Add consumer logic for provider was stopped.
authorKIM JungYong <jyong2.kim@samsung.com>
Thu, 18 Aug 2016 06:56:54 +0000 (15:56 +0900)
committerUze Choi <uzchoi@samsung.com>
Fri, 19 Aug 2016 11:43:52 +0000 (11:43 +0000)
When consumer presence listener received event of
stopped provider or deleted notification resource of provider,
consumer service does not act anything.
In this patch,
consumer service will process for canceling observe and removing provider infomation.

Change-Id: I9133ddbcbe8e341584ebaf8152c22df003cbb2ff
Signed-off-by: KIM JungYong <jyong2.kim@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/10587
Reviewed-by: Chihyun Cho <ch79.cho@samsung.com>
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Uze Choi <uzchoi@samsung.com>
service/notification/src/consumer/NSConsumerCommon.c
service/notification/src/consumer/NSConsumerDiscovery.c
service/notification/src/consumer/NSConsumerInternalTaskController.c
service/notification/src/consumer/NSConsumerInternalTaskController.h
service/notification/src/consumer/NSConsumerMemoryCache.c
service/notification/src/consumer/NSConsumerMemoryCache.h
service/notification/src/consumer/NSConsumerScheduler.c

index 7f36b32..93ced34 100644 (file)
@@ -572,6 +572,7 @@ bool NSOCResultToSuccess(OCStackResult ret)
         case OC_STACK_RESOURCE_CHANGED:
             return true;
         default:
+            NS_LOG_V(DEBUG, "OCStackResult : %d", (int)ret);
             return false;
     }
 }
index 48a7041..435430d 100644 (file)
@@ -64,9 +64,14 @@ OCStackApplicationResult NSConsumerPresenceListener(
     if (payload->trigger == OC_PRESENCE_TRIGGER_DELETE ||
             clientResponse->result == OC_STACK_PRESENCE_STOPPED)
     {
-        // TODO find request and cancel
         NS_LOG(DEBUG, "stopped presence or resource is deleted.");
-        //OCCancel(handle, NS_QOS, NULL, 0);
+        NS_LOG(DEBUG, "build NSTask");
+        OCDevAddr * addr = (OCDevAddr *)OICMalloc(sizeof(OCDevAddr));
+        NS_VERIFY_NOT_NULL(addr, OC_STACK_KEEP_TRANSACTION);
+        memcpy(addr, clientResponse->addr, sizeof(OCDevAddr));
+
+        NSTask * task = NSMakeTask(TASK_CONSUMER_PROVIDER_DELETED, addr);
+        NS_VERIFY_NOT_NULL(task, OC_STACK_KEEP_TRANSACTION);
     }
 
     else if (payload->trigger == OC_PRESENCE_TRIGGER_CREATE)
index e6f285d..06742bf 100644 (file)
@@ -112,6 +112,25 @@ NSProvider_internal * NSProviderCacheFind(const char * providerId)
     return NSCopyProvider_internal((NSProvider_internal *) cacheElement->data);
 }
 
+NSProvider_internal * NSFindProviderFromAddr(OCDevAddr * addr)
+{
+    NS_VERIFY_NOT_NULL(addr, NULL);
+
+    NSCacheList * ProviderCache = *(NSGetProviderCacheList());
+    if (!ProviderCache)
+    {
+        NS_LOG(DEBUG, "Provider Cache does not intialized.");
+        return NULL;
+    }
+
+    NSCacheElement * cacheElement =
+            NSGetProviderFromAddr(ProviderCache, addr->addr, addr->port);
+
+    NS_VERIFY_NOT_NULL(cacheElement, NULL);
+
+    return NSCopyProvider_internal((NSProvider_internal *) cacheElement->data);
+}
+
 void NSRemoveCacheElementMessage(NSCacheElement * obj)
 {
     NSRemoveMessage(((NSStoreMessage *)obj->data)->msg);
index de3394d..cbe4cfa 100644 (file)
@@ -48,6 +48,8 @@ NSMessage * NSMessageCacheFind(const char *);
 
 NSProvider_internal * NSProviderCacheFind(const char *);
 
+NSProvider_internal * NSFindProviderFromAddr(OCDevAddr * addr);
+
 void NSConsumerInternalTaskProcessing(NSTask *);
 
 #ifdef __cplusplus
index 38fce40..22672bc 100644 (file)
@@ -78,6 +78,43 @@ NSCacheElement * NSStorageRead(NSCacheList * list, const char * findId)
     return NULL;
 }
 
