Fix bug for topic is changed to empty.
authorKIM JungYong <jyong2.kim@samsung.com>
Fri, 23 Sep 2016 06:56:56 +0000 (15:56 +0900)
committerUze Choi <uzchoi@samsung.com>
Wed, 28 Sep 2016 23:25:40 +0000 (23:25 +0000)
When the provider delete topic, consumer never callback changed when topic is empty.
In this patch, consumer will callback changed topic to upper layer
when topic is empty from not empty.

Change-Id: I41d0ad42f19298ce2773ab4c17d37cd7c1aa6b5e
Signed-off-by: KIM JungYong <jyong2.kim@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/12167
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Chihyun Cho <ch79.cho@samsung.com>
Reviewed-by: Hun-je Yeon <hunje.yeon@samsung.com>
Reviewed-by: Uze Choi <uzchoi@samsung.com>
(cherry picked from commit d79bbeef21dcccf862210639006d34393086e83c)
Reviewed-on: https://gerrit.iotivity.org/gerrit/12457

service/notification/src/consumer/NSConsumerCommunication.c
service/notification/src/consumer/NSConsumerInternalTaskController.c

index 7d5fa6c..afde612 100644 (file)
@@ -668,8 +668,6 @@ OCStackApplicationResult NSIntrospectTopic(
             clientResponse->devAddr.adapter);
 
     NSTopicLL * newTopicLL = NSGetTopicLL(clientResponse);
-    NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(newTopicLL, OC_STACK_KEEP_TRANSACTION,
-          NSRemoveProvider_internal((NSProvider_internal *) ctx));
 
     NSProvider_internal * provider = (NSProvider_internal *) ctx;
     provider->topicLL = NSCopyTopicLL(newTopicLL);
index 1bb3afb..b069742 100644 (file)
@@ -413,6 +413,17 @@ void NSConsumerHandleRecvTopicLL(NSProvider_internal * provider)
     NSRemoveConnections(provider->connection);
     provider->connection = NULL;
 
+    NSProvider_internal * cachedProvider = NSProviderCacheFind(provider->providerId);
+    NS_VERIFY_NOT_NULL_V(cachedProvider);
+
+    if (!cachedProvider->topicLL && !provider->topicLL)
+    {
+        NS_LOG(DEBUG, "topic is null and previous status is same.");
+        NSRemoveProvider_internal(cachedProvider);
+        return;
+    }
+    NSRemoveProvider_internal(cachedProvider);
+
     NSResult ret = NSProviderCacheUpdate(provider);
     NS_VERIFY_NOT_NULL_V(ret == NS_OK ? (void *) 1 : NULL);