Merge "Merge remote-tracking branch 'origin/master' into notification-service" into...
[platform/upstream/iotivity.git] / service / notification / src / provider / NSProviderInterface.c
index 16d98b3..3b8ca0e 100644 (file)
 #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