+NSCacheElement * NSGetProviderFromAddr(NSCacheList * list, const char * addr, uint16_t port)
+{
+    NS_VERIFY_NOT_NULL(list, NULL);
+    NS_VERIFY_NOT_NULL(addr, NULL);
+    NS_VERIFY_NOT_NULL(
+            (list->cacheType != NS_CONSUMER_CACHE_PROVIDER) ? NULL : (void *) 1, NULL);
+
+    pthread_mutex_t * mutex = NSGetCacheMutex();
+    pthread_mutex_lock(mutex);
+
+    NSCacheElement * iter = list->head;
+
+    while (iter)
+    {
+        NSProviderConnectionInfo * connection =
+                ((NSProviderConnectionInfo *) iter->data)->next;
+        while (connection)
+        {
+            char * conAddr = connection->addr->addr;
+            uint16_t conPort = connection->addr->port;
+
+            if (!strcmp(conAddr, addr) && conPort == port)
+            {
+                pthread_mutex_unlock(mutex);
+                return iter;
+            }
+            connection = connection->next;
+        }
+
+        iter = iter->next;
+    }
+
+    NS_LOG (DEBUG, "No Cache Element");
+    pthread_mutex_unlock(mutex);
+    return NULL;
+}
+
 NSResult NSStorageWrite(NSCacheList * list, NSCacheElement * newObj)
 {
     NS_VERIFY_NOT_NULL(list, NS_ERROR);
index 69702a4..76ab968 100644 (file)
@@ -37,6 +37,8 @@ NSResult NSConsumerCacheWriteMessage(NSCacheList * list, NSCacheElement * newObj
 NSResult NSConsumerCacheWriteProvider(NSCacheList * list, NSCacheElement * newObj);
 NSCacheElement * NSPopProviderCacheList(NSCacheList * list);
 
+NSCacheElement * NSGetProviderFromAddr(NSCacheList * list, const char * addr, uint16_t port);
+
 #ifdef __cplusplus
 }
 #endif // __cplusplus
index 1e4b5f8..7e85eab 100644 (file)
@@ -211,6 +211,33 @@ void * NSConsumerMsgPushThreadFunc(void * data)
     return NULL;
 }
 
+void NSProviderDeletedPostClean(
+        NSTask * task, NSProvider_internal * prov1, NSProvider_internal * prov2)
+{
+    if (task && task->taskData)
+    {
+        if (task->taskType == TASK_CONSUMER_REQ_SUBSCRIBE_CANCEL)
+        {
+            NSRemoveProvider((NSProvider *) task->taskData);
+        }
+        else if (task->taskType == TASK_CONSUMER_PROVIDER_DELETED)
+        {
+            NSOICFree(task->taskData);
+        }
+        NSOICFree(task);
+    }
+
+    if (prov1)
+    {
+        NSRemoveProvider_internal(prov1);
+    }
+
+    if (prov2)
+    {
+        NSRemoveProvider_internal(prov2);
+    }
+}
+
 void NSConsumerTaskProcessing(NSTask * task)
 {
     switch (task->taskType)
@@ -256,21 +283,38 @@ void NSConsumerTaskProcessing(NSTask * task)
             break;
         }
         case TASK_CONSUMER_REQ_SUBSCRIBE_CANCEL:
+        case TASK_CONSUMER_PROVIDER_DELETED:
         {
-            NSProvider_internal * data =
-                    NSConsumerFindNSProvider(((NSProvider *)task->taskData)->providerId);
-            NS_VERIFY_NOT_NULL_V(data);
+            NSProvider_internal * data = NULL;
+
+            if (task->taskType == TASK_CONSUMER_REQ_SUBSCRIBE_CANCEL)
+            {
+                data = NSConsumerFindNSProvider(((NSProvider *) task->taskData)->providerId);
+                NS_VERIFY_NOT_NULL_WITH_POST_CLEANING_V(
+                        data, NSProviderDeletedPostClean(task, NULL, NULL));
+            }
+            else if (task->taskType == TASK_CONSUMER_PROVIDER_DELETED)
+            {
+                data = NSFindProviderFromAddr((OCDevAddr *) task->taskData);
+                NS_VERIFY_NOT_NULL_WITH_POST_CLEANING_V(
+                        data, NSProviderDeletedPostClean(task, NULL, NULL));
+            }
+
+            NSProvider_internal * data2 = NSCopyProvider_internal(data);
+            NS_VERIFY_NOT_NULL_WITH_POST_CLEANING_V(
+                        data2, NSProviderDeletedPostClean(task, data, NULL));
+
             NSTask * conTask = NSMakeTask(TASK_CONSUMER_REQ_SUBSCRIBE_CANCEL, data);
-            NS_VERIFY_NOT_NULL_V(conTask);
+            NS_VERIFY_NOT_NULL_WITH_POST_CLEANING_V(
+                        conTask, NSProviderDeletedPostClean(task, data, data2));
             NSConsumerCommunicationTaskProcessing(conTask);
 
-            data = NSConsumerFindNSProvider(((NSProvider *)task->taskData)->providerId);
-            NS_VERIFY_NOT_NULL_V(data);
-            NSTask * conTask2 = NSMakeTask(TASK_CONSUMER_REQ_SUBSCRIBE_CANCEL, data);
+            NSTask * conTask2 = NSMakeTask(TASK_CONSUMER_REQ_SUBSCRIBE_CANCEL, data2);
+            NS_VERIFY_NOT_NULL_WITH_POST_CLEANING_V(
+                        conTask, NSProviderDeletedPostClean(task, NULL, data2));
             NSConsumerInternalTaskProcessing(conTask2);
 
-            NSRemoveProvider((NSProvider *)task->taskData);
-            NSOICFree(task);
+            NSProviderDeletedPostClean(task, NULL, NULL);
             break;
         }
         case TASK_RECV_SYNCINFO: