replace : iotivity -> iotivity-sec
[platform/upstream/iotivity.git] / service / notification / src / consumer / NSConsumerInterface.c
index 1402248..f52b20d 100644 (file)
@@ -27,6 +27,7 @@
 #include "NSConsumerCommon.h"
 #include "NSConstants.h"
 #include "NSConsumerScheduler.h"
+#include "NSUtil.h"
 #include "oic_malloc.h"
 #include "oic_string.h"
 
@@ -36,15 +37,13 @@ NSResult NSStartConsumer(NSConsumerConfig config)
     bool isStartedConsumer = NSIsStartedConsumer();
     NS_VERIFY_NOT_NULL(isStartedConsumer == false ? (void *) 1 : NULL, NS_OK);
 
-    NS_VERIFY_NOT_NULL(config.discoverCb, NS_ERROR);
     NS_VERIFY_NOT_NULL(config.messageCb, NS_ERROR);
     NS_VERIFY_NOT_NULL(config.syncInfoCb, NS_ERROR);
-    NS_VERIFY_NOT_NULL(config.acceptedCb, NS_ERROR);
+    NS_VERIFY_NOT_NULL(config.changedCb, NS_ERROR);
 
-    NSSetDiscoverProviderCb(config.discoverCb);
     NSSetMessagePostedCb(config.messageCb);
     NSSetNotificationSyncCb(config.syncInfoCb);
-    NSSetSubscriptionAcceptedCb(config.acceptedCb);
+    NSSetProviderChangedCb(config.changedCb);
     NSSetIsStartedConsumer(true);
 
     NSResult ret = NSConsumerMessageHandlerInit();
@@ -59,10 +58,9 @@ NSResult NSStopConsumer()
     bool isStartedConsumer = NSIsStartedConsumer();
     NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
 
-    NSSetDiscoverProviderCb(NULL);
     NSSetMessagePostedCb(NULL);
     NSSetNotificationSyncCb(NULL);
-    NSSetSubscriptionAcceptedCb(NULL);
+    NSSetProviderChangedCb(NULL);
     NSSetIsStartedConsumer(false);
 
     NSConsumerMessageHandlerExit();
@@ -70,34 +68,83 @@ NSResult NSStopConsumer()
     return NS_OK;
 }
 
-NSResult NSConsumerEnableRemoteService(char *serverAddress)
+#ifdef WITH_MQ
+NSResult NSConsumerSubscribeMQService(const char * serverAddress, const char * topicName)
 {
+    NS_VERIFY_NOT_NULL(serverAddress, NS_ERROR);
+    NS_VERIFY_NOT_NULL(topicName, NS_ERROR);
     bool isStartedConsumer = NSIsStartedConsumer();
     NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
 
-    NSTask * discoverTask = NSMakeTask(TASK_CONSUMER_REQ_DISCOVER, (void *)serverAddress);
+    char * queryAddr = NSGetQueryAddress(serverAddress);
+    NS_VERIFY_NOT_NULL(queryAddr, NS_ERROR);
+
+    NSMQTopicAddress * topicAddr = (NSMQTopicAddress *)OICMalloc(sizeof(NSMQTopicAddress));
+    NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(queryAddr, NS_ERROR, NSOICFree(queryAddr));
+
+    topicAddr->serverAddr = queryAddr;
+    topicAddr->topicName = OICStrdup(topicName);
+
+    NSTask * subMQTask = NSMakeTask(TASK_MQ_REQ_SUBSCRIBE, (void *)topicAddr);
+    NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(subMQTask, NS_ERROR,
+                  {
+                      NSOICFree(topicAddr->serverAddr);
+                      NSOICFree(topicAddr->topicName)
+                      NSOICFree(topicAddr);
+                  });
+
+    return NSConsumerPushEvent(subMQTask);
+}
+#endif
+
+NSResult NSConsumerEnableRemoteService(const char * serverAddress)
+{
+    NS_VERIFY_NOT_NULL(serverAddress, NS_ERROR);
+    bool isStartedConsumer = NSIsStartedConsumer();
+    NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
+
+    char * queryAddr = OICStrdup(serverAddress);
+    NS_VERIFY_NOT_NULL(queryAddr, NS_ERROR);
+
+    NSTask * discoverTask = NSMakeTask(TASK_CONSUMER_REQ_DISCOVER, (void *)queryAddr);
     NS_VERIFY_NOT_NULL(discoverTask, NS_ERROR);
 
     return NSConsumerPushEvent(discoverTask);
 }
 
-NSResult NSSubscribe(NSProvider * provider)
+NSResult NSSubscribe(const char * providerId)
 {
+    NS_VERIFY_NOT_NULL(providerId, NS_ERROR);
     bool isStartedConsumer = NSIsStartedConsumer();
     NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
 
-    NSTask * subscribeTask = NSMakeTask(TASK_CONSUMER_REQ_SUBSCRIBE, (void *) provider);
+    NSProvider_internal * provInternal = NSConsumerFindNSProvider(providerId);
+    NS_VERIFY_NOT_NULL(provInternal, NS_ERROR);
+
+    NSProvider * prov = (NSProvider *)NSCopyProvider(provInternal);
+    NSRemoveProvider_internal(provInternal);
+    NS_VERIFY_NOT_NULL(prov, NS_ERROR);
+
+    NSTask * subscribeTask = NSMakeTask(TASK_CONSUMER_REQ_SUBSCRIBE, (void *) prov);
     NS_VERIFY_NOT_NULL(subscribeTask, NS_ERROR);
 
     return NSConsumerPushEvent(subscribeTask);
 }
 
