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 "NSConstants.h"
22 #include "NSConsumerCommon.h"
23 #include "NSConsumerCommunication.h"
24 #include "oic_malloc.h"
25 #include "oic_string.h"
26 #include "ocpayload.h"
28 #define NS_SYNC_URI "/notification/sync"
30 unsigned long NS_MESSAGE_ACCEPTANCE = 1;
32 NSMessage_consumer * NSCreateMessage_internal(uint64_t msgId, const char * providerId);
33 NSSyncInfo * NSCreateSyncInfo_consumer(uint64_t msgId, const char * providerId, NSSyncType state);
35 NSMessage_consumer * NSGetMessage(OCClientResponse * clientResponse);
36 NSSyncInfo * NSGetSyncInfoc(OCClientResponse * clientResponse);
38 OCRepPayload * NSGetofSyncInfoPayload(NSMessage_consumer * message, int type);
39 OCStackResult NSSendSyncInfo(NSMessage_consumer * message, int type);
41 // TODO it seem to not to be this file
42 NSResult NSPushToCache(OCClientResponse * clientResponse, NSTaskType type);
44 NSResult NSConsumerSubscribeProvider(NSProvider * provider)
46 NSProvider_internal * provider_internal = (NSProvider_internal *) provider;
47 NS_VERTIFY_NOT_NULL(provider_internal, NS_ERROR);
49 NS_LOG(DEBUG, "get subscribe message query");
50 char * query = NSGetQuery(provider_internal->messageUri);
51 NS_VERTIFY_NOT_NULL(query, NS_ERROR);
53 NS_LOG(DEBUG, "subscribe message");
54 NS_LOG_V(DEBUG, "subscribe query : %s", query);
55 OCStackResult ret = NSInvokeRequest(&(provider_internal->messageHandle),
56 OC_REST_OBSERVE, provider_internal->addr,
57 query, NULL, NSConsumerMessageListener, NULL);
58 NS_VERTIFY_STACK_OK(ret, NS_ERROR);
61 NS_LOG(DEBUG, "get subscribe sync query");
62 query = NSGetQuery(provider_internal->syncUri);
63 NS_VERTIFY_NOT_NULL(query, NS_ERROR);
65 NS_LOG(DEBUG, "subscribe sync");
66 NS_LOG_V(DEBUG, "subscribe query : %s", query);
67 ret = NSInvokeRequest(&(provider_internal->syncHandle),
68 OC_REST_OBSERVE, provider_internal->addr,
69 query, NULL, NSConsumerSyncInfoListener, NULL);
70 NS_VERTIFY_STACK_OK(ret, NS_ERROR);
76 OCStackApplicationResult NSConsumerCheckPostResult(
77 void * ctx, OCDoHandle handle, OCClientResponse * clientResponse)
82 NS_VERTIFY_NOT_NULL(clientResponse, OC_STACK_KEEP_TRANSACTION);
83 NS_VERTIFY_STACK_OK(clientResponse->result, OC_STACK_KEEP_TRANSACTION);
85 return OC_STACK_KEEP_TRANSACTION;
88 void NSRemoveSyncInfoObj(NSSyncInfo * sync)
93 OCStackApplicationResult NSConsumerSyncInfoListener(
94 void * ctx, OCDoHandle handle, OCClientResponse * clientResponse)
99 NS_VERTIFY_NOT_NULL(clientResponse, OC_STACK_KEEP_TRANSACTION);
100 NS_VERTIFY_STACK_OK(clientResponse->result, OC_STACK_KEEP_TRANSACTION);
102 NS_LOG(DEBUG, "get NSSyncInfo");
103 NSSyncInfo * newSync = NSGetSyncInfoc(clientResponse);
104 NS_VERTIFY_NOT_NULL(newSync, OC_STACK_KEEP_TRANSACTION);
106 NSTaskType taskType = TASK_RECV_SYNCINFO;
108 NS_LOG(DEBUG, "build NSTask");
109 NSTask * task = NSMakeTask(taskType, (void *) newSync);
110 NS_VERTIFY_NOT_NULL_WITH_POST_CLEANING(task,
111 OC_STACK_KEEP_TRANSACTION, NSRemoveSyncInfoObj(newSync));
113 NSConsumerPushEvent(task);
115 return OC_STACK_KEEP_TRANSACTION;
118 OCStackApplicationResult NSConsumerMessageListener(
119 void * ctx, OCDoHandle handle, OCClientResponse * clientResponse)
124 NS_VERTIFY_NOT_NULL(clientResponse, OC_STACK_KEEP_TRANSACTION);
125 NS_VERTIFY_STACK_OK(clientResponse->result, OC_STACK_KEEP_TRANSACTION);
127 NS_LOG(DEBUG, "build NSMessage");
128 NSMessage_consumer * newNoti = NSGetMessage(clientResponse);
129 NS_VERTIFY_NOT_NULL(newNoti, OC_STACK_KEEP_TRANSACTION);
131 NSTaskType type = TASK_CONSUMER_RECV_MESSAGE;
133 if (newNoti->messageId == NS_MESSAGE_ACCEPTANCE)
135 NS_LOG(DEBUG, "Receive Subscribe confirm");
136 type = TASK_CONSUMER_RECV_SUBSCRIBE_CONFIRMED;
140 NS_LOG(DEBUG, "Receive new message");
143 NS_LOG(DEBUG, "build NSTask");
144 NSTask * task = NSMakeTask(type, (void *) newNoti);
145 NS_VERTIFY_NOT_NULL_WITH_POST_CLEANING(task, NS_ERROR, NSRemoveMessage(newNoti));
147 NSConsumerPushEvent(task);
149 return OC_STACK_KEEP_TRANSACTION;
152 NSResult NSPushToCache(OCClientResponse * clientResponse, NSTaskType type)
154 NSMessage_consumer * cachedNoti = NSGetMessage(clientResponse);
155 NS_LOG(DEBUG, "build NSMessage");
156 NS_VERTIFY_NOT_NULL(cachedNoti, NS_ERROR);
158 NS_LOG(DEBUG, "build NSTask");
159 NSTask * task = NSMakeTask(type, (void *) cachedNoti);
160 NS_VERTIFY_NOT_NULL_WITH_POST_CLEANING(task, NS_ERROR, NSRemoveMessage(cachedNoti));
162 NSConsumerPushEvent(task);
167 void NSGetMessagePostClean(char * pId, OCDevAddr * addr)
173 NSMessage_consumer * NSGetMessage(OCClientResponse * clientResponse)
175 NS_VERTIFY_NOT_NULL(clientResponse->payload, NULL);
176 OCRepPayload * payload = (OCRepPayload *)clientResponse->payload;
178 NS_LOG(DEBUG, "get msg id");
180 bool getResult = OCRepPayloadGetPropInt(payload, NS_ATTRIBUTE_MESSAGE_ID, (int64_t *)&id);
181 NS_VERTIFY_NOT_NULL(getResult == true ? (void *) 1 : NULL, NULL);
183 NS_LOG(DEBUG, "get provider id");
185 getResult = OCRepPayloadGetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID, &pId);
186 NS_VERTIFY_NOT_NULL(getResult == true ? (void *) 1 : NULL, NULL);
188 NS_LOG(DEBUG, "get provider address");
189 OCDevAddr * addr = (OCDevAddr *)OICMalloc(sizeof(OCDevAddr));
190 NS_VERTIFY_NOT_NULL_WITH_POST_CLEANING(addr, NULL, NSGetMessagePostClean(pId, addr));
191 memcpy(addr, clientResponse->addr, sizeof(OCDevAddr));
193 NS_LOG(DEBUG, "create NSMessage");
194 NSMessage_consumer * retNoti = NSCreateMessage_internal(id, pId);
195 NS_VERTIFY_NOT_NULL_WITH_POST_CLEANING(retNoti, NULL, NSGetMessagePostClean(pId, addr));
198 retNoti->addr = addr;
199 retNoti->messageTypes = Notification;
201 NS_LOG(DEBUG, "get msg optional field");
202 OCRepPayloadGetPropString(payload, NS_ATTRIBUTE_TITLE, &retNoti->title);
203 OCRepPayloadGetPropString(payload, NS_ATTRIBUTE_TEXT, &retNoti->contentText);
204 OCRepPayloadGetPropString(payload, NS_ATTRIBUTE_SOURCE, &retNoti->sourceName);
206 OCRepPayloadGetPropInt(payload, NS_ATTRIBUTE_TYPE, (int64_t *)&retNoti->type);
207 OCRepPayloadGetPropString(payload, NS_ATTRIBUTE_DATETIME, &retNoti->dateTime);
208 OCRepPayloadGetPropInt(payload, NS_ATTRIBUTE_TTL, (int64_t *)&retNoti->ttl);
210 NS_LOG_V(DEBUG, "Msg Address : %s", retNoti->addr->addr);
211 NS_LOG_V(DEBUG, "Msg ID : %ld", retNoti->messageId);
212 NS_LOG_V(DEBUG, "Msg Title : %s", retNoti->title);
213 NS_LOG_V(DEBUG, "Msg Content : %s", retNoti->contentText);
214 NS_LOG_V(DEBUG, "Msg Source : %s", retNoti->sourceName);
215 NS_LOG_V(DEBUG, "Msg Type : %d", retNoti->type);
216 NS_LOG_V(DEBUG, "Msg Date : %s", retNoti->dateTime);
217 NS_LOG_V(DEBUG, "Msg ttl : %ld", retNoti->ttl);
222 NSSyncInfo * NSGetSyncInfoc(OCClientResponse * clientResponse)
224 NS_VERTIFY_NOT_NULL(clientResponse->payload, NULL);
226 OCRepPayload * payload = (OCRepPayload *)clientResponse->payload;
228 NS_LOG(DEBUG, "get msg id");
230 bool getResult = OCRepPayloadGetPropInt(payload, NS_ATTRIBUTE_MESSAGE_ID, (int64_t *)&id);
231 NS_VERTIFY_NOT_NULL(getResult == true ? (void *) 1 : NULL, NULL);
233 NS_LOG(DEBUG, "get provider id");
235 getResult = OCRepPayloadGetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID, &pId);
236 NS_VERTIFY_NOT_NULL(getResult == true ? (void *) 1 : NULL, NULL);
238 NS_LOG(DEBUG, "get state");
240 getResult = OCRepPayloadGetPropInt(payload, NS_ATTRIBUTE_STATE, & state);
241 NS_VERTIFY_NOT_NULL(getResult == true ? (void *) 1 : NULL, NULL);
243 NS_LOG(DEBUG, "create NSSyncInfo");
244 NSSyncInfo * retSync = NSCreateSyncInfo_consumer(id, pId, (NSSyncType)state);
245 NS_VERTIFY_NOT_NULL(retSync, NULL);
247 NS_LOG_V(DEBUG, "Sync ID : %ld", retSync->messageId);
248 NS_LOG_V(DEBUG, "Sync State : %d", (int) retSync->state);
249 NS_LOG_V(DEBUG, "Sync Provider ID : %s", retSync->providerId);
254 NSMessage_consumer * NSCreateMessage_internal(uint64_t id, const char * providerId)
256 NSMessage_consumer * retNoti = (NSMessage_consumer *)OICMalloc(sizeof(NSMessage_consumer));
257 NS_VERTIFY_NOT_NULL(retNoti, NULL);
259 retNoti->messageId = id;
260 OICStrcpy(retNoti->providerId, sizeof(char) * NS_DEVICE_ID_LENGTH, providerId);
261 retNoti->title = NULL;
262 retNoti->contentText = NULL;
263 retNoti->sourceName = NULL;
264 retNoti->type = NS_MESSAGE_INFO;
265 retNoti->dateTime = NULL;
267 retNoti->addr = NULL;
272 NSSyncInfo * NSCreateSyncInfo_consumer(uint64_t msgId, const char * providerId, NSSyncType state)
274 NSSyncInfo * retSync = (NSSyncInfo *)OICMalloc(sizeof(NSSyncInfo));
275 NS_VERTIFY_NOT_NULL(retSync, NULL);
277 retSync->messageId = msgId;
278 retSync->state = state;
279 OICStrcpy(retSync->providerId, sizeof(char) * NS_DEVICE_ID_LENGTH, providerId);
284 void NSConsumerCommunicationTaskProcessing(NSTask * task)
286 NS_VERTIFY_NOT_NULL_V(task);
288 NS_LOG_V(DEBUG, "Receive Event : %d", (int)task->taskType);
289 if (task->taskType == TASK_CONSUMER_REQ_SUBSCRIBE)
291 NS_LOG(DEBUG, "Request Subscribe");
292 NSResult ret = NSConsumerSubscribeProvider((NSProvider *)task->taskData);
293 NS_VERTIFY_NOT_NULL_V(ret == NS_OK ? (void *)1 : NULL);
295 else if (task->taskType == TASK_SEND_READ || task->taskType == TASK_SEND_DISMISS)
297 NSMessage_consumer * message = (NSMessage_consumer *) task->taskData;
298 NS_VERTIFY_NOT_NULL_V(message);
300 OCStackResult ret = NSSendSyncInfo(message, (task->taskType == TASK_SEND_READ) ? 0 : 1);
301 NS_VERTIFY_STACK_OK_V(ret);
304 else if (task->taskType == TASK_CONSUMER_REQ_SUBSCRIBE_CANCEL)
306 NSProvider_internal * provider = (NSProvider_internal *)task->taskData;
308 OCCancel(provider->messageHandle, NS_QOS, NULL, 0);
309 OCCancel(provider->syncHandle, NS_QOS, NULL, 0);
313 NS_LOG(ERROR, "Unknown type message");
317 OCRepPayload * NSGetofSyncInfoPayload(NSMessage_consumer * message, int type)
319 OCRepPayload * payload = OCRepPayloadCreate();
320 NS_VERTIFY_NOT_NULL(payload, NULL);
322 OCRepPayloadSetPropInt(payload, NS_ATTRIBUTE_MESSAGE_ID, (int64_t)message->messageId);
323 OCRepPayloadSetPropInt(payload, NS_ATTRIBUTE_STATE, type);
328 OCStackResult NSSendSyncInfo(NSMessage_consumer * message, int type)
330 OCRepPayload * payload = NSGetofSyncInfoPayload(message, type);
331 NS_VERTIFY_NOT_NULL(payload, OC_STACK_ERROR);
333 return NSInvokeRequest(NULL, OC_REST_POST, message->addr,
334 NS_SYNC_URI, (OCPayload*)payload,
335 NSConsumerCheckPostResult, NULL);