#include "NSProviderInterface.h"\r
#include "NSProviderScheduler.h"\r
#include "NSProviderListener.h"\r
-#include "NSCacheAdapter.h"\r
-#include "cautilinterface.h"\r
#include "NSProviderSubscription.h"\r
#include "NSProviderNotification.h"\r
+#include "NSProviderCallbackResponse.h"\r
+#include "NSStorageAdapter.h"\r
+#include "NSProviderMemoryCache.h"\r
+#include "NSProviderTopic.h"\r
+#include "oic_malloc.h"\r
+#include "oic_string.h"\r
+#include "cautilinterface.h"\r
+#include "NSProviderSystem.h"\r
+#include "oic_time.h"\r
\r
bool initProvider = false;\r
-static NSSubscribeRequestCallback g_subscribeRequestCb = NULL;\r
-static NSSyncCallback g_syncCb = NULL;\r
-pthread_mutex_t NSCacheMutex;\r
\r
-void NSRegisterSubscribeRequestCb(NSSubscribeRequestCallback subscribeRequestCb)\r
-{\r
- g_subscribeRequestCb = subscribeRequestCb;\r
-}\r
+pthread_mutex_t nsInitMutex;\r
\r
-void NSRegisterSyncCb(NSSyncCallback syncCb)\r
+void initializeMutex()\r
{\r
- g_syncCb = syncCb;\r
+ static pthread_mutex_t initMutex = PTHREAD_MUTEX_INITIALIZER;\r
+ nsInitMutex = initMutex;\r
}\r
\r
-void NSSubscribeRequestCb(NSConsumer *consumer)\r
+NSResult NSStartProvider(NSProviderConfig config)\r
{\r
- g_subscribeRequestCb(consumer);\r
-}\r
+ NS_LOG(DEBUG, "NSStartProvider - IN");\r
\r
-void NSSyncCb(NSSync *sync)\r
-{\r
- g_syncCb(sync);\r
-}\r
-\r
-NSResult NSStartProvider(NSAccessPolicy policy, NSSubscribeRequestCallback subscribeRequestCb,\r
- NSSyncCallback syncCb)\r
-{\r
- OIC_LOG(INFO, INTERFACE_TAG, "Notification Service Start Provider..");\r
+ initializeMutex();\r
\r
- NSSetSubscriptionAcceptPolicy(policy);\r
+ pthread_mutex_lock(&nsInitMutex);\r
\r
if (!initProvider)\r
{\r
+ NS_LOG(DEBUG, "Init Provider");\r
initProvider = true;\r
+ NSInitProviderInfo(config.userInfo);\r
+ NSSetSubscriptionAccessPolicy(config.policy);\r
+ NSRegisterSubscribeRequestCb(config.subRequestCallback);\r
+ NSRegisterSyncCb(config.syncInfoCallback);\r
+ CARegisterNetworkMonitorHandler((CAAdapterStateChangedCB)NSProviderAdapterStateListener,\r
+ (CAConnectionStateChangedCB)NSProviderConnectionStateListener);\r
\r
NSSetList();\r
NSInitScheduler();\r
NSStartScheduler();\r
- }\r
-\r
- NSRegisterSubscribeRequestCb(subscribeRequestCb);\r
- NSRegisterSyncCb(syncCb);\r
\r
- CARegisterNetworkMonitorHandler(NSProviderAdapterStateListener,\r
- NSProviderConnectionStateListener);\r
-\r
- NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);\r
- NSPushQueue(DISCOVERY_SCHEDULER, TASK_REGISTER_RESOURCE, NULL);\r
+ NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);\r
+ NSPushQueue(DISCOVERY_SCHEDULER, TASK_REGISTER_RESOURCE, NULL);\r
+ }\r
+ else\r
+ {\r
+ NS_LOG(DEBUG, "Already started Notification Provider");\r
+ }\r
+ pthread_mutex_unlock(&nsInitMutex);\r
\r
+ NS_LOG(DEBUG, "NSStartProvider - OUT");\r
return NS_OK;\r
}\r
\r
void NSSetList()\r
{\r
- pthread_mutex_init(&NSCacheMutex, NULL);\r
+ NS_LOG(DEBUG, "NSSetList - IN");\r
+\r
+ pthread_mutexattr_init(&NSCacheMutexAttr);\r
+ int pthreadResult = pthread_mutexattr_settype(&NSCacheMutexAttr, PTHREAD_MUTEX_RECURSIVE);\r
+ pthread_mutex_init(&NSCacheMutex, &NSCacheMutexAttr);\r
+\r
NSInitSubscriptionList();\r
NSInitMessageList();\r
+ NS_LOG(DEBUG, "NSSetList - OUT");\r
+}\r
+\r
+void NSDestroyList()\r
+{\r
+ NSStorageDestroy(consumerSubList);\r
+ NSStorageDestroy(messageList);\r
+\r
+ pthread_mutex_destroy(&NSCacheMutex);\r
+ pthread_mutexattr_destroy(&NSCacheMutexAttr);\r
}\r
\r
NSResult NSStopProvider()\r
{\r
- NSRegisterSubscribeRequestCb((NSSubscribeRequestCallback)NULL);\r
- NSRegisterSyncCb((NSSyncCallback)NULL);\r
- initProvider = false;\r
+ NS_LOG(DEBUG, "NSStopProvider - IN");\r
+ pthread_mutex_lock(&nsInitMutex);\r
+\r
+ if(initProvider)\r
+ {\r
+ NSPushQueue(DISCOVERY_SCHEDULER, TASK_STOP_PRESENCE, NULL);\r
+ NSDeinitProviderInfo();\r
+ NSUnRegisterResource();\r
+ NSRegisterSubscribeRequestCb((NSSubscribeRequestCallback)NULL);\r
+ NSRegisterSyncCb((NSProviderSyncInfoCallback)NULL);\r
+ NSStopScheduler();\r
+ NSDestroyList();\r
+\r
+ initProvider = false;\r
+ }\r
+\r
+ pthread_mutex_unlock(&nsInitMutex);\r
+ NS_LOG(DEBUG, "NSStopProvider - OUT");\r
return NS_OK;\r
}\r
\r
-NSResult NSSendNotification(NSMessage *msg)\r
+#ifdef WITH_CLOUD\r
+NSResult NSProviderEnableRemoteService(char *serverAddress)\r
{\r
- OIC_LOG(INFO, INTERFACE_TAG, "Send Notification");\r
+ NS_LOG(DEBUG, "NSProviderEnableRemoteService - IN");\r
+ pthread_mutex_lock(&nsInitMutex);\r
+ \r
+ if(!initProvider)\r
+ {\r
+ NS_LOG(DEBUG, "Provider service has not been started yet");\r
+ pthread_mutex_unlock(&nsInitMutex);\r
+ return NS_FAIL;\r
+ }\r
\r
- NSPushQueue(NOTIFICATION_SCHEDULER, TASK_SEND_NOTIFICATION, msg);\r
+ NS_LOG_V(DEBUG, "Remote server address: %s", serverAddress);\r
+ NSPushQueue(DISCOVERY_SCHEDULER, TASK_PUBLISH_RESOURCE, serverAddress);\r
\r
+ pthread_mutex_unlock(&nsInitMutex);\r
+ NS_LOG(DEBUG, "NSProviderEnableRemoteService - OUT");\r
return NS_OK;\r
}\r
\r
-NSResult NSProviderReadCheck(NSMessage *msg)\r
+NSResult NSProviderDisableRemoteService(char *serverAddress)\r
{\r
- OIC_LOG(INFO, INTERFACE_TAG, "Read Sync");\r
+ NS_LOG(DEBUG, "NSProviderDisableRemoteService - IN");\r
+ pthread_mutex_lock(&nsInitMutex);\r
\r
- NSPushQueue(NOTIFICATION_SCHEDULER, TASK_SEND_READ, msg);\r
+ if(!initProvider)\r
+ {\r
+ NS_LOG(DEBUG, "Provider service has not been started yet");\r
+ return NS_FAIL;\r
+ }\r
+ NS_LOG_V(DEBUG, "Remote server address: %s", serverAddress);\r
\r
+ pthread_mutex_unlock(&nsInitMutex);\r
+ NS_LOG(DEBUG, "NSProviderDisableRemoteService - OUT");\r
return NS_OK;\r
}\r
+#endif\r
\r
-NSResult NSAccept(NSConsumer *consumer, bool accepted)\r
+NSResult NSSendMessage(NSMessage *msg)\r
{\r
- OIC_LOG(INFO, INTERFACE_TAG, "Response Acceptance");\r
+ NS_LOG(DEBUG, "NSSendNotification - IN");\r
+\r
+ pthread_mutex_lock(&nsInitMutex);\r
\r
+ if(msg == NULL)\r
+ {\r
+ NS_LOG(ERROR, "Msg is NULL");\r
+ pthread_mutex_unlock(&nsInitMutex);\r
+ return NS_ERROR;\r
+ }\r
+\r
+ NSMessage * newMsg = NSDuplicateMessage(msg);\r
+ NSPushQueue(NOTIFICATION_SCHEDULER, TASK_SEND_NOTIFICATION, newMsg);\r
+\r
+ pthread_mutex_unlock(&nsInitMutex);\r
+\r
+ NS_LOG(DEBUG, "NSSendNotification - OUT");\r
+ return NS_OK;\r
+}\r
+\r
+NSResult NSProviderSendSyncInfo(uint64_t messageId, NSSyncType type)\r
+{\r
+ NS_LOG(DEBUG, "NSProviderReadCheck - IN");\r
+ pthread_mutex_lock(&nsInitMutex);\r
+\r
+ NSSyncInfo * syncInfo = (NSSyncInfo *)OICMalloc(sizeof(NSSyncInfo));\r
+ OICStrcpy(syncInfo->providerId, UUID_STRING_SIZE, NSGetProviderInfo()->providerId);\r
+ syncInfo->messageId = messageId;\r
+ syncInfo->state = type;\r
+ NSPushQueue(NOTIFICATION_SCHEDULER, TASK_SEND_READ, syncInfo);\r
+\r
+ pthread_mutex_unlock(&nsInitMutex);\r
+ NS_LOG(DEBUG, "NSProviderReadCheck - OUT");\r
+ return NS_OK;\r
+}\r
+\r
+NSResult NSAcceptSubscription(NSConsumer *consumer, bool accepted)\r
+{\r
+ NS_LOG(DEBUG, "NSAccept - IN");\r
+\r
+ pthread_mutex_lock(&nsInitMutex);\r
+\r
+ NSConsumer * newConsumer = NSDuplicateConsumer(consumer);\r
if(accepted)\r
{\r
- NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_ALLOW, consumer);\r
+ NS_LOG(DEBUG, "accepted is true - ALLOW");\r
+ NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_ALLOW, newConsumer);\r
}\r
else\r
{\r
- NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_DENY, consumer);\r
+ NS_LOG(DEBUG, "accepted is false - DENY");\r
+ NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_DENY, newConsumer);\r
}\r
\r
+ pthread_mutex_unlock(&nsInitMutex);\r
+ NS_LOG(DEBUG, "NSAccept - OUT");\r
return NS_OK;\r
}\r
\r
-/*\r
-NSResult NSGetConsumerList(uint8_t *list, uint32_t size)\r
+NSMessage * NSCreateMessage()\r
{\r
- OIC_LOG(INFO, INTERFACE_TAG, "Get consumer list");\r
+ NS_LOG(DEBUG, "NSCreateMessage - IN");\r
+ pthread_mutex_lock(&nsInitMutex);\r
\r
- NSGetObsIdList(list);\r
- size = NSGetNumberOfObsList();\r
+ NSMessage * msg = NSInitializeMessage();\r
+ OICStrcpy(msg->providerId, UUID_STRING_SIZE, NSGetProviderInfo()->providerId);\r
\r
- return NS_OK;\r
-}*/\r
+ pthread_mutex_unlock(&nsInitMutex);\r
+ NS_LOG(DEBUG, "NSCreateMessage - OUT");\r
+ return msg;\r
+}\r
\r
-void * NSResponseSchedule(void * ptr)\r
+NSTopicList * NSProviderGetTopics(char *consumerId)\r
{\r
- if (ptr == NULL)\r
+ NS_LOG(DEBUG, "NSProviderGetTopics - IN");\r
+ pthread_mutex_lock(&nsInitMutex);\r
+\r
+ if(consumerId == NULL)\r
{\r
- OIC_LOG(INFO, INTERFACE_TAG, "Init NSResponseSchedule");\r
+ NS_LOG(DEBUG, "Get all the topics registered by user");\r
}\r
\r
- while (NSIsRunning[RESPONSE_SCHEDULER])\r
- {\r
- sem_wait(&NSSemaphore[RESPONSE_SCHEDULER]);\r
- pthread_mutex_lock(&NSMutex[RESPONSE_SCHEDULER]);\r
-\r
- if (NSHeadMsg[RESPONSE_SCHEDULER] != NULL)\r
- {\r
- NSTask *node = NSHeadMsg[RESPONSE_SCHEDULER];\r
- NSHeadMsg[RESPONSE_SCHEDULER] = node->nextTask;\r
-\r
- switch (node->taskType)\r
- {\r
- case TASK_CB_SUBSCRIPTION:\r
- {\r
- printf("before - TASK_CB_SUBSCRIPTION :\n");\r
- OCEntityHandlerRequest * request = (OCEntityHandlerRequest*)node->taskData;\r
- NSConsumer consumer;\r
-\r
- consumer.mId = strdup(request->devAddr.addr);\r
- int * obId = (int *) OICMalloc(sizeof(int));\r
- *obId = request->obsInfo.obsId;\r
- consumer.mUserData = obId;\r
-\r
- NSSubscribeRequestCb(&consumer);\r
- printf("after - TASK_CB_SUBSCRIPTION :\n");\r
- break;\r
- }\r
- case TASK_CB_SYNC:\r
- {\r
- NSSync * sync = (NSSync*)node->taskData;\r
- NSSyncCb(sync);\r
- break;\r
- }\r
- default:\r
- OIC_LOG(INFO, INTERFACE_TAG, "Response to User");\r
-\r
- // TODO: NSSubscribeRequestCb\r
-\r
- // TODO: NSSyncCb\r
-\r
- break;\r
-\r
- }\r
- OICFree(node);\r
- }\r
-\r
- pthread_mutex_unlock(&NSMutex[RESPONSE_SCHEDULER]);\r
+ NSTopicList * topicList = NSInitializeTopicList();\r
+ OICStrcpy(topicList->consumerId, UUID_STRING_SIZE, consumerId);\r
+ // OICStrcpy(topicList->topics, sizeof(NSTopic), NSGetTopics(consumerId));\r
\r
- }\r
- return NULL;\r
+ pthread_mutex_unlock(&nsInitMutex);\r
+ NS_LOG(DEBUG, "NSProviderGetTopics - OUT");\r
+\r
+ return topicList;\r
}\r
\r
-NSResult NSTestStartPresence()\r
+NSResult NSProviderSetTopics(NSTopicList *topicList)\r
{\r
- NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);\r
+ NS_LOG(DEBUG, "NSProviderSetTopics - IN");\r
+ pthread_mutex_lock(&nsInitMutex);\r
+\r
+ if(topicList->consumerId != NULL)\r
+ {\r
+ NS_LOG(DEBUG, "consumer id should be set by NULL to register topics");\r
+ return NS_FAIL;\r
+ }\r
+\r
+ NSPushQueue(TOPIC_SCHEDULER, TASK_REGISTER_TOPICS, topicList);\r
+\r
+ pthread_mutex_unlock(&nsInitMutex);\r
+ NS_LOG(DEBUG, "NSProviderSetTopics - OUT");\r
+ \r
return NS_OK;\r
}\r
\r
-NSResult NSTestStopPresence()\r
+NSResult NSProviderRecommendTopics(NSTopicList *topicList)\r
{\r
- NSPushQueue(DISCOVERY_SCHEDULER, TASK_STOP_PRESENCE, NULL);\r
+ NS_LOG(DEBUG, "NSProviderRecommendTopics - IN");\r
+ pthread_mutex_lock(&nsInitMutex);\r
+\r
+ if(topicList->consumerId == NULL)\r
+ {\r
+ NS_LOG(DEBUG, "consumer id should be set for topic subscription");\r
+ return NS_FAIL;\r
+ }\r
+\r
+ NSPushQueue(TOPIC_SCHEDULER, TASK_SUBSCRIBE_TOPICS, topicList);\r
+\r
+ pthread_mutex_unlock(&nsInitMutex);\r
+ NS_LOG(DEBUG, "NSProviderRecommendTopics - OUT");\r
return NS_OK;\r
}\r
\r
-\r