-NSResult NSUnsubscribe(NSProvider * provider)
+NSResult NSUnsubscribe(const char * providerId)
 {
+    NS_VERIFY_NOT_NULL(providerId, NS_ERROR);
     bool isStartedConsumer = NSIsStartedConsumer();
     NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
 
-    NSTask * unsubscribeTask = NSMakeTask(TASK_CONSUMER_REQ_SUBSCRIBE_CANCEL, (void *) provider);
+    NSProvider_internal * provInternal = NSConsumerFindNSProvider(providerId);
+    NS_VERIFY_NOT_NULL(provInternal, NS_ERROR);
+
+    NSProvider * prov = (NSProvider *)NSCopyProvider((NSProvider_internal *) provInternal);
+    NSRemoveProvider_internal(provInternal);
+    NS_VERIFY_NOT_NULL(prov, NS_ERROR);
+
+    NSTask * unsubscribeTask = NSMakeTask(TASK_CONSUMER_REQ_SUBSCRIBE_CANCEL, (void *) prov);
     NS_VERIFY_NOT_NULL(unsubscribeTask, NS_ERROR);
 
     return NSConsumerPushEvent(unsubscribeTask);
@@ -105,6 +152,7 @@ NSResult NSUnsubscribe(NSProvider * provider)
 
 NSResult NSConsumerSendSyncInfo(const char * providerId, uint64_t messageId, NSSyncType type)
 {
+    NS_VERIFY_NOT_NULL(providerId, NS_ERROR);
     bool isStartedConsumer = NSIsStartedConsumer();
     NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
 
@@ -134,34 +182,61 @@ NSResult NSRescanProvider()
 
 NSProvider * NSConsumerGetProvider(const char * providerId)
 {
+    NS_VERIFY_NOT_NULL(providerId, NULL);
     bool isStartedConsumer = NSIsStartedConsumer();
     NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NULL);
 
     NS_VERIFY_NOT_NULL(providerId, NULL);
 
-    return (NSProvider *) NSConsumerFindNSProvider(providerId);
+    NSProvider_internal * prov = NSConsumerFindNSProvider(providerId);
+    NS_VERIFY_NOT_NULL(prov, NULL);
+
+    NSProvider * retProv = NSCopyProvider(prov);
+    NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(retProv, NULL, NSRemoveProvider_internal(prov));
+    NSRemoveProvider_internal(prov);
+
+    return retProv;
 }
 
-NSMessage * NSConsumerGetMessage(uint64_t messageId)
+NSTopicLL * NSConsumerGetTopicList(const char * providerId)
 {
+    NS_VERIFY_NOT_NULL(providerId, NULL);
     bool isStartedConsumer = NSIsStartedConsumer();
     NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NULL);
 
-    char msgId[NS_DEVICE_ID_LENGTH] = { 0, };
-    snprintf(msgId, NS_DEVICE_ID_LENGTH, "%lld", (long long int)messageId);
+    NS_LOG_V(INFO_PRIVATE, "NSProvider ID: %s", providerId);
+    NSProvider_internal * prov_internal = NSConsumerFindNSProvider(providerId);
+    NS_VERIFY_NOT_NULL(prov_internal, NULL);
+
+    NSTopicLL * retTopics = prov_internal->topicLL;
+    prov_internal->topicLL = NULL;
+    NSRemoveProvider_internal(prov_internal);
 
-    return (NSMessage *) NSConsumerFindNSMessage(msgId);
+    return retTopics;
 }
 
-NSResult NSDropNSMessage(NSMessage * obj)
+NSResult NSConsumerUpdateTopicList(const char * providerId, NSTopicLL * topics)
 {
-    NS_VERIFY_NOT_NULL(obj, NS_ERROR);
+    NS_VERIFY_NOT_NULL(providerId, NS_ERROR);
+    NS_VERIFY_NOT_NULL(topics, NS_ERROR);
+    bool isStartedConsumer = NSIsStartedConsumer();
+    NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
 
-    obj->messageId = 0;
-    NSOICFree(obj->title);
-    NSOICFree(obj->contentText);
-    NSOICFree(obj->sourceName);
-    NSOICFree(obj);
+    NSProvider_internal * prov_internal = NSConsumerFindNSProvider(providerId);
+    NS_VERIFY_NOT_NULL(prov_internal, NS_ERROR);
+    NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(prov_internal->topicLL, NS_ERROR,
+                         NSRemoveProvider_internal(prov_internal));
 
-    return NS_OK;
+    NSSelector selector = prov_internal->accessPolicy;
+    NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(
+            selector == NS_SELECTION_CONSUMER ? (void *) 1 : NULL, NS_ERROR,
+            NSRemoveProvider_internal(prov_internal));
+
+    NSRemoveTopicLL(prov_internal->topicLL);
+    prov_internal->topicLL = NSCopyTopicLL(topics);
+
+    NSTask * topicTask = NSMakeTask(TASK_CONSUMER_SELECT_TOPIC_LIST, (void *) prov_internal);
+    NS_VERIFY_NOT_NULL(topicTask, NS_ERROR);
+
+    return NSConsumerPushEvent(topicTask);
 }