replace : iotivity -> iotivity-sec
[platform/upstream/iotivity.git] / service / notification / src / provider / NSProviderNotification.c
index 3c31b98..0119116 100644 (file)
 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
 #include "NSProviderNotification.h"
+#include "NSProviderListener.h"
+#include "NSProviderSystem.h"
 
-NSResult NSInitMessageList()
+NSResult NSSetMessagePayload(NSMessage *msg, OCRepPayload** msgPayload)
 {
-    messageList = NSCacheCreate();
-    messageList->cacheType = NS_PROVIDER_CACHE_MESSAGE;
-    return NS_OK;
-}
+    NS_LOG(DEBUG, "NSSetMessagePayload - IN");
 
-NSResult NSGetMessagePayload(NSMessage *msg, OCRepPayload** msgPayload)
-{
-
-    *msgPayload = OCRepPayloadCreate();
+    *msgPayload = msg->extraInfo != NULL ? msg->extraInfo : OCRepPayloadCreate();
 
     if (!*msgPayload)
     {
-        OIC_LOG(ERROR, NOTIFICATION_TAG, PCF("Failed to allocate payload"));
+        NS_LOG(ERROR, "Failed to allocate payload");
         return NS_ERROR;
     }
 
-    OCRepPayloadSetUri(*msgPayload, NSGetNotificationMessageUri());
-    OCRepPayloadSetPropString(*msgPayload, NS_ATTRIBUTE_ID, msg->mId);
-    OCRepPayloadSetPropString(*msgPayload, NS_ATTRIBUTE_TITLE, msg->mTitle);
-    OCRepPayloadSetPropString(*msgPayload, NS_ATTRIBUTE_TEXT, msg->mContentText);
+    OCRepPayloadSetUri(*msgPayload, NS_COLLECTION_MESSAGE_URI);
+    OCRepPayloadSetPropInt(*msgPayload, NS_ATTRIBUTE_MESSAGE_ID, msg->messageId);
+    OCRepPayloadSetPropString(*msgPayload, NS_ATTRIBUTE_PROVIDER_ID, msg->providerId);
+
+    NSDuplicateSetPropertyInt(msgPayload, NS_ATTRIBUTE_TYPE, msg->type);
+    NSDuplicateSetPropertyInt(msgPayload, NS_ATTRIBUTE_TTL, msg->ttl);
+    NSDuplicateSetPropertyString(msgPayload, NS_ATTRIBUTE_DATETIME, msg->dateTime);
+    NSDuplicateSetPropertyString(msgPayload, NS_ATTRIBUTE_TITLE, msg->title);
+    NSDuplicateSetPropertyString(msgPayload, NS_ATTRIBUTE_TEXT, msg->contentText);
+    NSDuplicateSetPropertyString(msgPayload, NS_ATTRIBUTE_SOURCE, msg->sourceName);
+    NSDuplicateSetPropertyString(msgPayload, NS_ATTRIBUTE_TOPIC_NAME, msg->topic);
 
+    if (msg->mediaContents)
+    {
+        NSDuplicateSetPropertyString(msgPayload, NS_ATTRIBUTE_ICON_IMAGE,
+                msg->mediaContents->iconImage);
+    }
+
+    NS_LOG(DEBUG, "NSSetMessagePayload - OUT");
     return NS_OK;
 }
 
