Modify to call of provider state callback.
authorKIM JungYong <jyong2.kim@samsung.com>
Fri, 2 Sep 2016 05:23:42 +0000 (14:23 +0900)
committerUze Choi <uzchoi@samsung.com>
Fri, 2 Sep 2016 10:26:30 +0000 (10:26 +0000)
When incomming the subscription result,
consumer service callback to upper layer every result message
although some of message was duplicated.

Provider state callback is fixed for call once as provider state(allow/deny) changed.

Change-Id: I5a8094092b33e569716475aa60b574ee5eb0e913
Signed-off-by: KIM JungYong <jyong2.kim@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/11325
Reviewed-by: Uze Choi <uzchoi@samsung.com>
Tested-by: Uze Choi <uzchoi@samsung.com>
service/notification/src/consumer/NSConsumerCommon.c
service/notification/src/consumer/NSConsumerCommon.h
service/notification/src/consumer/NSConsumerDiscovery.c
service/notification/src/consumer/NSConsumerInternalTaskController.c

index 4f6af44dc55e52779344cdbdc07d381b8b89ccdd..ef15ae22758d8b17051841ff99d1f372c7b06e0a 100644 (file)
@@ -436,6 +436,7 @@ NSProvider_internal * NSCopyProvider_internal(NSProvider_internal * prov)
     newProv->syncUri = OICStrdup(prov->syncUri);
     newProv->topicUri = OICStrdup(prov->topicUri);
     newProv->accessPolicy = prov->accessPolicy;
+    newProv->state = prov->state;
 
     return newProv;
 }
index c764d3cf558360b75fc837e76e628ce68750610f..b3862818c9077340480d377ecfd8001b1082c378 100644 (file)
@@ -81,6 +81,7 @@ typedef struct
     char * topicUri;
 
     NSSelector accessPolicy;
+    NSProviderState state;
 
     NSProviderConnectionInfo * connection;
 
index 208a6ae585f5af411ddf5bcd845e098e546af021..0509ac5d9c639ebd174f13165022bf9d2e2f0a7b 100644 (file)
@@ -249,6 +249,7 @@ NSProvider_internal * NSGetProvider(OCClientResponse * clientResponse)
     newProvider->accessPolicy = (NSSelector)accepter;
     newProvider->connection = connection;
     newProvider->topicLL = NULL;
+    newProvider->state = NS_DISCOVERED;
 
     return newProvider;
 }
index af1f705a03ecd15eddacb24cef612c3d5beabc58..84f70920830edb286cceea0e41498df5060cf49d 100644 (file)
@@ -347,13 +347,32 @@ void NSConsumerHandleRecvProviderChanged(NSMessage * msg)
     NS_VERIFY_NOT_NULL_V(msg);
 
     NS_LOG_V(DEBUG, "confirmed by : %s", msg->providerId);
-    NSProvider_internal * provider = NSProviderCacheFind(msg->providerId);
-    NS_VERIFY_NOT_NULL_V(provider);
 
+    NSCacheList * ProviderCache = *(NSGetProviderCacheList());
+
+    NSCacheElement * cacheElement = NSStorageRead(ProviderCache, msg->providerId);
+    NS_VERIFY_NOT_NULL_V(cacheElement);
+
+    pthread_mutex_t * mutex = NSGetCacheMutex();
+    pthread_mutex_lock(mutex);
+    NS_VERIFY_NOT_NULL_WITH_POST_CLEANING_V(cacheElement, pthread_mutex_unlock(mutex));
+    NSProvider_internal * provider = (NSProvider_internal *) cacheElement->data;
+    if (provider->state == (NSProviderState) msg->messageId)
+    {
+        NS_LOG_V(DEBUG, "Already receive message(ALLOW/DENY) : %d", (int) msg->messageId);
+        pthread_mutex_unlock(mutex);
+        return;
+    }
+
+    NS_LOG_V(DEBUG, "Provider State Changed %d -> %d",
+             (int) provider->state, (int) msg->messageId);
     NS_LOG(DEBUG, "call back to user");
+    provider->state = (NSProviderState) msg->messageId;
+
     NSProvider * prov = NSCopyProvider(provider);
+
+    pthread_mutex_unlock(mutex);
     NSProviderChanged(prov, (NSProviderState) msg->messageId);
-    NSRemoveProvider_internal(provider);
 }
 
 void NSConsumerHandleRecvMessage(NSMessage * msg)