//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#include "NSProviderNotification.h"
+#include "NSProviderListener.h"
+#include "NSProviderSystem.h"
-NSResult NSInitMessageList()
+NSResult NSSetMessagePayload(NSMessage *msg, OCRepPayload** msgPayload)
{
- NS_LOG(DEBUG, "NSInitMessageList - IN");
+ NS_LOG(DEBUG, "NSSetMessagePayload - IN");
- messageList = NSCacheCreate();
- messageList->cacheType = NS_PROVIDER_CACHE_MESSAGE;
-
- NS_LOG(DEBUG, "NSInitMessageList - OUT");
- return NS_OK;
-}
-
-NSResult NSGetMessagePayload(NSMessage *msg, OCRepPayload** msgPayload)
-{
- NS_LOG(DEBUG, "NSGetMessagePayload - IN");
-
- *msgPayload = OCRepPayloadCreate();
+ *msgPayload = msg->extraInfo != NULL ? msg->extraInfo : OCRepPayloadCreate();
if (!*msgPayload)
{
return NS_ERROR;
}
- OCRepPayloadSetUri(*msgPayload, NSGetNotificationMessageUri());
- if(msg->mId)
- OCRepPayloadSetPropString(*msgPayload, NS_ATTRIBUTE_ID, msg->mId);
- if(msg->mTitle)
- OCRepPayloadSetPropString(*msgPayload, NS_ATTRIBUTE_TITLE, msg->mTitle);
- if(msg->mContentText)
- OCRepPayloadSetPropString(*msgPayload, NS_ATTRIBUTE_TEXT, msg->mContentText);
- if(msg->mSource)
- OCRepPayloadSetPropString(*msgPayload, NS_ATTRIBUTE_SOURCE, msg->mSource);
-
- NS_LOG(DEBUG, "NSGetMessagePayload - OUT");
+ 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, "NSGetSyncPayload - IN");
+ NS_LOG(DEBUG, "NSSetSyncPayload - IN");
*syncPayload = OCRepPayloadCreate();
return NS_ERROR;
}
- OCRepPayloadSetUri(*syncPayload, NSGetNotificationSyncUri());
+ 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;
+}
+
+#ifdef WITH_MQ
+OCStackResult NSProviderPublishTopic(OCRepPayload * payload, OCClientResponseHandler response)
+{
+ 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(sync->mMessageId)
+ if (!serverInfo)
{
- OCRepPayloadSetPropString(*syncPayload, NS_ATTRIBUTE_ID, sync->mMessageId);
- OCRepPayloadSetPropInt(*syncPayload, NS_ATTRIBUTE_STATE, sync->mState);
+ NS_LOG(DEBUG, "serverInfo is not NULL");
+ NS_LOG_V(DEBUG, "serverInfo->serverUri = %s", serverInfo->serverUri);
}
- NS_LOG(DEBUG, "NSGetSyncPayload - OUT");
- return NS_OK;
+ 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 NSSendMessage(NSMessage *msg)
+NSResult NSSendNotification(NSMessage *msg)
{
NS_LOG(DEBUG, "NSSendMessage - IN");
OCResourceHandle rHandle;
- OCObservationId obArray[255] = { 0, };
+ OCObservationId obArray[3839] = { 0, };
int obCount = 0, i;
if (NSPutMessageResource(msg, &rHandle) != NS_OK)
return NS_ERROR;
}
- if (consumerSubList->head == NULL)
+ OCRepPayload* payload = NULL;
+
+ if (NSSetMessagePayload(msg, &payload) != NS_OK)
{
- NS_LOG(ERROR, "SubList->head is NULL, empty SubList");
+ NS_LOG(ERROR, "fail to Get message payload");
return NS_ERROR;
}
- OCRepPayload* payload;
+#ifdef WITH_MQ
+ if (NSGetMQServerInfo())
+ {
+ NSProviderPublishTopic(OCRepPayloadClone(payload), NSProviderPublishMQResponseCB);
+ }
+#endif
- if (NSGetMessagePayload(msg, &payload) != NS_OK)
+ if (consumerSubList->head == NULL)
{
- NS_LOG(ERROR, "fail to Get message payload");
+ NS_LOG(ERROR, "SubList->head is NULL, empty SubList");
+ OCRepPayloadDestroy(payload);
+ msg->extraInfo = NULL;
return NS_ERROR;
}
while (it)
{
NSCacheSubData * subData = (NSCacheSubData *) it->data;
- NS_LOG_V(DEBUG, "subData->id = %s", subData->id);
+ 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->obID = %d", subData->syncObId);
+ 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->messageObId;
- }
+ 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;
}
- NS_LOG_V(DEBUG, "observer Count = %d", obCount);
-
for (i = 0; i < obCount; ++i)
{
NS_LOG(DEBUG, "-------------------------------------------------------message\n");
NS_LOG(DEBUG, "-------------------------------------------------------message\n");
}
+ if (!obCount)
+ {
+ NS_LOG(ERROR, "observer count is zero");
+ OCRepPayloadDestroy(payload);
+ msg->extraInfo = NULL;
+ return NS_ERROR;
+ }
+
OCStackResult ocstackResult = OCNotifyListOfObservers(rHandle, obArray, obCount, payload,
OC_LOW_QOS);
{
NS_LOG(ERROR, "fail to send message");
OCRepPayloadDestroy(payload);
+ msg->extraInfo = NULL;
return NS_ERROR;
}
+
OCRepPayloadDestroy(payload);
- NSFreeMessage(msg);
+ msg->extraInfo = NULL;
NS_LOG(DEBUG, "NSSendMessage - OUT");
-
return NS_OK;
}
-NSResult NSSendSync(NSSync *sync)
+NSResult NSSendSync(NSSyncInfo *sync)
{
NS_LOG(DEBUG, "NSSendSync - IN");
- OCObservationId obArray[255] = { 0, };
+ OCObservationId obArray[3839] = { 0, };
int obCount = 0;
int i;
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;
-
}
- OCRepPayload* payload;
- if (NSGetSyncPayload(sync, &payload) != NS_OK)
+ OCRepPayload* payload = NULL;
+ if (NSSetSyncPayload(sync, &payload) != NS_OK)
{
NS_LOG(ERROR, "Failed to allocate payload");
return NS_ERROR;
}
+#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)
{
NS_LOG(DEBUG, "-------------------------------------------------------message\n");
obCount, payload, OC_LOW_QOS);
NS_LOG_V(DEBUG, "Sync ocstackResult = %d", ocstackResult);
-
if (ocstackResult != OC_STACK_OK)
{
NS_LOG(ERROR, "fail to send Sync");
OCRepPayloadDestroy(payload);
return NS_ERROR;
-
}
OCRepPayloadDestroy(payload);
case TASK_SEND_NOTIFICATION:
{
NS_LOG(DEBUG, "CASE TASK_SEND_NOTIFICATION : ");
- NSSendMessage((NSMessage *)node->taskData);
- break;
+ NSSendNotification((NSMessage *)node->taskData);
+ NSFreeMessage((NSMessage *)node->taskData);
}
+ break;
case TASK_SEND_READ:
NS_LOG(DEBUG, "CASE TASK_SEND_READ : ");
- NSSendSync((NSSync*) node->taskData);
+ NSSendSync((NSSyncInfo*) node->taskData);
+ NSFreeSync((NSSyncInfo*) node->taskData);
break;
case TASK_RECV_READ:
NS_LOG(DEBUG, "CASE TASK_RECV_READ : ");
- NSSendSync((NSSync*) node->taskData);
- NSPushQueue(RESPONSE_SCHEDULER, TASK_CB_SYNC, node->taskData);
+ NSSendSync((NSSyncInfo*) node->taskData);
+ NSPushQueue(CALLBACK_RESPONSE_SCHEDULER, TASK_CB_SYNC, node->taskData);
break;
-
default:
NS_LOG(ERROR, "Unknown type message");
break;
}
- OICFree(node);
+ NSOICFree(node);
}
pthread_mutex_unlock(&NSMutex[NOTIFICATION_SCHEDULER]);
-
}
NS_LOG(INFO, "Destroy NSNotificationSchedule");