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 = NSCacheCreate();
28 messageList->cacheType = NS_PROVIDER_CACHE_MESSAGE;
30 NS_LOG(DEBUG, "NSInitMessageList - OUT");
34 NSResult NSGetMessagePayload(NSMessage *msg, OCRepPayload** msgPayload)
36 NS_LOG(DEBUG, "NSGetMessagePayload - IN");
38 *msgPayload = OCRepPayloadCreate();
42 OIC_LOG(ERROR, NOTIFICATION_TAG, PCF("Failed to allocate payload"));
46 OCRepPayloadSetUri(*msgPayload, NSGetNotificationMessageUri());
47 OCRepPayloadSetPropString(*msgPayload, NS_ATTRIBUTE_ID, msg->mId);
48 OCRepPayloadSetPropString(*msgPayload, NS_ATTRIBUTE_TITLE, msg->mTitle);
49 OCRepPayloadSetPropString(*msgPayload, NS_ATTRIBUTE_TEXT, msg->mContentText);
50 OCRepPayloadSetPropString(*msgPayload, NS_ATTRIBUTE_SOURCE, msg->mSource);
52 NS_LOG(DEBUG, "NSGetMessagePayload - OUT");
56 NSResult NSGetSyncPayload(NSSync *sync, OCRepPayload** syncPayload)
58 NS_LOG(DEBUG, "NSGetSyncPayload - IN");
60 *syncPayload = OCRepPayloadCreate();
64 OIC_LOG(ERROR, NOTIFICATION_TAG, PCF("Failed to allocate payload"));
68 OCRepPayloadSetUri(*syncPayload, NSGetNotificationSyncUri());
69 OCRepPayloadSetPropString(*syncPayload, NS_ATTRIBUTE_ID, sync->mMessageId);
70 OCRepPayloadSetPropInt(*syncPayload, NS_ATTRIBUTE_STATE, sync->mState);
72 NS_LOG(DEBUG, "NSGetSyncPayload - OUT");
76 NSResult NSSendMessage(NSMessage *msg)
78 OIC_LOG(DEBUG, NOTIFICATION_TAG, "Send Notification Message to consumer");
79 NS_LOG(DEBUG, "NSSendMessage - IN");
81 OCResourceHandle rHandle;
82 OCObservationId obArray[255] = { 0, };
85 if (NSPutMessageResource(msg, &rHandle) != NS_OK)
87 OIC_LOG(ERROR, NOTIFICATION_TAG, PCF("Fail to put notification resource"));
88 NS_LOG(DEBUG, "fail to Put notification resource");
92 if (consumerSubList->head == NULL)
94 OIC_LOG(ERROR, NOTIFICATION_TAG, PCF("no observers"));
95 NS_LOG(ERROR, "SubList->head is NULL, empty SubList");
99 OCRepPayload* payload;
101 if (NSGetMessagePayload(msg, &payload) != NS_OK)
103 OIC_LOG(ERROR, NOTIFICATION_TAG, PCF("Failed to allocate payload"));
104 NS_LOG(ERROR, "fail to Get message payload");
108 NSCacheElement * it = consumerSubList->head;
112 NSCacheSubData * subData = (NSCacheSubData *) it->data;
113 NS_LOG_V(DEBUG, "subData->id = %s", subData->id);
114 NS_LOG_V(DEBUG, "subData->messageId = %d", subData->messageObId);
115 NS_LOG_V(DEBUG, "subData->obID = %d", subData->syncObId);
116 NS_LOG_V(DEBUG, "subData->isWhite = %d", subData->isWhite);
118 if (subData->isWhite)
120 obArray[obCount++] = subData->messageObId;
126 NS_LOG_V(DEBUG, "observer Count = %d", obCount);
128 for (i = 0; i < obCount; ++i)
130 NS_LOG(DEBUG, "-------------------------------------------------------message\n");
131 NS_LOG_V(DEBUG, "SubScription WhiteList[%d] = %d", i, obArray[i]);
132 NS_LOG(DEBUG, "-------------------------------------------------------message\n");
135 OCStackResult ocstackResult = OCNotifyListOfObservers(rHandle, obArray, obCount, payload,
138 NS_LOG_V(DEBUG, "Message ocstackResult = %d", ocstackResult);
140 if (ocstackResult != OC_STACK_OK)
142 OIC_LOG(ERROR, NOTIFICATION_TAG, "fail to send message");
143 NS_LOG(ERROR, "fail to send message");
144 OCRepPayloadDestroy(payload);
147 OCRepPayloadDestroy(payload);
150 NS_LOG(DEBUG, "NSSendMessage - OUT");
155 NSResult NSSendSync(NSSync *sync)
157 OIC_LOG(DEBUG, NOTIFICATION_TAG, "Send Notification Sync to consumer");
158 NS_LOG(DEBUG, "NSSendSync - IN");
160 OCObservationId obArray[255] = { 0, };
164 OCResourceHandle rHandle;
165 if (NSPutSyncResource(sync, &rHandle) != NS_OK)
167 OIC_LOG(ERROR, NOTIFICATION_TAG, PCF("Fail to put sync resource"));
171 NSCacheElement * it = consumerSubList->head;
175 NSCacheSubData * subData = (NSCacheSubData *) it->data;
176 if (subData->isWhite)
178 obArray[obCount++] = subData->syncObId;
185 OCRepPayload* payload;
186 if (NSGetSyncPayload(sync, &payload) != NS_OK)
188 OIC_LOG(ERROR, NOTIFICATION_TAG, PCF("Failed to allocate payload"));
192 for (i = 0; i < obCount; ++i)
194 NS_LOG(DEBUG, "-------------------------------------------------------message\n");
195 NS_LOG_V(DEBUG, "Sync WhiteList[%d] = %d", i, obArray[i]);
196 NS_LOG(DEBUG, "-------------------------------------------------------message\n");
199 OCStackResult ocstackResult = OCNotifyListOfObservers(rHandle, obArray,
200 obCount, payload, OC_LOW_QOS);
202 NS_LOG_V(DEBUG, "Sync ocstackResult = %d", ocstackResult);
204 if (ocstackResult != OC_STACK_OK)
206 OIC_LOG(ERROR, NOTIFICATION_TAG, "fail to send Sync");
207 OCRepPayloadDestroy(payload);
212 OCRepPayloadDestroy(payload);
214 NS_LOG(DEBUG, "NSSendSync - OUT");
218 void * NSNotificationSchedule(void *ptr)
222 OIC_LOG(DEBUG, NOTIFICATION_TAG, "Create NSNotifiactionSchedule");
223 NS_LOG(DEBUG, "Create NSNotifiactionSchedule");
226 while (NSIsRunning[NOTIFICATION_SCHEDULER])
228 sem_wait(&NSSemaphore[NOTIFICATION_SCHEDULER]);
229 pthread_mutex_lock(&NSMutex[NOTIFICATION_SCHEDULER]);
231 if (NSHeadMsg[NOTIFICATION_SCHEDULER] != NULL)
233 NSTask *node = NSHeadMsg[NOTIFICATION_SCHEDULER];
234 NSHeadMsg[NOTIFICATION_SCHEDULER] = node->nextTask;
236 switch ((int)node->taskType)
238 case TASK_SEND_NOTIFICATION:
240 NS_LOG(DEBUG, "CASE TASK_SEND_NOTIFICATION : ");
241 NSMessage * nsMsg = (NSMessage *)node->taskData;
242 NSSendMessage(nsMsg);
246 NS_LOG(DEBUG, "CASE TASK_SEND_READ : ");
247 NSSendSync((NSSync*) node->taskData);
250 NS_LOG(DEBUG, "CASE TASK_RECV_READ : ");
251 NSSendSync((NSSync*) node->taskData);
252 NSPushQueue(RESPONSE_SCHEDULER, TASK_CB_SYNC, node->taskData);
256 OIC_LOG(ERROR, NOTIFICATION_TAG, "Unknown type message");
257 NS_LOG(ERROR, "Unknow type message");
264 pthread_mutex_unlock(&NSMutex[NOTIFICATION_SCHEDULER]);