//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#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;
}
- if (consumerSubList->head == NULL)
+ OCRepPayload* payload = 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())
{
- printf("printf - no observers - 2\n");
- OIC_LOG(ERROR, NOTIFICATION_TAG, PCF("Failed to allocate payload"));
+ NSProviderPublishTopic(OCRepPayloadClone(payload), NSProviderPublishMQResponseCB);
+ }
+#endif
+
+ if (consumerSubList->head == NULL)
+ {
+ 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");
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;
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;
}
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;
}
{
if (ptr == NULL)
{
- OIC_LOG(DEBUG, NOTIFICATION_TAG, "Create NSNotifiactionSchedule");
+ NS_LOG(DEBUG, "Create NSNotifiactionSchedule");
}
while (NSIsRunning[NOTIFICATION_SCHEDULER])
NSTask *node = NSHeadMsg[NOTIFICATION_SCHEDULER];
NSHeadMsg[NOTIFICATION_SCHEDULER] = node->nextTask;
- switch ((int)node->taskType)
+ switch (node->taskType)
{
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;
}