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 NSInitMessageList()
25 NS_LOG(DEBUG, "NSInitMessageList - IN");
27 messageList = NSStorageCreate();
28 messageList->cacheType = NS_PROVIDER_CACHE_MESSAGE;
30 NS_LOG(DEBUG, "NSInitMessageList - OUT");
34 NSResult NSSetMessagePayload(NSMessage *msg, OCRepPayload** msgPayload)
36 NS_LOG(DEBUG, "NSSetMessagePayload - IN");
38 *msgPayload = OCRepPayloadCreate();
42 NS_LOG(ERROR, "Failed to allocate payload");
46 OCRepPayloadSetUri(*msgPayload, NS_COLLECTION_MESSAGE_URI);
47 OCRepPayloadSetPropInt(*msgPayload, NS_ATTRIBUTE_MESSAGE_ID, msg->messageId);
48 OCRepPayloadSetPropString(*msgPayload, NS_ATTRIBUTE_PROVIDER_ID, msg->providerId);
50 NSDuplicateSetPropertyInt(msgPayload, NS_ATTRIBUTE_TYPE, msg->type);
51 NSDuplicateSetPropertyInt(msgPayload, NS_ATTRIBUTE_MESSAGE_ID, msg->ttl);
52 NSDuplicateSetPropertyString(msgPayload, NS_ATTRIBUTE_DATETIME, msg->dateTime);
53 NSDuplicateSetPropertyString(msgPayload, NS_ATTRIBUTE_TITLE, msg->title);
54 NSDuplicateSetPropertyString(msgPayload, NS_ATTRIBUTE_TEXT, msg->contentText);
55 NSDuplicateSetPropertyString(msgPayload, NS_ATTRIBUTE_SOURCE, msg->sourceName);
57 NS_LOG(DEBUG, "NSSetMessagePayload - OUT");
61 NSResult NSSetSyncPayload(NSSyncInfo *sync, OCRepPayload** syncPayload)
63 NS_LOG(DEBUG, "NSSetSyncPayload - IN");
65 *syncPayload = OCRepPayloadCreate();
69 NS_LOG(ERROR, "Failed to allocate payload");
73 OCRepPayloadSetUri(*syncPayload, NS_COLLECTION_SYNC_URI);
75 OCRepPayloadSetPropString(*syncPayload, NS_ATTRIBUTE_PROVIDER_ID, sync->providerId);
76 OCRepPayloadSetPropInt(*syncPayload, NS_ATTRIBUTE_MESSAGE_ID, sync->messageId);
77 OCRepPayloadSetPropInt(*syncPayload, NS_ATTRIBUTE_STATE, sync->state);
79 NS_LOG(DEBUG, "NSSetSyncPayload - OUT");
83 NSResult NSSendNotification(NSMessage *msg)
85 NS_LOG(DEBUG, "NSSendMessage - IN");
87 OCResourceHandle rHandle;
88 OCObservationId obArray[255] = { 0, };
91 if (NSPutMessageResource(msg, &rHandle) != NS_OK)
93 NS_LOG(ERROR, "fail to Put notification resource");
97 if (consumerSubList->head == NULL)
99 NS_LOG(ERROR, "SubList->head is NULL, empty SubList");
103 OCRepPayload* payload = NULL;
105 if (NSSetMessagePayload(msg, &payload) != NS_OK)
107 NS_LOG(ERROR, "fail to Get message payload");
111 NSCacheElement * it = consumerSubList->head;
115 NSCacheSubData * subData = (NSCacheSubData *) it->data;
116 NS_LOG_V(DEBUG, "message subData->id = %s", subData->id);
117 NS_LOG_V(DEBUG, "subData->messageId = %d", subData->messageObId);
118 NS_LOG_V(DEBUG, "subData->cloud_messageId = %d", subData->remote_messageObId);
119 NS_LOG_V(DEBUG, "subData->syncId = %d", subData->syncObId);
120 NS_LOG_V(DEBUG, "subData->cloud_syncId = %d", subData->remote_syncObId);
121 NS_LOG_V(DEBUG, "subData->isWhite = %d", subData->isWhite);
123 if (subData->isWhite)
125 if(subData->messageObId != 0)
129 NS_LOG_V(DEBUG, "this is topic message: %s", msg->topic);
131 if(NSIsTopicSubscribed(subData->id, msg->topic))
133 obArray[obCount++] = subData->messageObId;
138 obArray[obCount++] = subData->messageObId;
143 if(subData->remote_messageObId != 0)
145 if(NSIsTopicSubscribed(subData->id, msg->topic))
147 obArray[obCount++] = subData->remote_messageObId;
151 obArray[obCount++] = subData->remote_messageObId;
160 for (i = 0; i < obCount; ++i)
162 NS_LOG(DEBUG, "-------------------------------------------------------message\n");
163 NS_LOG_V(DEBUG, "SubScription WhiteList[%d] = %d", i, obArray[i]);
164 NS_LOG(DEBUG, "-------------------------------------------------------message\n");
169 NS_LOG(ERROR, "observer count is zero");
173 OCStackResult ocstackResult = OCNotifyListOfObservers(rHandle, obArray, obCount, payload,
176 NS_LOG_V(DEBUG, "Message ocstackResult = %d", ocstackResult);
178 if (ocstackResult != OC_STACK_OK)
180 NS_LOG(ERROR, "fail to send message");
181 OCRepPayloadDestroy(payload);
185 OCRepPayloadDestroy(payload);
187 NS_LOG(DEBUG, "NSSendMessage - OUT");
192 NSResult NSSendSync(NSSyncInfo *sync)
194 NS_LOG(DEBUG, "NSSendSync - IN");
196 OCObservationId obArray[255] = { 0, };
200 OCResourceHandle rHandle;
201 if (NSPutSyncResource(sync, &rHandle) != NS_OK)
203 NS_LOG(ERROR, PCF("Fail to put sync resource"));
207 NSCacheElement * it = consumerSubList->head;
211 NSCacheSubData * subData = (NSCacheSubData *) it->data;
212 NS_LOG_V(DEBUG, "sync subData->id = %s", subData->id);
213 NS_LOG_V(DEBUG, "subData->messageId = %d", subData->messageObId);
214 NS_LOG_V(DEBUG, "subData->cloud_messageId = %d", subData->remote_messageObId);
215 NS_LOG_V(DEBUG, "subData->syncId = %d", subData->syncObId);
216 NS_LOG_V(DEBUG, "subData->cloud_syncId = %d", subData->remote_syncObId);
217 NS_LOG_V(DEBUG, "subData->isWhite = %d", subData->isWhite);
219 if (subData->isWhite)
221 if(subData->syncObId != 0)
223 obArray[obCount++] = subData->syncObId;
227 if(subData->remote_syncObId != 0)
229 obArray[obCount++] = subData->remote_syncObId;
236 OCRepPayload* payload;
237 if (NSSetSyncPayload(sync, &payload) != NS_OK)
239 NS_LOG(ERROR, "Failed to allocate payload");
243 for (i = 0; i < obCount; ++i)
245 NS_LOG(DEBUG, "-------------------------------------------------------message\n");
246 NS_LOG_V(DEBUG, "Sync WhiteList[%d] = %d", i, obArray[i]);
247 NS_LOG(DEBUG, "-------------------------------------------------------message\n");
250 OCStackResult ocstackResult = OCNotifyListOfObservers(rHandle, obArray,
251 obCount, payload, OC_HIGH_QOS);
253 NS_LOG_V(DEBUG, "Sync ocstackResult = %d", ocstackResult);
255 if (ocstackResult != OC_STACK_OK)
257 NS_LOG(ERROR, "fail to send Sync");
258 OCRepPayloadDestroy(payload);
262 OCRepPayloadDestroy(payload);
264 NS_LOG(DEBUG, "NSSendSync - OUT");
268 void * NSNotificationSchedule(void *ptr)
272 NS_LOG(DEBUG, "Create NSNotifiactionSchedule");
275 while (NSIsRunning[NOTIFICATION_SCHEDULER])
277 sem_wait(&NSSemaphore[NOTIFICATION_SCHEDULER]);
278 pthread_mutex_lock(&NSMutex[NOTIFICATION_SCHEDULER]);
280 if (NSHeadMsg[NOTIFICATION_SCHEDULER] != NULL)
282 NSTask *node = NSHeadMsg[NOTIFICATION_SCHEDULER];
283 NSHeadMsg[NOTIFICATION_SCHEDULER] = node->nextTask;
285 switch (node->taskType)
287 case TASK_SEND_NOTIFICATION:
289 NS_LOG(DEBUG, "CASE TASK_SEND_NOTIFICATION : ");
290 NSSendNotification((NSMessage *)node->taskData);
291 NSFreeMessage((NSMessage *)node->taskData);
295 NS_LOG(DEBUG, "CASE TASK_SEND_READ : ");
296 NSSendSync((NSSyncInfo*) node->taskData);
297 NSFreeSync((NSSyncInfo*) node->taskData);
300 NS_LOG(DEBUG, "CASE TASK_RECV_READ : ");
301 NSSendSync((NSSyncInfo*) node->taskData);
302 NSPushQueue(CALLBACK_RESPONSE_SCHEDULER, TASK_CB_SYNC, node->taskData);
305 NS_LOG(ERROR, "Unknown type message");
312 pthread_mutex_unlock(&NSMutex[NOTIFICATION_SCHEDULER]);
316 NS_LOG(INFO, "Destroy NSNotificationSchedule");