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"
22 #include "NSProviderListener.h"
23 #include "NSProviderSystem.h"
25 NSResult NSSetMessagePayload(NSMessage *msg, OCRepPayload** msgPayload)
27 NS_LOG(DEBUG, "NSSetMessagePayload - IN");
29 *msgPayload = msg->extraInfo != NULL ? msg->extraInfo : OCRepPayloadCreate();
33 NS_LOG(ERROR, "Failed to allocate payload");
37 OCRepPayloadSetUri(*msgPayload, NS_COLLECTION_MESSAGE_URI);
38 OCRepPayloadSetPropInt(*msgPayload, NS_ATTRIBUTE_MESSAGE_ID, msg->messageId);
39 OCRepPayloadSetPropString(*msgPayload, NS_ATTRIBUTE_PROVIDER_ID, msg->providerId);
41 NSDuplicateSetPropertyInt(msgPayload, NS_ATTRIBUTE_TYPE, msg->type);
42 NSDuplicateSetPropertyInt(msgPayload, NS_ATTRIBUTE_TTL, msg->ttl);
43 NSDuplicateSetPropertyString(msgPayload, NS_ATTRIBUTE_DATETIME, msg->dateTime);
44 NSDuplicateSetPropertyString(msgPayload, NS_ATTRIBUTE_TITLE, msg->title);
45 NSDuplicateSetPropertyString(msgPayload, NS_ATTRIBUTE_TEXT, msg->contentText);
46 NSDuplicateSetPropertyString(msgPayload, NS_ATTRIBUTE_SOURCE, msg->sourceName);
47 NSDuplicateSetPropertyString(msgPayload, NS_ATTRIBUTE_TOPIC_NAME, msg->topic);
49 if (msg->mediaContents)
51 NSDuplicateSetPropertyString(msgPayload, NS_ATTRIBUTE_ICON_IMAGE,
52 msg->mediaContents->iconImage);
55 NS_LOG(DEBUG, "NSSetMessagePayload - OUT");
59 NSResult NSSetSyncPayload(NSSyncInfo *sync, OCRepPayload** syncPayload)
61 NS_LOG(DEBUG, "NSSetSyncPayload - IN");
63 *syncPayload = OCRepPayloadCreate();
67 NS_LOG(ERROR, "Failed to allocate payload");
71 OCRepPayloadSetUri(*syncPayload, NS_COLLECTION_SYNC_URI);
73 OCRepPayloadSetPropString(*syncPayload, NS_ATTRIBUTE_PROVIDER_ID, sync->providerId);
74 OCRepPayloadSetPropInt(*syncPayload, NS_ATTRIBUTE_MESSAGE_ID, sync->messageId);
75 OCRepPayloadSetPropInt(*syncPayload, NS_ATTRIBUTE_STATE, sync->state);
77 NS_LOG(DEBUG, "NSSetSyncPayload - OUT");
82 OCStackResult NSProviderPublishTopic(OCRepPayload * payload, OCClientResponseHandler response)
84 NS_LOG(DEBUG, "NSProviderPublishTopic - IN");
85 OCCallbackData cbData;
86 memset(&cbData, 0, sizeof(OCCallbackData));
89 cbData.context = NULL;
91 NSMQServerInfo * serverInfo = NSGetMQServerInfo();
95 NS_LOG(DEBUG, "serverInfo is not NULL");
96 NS_LOG_V(DEBUG, "serverInfo->serverUri = %s", serverInfo->serverUri);
99 NS_LOG(DEBUG, "NSProviderPublishTopic - OUT");
101 return OCDoResource(NULL, OC_REST_POST, serverInfo->serverUri, serverInfo->devAddr,
102 (OCPayload *)payload, CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);
106 NSResult NSSendNotification(NSMessage *msg)
108 NS_LOG(DEBUG, "NSSendMessage - IN");
110 OCResourceHandle rHandle;
111 OCObservationId obArray[3839] = { 0, };
114 if (NSPutMessageResource(msg, &rHandle) != NS_OK)
116 NS_LOG(ERROR, "fail to Put notification resource");
120 OCRepPayload* payload = NULL;
122 if (NSSetMessagePayload(msg, &payload) != NS_OK)
124 NS_LOG(ERROR, "fail to Get message payload");
129 if (NSGetMQServerInfo())
131 NSProviderPublishTopic(OCRepPayloadClone(payload), NSProviderPublishMQResponseCB);
135 if (consumerSubList->head == NULL)
137 NS_LOG(ERROR, "SubList->head is NULL, empty SubList");
138 OCRepPayloadDestroy(payload);
139 msg->extraInfo = NULL;
143 NSCacheElement * it = consumerSubList->head;
147 NSCacheSubData * subData = (NSCacheSubData *) it->data;
148 NS_LOG_V(INFO_PRIVATE, "message subData->id = %s", subData->id);
149 NS_LOG_V(DEBUG, "subData->messageId = %d", subData->messageObId);
150 NS_LOG_V(DEBUG, "subData->cloud_messageId = %d", subData->remote_messageObId);
151 NS_LOG_V(DEBUG, "subData->syncId = %d", subData->syncObId);
152 NS_LOG_V(DEBUG, "subData->cloud_syncId = %d", subData->remote_syncObId);
153 NS_LOG_V(DEBUG, "subData->isWhite = %d", subData->isWhite);
155 if (subData->isWhite)
157 if(subData->messageObId != 0)
159 if (msg->topic && (msg->topic)[0] != '\0')
161 NS_LOG_V(DEBUG, "this is topic message: %s", msg->topic);
163 if (NSProviderIsTopicSubScribed(consumerTopicList->head, subData->id, msg->topic))
165 obArray[obCount++] = subData->messageObId;
170 obArray[obCount++] = subData->messageObId;
174 #if (defined WITH_CLOUD)
175 if (subData->remote_messageObId != 0)
177 if (msg->topic && (msg->topic)[0] != '\0')
179 NS_LOG_V(DEBUG, "this is topic message via remote server: %s", msg->topic);
180 if (NSProviderIsTopicSubScribed(consumerTopicList->head, subData->id, msg->topic))
182 obArray[obCount++] = subData->remote_messageObId;
187 obArray[obCount++] = subData->remote_messageObId;
196 for (i = 0; i < obCount; ++i)
198 NS_LOG(DEBUG, "-------------------------------------------------------message\n");
199 NS_LOG_V(DEBUG, "SubScription WhiteList[%d] = %d", i, obArray[i]);
200 NS_LOG(DEBUG, "-------------------------------------------------------message\n");
205 NS_LOG(ERROR, "observer count is zero");
206 OCRepPayloadDestroy(payload);
207 msg->extraInfo = NULL;
211 OCStackResult ocstackResult = OCNotifyListOfObservers(rHandle, obArray, obCount, payload,
214 NS_LOG_V(DEBUG, "Message ocstackResult = %d", ocstackResult);
216 if (ocstackResult != OC_STACK_OK)
218 NS_LOG(ERROR, "fail to send message");
219 OCRepPayloadDestroy(payload);
220 msg->extraInfo = NULL;
224 OCRepPayloadDestroy(payload);
225 msg->extraInfo = NULL;
227 NS_LOG(DEBUG, "NSSendMessage - OUT");
231 NSResult NSSendSync(NSSyncInfo *sync)
233 NS_LOG(DEBUG, "NSSendSync - IN");
235 OCObservationId obArray[3839] = { 0, };
239 OCResourceHandle rHandle;
240 if (NSPutSyncResource(sync, &rHandle) != NS_OK)
242 NS_LOG(ERROR, PCF("Fail to put sync resource"));
246 NSCacheElement * it = consumerSubList->head;
250 NSCacheSubData * subData = (NSCacheSubData *) it->data;
251 NS_LOG_V(INFO_PRIVATE, "sync subData->id = %s", subData->id);
252 NS_LOG_V(DEBUG, "subData->messageId = %d", subData->messageObId);
253 NS_LOG_V(DEBUG, "subData->cloud_messageId = %d", subData->remote_messageObId);
254 NS_LOG_V(DEBUG, "subData->syncId = %d", subData->syncObId);
255 NS_LOG_V(DEBUG, "subData->cloud_syncId = %d", subData->remote_syncObId);
256 NS_LOG_V(DEBUG, "subData->isWhite = %d", subData->isWhite);
258 if (subData->isWhite)
260 if (subData->syncObId != 0)
262 obArray[obCount++] = subData->syncObId;
265 #if (defined WITH_CLOUD)
266 if (subData->remote_syncObId != 0)
268 obArray[obCount++] = subData->remote_syncObId;
275 OCRepPayload* payload = NULL;
276 if (NSSetSyncPayload(sync, &payload) != NS_OK)
278 NS_LOG(ERROR, "Failed to allocate payload");
283 if (NSGetMQServerInfo())
285 OCRepPayload* MQPayload = OCRepPayloadClone(payload);
286 NSMessageType MQType = 0;
288 if (sync->state == NS_SYNC_READ)
290 MQType = NS_MESSAGE_READ;
292 else if (sync->state == NS_SYNC_DELETED)
294 MQType = NS_MESSAGE_DELETED;
297 OCRepPayloadSetPropInt(MQPayload, NS_ATTRIBUTE_TYPE, (int64_t) MQType);
298 NSProviderPublishTopic(MQPayload, NSProviderPublishMQResponseCB);
302 for (i = 0; i < obCount; ++i)
304 NS_LOG(DEBUG, "-------------------------------------------------------message\n");
305 NS_LOG_V(DEBUG, "Sync WhiteList[%d] = %d", i, obArray[i]);
306 NS_LOG(DEBUG, "-------------------------------------------------------message\n");
309 OCStackResult ocstackResult = OCNotifyListOfObservers(rHandle, obArray,
310 obCount, payload, OC_LOW_QOS);
312 NS_LOG_V(DEBUG, "Sync ocstackResult = %d", ocstackResult);
313 if (ocstackResult != OC_STACK_OK)
315 NS_LOG(ERROR, "fail to send Sync");
316 OCRepPayloadDestroy(payload);
320 OCRepPayloadDestroy(payload);
322 NS_LOG(DEBUG, "NSSendSync - OUT");
326 void * NSNotificationSchedule(void *ptr)
330 NS_LOG(DEBUG, "Create NSNotifiactionSchedule");
333 while (NSIsRunning[NOTIFICATION_SCHEDULER])
335 sem_wait(&NSSemaphore[NOTIFICATION_SCHEDULER]);
336 pthread_mutex_lock(&NSMutex[NOTIFICATION_SCHEDULER]);
338 if (NSHeadMsg[NOTIFICATION_SCHEDULER] != NULL)
340 NSTask *node = NSHeadMsg[NOTIFICATION_SCHEDULER];
341 NSHeadMsg[NOTIFICATION_SCHEDULER] = node->nextTask;
343 switch (node->taskType)
345 case TASK_SEND_NOTIFICATION:
347 NS_LOG(DEBUG, "CASE TASK_SEND_NOTIFICATION : ");
348 NSSendNotification((NSMessage *)node->taskData);
349 NSFreeMessage((NSMessage *)node->taskData);
353 NS_LOG(DEBUG, "CASE TASK_SEND_READ : ");
354 NSSendSync((NSSyncInfo*) node->taskData);
355 NSFreeSync((NSSyncInfo*) node->taskData);
358 NS_LOG(DEBUG, "CASE TASK_RECV_READ : ");
359 NSSendSync((NSSyncInfo*) node->taskData);
360 NSPushQueue(CALLBACK_RESPONSE_SCHEDULER, TASK_CB_SYNC, node->taskData);
363 NS_LOG(ERROR, "Unknown type message");
370 pthread_mutex_unlock(&NSMutex[NOTIFICATION_SCHEDULER]);
373 NS_LOG(INFO, "Destroy NSNotificationSchedule");