-NSResult NSGetSyncPayload(NSSync *sync, OCRepPayload** syncPayload)
+NSResult NSSetSyncPayload(NSSyncInfo *sync, OCRepPayload** syncPayload)
 {
+    NS_LOG(DEBUG, "NSSetSyncPayload - IN");
 
     *syncPayload = OCRepPayloadCreate();
 
     if (!*syncPayload)
     {
-        OIC_LOG(ERROR, NOTIFICATION_TAG, PCF("Failed to allocate payload"));
+        NS_LOG(ERROR, "Failed to allocate payload");
         return NS_ERROR;
     }
 
-    OCRepPayloadSetUri(*syncPayload, NSGetNotificationSyncUri());
-    OCRepPayloadSetPropString(*syncPayload, NS_ATTRIBUTE_ID, sync->mMessageId);
-    OCRepPayloadSetPropInt(*syncPayload, NS_ATTRIBUTE_STATE, sync->mState);
+    OCRepPayloadSetUri(*syncPayload, NS_COLLECTION_SYNC_URI);
 
+    OCRepPayloadSetPropString(*syncPayload, NS_ATTRIBUTE_PROVIDER_ID, sync->providerId);
+    OCRepPayloadSetPropInt(*syncPayload, NS_ATTRIBUTE_MESSAGE_ID, sync->messageId);
+    OCRepPayloadSetPropInt(*syncPayload, NS_ATTRIBUTE_STATE, sync->state);
+
+    NS_LOG(DEBUG, "NSSetSyncPayload - OUT");
     return NS_OK;
 }
 
-NSResult NSSendMessage(NSMessage *msg)
+#ifdef WITH_MQ
+OCStackResult NSProviderPublishTopic(OCRepPayload * payload, OCClientResponseHandler response)
 {
-    OIC_LOG(DEBUG, NOTIFICATION_TAG, "Send Notification Message to consumer");
-    int i;
-    // Set Resource and get resource handle
+    NS_LOG(DEBUG, "NSProviderPublishTopic - IN");
+    OCCallbackData cbData;
+    memset(&cbData, 0, sizeof(OCCallbackData));
+    cbData.cb = response;
+    cbData.cd = NULL;
+    cbData.context = NULL;
+
+    NSMQServerInfo * serverInfo = NSGetMQServerInfo();
+
+    if (!serverInfo)
+    {
+        NS_LOG(DEBUG, "serverInfo is not NULL");
+        NS_LOG_V(DEBUG, "serverInfo->serverUri = %s", serverInfo->serverUri);
+    }
+
+    NS_LOG(DEBUG, "NSProviderPublishTopic - OUT");
+
+    return OCDoResource(NULL, OC_REST_POST, serverInfo->serverUri, serverInfo->devAddr,
+            (OCPayload *)payload, CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);
+}
+#endif
+
+NSResult NSSendNotification(NSMessage *msg)
+{
+    NS_LOG(DEBUG, "NSSendMessage - IN");
+
     OCResourceHandle rHandle;
-    OCObservationId obArray[255] =
-    { 0, };
-    int obCount = 0;
+    OCObservationId obArray[255] = { 0, };
+    int obCount = 0, i;
+
     if (NSPutMessageResource(msg, &rHandle) != NS_OK)
     {
-        OIC_LOG(ERROR, NOTIFICATION_TAG, PCF("Fail to put notification resource"));
+        NS_LOG(ERROR, "fail to Put notification resource");
         return NS_ERROR;
     }
 
-    // Send Notification to subscribers
+    OCRepPayload* payload = NULL;
 
-    if (consumerSubList->head == NULL)
+    if (NSSetMessagePayload(msg, &payload) != NS_OK)
     {
-        printf("printf - no observers (consumerSubList->head == NULL)\n");
-        OIC_LOG(ERROR, NOTIFICATION_TAG, PCF("no observers"));
+        NS_LOG(ERROR, "fail to Get message payload");
         return NS_ERROR;
     }
 
-    OCRepPayload* payload;
-    printf("printf - no observers - 1\n");
-    if (NSGetMessagePayload(msg, &payload) != NS_OK)
+#ifdef WITH_MQ
+    if (NSGetMQServerInfo())
+    {
+        NSProviderPublishTopic(OCRepPayloadClone(payload), NSProviderPublishMQResponseCB);
+    }
+#endif
+
+    if (consumerSubList->head == NULL)
     {
-        printf("printf - no observers - 2\n");
-        OIC_LOG(ERROR, NOTIFICATION_TAG, PCF("Failed to allocate payload"));
+        NS_LOG(ERROR, "SubList->head is NULL, empty SubList");
+        OCRepPayloadDestroy(payload);
+        msg->extraInfo = NULL;
         return NS_ERROR;
     }
 
-    printf("printf - no observers - 3\n");
     NSCacheElement * it = consumerSubList->head;
-    printf("printf - no observers - 4\n");
+
     while (it)
     {
-        printf("printf - no observers - 5\n");
         NSCacheSubData * subData = (NSCacheSubData *) it->data;
-        printf("NS_ subData->id = %s\n", subData->id);
-        printf("NS_ subData->messageId = %d\n", subData->messageObId);
-        printf("NS_ subData->obID = %d\n", subData->syncObId);
-        printf("NS_ subData->isWhite = %d\n", subData->isWhite);
+        NS_LOG_V(INFO_PRIVATE, "message subData->id = %s", subData->id);
+        NS_LOG_V(DEBUG, "subData->messageId = %d", subData->messageObId);
+        NS_LOG_V(DEBUG, "subData->cloud_messageId = %d", subData->remote_messageObId);
+        NS_LOG_V(DEBUG, "subData->syncId = %d", subData->syncObId);
+        NS_LOG_V(DEBUG, "subData->cloud_syncId = %d", subData->remote_syncObId);
+        NS_LOG_V(DEBUG, "subData->isWhite = %d", subData->isWhite);
 
-        printf("printf - no observers - 6\n");
         if (subData->isWhite)
         {
-            printf("printf - no observers - 7\n");
-            obArray[obCount++] = subData->messageObId;
-            printf("printf - no observers - 8\n");
-        }
+            if(subData->messageObId != 0)
+            {
+                if (msg->topic && (msg->topic)[0] != '\0')
+                {
+                    NS_LOG_V(DEBUG, "this is topic message: %s", msg->topic);
+
+                    if (NSProviderIsTopicSubScribed(consumerTopicList->head, subData->id, msg->topic))
+                    {
+                        obArray[obCount++] = subData->messageObId;
+                    }
+                }
+                else
+                {
+                    obArray[obCount++] = subData->messageObId;
+                }
+            }
 
+#if (defined WITH_CLOUD)
+            if (subData->remote_messageObId != 0)
+            {
+                if (msg->topic && (msg->topic)[0] != '\0')
+                {
+                    NS_LOG_V(DEBUG, "this is topic message via remote server: %s", msg->topic);
+                    if (NSProviderIsTopicSubScribed(consumerTopicList->head, subData->id, msg->topic))
+                    {
+                        obArray[obCount++] = subData->remote_messageObId;
+                    }
+                }
+                else
+                {
+                    obArray[obCount++] = subData->remote_messageObId;
+                }
+            }
+#endif
+
+        }
         it = it->next;
     }
