#include "NSCommon.h"
#include "NSConsumerCommon.h"
-#include "NSConsumerMessageHandler.h"
+#include "NSConstants.h"
+#include "NSConsumerScheduler.h"
+#include "NSUtil.h"
#include "oic_malloc.h"
+#include "oic_string.h"
// Public APIs
-NSResult NSStartConsumer(
- NSProviderDiscoveredCallback discoverCb,
- NSNotificationReceivedCallback postCb,
- NSSyncCallback syncCb)
+NSResult NSStartConsumer(NSConsumerConfig config)
{
- if (NSIsStartedConsumer())
- {
- printf("is already started consumer service?\n");
- return NS_OK;
- }
-
- NSSetDiscoverProviderCb(discoverCb);
- NSSetNotificationPostedCb(postCb);
- NSSetNotificationSyncCb(syncCb);
+ bool isStartedConsumer = NSIsStartedConsumer();
+ NS_VERIFY_NOT_NULL(isStartedConsumer == false ? (void *) 1 : NULL, NS_OK);
+
+ NS_VERIFY_NOT_NULL(config.messageCb, NS_ERROR);
+ NS_VERIFY_NOT_NULL(config.syncInfoCb, NS_ERROR);
+ NS_VERIFY_NOT_NULL(config.changedCb, NS_ERROR);
+
+ NSSetMessagePostedCb(config.messageCb);
+ NSSetNotificationSyncCb(config.syncInfoCb);
+ NSSetProviderChangedCb(config.changedCb);
NSSetIsStartedConsumer(true);
- if (NS_OK != NSConsumerMessageHandlerInit())
- {
- return NS_ERROR;
- }
+ NSResult ret = NSConsumerMessageHandlerInit();
+ NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(ret == NS_OK ? (void *) 1 : NULL,
+ NS_ERROR, NSStopConsumer());
return NS_OK;
}
NSResult NSStopConsumer()
{
- NSSetDiscoverProviderCb(NULL);
- NSSetNotificationPostedCb(NULL);
+ bool isStartedConsumer = NSIsStartedConsumer();
+ NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
+
+ NSSetMessagePostedCb(NULL);
NSSetNotificationSyncCb(NULL);
+ NSSetProviderChangedCb(NULL);
NSSetIsStartedConsumer(false);
+ NSConsumerMessageHandlerExit();
+
return NS_OK;
}
-NSResult NSSubscribeProvider(NSProvider * provider)
+#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);
+
+ 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)
{
- NSTask * subscribeTask = NSMakeTask(TASK_CONSUMER_REQ_SUBSCRIBE, (void *) provider);
- if (!subscribeTask)
- {
- NS_CONSUMER_LOG(ERROR, "NSTask allocation fail");
- return NS_ERROR;
- }
+ 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(const char * providerId)
+{
+ NS_VERIFY_NOT_NULL(providerId, NS_ERROR);
+ bool isStartedConsumer = NSIsStartedConsumer();
+ NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
+
+ 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 NSUnsubscribeProvider(NSProvider * provider)
+NSResult NSUnsubscribe(const char * providerId)
{
- NSTask * unsubscribeTask = NSMakeTask(TASK_CONSUMER_REQ_SUBSCRIBE_CANCEL, (void *) provider);
- if (!unsubscribeTask)
- {
- NS_CONSUMER_LOG(ERROR, "NSTask allocation fail");
- return NS_ERROR;
- }
+ NS_VERIFY_NOT_NULL(providerId, NS_ERROR);
+ bool isStartedConsumer = NSIsStartedConsumer();
+ NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
+
+ 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);
}
+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);
+
+ NSSyncInfo * syncInfo = (NSSyncInfo *)OICMalloc(sizeof(NSSyncInfo));
+ NS_VERIFY_NOT_NULL(syncInfo, NS_ERROR);
+
+ OICStrcpy(syncInfo->providerId, sizeof(char) * NS_DEVICE_ID_LENGTH, providerId);
+ syncInfo->messageId = messageId;
+ syncInfo->state = type;
+
+ NSTask * syncTask = NSMakeTask(TASK_MAKE_SYNCINFO, (void *) syncInfo);
+ NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(syncTask, NS_ERROR, NSOICFree(syncInfo));
+
+ return NSConsumerPushEvent(syncTask);
+}
+
NSResult NSRescanProvider()
{
+ bool isStartedConsumer = NSIsStartedConsumer();
+ NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
+
NSTask * discoverTask = NSMakeTask(TASK_CONSUMER_REQ_DISCOVER, NULL);
- if (!discoverTask)
- {
- NS_CONSUMER_LOG(ERROR, "NSTask allocation fail");
- return NS_ERROR;
- }
+ NS_VERIFY_NOT_NULL(discoverTask, NS_ERROR);
return NSConsumerPushEvent(discoverTask);
}
-NSResult NSRead(NSMessage * obj)
+NSProvider * NSConsumerGetProvider(const char * providerId)
{
- NSTask * readTask = NSMakeTask(TASK_SEND_READ, (void *) obj);
- if (!readTask)
- {
- NS_CONSUMER_LOG(ERROR, "NSTask allocation fail");
- return NS_ERROR;
- }
-
- return NSConsumerPushEvent(readTask);
+ 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);
+
+ 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;
}
-NSResult NSDismiss(NSMessage * obj)
+NSTopicLL * NSConsumerGetTopicList(const char * providerId)
{
- NSTask * dismissTask = NSMakeTask(TASK_SEND_DISMISS, (void *) obj);
- if (!dismissTask)
- {
- NS_CONSUMER_LOG(ERROR, "NSTask allocation fail");
- return NS_ERROR;
- }
-
- return NSConsumerPushEvent(dismissTask);
+ NS_VERIFY_NOT_NULL(providerId, NULL);
+ bool isStartedConsumer = NSIsStartedConsumer();
+ NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NULL);
+
+ 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 retTopics;
}
-NSResult NSDropNSObject(NSMessage * obj)
+NSResult NSConsumerUpdateTopicList(const char * providerId, NSTopicLL * topics)
{
- if (!obj)
- {
- return NS_ERROR;
- }
-
- if (obj->mId)
- {
- OICFree(obj->mId);
- obj->mId = NULL;
- }
-
- if (obj->mTitle)
- {
- OICFree(obj->mTitle);
- obj->mTitle = NULL;
- }
-
- if (obj->mContentText)
- {
- OICFree(obj->mContentText);
- obj->mContentText = NULL;
- }
-
- OICFree(obj);
+ 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);
- return NS_OK;
+ 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));
+
+ 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);
}