Implement APIs for topic notification.
authorjaesick.shin <jaesick.shin@samsung.com>
Tue, 9 Aug 2016 12:03:21 +0000 (21:03 +0900)
committerMadan Lanka <lanka.madan@samsung.com>
Wed, 10 Aug 2016 12:29:05 +0000 (12:29 +0000)
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>
13 files changed:
service/notification/include/NSCommon.h
service/notification/include/NSProviderInterface.h
service/notification/src/common/NSConstants.h
service/notification/src/common/NSStructs.h
service/notification/src/common/NSUtil.c
service/notification/src/consumer/NSConsumerCommunication.c
service/notification/src/consumer/NSConsumerDiscovery.c
service/notification/src/consumer/NSConsumerInterface.c
service/notification/src/provider/NSProviderInterface.c
service/notification/src/provider/NSProviderResource.c
service/notification/src/provider/NSProviderResource.h
service/notification/src/provider/NSProviderTopic.c
service/notification/src/provider/NSProviderTopic.h

index 5806e3c..e293df5 100644 (file)
@@ -114,23 +114,24 @@ typedef enum
  */
 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;
 
index 843a99e..8c6cc1d 100644 (file)
@@ -133,6 +133,47 @@ NSResult NSProviderSendSyncInfo(uint64_t messageId, NSSyncType type);
 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
@@ -146,7 +187,7 @@ NSTopicList * NSProviderGetTopics(char *consumerId);
  * 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
@@ -154,8 +195,7 @@ NSResult NSProviderSetTopics(NSTopicList *topicList);
  * 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
index e79b447..226a124 100644 (file)
@@ -90,6 +90,8 @@
 #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) \
index fb207c6..f825836 100644 (file)
@@ -72,7 +72,7 @@ typedef struct
 typedef struct\r
 {\r
     char consumerId[37];\r
-    NSTopicList ** topicList;\r
+    NSTopic** topics;\r
 } NSCacheTopicData;\r
 \r
 typedef struct\r
index e3b221a..be70df7 100755 (executable)
@@ -456,8 +456,22 @@ NSTopicList * NSInitializeTopicList()
     }
 
     (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;
+}
+
index bf4c51e..6a6df15 100644 (file)
@@ -402,6 +402,7 @@ void NSConsumerCommunicationTaskProcessing(NSTask * task)
             connections = connections->next;
         }
     }
+    /* TODO next commit, modify code.
     else if (task->taskType == TASK_CONSUMER_REQ_TOPIC_LIST)
     {
         NSProvider_internal * provider = (NSProvider_internal *)task->taskData;
@@ -507,23 +508,27 @@ void NSConsumerCommunicationTaskProcessing(NSTask * task)
         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);
 
@@ -591,12 +596,13 @@ NSTopicList * NSGetTopic(OCClientResponse * clientResponse, size_t * topicListSi
 
     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);
@@ -630,4 +636,5 @@ OCStackApplicationResult NSIntrospectTopic(
     NSRemoveProviderTopicList(newTopicList, topicListSize);
 
     return OC_STACK_KEEP_TRANSACTION;
+    */
 }
index 894ab8a..1467159 100644 (file)
@@ -212,10 +212,12 @@ NSProvider_internal * NSGetProvider(OCClientResponse * clientResponse)
     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);
index de87c0a..13ba403 100644 (file)
@@ -155,6 +155,7 @@ NSMessage * NSConsumerGetMessage(uint64_t messageId)
 
 NSResult NSConsumerGetInterestTopics(NSProvider * provider)
 {
+    /* TODO next commit, modify code.
     bool isStartedConsumer = NSIsStartedConsumer();
     NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
 
@@ -164,10 +165,12 @@ NSResult NSConsumerGetInterestTopics(NSProvider * provider)
     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);
 
@@ -183,6 +186,7 @@ NSResult NSConsumerSelectInterestTopics(NSProvider * provider)
     NS_VERIFY_NOT_NULL(provider, NS_ERROR);
 
     return NSConsumerPushEvent(topicTask);
+    */
 }
 
 NSResult NSDropNSMessage(NSMessage * obj)
index cc783fc..0c81b2d 100644 (file)
@@ -248,8 +248,7 @@ NSTopicList * NSProviderGetTopics(char *consumerId)
     }\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
@@ -257,31 +256,26 @@ NSTopicList * NSProviderGetTopics(char *consumerId)
     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
index 0e4030f..fae0947 100644 (file)
@@ -48,7 +48,7 @@ NSResult NSPublishResourceToCloud(char *serverAddress)
     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)
@@ -270,7 +270,7 @@ NSResult NSPutSyncResource(NSSyncInfo *sync, OCResourceHandle * handle)
     return NS_OK;
 }
 
-NSResult NSPutTopicResource(NSTopicList **topicList, OCResourceHandle * handle)
+NSResult NSPutTopicResource(NSTopicList *topicList, OCResourceHandle * handle)
 {
     NS_LOG(DEBUG, "NSPutTopicResource - IN");
 
index 7c868c2..3e273b9 100644 (file)
@@ -42,6 +42,6 @@ NSResult NSPutMessageResource(NSMessage *msg, OCResourceHandle * handle);
 
 NSResult NSPutSyncResource(NSSyncInfo *sync, OCResourceHandle * handle);
 
-NSResult NSPutTopicResource(NSTopicList **topicList, OCResourceHandle * handle);
+NSResult NSPutTopicResource(NSTopicList *topicList, OCResourceHandle * handle);
 
 #endif /* _NS_PROVIDER_RESOURCE_H_ */
index ecd9602..e693a7d 100644 (file)
 \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
@@ -39,6 +59,181 @@ NSTopicList * NSGetTopics(char *consumerId)
     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
@@ -72,6 +267,11 @@ void * NSTopicSchedule(void * ptr)
                     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
index e6ddb64..0f9b6b1 100644 (file)
 \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