-    printf("printf - no observers - 9\n");
+
     for (i = 0; i < obCount; ++i)
     {
-        printf("NS_ -------------------------------------------------------message\n");
-        printf("NS_ whiteList->idList[%d] = %d\n", i, obArray[i]);
-        printf("NS_ -------------------------------------------------------message\n");
+        NS_LOG(DEBUG, "-------------------------------------------------------message\n");
+        NS_LOG_V(DEBUG, "SubScription WhiteList[%d] = %d", i, obArray[i]);
+        NS_LOG(DEBUG, "-------------------------------------------------------message\n");
+    }
+
+    if (!obCount)
+    {
+        NS_LOG(ERROR, "observer count is zero");
+        OCRepPayloadDestroy(payload);
+        msg->extraInfo = NULL;
+        return NS_ERROR;
     }
-    printf("printf - no observers - 10\n");
-    // Notify message to subscribers
 
     OCStackResult ocstackResult = OCNotifyListOfObservers(rHandle, obArray, obCount, payload,
             OC_LOW_QOS);
-    printf("NS_ message ocstackResult = %d\n", ocstackResult);
+
+    NS_LOG_V(DEBUG, "Message ocstackResult = %d", ocstackResult);
 
     if (ocstackResult != OC_STACK_OK)
     {
-        printf("printf - no observers - 11\n");
-        OIC_LOG(ERROR, NOTIFICATION_TAG, "fail to send message");
+        NS_LOG(ERROR, "fail to send message");
         OCRepPayloadDestroy(payload);
+        msg->extraInfo = NULL;
         return NS_ERROR;
-
     }
