The changes are about implementation of APIs for topic notification.
TODO tasks will be complete with next commits.
four patch included comment out about related Topic in Consumer Side.
because of, It has already been modified about NSTopic, NSTopicList.
Conflicts:
service/notification/include/NSCommon.h
Change-Id: I6cea362cce5fbc0bf7623853fa4c87c7de854321
Signed-off-by: jaesick.shin <jaesick.shin@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/10201
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Madan Lanka <lanka.madan@samsung.com>
*/
typedef enum
{
- NS_TOPIC_CREATED = 0,
+ NS_TOPIC_UNSUBSCRIBED = 0,
NS_TOPIC_SUBSCRIBED = 1,
- NS_TOPIC_UNSUBSCRIBED = 2,
} NSTopicState;
-typedef struct
+typedef struct _nsTopic
{
char * topicName;
NSTopicState state;
+ struct _nsTopic * next;
} NSTopic;
typedef struct
{
- char consumerId[37];
- NSTopic ** topics;
+ char consumerId[NS_UUID_STRING_SIZE];
+ NSTopic * head;
+ NSTopic * tail;
} NSTopicList;
NSMessage * NSCreateMessage();\r
\r
/**\r
+ * Create empty topic list which is required to set by following APIs\r
+ * @return ::NSTopicList\r
+ */\r
+NSTopicList * NSProviderCreateTopicList();\r
+\r
+/**\r
+ * Add topic to topic list which is able to be created\r
+ * by NSProviderCreateTopicList function\r
+ * @param[out] topicList Topic list added with topic name\r
+ * @param[in] topicName Topic name to add\r
+ * @return ::NS_OK or result code of NSResult\r
+ */\r
+NSResult NSProviderAddTopic(NSTopicList** topicList, char* topicName);\r
+\r
+/**\r
+ * Delete topic from topic list\r
+ * @param[out] topicList Topic list deleted with topic name\r
+ * @param[in] topicName Topic name to delete\r
+ * @return ::NS_OK or result code of NSResult\r
+ */\r
+NSResult NSProviderDeleteTopic(NSTopicList** topicList, char* topicName);\r
+\r
+/**\r
+ * Select a topic for consumer\r
+ * @param[out] topicList Topic list with selected and unselected topics for consumer\r
+ * @param[in] consumerId consumer id for which the user on provider selects a topic\r
+ * @param[in] topicName Topic name to select\r
+ * @return ::NS_OK or result code of NSResult\r
+ */\r
+NSResult NSProviderSelectTopic(NSTopicList** topicList, char* consumerId, char* topicName);\r
+\r
+/**\r
+ * Unselect a topic from the topic list for consumer\r
+ * @param[out] topicList Topic list with selected and unselected topics for consumer\r
+ * @param[in] consumerId consumer id for which the user on provider unselects a topic\r
+ * @param[in] topicName Topic name to unselect\r
+ * @return ::NS_OK or result code of NSResult\r
+ */\r
+NSResult NSProviderUnselectTopic(NSTopicList** topicList, char* consumerId, char* topicName);\r
+\r
+/**\r
* Request all the topics which has already registered by user\r
* @param[in] consumerid the id of consumer which subscribes topics\r
* if NULL, all the registered topic list is returned\r
* the consumerId of NSTopicList struct shoud be set NULL\r
* @return ::NS_OK or result code of NSResult\r
*/\r
-NSResult NSProviderSetTopics(NSTopicList *topicList);\r
+NSResult NSProviderRegisterTopics(NSTopicList *topicList);\r
\r
/**\r
* Set recommended topics for a consumer\r
* the consumerId of NSTopicList struct should be set consumerId\r
* @return ::NS_OK or result code of NSResult\r
*/\r
-NSResult NSProviderRecommendTopics(NSTopicList *topicList);\r
-\r
+NSResult NSProviderRecommendTopics(char* consumerId, NSTopicList *topicList);\r
\r
#ifdef __cplusplus\r
}\r
#define NS_POLICY_PROVIDER 1
#define NS_POLICY_CONSUMER 0
+#define NS_RD_PUBLISH_QUERY "/oic/rd?rt=oic.wk.rdpub"
+
#define NS_VERIFY_NOT_NULL_V(obj) \
{ \
if ((obj) == NULL) \
typedef struct\r
{\r
char consumerId[37];\r
- NSTopicList ** topicList;\r
+ NSTopic** topics;\r
} NSCacheTopicData;\r
\r
typedef struct\r
}
(topicList->consumerId)[0] = '\0';
- topicList->topics = NULL;
+ topicList->head = NULL;
+ topicList->tail = NULL;
return topicList;
}
+NSResult NSFreeTopicList(NSTopicList * topicList)
+{
+ if (!topicList)
+ {
+ return NS_ERROR;
+ }
+
+ //TODO:Free Topic List
+
+
+ return NS_OK;
+}
+
connections = connections->next;
}
}
+ /* TODO next commit, modify code.
else if (task->taskType == TASK_CONSUMER_REQ_TOPIC_LIST)
{
NSProvider_internal * provider = (NSProvider_internal *)task->taskData;
NS_VERIFY_STACK_SUCCESS_V(NSOCResultToSuccess(ret));
NSOICFree(query);
NSOICFree(topicUri);
- }
+ }*/
else
{
NS_LOG(ERROR, "Unknown type message");
}
+
NSOICFree(task);
}
void NSGetTopicPostClean(
char * cId, NSTopicList * tList, size_t dSize)
{
+ /* TODO next commit, modify code.
NSOICFree(cId);
NSRemoveProviderTopicList(tList, dSize);
+ */
}
NSTopicList * NSGetTopic(OCClientResponse * clientResponse, size_t * topicListSize)
{
+ /* TODO next commit, modify code.
NS_LOG(DEBUG, "create NSTopic");
NS_VERIFY_NOT_NULL(clientResponse->payload, NULL);
NSOICFree(consumerId);
- return topicList;
+ return topicList;*/
}
OCStackApplicationResult NSIntrospectTopic(
void * ctx, OCDoHandle handle, OCClientResponse * clientResponse)
{
+/* TODO next commit, modify code.
(void) handle;
NS_VERIFY_NOT_NULL(clientResponse, OC_STACK_KEEP_TRANSACTION);
NSRemoveProviderTopicList(newTopicList, topicListSize);
return OC_STACK_KEEP_TRANSACTION;
+ */
}
NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(getResult == true ? (void *) 1 : NULL, NULL,
NSGetProviderPostClean(providerId, messageUri, syncUri, connection));
+ /* TODO next commit, modify code.
NS_LOG(DEBUG, "get topic URI");
getResult = OCRepPayloadGetPropString(payload, NS_ATTRIBUTE_TOPIC, & topicUri);
NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(getResult == true ? (void *) 1 : NULL, NULL,
NSGetProviderPostClean(providerId, messageUri, syncUri, topicUri, connection));
+ */
NS_LOG(DEBUG, "get provider connection information");
NS_VERIFY_NOT_NULL(clientResponse->addr, NULL);
NSResult NSConsumerGetInterestTopics(NSProvider * provider)
{
+ /* TODO next commit, modify code.
bool isStartedConsumer = NSIsStartedConsumer();
NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
NS_VERIFY_NOT_NULL(topicTask, NS_ERROR);
return NSConsumerPushEvent(topicTask);
+ */
}
NSResult NSConsumerSelectInterestTopics(NSProvider * provider)
{
+ /* TODO next commit, modify code.
bool isStartedConsumer = NSIsStartedConsumer();
NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
NS_VERIFY_NOT_NULL(provider, NS_ERROR);
return NSConsumerPushEvent(topicTask);
+ */
}
NSResult NSDropNSMessage(NSMessage * obj)
}\r
\r
NSTopicList * topicList = NSInitializeTopicList();\r
- OICStrcpy(topicList->consumerId, UUID_STRING_SIZE, consumerId);\r
- OICStrcpy(topicList->topics, sizeof(NSTopic), NSGetTopics(consumerId));\r
+ //TODO: copy topic list\r
\r
pthread_mutex_unlock(&nsInitMutex);\r
NS_LOG(DEBUG, "NSProviderGetTopics - OUT");\r
return topicList;\r
}\r
\r
-NSResult NSProviderSetTopics(NSTopicList *topicList)\r
+NSResult NSProviderRegisterTopics(NSTopicList *topicList)\r
{\r
NS_LOG(DEBUG, "NSProviderSetTopics - IN");\r
pthread_mutex_lock(&nsInitMutex);\r
\r
- if(topicList->consumerId != NULL)\r
- {\r
- NS_LOG(DEBUG, "consumer id should be set by NULL to register topics");\r
- return NS_FAIL;\r
- }\r
+ NSInitTopicStorage();\r
\r
NSPushQueue(TOPIC_SCHEDULER, TASK_REGISTER_TOPICS, topicList);\r
\r
pthread_mutex_unlock(&nsInitMutex);\r
NS_LOG(DEBUG, "NSProviderSetTopics - OUT");\r
- \r
return NS_OK;\r
}\r
\r
-NSResult NSProviderRecommendTopics(NSTopicList *topicList)\r
+NSResult NSProviderRecommendTopics(char* consumerId, NSTopicList *topicList)\r
{\r
NS_LOG(DEBUG, "NSProviderRecommendTopics - IN");\r
pthread_mutex_lock(&nsInitMutex);\r
\r
- if(topicList->consumerId == NULL)\r
+ if(consumerId == NULL)\r
{\r
NS_LOG(DEBUG, "consumer id should be set for topic subscription");\r
return NS_FAIL;\r
NS_LOG(DEBUG, "NSPublishResourceToCloud - IN");
NS_LOG_V(DEBUG, "Cloud address: %s", serverAddress);
- const char * publishQuery = "/oic/rd?rt=oic.wk.rdpub";
+ const char * publishQuery = NS_RD_PUBLISH_QUERY;
if (NSCloudPublish(serverAddress, publishQuery, &NSHandlePublishCb, 1,
NotificationResource.handle) != OC_STACK_OK)
return NS_OK;
}
-NSResult NSPutTopicResource(NSTopicList **topicList, OCResourceHandle * handle)
+NSResult NSPutTopicResource(NSTopicList *topicList, OCResourceHandle * handle)
{
NS_LOG(DEBUG, "NSPutTopicResource - IN");
NSResult NSPutSyncResource(NSSyncInfo *sync, OCResourceHandle * handle);
-NSResult NSPutTopicResource(NSTopicList **topicList, OCResourceHandle * handle);
+NSResult NSPutTopicResource(NSTopicList *topicList, OCResourceHandle * handle);
#endif /* _NS_PROVIDER_RESOURCE_H_ */
\r
#include "NSProviderTopic.h"\r
\r
+static bool isTopicList = false;\r
+\r
+NSResult NSInitTopicStorage()\r
+{\r
+ NS_LOG(DEBUG, "NSInitTopicList - IN");\r
+\r
+ if(isTopicList)\r
+ {\r
+ NS_LOG(DEBUG, "topic list has already initiated");\r
+ return NS_FAIL;\r
+ }\r
+\r
+ topicStorage = NSStorageCreate();\r
+ topicStorage->cacheType = NS_PROVIDER_CACHE_TOPIC;\r
+ isTopicList = true;\r
+\r
+ NS_LOG(DEBUG, "NSInitTopicList - OUT");\r
+ return NS_OK;\r
+}\r
+\r
NSTopicList * NSGetTopics(char *consumerId)\r
{\r
NS_LOG(DEBUG, "NSGetTopics()");\r
return topicList;\r
}\r
\r
+//TODO: update parameter\r
+NSResult NSStoreTopics(char * consumerId, NSTopic** topics)\r
+{\r
+ NS_LOG(DEBUG, "NSWriteTopicsToStorage()");\r
+\r
+ NSCacheElement * element = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement));\r
+ NSCacheTopicData * topicData = (NSCacheTopicData *) OICMalloc(sizeof(NSCacheTopicData));\r
+\r
+ OICStrcpy(topicData->consumerId, UUID_STRING_SIZE, consumerId);\r
+ NS_LOG_V(DEBUG, "consumer id: %s", topicData->consumerId);\r
+\r
+ // TODO: print topic list\r
+ topicData->topics = topics;\r
+ NS_LOG(DEBUG, "print topic list");\r
+\r
+ element->data = (void*) topicData;\r
+ element->next = NULL;\r
+\r
+ if(NSStorageWrite(topicStorage, element) != NS_OK)\r
+ {\r
+ NS_LOG(DEBUG, "fail to write cache");\r
+ }\r
+\r
+ NS_LOG(DEBUG, "NSWriteTopicsToStorage() NS_OK");\r
+ return NS_OK;\r
+}\r
+\r
+NSResult NSRegisterTopicList(NSTopicList *topicList)\r
+{\r
+ NS_LOG(DEBUG, "NSRegisterTopicList()");\r
+\r
+ if(!topicList)\r
+ {\r
+ NS_LOG(ERROR, "no topics");\r
+ return NS_ERROR;\r
+ }\r
+\r
+ OCResourceHandle rHandle = NULL;\r
+ if(NSPutTopicResource(topicList, &rHandle) != NS_OK)\r
+ {\r
+ NS_LOG(ERROR, "Fail to put topic resource");\r
+ return NS_ERROR;\r
+ }\r
+\r
+ if(topicList->consumerId != NULL)\r
+ {\r
+ // id should be null to register topic list\r
+ NS_LOG(ERROR, "invalid consumer id");\r
+ return NS_ERROR;\r
+ }\r
+\r
+ NSStoreTopics(topicList->consumerId, topicList->head);\r
+\r
+ NS_LOG(DEBUG, "NSRegisterTopicList() NS_OK");\r
+ return NS_OK;\r
+}\r
+\r
+NSResult NSSendTopicUpdation()\r
+{\r
+ NS_LOG(DEBUG, "NSSendTopicUpdation - IN");\r
+\r
+ OCRepPayload* payload = OCRepPayloadCreate();\r
+\r
+ if (!payload)\r
+ {\r
+ NS_LOG(ERROR, "fail to create playload");\r
+ return NS_ERROR;\r
+ }\r
+\r
+ OCResourceHandle rHandle = NULL;\r
+ if (NSPutMessageResource(NULL, &rHandle) != NS_OK)\r
+ {\r
+ NS_LOG(ERROR, "Fail to put message resource");\r
+ return NS_ERROR;\r
+ }\r
+\r
+ OCRepPayloadSetUri(payload, NS_COLLECTION_MESSAGE_URI);\r
+ OCRepPayloadSetPropInt(payload, NS_ATTRIBUTE_MESSAGE_ID, NS_TOPIC);\r
+ OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID, NSGetProviderInfo()->providerId);\r
+\r
+ OCObservationId obArray[255] = { 0, };\r
+ int obCount = 0;\r
+\r
+ NSCacheElement * it = consumerSubList->head;\r
+\r
+ while (it)\r
+ {\r
+ NSCacheSubData * subData = (NSCacheSubData *) it->data;\r
+\r
+ if (subData->isWhite)\r
+ {\r
+ if(subData->messageObId != 0)\r
+ {\r
+ obArray[obCount++] = subData->messageObId;\r
+ }\r
+\r
+#ifdef WITH_CLOUD\r
+ if(subData->remote_messageObId != 0)\r
+ {\r
+ obArray[obCount++] = subData->remote_messageObId;\r
+ }\r
+#endif\r
+\r
+ }\r
+ it = it->next;\r
+ }\r
+\r
+ if(!obCount)\r
+ {\r
+ NS_LOG(ERROR, "observer count is zero");\r
+ return NS_ERROR;\r
+ }\r
+\r
+ if (OCNotifyListOfObservers(rHandle, obArray, obCount, payload, OC_HIGH_QOS)\r
+ != OC_STACK_OK)\r
+ {\r
+ NS_LOG(ERROR, "fail to send topic updation");\r
+ OCRepPayloadDestroy(payload);\r
+ return NS_ERROR;\r
+\r
+ }\r
+ OCRepPayloadDestroy(payload);\r
+\r
+ NS_LOG(DEBUG, "NSSendTopicUpdation - OUT");\r
+ return NS_OK;\r
+}\r
+\r
+NSResult NSSendTopicUpdationToConsumer(char *consumerId)\r
+{\r
+ NS_LOG(DEBUG, "NSSendTopicUpdationToConsumer - IN");\r
+\r
+ OCRepPayload* payload = OCRepPayloadCreate();\r
+\r
+ if (!payload)\r
+ {\r
+ NS_LOG(ERROR, "fail to create playload");\r
+ return NS_ERROR;\r
+ }\r
+\r
+ OCResourceHandle rHandle = NULL;\r
+ if (NSPutMessageResource(NULL, &rHandle) != NS_OK)\r
+ {\r
+ NS_LOG(ERROR, "Fail to put message resource");\r
+ return NS_ERROR;\r
+ }\r
+\r
+ OCRepPayloadSetUri(payload, NS_COLLECTION_MESSAGE_URI);\r
+ OCRepPayloadSetPropInt(payload, NS_ATTRIBUTE_MESSAGE_ID, NS_TOPIC);\r
+ OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID, NSGetProviderInfo()->providerId);\r
+\r
+ NSCacheElement * element = NSStorageRead(consumerSubList, consumerId);\r
+\r
+ if(element == NULL)\r
+ {\r
+ NS_LOG(ERROR, "element is NULL");\r
+ return NS_ERROR;\r
+ }\r
+\r
+ NSCacheSubData * subData = (NSCacheSubData*) element->data;\r
+\r
+ if (OCNotifyListOfObservers(rHandle, (OCObservationId*)&subData->messageObId, 1, payload, OC_HIGH_QOS)\r
+ != OC_STACK_OK)\r
+ {\r
+ NS_LOG(ERROR, "fail to send topic updation");\r
+ OCRepPayloadDestroy(payload);\r
+ return NS_ERROR;\r
+\r
+ }\r
+\r
+ OCRepPayloadDestroy(payload);\r
+\r
+ NS_LOG(DEBUG, "NSSendTopicUpdationToConsumer - OUT");\r
+ return NS_OK;\r
+}\r
+\r
bool NSIsTopicSubscribed(char * consumerId, char * topic)\r
{\r
//TODO: implement function\r
break;\r
case TASK_REGISTER_TOPICS:\r
NS_LOG(DEBUG, "CASE TASK_REGISTER_TOPICS : ");\r
+ NSTopicList * topicList = (NSTopicList *) node->taskData;\r
+ NSRegisterTopicList(topicList);\r
+ NSSendTopicUpdation();\r
+ // TODO : free NSTopic\r
+ // NSFreeTopicList(topicList);\r
break;\r
default:\r
break;\r
\r
#include "NSCommon.h"\r
#include "NSStructs.h"\r
+#include "NSConstants.h"\r
#include "NSProviderScheduler.h"\r
#include "NSProviderResource.h"\r
+#include "NSProviderSubscription.h"\r
\r
+NSCacheList * topicStorage;\r
+\r
+NSResult NSInitTopicStorage();\r
NSTopicList * NSGetTopics(char *consumerId);\r
\r
bool NSIsTopicSubscribed(char *consumerId, char *topic);\r