1 //******************************************************************
3 // Copyright 2016 Samsung Electronics All Rights Reserved.
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
7 // Licensed under the Apache License, Version 2.0 (the "License");
8 // you may not use this file except in compliance with the License.
9 // You may obtain a copy of the License at
11 // http://www.apache.org/licenses/LICENSE-2.0
13 // Unless required by applicable law or agreed to in writing, software
14 // distributed under the License is distributed on an "AS IS" BASIS,
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 // See the License for the specific language governing permissions and
17 // limitations under the License.
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
21 #include "NSProviderNotification.h"
23 NSResult NSSetMessagePayload(NSMessage *msg, OCRepPayload** msgPayload)
25 NS_LOG(DEBUG, "NSSetMessagePayload - IN");
27 *msgPayload = OCRepPayloadCreate();
31 NS_LOG(ERROR, "Failed to allocate payload");
35 OCRepPayloadSetUri(*msgPayload, NS_COLLECTION_MESSAGE_URI);
36 OCRepPayloadSetPropInt(*msgPayload, NS_ATTRIBUTE_MESSAGE_ID, msg->messageId);
37 OCRepPayloadSetPropString(*msgPayload, NS_ATTRIBUTE_PROVIDER_ID, msg->providerId);
39 NSDuplicateSetPropertyInt(msgPayload, NS_ATTRIBUTE_TYPE, msg->type);
40 NSDuplicateSetPropertyInt(msgPayload, NS_ATTRIBUTE_MESSAGE_ID, msg->ttl);
41 NSDuplicateSetPropertyString(msgPayload, NS_ATTRIBUTE_DATETIME, msg->dateTime);
42 NSDuplicateSetPropertyString(msgPayload, NS_ATTRIBUTE_TITLE, msg->title);
43 NSDuplicateSetPropertyString(msgPayload, NS_ATTRIBUTE_TEXT, msg->contentText);
44 NSDuplicateSetPropertyString(msgPayload, NS_ATTRIBUTE_SOURCE, msg->sourceName);
45 NSDuplicateSetPropertyString(msgPayload, NS_ATTRIBUTE_TOPIC_NAME, msg->topic);
46 if(msg->mediaContents)
48 NSDuplicateSetPropertyString(msgPayload,
49 NS_ATTRIBUTE_ICON_IMAGE, msg->mediaContents->iconImage);
52 NS_LOG(DEBUG, "NSSetMessagePayload - OUT");
56 NSResult NSSetSyncPayload(NSSyncInfo *sync, OCRepPayload** syncPayload)
58 NS_LOG(DEBUG, "NSSetSyncPayload - IN");
60 *syncPayload = OCRepPayloadCreate();
64 NS_LOG(ERROR, "Failed to allocate payload");
68 OCRepPayloadSetUri(*syncPayload, NS_COLLECTION_SYNC_URI);
70 OCRepPayloadSetPropString(*syncPayload, NS_ATTRIBUTE_PROVIDER_ID, sync->providerId);
71 OCRepPayloadSetPropInt(*syncPayload, NS_ATTRIBUTE_MESSAGE_ID, sync->messageId);
72 OCRepPayloadSetPropInt(*syncPayload, NS_ATTRIBUTE_STATE, sync->state);
74 NS_LOG(DEBUG, "NSSetSyncPayload - OUT");
78 NSResult NSSendNotification(NSMessage *msg)
80 NS_LOG(DEBUG, "NSSendMessage - IN");
82 OCResourceHandle rHandle;
83 OCObservationId obArray[255] = { 0, };
86 if (NSPutMessageResource(msg, &rHandle) != NS_OK)
88 NS_LOG(ERROR, "fail to Put notification resource");
92 if (consumerSubList->head == NULL)
94 NS_LOG(ERROR, "SubList->head is NULL, empty SubList");
98 OCRepPayload* payload = NULL;
100 if (NSSetMessagePayload(msg, &payload) != NS_OK)
102 NS_LOG(ERROR, "fail to Get message payload");
106 NSCacheElement * it = consumerSubList->head;
110 NSCacheSubData * subData = (NSCacheSubData *) it->data;
111 NS_LOG_V(DEBUG, "message subData->id = %s", subData->id);
112 NS_LOG_V(DEBUG, "subData->messageId = %d", subData->messageObId);
113 NS_LOG_V(DEBUG, "subData->cloud_messageId = %d", subData->remote_messageObId);
114 NS_LOG_V(DEBUG, "subData->syncId = %d", subData->syncObId);
115 NS_LOG_V(DEBUG, "subData->cloud_syncId = %d", subData->remote_syncObId);
116 NS_LOG_V(DEBUG, "subData->isWhite = %d", subData->isWhite);
118 if (subData->isWhite)
120 if(subData->messageObId != 0)
122 if(msg->topic && (msg->topic)[0] != '\0')
124 NS_LOG_V(DEBUG, "this is topic message: %s", msg->topic);
126 if(NSProviderIsTopicSubScribed(consumerTopicList->head, subData->id, msg->topic))
128 obArray[obCount++] = subData->messageObId;
133 obArray[obCount++] = subData->messageObId;
137 #if(defined WITH_CLOUD && defined RD_CLIENT)
138 if(subData->remote_messageObId != 0)
140 if(msg->topic && (msg->topic)[0] != '\0')
142 NS_LOG_V(DEBUG, "this is topic message via remote server: %s", msg->topic);
143 if(NSProviderIsTopicSubScribed(consumerTopicList->head, subData->id, msg->topic))
145 obArray[obCount++] = subData->remote_messageObId;
150 obArray[obCount++] = subData->remote_messageObId;
159 for (i = 0; i < obCount; ++i)
161 NS_LOG(DEBUG, "-------------------------------------------------------message\n");
162 NS_LOG_V(DEBUG, "SubScription WhiteList[%d] = %d", i, obArray[i]);
163 NS_LOG(DEBUG, "-------------------------------------------------------message\n");
168 NS_LOG(ERROR, "observer count is zero");
172 OCStackResult ocstackResult = OCNotifyListOfObservers(rHandle, obArray, obCount, payload,
175 NS_LOG_V(DEBUG, "Message ocstackResult = %d", ocstackResult);
177 if (ocstackResult != OC_STACK_OK)
179 NS_LOG(ERROR, "fail to send message");
180 OCRepPayloadDestroy(payload);
184 OCRepPayloadDestroy(payload);
186 NS_LOG(DEBUG, "NSSendMessage - OUT");
191 NSResult NSSendSync(NSSyncInfo *sync)
193 NS_LOG(DEBUG, "NSSendSync - IN");
195 OCObservationId obArray[255] = { 0, };
199 OCResourceHandle rHandle;
200 if (NSPutSyncResource(sync, &rHandle) != NS_OK)
202 NS_LOG(ERROR, PCF("Fail to put sync resource"));
206 NSCacheElement * it = consumerSubList->head;
210 NSCacheSubData * subData = (NSCacheSubData *) it->data;
211 NS_LOG_V(DEBUG, "sync subData->id = %s", subData->id);
212 NS_LOG_V(DEBUG, "subData->messageId = %d", subData->messageObId);
213 NS_LOG_V(DEBUG, "subData->cloud_messageId = %d", subData->remote_messageObId);
214 NS_LOG_V(DEBUG, "subData->syncId = %d", subData->syncObId);
215 NS_LOG_V(DEBUG, "subData->cloud_syncId = %d", subData->remote_syncObId);
216 NS_LOG_V(DEBUG, "subData->isWhite = %d", subData->isWhite);
218 if (subData->isWhite)
220 if(subData->syncObId != 0)
222 obArray[obCount++] = subData->syncObId;
225 #if(defined WITH_CLOUD && defined RD_CLIENT)
226 if(subData->remote_syncObId != 0)
228 obArray[obCount++] = subData->remote_syncObId;
235 OCRepPayload* payload;
236 if (NSSetSyncPayload(sync, &payload) != NS_OK)
238 NS_LOG(ERROR, "Failed to allocate payload");
242 for (i = 0; i < obCount; ++i)
244 NS_LOG(DEBUG, "-------------------------------------------------------message\n");
245 NS_LOG_V(DEBUG, "Sync WhiteList[%d] = %d", i, obArray[i]);
246 NS_LOG(DEBUG, "-------------------------------------------------------message\n");
249 OCStackResult ocstackResult = OCNotifyListOfObservers(rHandle, obArray,
250 obCount, payload, OC_LOW_QOS);
252 NS_LOG_V(DEBUG, "Sync ocstackResult = %d", ocstackResult);
254 if (ocstackResult != OC_STACK_OK)
256 NS_LOG(ERROR, "fail to send Sync");
257 OCRepPayloadDestroy(payload);
261 OCRepPayloadDestroy(payload);
263 NS_LOG(DEBUG, "NSSendSync - OUT");
267 void * NSNotificationSchedule(void *ptr)
271 NS_LOG(DEBUG, "Create NSNotifiactionSchedule");
274 while (NSIsRunning[NOTIFICATION_SCHEDULER])
276 sem_wait(&NSSemaphore[NOTIFICATION_SCHEDULER]);
277 pthread_mutex_lock(&NSMutex[NOTIFICATION_SCHEDULER]);
279 if (NSHeadMsg[NOTIFICATION_SCHEDULER] != NULL)
281 NSTask *node = NSHeadMsg[NOTIFICATION_SCHEDULER];
282 NSHeadMsg[NOTIFICATION_SCHEDULER] = node->nextTask;
284 switch (node->taskType)
286 case TASK_SEND_NOTIFICATION:
288 NS_LOG(DEBUG, "CASE TASK_SEND_NOTIFICATION : ");
289 NSSendNotification((NSMessage *)node->taskData);
290 NSFreeMessage((NSMessage *)node->taskData);
294 NS_LOG(DEBUG, "CASE TASK_SEND_READ : ");
295 NSSendSync((NSSyncInfo*) node->taskData);
296 NSFreeSync((NSSyncInfo*) node->taskData);
299 NS_LOG(DEBUG, "CASE TASK_RECV_READ : ");
300 NSSendSync((NSSyncInfo*) node->taskData);
301 NSPushQueue(CALLBACK_RESPONSE_SCHEDULER, TASK_CB_SYNC, node->taskData);
304 NS_LOG(ERROR, "Unknown type message");
311 pthread_mutex_unlock(&NSMutex[NOTIFICATION_SCHEDULER]);
315 NS_LOG(INFO, "Destroy NSNotificationSchedule");