-    printf("printf - no observers - 12\n");
+
     OCRepPayloadDestroy(payload);
+    msg->extraInfo = NULL;
 
+    NS_LOG(DEBUG, "NSSendMessage - OUT");
     return NS_OK;
 }
 
-NSResult NSSendSync(NSSync *sync)
+NSResult NSSendSync(NSSyncInfo *sync)
 {
-    OIC_LOG(DEBUG, NOTIFICATION_TAG, "Send Notification Sync to consumer");
+    NS_LOG(DEBUG, "NSSendSync - IN");
 
     OCObservationId obArray[255] = { 0, };
     int obCount = 0;
@@ -158,7 +239,7 @@ NSResult NSSendSync(NSSync *sync)
     OCResourceHandle rHandle;
     if (NSPutSyncResource(sync, &rHandle) != NS_OK)
     {
-        OIC_LOG(ERROR, NOTIFICATION_TAG, PCF("Fail to put sync resource"));
+        NS_LOG(ERROR, PCF("Fail to put sync resource"));
         return NS_ERROR;
     }
 
@@ -167,46 +248,78 @@ NSResult NSSendSync(NSSync *sync)
     while (it)
     {
         NSCacheSubData * subData = (NSCacheSubData *) it->data;
+        NS_LOG_V(INFO_PRIVATE, "sync subData->id = %s", subData->id);
+        NS_LOG_V(DEBUG, "subData->messageId = %d", subData->messageObId);
+        NS_LOG_V(DEBUG, "subData->cloud_messageId = %d", subData->remote_messageObId);
+        NS_LOG_V(DEBUG, "subData->syncId = %d", subData->syncObId);
+        NS_LOG_V(DEBUG, "subData->cloud_syncId = %d", subData->remote_syncObId);
+        NS_LOG_V(DEBUG, "subData->isWhite = %d", subData->isWhite);
+
         if (subData->isWhite)
         {
-            obArray[obCount++] = subData->syncObId;
-        }
+            if (subData->syncObId != 0)
+            {
+                obArray[obCount++] = subData->syncObId;
+            }
 
+#if (defined WITH_CLOUD)
+            if (subData->remote_syncObId != 0)
+            {
+                obArray[obCount++] = subData->remote_syncObId;
+            }
+#endif
+        }
         it = it->next;
-
     }
 
-    // Send sync to subscribers
-
-    OCRepPayload* payload;
-    if (NSGetSyncPayload(sync, &payload) != NS_OK)
+    OCRepPayload* payload = NULL;
+    if (NSSetSyncPayload(sync, &payload) != NS_OK)
     {
-        OIC_LOG(ERROR, NOTIFICATION_TAG, PCF("Failed to allocate payload"));
+        NS_LOG(ERROR, "Failed to allocate payload");
         return NS_ERROR;
     }
 
