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 4f6af44..ef15ae2 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 c764d3c..b386281 100644 (file)
@@ -81,6 +81,7 @@ typedef struct
     char * topicUri;
 
     NSSelector accessPolicy;
+    NSProviderState state;
 
     NSProviderConnectionInfo * connection;
 
index 208a6ae..0509ac5 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 af1f705..84f7092 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)