X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=service%2Fnotification%2Fsrc%2Fprovider%2FNSProviderNotification.c;h=74708dff13b095dbfe2908af8f83b0f600dff52f;hb=03ae7cd73e2e10a8de75da40a0e476cc955b46b2;hp=aaa989972bcb2ee8a682fb0561e87f9e17e54889;hpb=caa454fe2c6c8f31cb22fa42bdf983cfb7bbecaf;p=platform%2Fupstream%2Fiotivity.git diff --git a/service/notification/src/provider/NSProviderNotification.c b/service/notification/src/provider/NSProviderNotification.c index aaa9899..74708df 100644 --- a/service/notification/src/provider/NSProviderNotification.c +++ b/service/notification/src/provider/NSProviderNotification.c @@ -19,88 +19,124 @@ //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= #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; + *msgPayload = msg->extraInfo != NULL ? msg->extraInfo : OCRepPayloadCreate(); - NS_LOG(DEBUG, "NSInitMessageList - OUT"); + if (!*msgPayload) + { + NS_LOG(ERROR, "Failed to allocate payload"); + return NS_ERROR; + } + + 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 NSGetMessagePayload(NSMessage *msg, OCRepPayload** msgPayload) +NSResult NSSetSyncPayload(NSSyncInfo *sync, OCRepPayload** syncPayload) { - NS_LOG(DEBUG, "NSGetMessagePayload - IN"); + NS_LOG(DEBUG, "NSSetSyncPayload - IN"); - *msgPayload = OCRepPayloadCreate(); + *syncPayload = OCRepPayloadCreate(); - if (!*msgPayload) + if (!*syncPayload) { - 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(*syncPayload, NS_COLLECTION_SYNC_URI); - NS_LOG(DEBUG, "NSGetMessagePayload - OUT"); + 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 NSGetSyncPayload(NSSync *sync, OCRepPayload** syncPayload) +#ifdef WITH_MQ +OCStackResult NSProviderPublishTopic(OCRepPayload * payload, OCClientResponseHandler response) { - NS_LOG(DEBUG, "NSGetSyncPayload - IN"); + NS_LOG(DEBUG, "NSProviderPublishTopic - IN"); + OCCallbackData cbData; + memset(&cbData, 0, sizeof(OCCallbackData)); + cbData.cb = response; + cbData.cd = NULL; + cbData.context = NULL; - *syncPayload = OCRepPayloadCreate(); + NSMQServerInfo * serverInfo = NSGetMQServerInfo(); - if (!*syncPayload) + if (!serverInfo) { - OIC_LOG(ERROR, NOTIFICATION_TAG, PCF("Failed to allocate payload")); - return NS_ERROR; + NS_LOG(DEBUG, "serverInfo is not NULL"); + NS_LOG_V(DEBUG, "serverInfo->serverUri = %s", serverInfo->serverUri); } - OCRepPayloadSetUri(*syncPayload, NSGetNotificationSyncUri()); - OCRepPayloadSetPropString(*syncPayload, NS_ATTRIBUTE_ID, sync->mMessageId); - OCRepPayloadSetPropInt(*syncPayload, NS_ATTRIBUTE_STATE, sync->mState); + NS_LOG(DEBUG, "NSProviderPublishTopic - OUT"); - NS_LOG(DEBUG, "NSGetSyncPayload - OUT"); - return NS_OK; + 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) { - OIC_LOG(DEBUG, NOTIFICATION_TAG, "Send Notification Message to consumer"); 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) { - OIC_LOG(ERROR, NOTIFICATION_TAG, PCF("Fail to put notification resource")); - NS_LOG(DEBUG, "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) { - OIC_LOG(ERROR, NOTIFICATION_TAG, PCF("no observers")); - 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) { - OIC_LOG(ERROR, NOTIFICATION_TAG, PCF("Failed to allocate payload")); - 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; } @@ -109,21 +145,54 @@ NSResult NSSendMessage(NSMessage *msg) 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"); @@ -131,6 +200,14 @@ NSResult NSSendMessage(NSMessage *msg) 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); @@ -138,31 +215,31 @@ NSResult NSSendMessage(NSMessage *msg) if (ocstackResult != OC_STACK_OK) { - OIC_LOG(ERROR, NOTIFICATION_TAG, "fail to send message"); NS_LOG(ERROR, "fail to send message"); OCRepPayloadDestroy(payload); + msg->extraInfo = NULL; return NS_ERROR; } + 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, }; + OCObservationId obArray[3839] = { 0, }; int obCount = 0; int i; 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; } @@ -171,22 +248,57 @@ 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; - } - 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; } +#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"); @@ -198,13 +310,11 @@ NSResult NSSendSync(NSSync *sync) obCount, payload, OC_LOW_QOS); 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); @@ -217,7 +327,6 @@ void * NSNotificationSchedule(void *ptr) { if (ptr == NULL) { - OIC_LOG(DEBUG, NOTIFICATION_TAG, "Create NSNotifiactionSchedule"); NS_LOG(DEBUG, "Create NSNotifiactionSchedule"); } @@ -231,36 +340,36 @@ void * NSNotificationSchedule(void *ptr) NSTask *node = NSHeadMsg[NOTIFICATION_SCHEDULER]; NSHeadMsg[NOTIFICATION_SCHEDULER] = node->nextTask; - switch ((int)node->taskType) + switch (node->taskType) { case TASK_SEND_NOTIFICATION: { NS_LOG(DEBUG, "CASE TASK_SEND_NOTIFICATION : "); - NSMessage * nsMsg = node->taskData; - NSSendMessage(nsMsg); - 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: - OIC_LOG(ERROR, NOTIFICATION_TAG, "Unknown type message"); - NS_LOG(ERROR, "Unknow 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; }