-    // Notify sync to subscribers
+#ifdef WITH_MQ
+    if (NSGetMQServerInfo())
+    {
+        OCRepPayload* MQPayload = OCRepPayloadClone(payload);
+        NSMessageType MQType = 0;
+
+        if (sync->state == NS_SYNC_READ)
+        {
+            MQType = NS_MESSAGE_READ;
+        }
+        else if (sync->state == NS_SYNC_DELETED)
+        {
+            MQType = NS_MESSAGE_DELETED;
+        }
+
+        OCRepPayloadSetPropInt(MQPayload, NS_ATTRIBUTE_TYPE, (int64_t) MQType);
+        NSProviderPublishTopic(MQPayload, NSProviderPublishMQResponseCB);
+    }
+#endif
 
     for (i = 0; i < obCount; ++i)
     {
-        printf("NS_ -------------------------------------------------------message\n");
-        printf("NS_ whiteList->idList[%d] = %d\n", i, obArray[i]);
-        printf("NS_ -------------------------------------------------------message\n");
+        NS_LOG(DEBUG, "-------------------------------------------------------message\n");
+        NS_LOG_V(DEBUG, "Sync WhiteList[%d] = %d", i, obArray[i]);
+        NS_LOG(DEBUG, "-------------------------------------------------------message\n");
     }
 
     OCStackResult ocstackResult = OCNotifyListOfObservers(rHandle, obArray,
             obCount, payload, OC_LOW_QOS);
 
-    printf("NS_ sync ocstackResult = %d\n", ocstackResult);
+    NS_LOG_V(DEBUG, "Sync ocstackResult = %d", ocstackResult);
     if (ocstackResult != OC_STACK_OK)
     {
-        OIC_LOG(ERROR, NOTIFICATION_TAG, "fail to send Sync");
+        NS_LOG(ERROR, "fail to send Sync");
         OCRepPayloadDestroy(payload);
         return NS_ERROR;
-
     }
+
     OCRepPayloadDestroy(payload);
 
+    NS_LOG(DEBUG, "NSSendSync - OUT");
     return NS_OK;
 }
 
@@ -214,7 +327,7 @@ void * NSNotificationSchedule(void *ptr)
 {
     if (ptr == NULL)
     {
-        OIC_LOG(DEBUG, NOTIFICATION_TAG, "Create NSNotifiactionSchedule");
+        NS_LOG(DEBUG, "Create NSNotifiactionSchedule");
     }
 
     while (NSIsRunning[NOTIFICATION_SCHEDULER])
@@ -231,28 +344,32 @@ void * NSNotificationSchedule(void *ptr)
             {
                 case TASK_SEND_NOTIFICATION:
                 {
-                    NSMessage * nsMsg = node->taskData;
-                    NSSendMessage(nsMsg);
-                    break;
+                    NS_LOG(DEBUG, "CASE TASK_SEND_NOTIFICATION : ");
+                    NSSendNotification((NSMessage *)node->taskData);
+                    NSFreeMessage((NSMessage *)node->taskData);
                 }
+                    break;
                 case TASK_SEND_READ:
-                    NSSendSync((NSSync*) node->taskData);
+                    NS_LOG(DEBUG, "CASE TASK_SEND_READ : ");
+                    NSSendSync((NSSyncInfo*) node->taskData);
+                    NSFreeSync((NSSyncInfo*) node->taskData);
                     break;
                 case TASK_RECV_READ:
-                    NSSendSync((NSSync*) node->taskData);
-                    NSPushQueue(RESPONSE_SCHEDULER, TASK_CB_SYNC, node->taskData);
+                    NS_LOG(DEBUG, "CASE TASK_RECV_READ : ");
+                    NSSendSync((NSSyncInfo*) node->taskData);
+                    NSPushQueue(CALLBACK_RESPONSE_SCHEDULER, TASK_CB_SYNC, node->taskData);
                     break;
-
                 default:
-                    OIC_LOG(ERROR, NOTIFICATION_TAG, "Unknown type message");
+                    NS_LOG(ERROR, "Unknown type message");
                     break;
 
             }
-            OICFree(node);
+            NSOICFree(node);
         }
 
         pthread_mutex_unlock(&NSMutex[NOTIFICATION_SCHEDULER]);
-
     }
+
+    NS_LOG(INFO, "Destroy NSNotificationSchedule");
     return NULL;
 }