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 "NSConsumerCommunication.h"
23 #include "NSConstants.h"
25 #include "NSConsumerCommon.h"
26 #include "oic_malloc.h"
27 #include "oic_string.h"
28 #include "ocpayload.h"
30 #define NS_SYNC_URI "/notification/sync"
32 static unsigned long NS_MESSAGE_ACCEPTANCE = 1;
34 NSMessage * NSCreateMessage_internal(uint64_t msgId, const char * providerId);
35 NSSyncInfo * NSCreateSyncInfo_consumer(uint64_t msgId, const char * providerId, NSSyncType state);
37 NSMessage * NSGetMessage(OCClientResponse * clientResponse);
38 NSSyncInfo * NSGetSyncInfoc(OCClientResponse * clientResponse);
39 NSTopicLL * NSGetTopicLL(OCClientResponse * clientResponse);
41 char * NSGetCloudUri(const char * providerId, char * uri);
43 NSResult NSConsumerSubscribeProvider(NSProvider * provider)
45 NSProvider_internal * provider_internal = (NSProvider_internal *) provider;
46 NS_VERIFY_NOT_NULL(provider_internal, NS_ERROR);
48 NSProviderConnectionInfo * connections = provider_internal->connection;
51 if (connections->isSubscribing == true)
53 connections = connections->next;
57 char * msgUri = OICStrdup(provider_internal->messageUri);
58 NS_VERIFY_NOT_NULL(msgUri, NS_ERROR);
59 char * syncUri = OICStrdup(provider_internal->syncUri);
60 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(syncUri, NS_ERROR, NSOICFree(msgUri));
62 OCConnectivityType type = CT_DEFAULT;
63 if (connections->addr->adapter == OC_ADAPTER_TCP)
65 type = CT_ADAPTER_TCP;
66 if (connections->isCloudConnection == true)
68 msgUri = NSGetCloudUri(provider_internal->providerId, msgUri);
69 NS_VERIFY_NOT_NULL(msgUri, NS_ERROR);
70 syncUri = NSGetCloudUri(provider_internal->providerId, syncUri);
71 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(syncUri, NS_ERROR, NSOICFree(msgUri));
75 NS_LOG_V(DEBUG, "subscribe to %s:%d", connections->addr->addr, connections->addr->port);
77 NS_LOG(DEBUG, "get subscribe message query");
79 query = NSMakeRequestUriWithConsumerId(msgUri);
80 NS_VERIFY_NOT_NULL(query, NS_ERROR);
82 NS_LOG(DEBUG, "subscribe message");
83 NS_LOG_V(DEBUG, "subscribe query : %s", query);
84 OCStackResult ret = NSInvokeRequest(&(connections->messageHandle),
85 OC_REST_OBSERVE, connections->addr, query, NULL,
86 NSConsumerMessageListener, NULL, type);
87 NS_VERIFY_STACK_SUCCESS_WITH_POST_CLEANING(
88 NSOCResultToSuccess(ret), NS_ERROR, NSOICFree(query));
92 NS_LOG(DEBUG, "get subscribe sync query");
93 query = NSMakeRequestUriWithConsumerId(syncUri);
94 NS_VERIFY_NOT_NULL(query, NS_ERROR);
96 NS_LOG(DEBUG, "subscribe sync");
97 NS_LOG_V(DEBUG, "subscribe query : %s", query);
98 ret = NSInvokeRequest(&(connections->syncHandle),
99 OC_REST_OBSERVE, connections->addr, query, NULL,
100 NSConsumerSyncInfoListener, NULL, type);
101 NS_VERIFY_STACK_SUCCESS_WITH_POST_CLEANING(
102 NSOCResultToSuccess(ret), NS_ERROR, NSOICFree(query));
106 connections->isSubscribing = true;
108 connections = connections->next;
111 NSProvider_internal * taskProvider = NSCopyProvider_internal(provider_internal);
112 NSTask * task = NSMakeTask(TASK_CONSUMER_SENT_REQ_OBSERVE, (void *) taskProvider);
113 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(task,
114 NS_ERROR, NSRemoveProvider_internal(taskProvider));
116 NSConsumerPushEvent(task);
121 OCStackApplicationResult NSConsumerCheckPostResult(
122 void * ctx, OCDoHandle handle, OCClientResponse * clientResponse)
127 NS_VERIFY_NOT_NULL(clientResponse, OC_STACK_KEEP_TRANSACTION);
128 NS_VERIFY_STACK_SUCCESS(
129 NSOCResultToSuccess(clientResponse->result), OC_STACK_KEEP_TRANSACTION);
131 return OC_STACK_KEEP_TRANSACTION;
134 void NSRemoveSyncInfoObj(NSSyncInfo * sync)
139 OCStackApplicationResult NSConsumerSyncInfoListener(
140 void * ctx, OCDoHandle handle, OCClientResponse * clientResponse)
145 NS_VERIFY_NOT_NULL(clientResponse, OC_STACK_KEEP_TRANSACTION);
146 NS_VERIFY_STACK_SUCCESS(
147 NSOCResultToSuccess(clientResponse->result), OC_STACK_KEEP_TRANSACTION);
149 NS_LOG(DEBUG, "get NSSyncInfo");
150 NSSyncInfo * newSync = NSGetSyncInfoc(clientResponse);
151 NS_VERIFY_NOT_NULL(newSync, OC_STACK_KEEP_TRANSACTION);
153 NSTaskType taskType = TASK_RECV_SYNCINFO;
155 NS_LOG(DEBUG, "build NSTask");
156 NSTask * task = NSMakeTask(taskType, (void *) newSync);
157 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(task,
158 OC_STACK_KEEP_TRANSACTION, NSRemoveSyncInfoObj(newSync));
160 NSConsumerPushEvent(task);
162 return OC_STACK_KEEP_TRANSACTION;
165 OCStackApplicationResult NSConsumerMessageListener(
166 void * ctx, OCDoHandle handle, OCClientResponse * clientResponse)
171 NS_VERIFY_NOT_NULL(clientResponse, OC_STACK_KEEP_TRANSACTION);
172 NS_VERIFY_STACK_SUCCESS(NSOCResultToSuccess(clientResponse->result), OC_STACK_KEEP_TRANSACTION);
174 NS_LOG(DEBUG, "build NSMessage");
175 NSMessage * newNoti = NSGetMessage(clientResponse);
176 NS_VERIFY_NOT_NULL(newNoti, OC_STACK_KEEP_TRANSACTION);
178 NSTaskType type = TASK_CONSUMER_RECV_MESSAGE;
180 if (newNoti->messageId == NS_MESSAGE_ACCEPTANCE || newNoti->messageId == NS_DENY)
182 NS_LOG(DEBUG, "Receive subscribe result");
183 type = TASK_CONSUMER_RECV_PROVIDER_CHANGED;
185 else if (newNoti->messageId == NS_TOPIC)
187 NS_LOG(DEBUG, "Receive Topic change");
188 type = TASK_CONSUMER_REQ_TOPIC_URI;
192 NS_LOG(DEBUG, "Receive new message");
195 NS_LOG(DEBUG, "build NSTask");
196 NSTask * task = NSMakeTask(type, (void *) newNoti);
197 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(task, NS_ERROR, NSRemoveMessage(newNoti));
199 NSConsumerPushEvent(task);
201 return OC_STACK_KEEP_TRANSACTION;
204 void NSGetMessagePostClean(char * pId, OCDevAddr * addr)
210 NSMessage * NSGetMessage(OCClientResponse * clientResponse)
212 NS_VERIFY_NOT_NULL(clientResponse->payload, NULL);
213 OCRepPayload * payload = (OCRepPayload *)clientResponse->payload;
215 NS_LOG(DEBUG, "get msg id");
217 bool getResult = OCRepPayloadGetPropInt(payload, NS_ATTRIBUTE_MESSAGE_ID, (int64_t *)&id);
218 NS_VERIFY_NOT_NULL(getResult == true ? (void *) 1 : NULL, NULL);
220 NS_LOG(DEBUG, "get provider id");
222 getResult = OCRepPayloadGetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID, &pId);
223 NS_LOG_V (DEBUG, "provider id: %s", pId);
224 NS_VERIFY_NOT_NULL(getResult == true ? (void *) 1 : NULL, NULL);
226 NS_LOG(DEBUG, "create NSMessage");
227 NSMessage * retMsg = NSCreateMessage_internal(id, pId);
228 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(retMsg, NULL, NSOICFree(pId));
231 NS_LOG(DEBUG, "get msg optional field");
232 OCRepPayloadGetPropString(payload, NS_ATTRIBUTE_TITLE, &retMsg->title);
233 OCRepPayloadGetPropString(payload, NS_ATTRIBUTE_TEXT, &retMsg->contentText);
234 OCRepPayloadGetPropString(payload, NS_ATTRIBUTE_SOURCE, &retMsg->sourceName);
235 OCRepPayloadGetPropString(payload, NS_ATTRIBUTE_TOPIC_NAME, &retMsg->topic);
237 OCRepPayloadGetPropInt(payload, NS_ATTRIBUTE_TYPE, (int64_t *)&retMsg->type);
238 OCRepPayloadGetPropString(payload, NS_ATTRIBUTE_DATETIME, &retMsg->dateTime);
239 OCRepPayloadGetPropInt(payload, NS_ATTRIBUTE_TTL, (int64_t *)&retMsg->ttl);
241 NS_LOG_V(DEBUG, "Msg ID : %lld", (long long int)retMsg->messageId);
242 NS_LOG_V(DEBUG, "Msg Title : %s", retMsg->title);
243 NS_LOG_V(DEBUG, "Msg Content : %s", retMsg->contentText);
244 NS_LOG_V(DEBUG, "Msg Source : %s", retMsg->sourceName);
245 NS_LOG_V(DEBUG, "Msg Topic : %s", retMsg->topic);
246 NS_LOG_V(DEBUG, "Msg Type : %d", retMsg->type);
247 NS_LOG_V(DEBUG, "Msg Date : %s", retMsg->dateTime);
248 NS_LOG_V(DEBUG, "Msg ttl : %lld", (long long int)retMsg->ttl);
253 NSSyncInfo * NSGetSyncInfoc(OCClientResponse * clientResponse)
255 NS_VERIFY_NOT_NULL(clientResponse->payload, NULL);
257 OCRepPayload * payload = (OCRepPayload *)clientResponse->payload;
259 NS_LOG(DEBUG, "get msg id");
261 bool getResult = OCRepPayloadGetPropInt(payload, NS_ATTRIBUTE_MESSAGE_ID, (int64_t *)&id);
262 NS_VERIFY_NOT_NULL(getResult == true ? (void *) 1 : NULL, NULL);
264 NS_LOG(DEBUG, "get provider id");
266 getResult = OCRepPayloadGetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID, &pId);
267 NS_VERIFY_NOT_NULL(getResult == true ? (void *) 1 : NULL, NULL);
269 NS_LOG(DEBUG, "get state");
271 getResult = OCRepPayloadGetPropInt(payload, NS_ATTRIBUTE_STATE, & state);
272 NS_VERIFY_NOT_NULL(getResult == true ? (void *) 1 : NULL, NULL);
274 NS_LOG(DEBUG, "create NSSyncInfo");
275 NSSyncInfo * retSync = NSCreateSyncInfo_consumer(id, pId, (NSSyncType)state);
276 NS_VERIFY_NOT_NULL(retSync, NULL);
278 NS_LOG_V(DEBUG, "Sync ID : %lld", (long long int)retSync->messageId);
279 NS_LOG_V(DEBUG, "Sync State : %d", (int) retSync->state);
280 NS_LOG_V(DEBUG, "Sync Provider ID : %s", retSync->providerId);
285 NSMessage * NSCreateMessage_internal(uint64_t id, const char * providerId)
287 NSMessage * retMsg = (NSMessage *)OICMalloc(sizeof(NSMessage));
288 NS_VERIFY_NOT_NULL(retMsg, NULL);
290 retMsg->messageId = id;
291 OICStrcpy(retMsg->providerId, sizeof(char) * NS_DEVICE_ID_LENGTH, providerId);
292 retMsg->title = NULL;
293 retMsg->contentText = NULL;
294 retMsg->sourceName = NULL;
295 retMsg->topic = NULL;
296 retMsg->type = NS_MESSAGE_INFO;
297 retMsg->dateTime = NULL;
299 retMsg->mediaContents = NULL;
304 NSSyncInfo * NSCreateSyncInfo_consumer(uint64_t msgId, const char * providerId, NSSyncType state)
306 NS_VERIFY_NOT_NULL(providerId, NULL);
308 NSSyncInfo * retSync = (NSSyncInfo *)OICMalloc(sizeof(NSSyncInfo));
309 NS_VERIFY_NOT_NULL(retSync, NULL);
311 retSync->messageId = msgId;
312 retSync->state = state;
313 OICStrcpy(retSync->providerId, sizeof(char) * NS_DEVICE_ID_LENGTH, providerId);
318 OCStackResult NSSendSyncInfo(NSSyncInfo * syncInfo, OCDevAddr * addr)
320 NS_VERIFY_NOT_NULL(syncInfo, OC_STACK_ERROR);
321 NS_VERIFY_NOT_NULL(addr, OC_STACK_ERROR);
323 OCRepPayload * payload = OCRepPayloadCreate();
324 NS_VERIFY_NOT_NULL(payload, OC_STACK_ERROR);
326 OCRepPayloadSetPropInt(payload, NS_ATTRIBUTE_MESSAGE_ID, (int64_t)syncInfo->messageId);
327 OCRepPayloadSetPropInt(payload, NS_ATTRIBUTE_STATE, syncInfo->state);
328 OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID, syncInfo->providerId);
330 char * uri = (char*)OICStrdup(NS_SYNC_URI);
331 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(uri, OC_STACK_ERROR, OCRepPayloadDestroy(payload));
333 OCConnectivityType type = CT_DEFAULT;
334 if(addr->adapter == OC_ADAPTER_TCP)
336 type = CT_ADAPTER_TCP;
337 uri = NSGetCloudUri(syncInfo->providerId, uri);
338 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(uri, OC_STACK_ERROR, OCRepPayloadDestroy(payload));
341 OCStackResult ret = NSInvokeRequest(NULL, OC_REST_POST, addr,
342 uri, (OCPayload*)payload,
343 NSConsumerCheckPostResult, NULL, type);
349 char * NSGetCloudUri(const char * providerId, char * uri)
351 size_t uriLen = NS_DEVICE_ID_LENGTH + 1 + strlen(uri) + 1;
352 char * retUri = (char *)OICMalloc(uriLen);
353 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(retUri, NULL, NSOICFree(uri));
355 snprintf(retUri, uriLen, "/%s%s", providerId, uri);
357 NS_LOG_V(DEBUG, "Cloud uri : %s", retUri);
362 void NSConsumerCommunicationTaskProcessing(NSTask * task)
364 NS_VERIFY_NOT_NULL_V(task);
366 NS_LOG_V(DEBUG, "Receive Event : %d", (int)task->taskType);
367 if (task->taskType == TASK_CONSUMER_REQ_SUBSCRIBE)
369 NS_VERIFY_NOT_NULL_V(task->taskData);
370 NS_LOG(DEBUG, "Request Subscribe");
371 NSResult ret = NSConsumerSubscribeProvider((NSProvider *)task->taskData);
372 NS_VERIFY_NOT_NULL_V(ret == NS_OK ? (void *)1 : NULL);
374 else if (task->taskType == TASK_SEND_SYNCINFO)
376 NS_VERIFY_NOT_NULL_V(task->taskData);
377 NSSyncInfo_internal * syncInfo = (NSSyncInfo_internal *)task->taskData;
378 NSProviderConnectionInfo * info = syncInfo->connection;
382 OCStackResult ret = NSSendSyncInfo((NSSyncInfo *)(task->taskData), info->addr);
383 if (ret != OC_STACK_OK)
385 NS_LOG_V(ERROR, "send sync info fail : %d", info->addr->adapter);
391 NSRemoveConnections(syncInfo->connection);
394 else if (task->taskType == TASK_CONSUMER_REQ_SUBSCRIBE_CANCEL)
396 NSProvider_internal * provider = (NSProvider_internal *)task->taskData;
398 NSProviderConnectionInfo * connections = provider->connection;
401 if (connections->isSubscribing == false)
403 NS_LOG_V(DEBUG, "unsubscribed to %s:%d",
404 connections->addr->addr, connections->addr->port);
405 connections = connections->next;
408 NS_LOG_V(DEBUG, "cancel subscribe to %s:%d",
409 connections->addr->addr, connections->addr->port);
410 OCCancel(connections->messageHandle, NS_QOS, NULL, 0);
411 OCCancel(connections->syncHandle, NS_QOS, NULL, 0);
412 connections->messageHandle = NULL;
413 connections->syncHandle = NULL;
414 connections->isSubscribing = false;
415 connections = connections->next;
418 else if (task->taskType == TASK_CONSUMER_REQ_TOPIC_LIST
419 || task->taskType == TASK_CONSUMER_GET_TOPIC_LIST)
421 NSProvider_internal * provider = (NSProvider_internal *)task->taskData;
423 NSProviderConnectionInfo * connections = provider->connection;
424 NS_VERIFY_NOT_NULL_V(connections);
426 char * topicUri = OICStrdup(provider->topicUri);
428 OCConnectivityType type = CT_DEFAULT;
429 if (connections->addr->adapter == OC_ADAPTER_TCP)
431 type = CT_ADAPTER_TCP;
432 if (connections->isCloudConnection == true)
434 topicUri = NSGetCloudUri(provider->providerId, topicUri);
438 NS_LOG(DEBUG, "get topic query");
440 if (task->taskType == TASK_CONSUMER_REQ_TOPIC_LIST)
442 query = OICStrdup(topicUri);
444 else if (task->taskType == TASK_CONSUMER_GET_TOPIC_LIST)
446 query = NSMakeRequestUriWithConsumerId(topicUri);
448 NS_VERIFY_NOT_NULL_V(query);
449 NS_LOG_V(DEBUG, "topic query : %s", query);
451 OCStackResult ret = NSInvokeRequest(NULL, OC_REST_GET, connections->addr,
452 query, NULL, NSIntrospectTopic, (void *) provider, type);
453 NS_VERIFY_STACK_SUCCESS_V(NSOCResultToSuccess(ret));
458 else if (task->taskType == TASK_CONSUMER_SELECT_TOPIC_LIST)
460 NSProvider_internal * provider = (NSProvider_internal *)task->taskData;
462 NSProviderConnectionInfo * connections = provider->connection;
463 NS_VERIFY_NOT_NULL_V(connections);
465 OCRepPayload * payload = OCRepPayloadCreate();
466 NS_VERIFY_NOT_NULL_V(payload);
468 NSTopicLL * topicLL = provider->topicLL;
469 NSTopicLL * iter = topicLL;
474 NS_LOG_V(DEBUG, "[%d] Topic Name:%s\tTopic State:%d",
475 topicLLSize, iter->topicName, iter->state);
476 iter = (NSTopicLL *) iter->next;
479 OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_CONSUMER_ID, *NSGetConsumerId());
480 NS_LOG_V(DEBUG, "NS_ATTRIBUTE_CONSUMER_ID: %s", *NSGetConsumerId());
484 NS_LOG_V(DEBUG, "DimensionSize: %d", topicLLSize);
486 OCRepPayload ** topicPayload = NULL;
489 topicPayload = (OCRepPayload **) OICMalloc(sizeof(OCRepPayload *)*topicLLSize);
490 NS_VERIFY_NOT_NULL_V(topicPayload);
492 while (iter || iterSize < topicLLSize)
494 topicPayload[iterSize] = OCRepPayloadCreate();
495 OCRepPayloadSetPropString(topicPayload[iterSize], NS_ATTRIBUTE_TOPIC_NAME,
497 OCRepPayloadSetPropInt(topicPayload[iterSize], NS_ATTRIBUTE_TOPIC_SELECTION,
499 NS_LOG_V(DEBUG, "NS_ATTRIBUTE_TOPIC_NAME: %s", iter->topicName);
500 NS_LOG_V(DEBUG, "NS_ATTRIBUTE_TOPIC_SELECTION: %d", iter->state);
504 size_t dimensions[3] = {topicLLSize, 0, 0};
506 OCRepPayloadSetPropObjectArrayAsOwner(payload, NS_ATTRIBUTE_TOPIC_LIST,
507 topicPayload, dimensions);
511 OCRepPayloadSetNull(payload, NS_ATTRIBUTE_TOPIC_LIST);
514 char * topicUri = OICStrdup(provider->topicUri);
516 OCConnectivityType type = CT_DEFAULT;
517 if (connections->addr->adapter == OC_ADAPTER_TCP)
519 type = CT_ADAPTER_TCP;
520 if (connections->isCloudConnection == true)
522 topicUri = NSGetCloudUri(provider->providerId, topicUri);
526 NS_LOG(DEBUG, "get topic query");
528 query = NSMakeRequestUriWithConsumerId(topicUri);
529 NS_VERIFY_NOT_NULL_V(query);
530 NS_LOG_V(DEBUG, "topic query : %s", query);
532 OCStackResult ret = NSInvokeRequest(NULL, OC_REST_POST, connections->addr,
533 query, (OCPayload*)payload, NSConsumerCheckPostResult, NULL, type);
534 NS_VERIFY_STACK_SUCCESS_V(NSOCResultToSuccess(ret));
541 NS_LOG(ERROR, "Unknown type message");
547 NSTopicLL * NSGetTopicLL(OCClientResponse * clientResponse)
549 NS_LOG(DEBUG, "create NSTopicLL");
550 NS_VERIFY_NOT_NULL(clientResponse->payload, NULL);
552 OCRepPayload * payload = (OCRepPayload *)clientResponse->payload;
555 NS_LOG_V(DEBUG, "Payload Key : %s", payload->values->name);
556 payload = payload->next;
559 payload = (OCRepPayload *)clientResponse->payload;
561 char * consumerId = NULL;
562 OCRepPayload ** topicLLPayload = NULL;
564 NS_LOG(DEBUG, "get information of consumerId");
566 bool getResult = OCRepPayloadGetPropString(payload, NS_ATTRIBUTE_CONSUMER_ID, & consumerId);
567 NSOICFree(consumerId);
569 OCRepPayloadValue * payloadValue = NULL;
570 payloadValue = NSPayloadFindValue(payload, NS_ATTRIBUTE_TOPIC_LIST);
571 NS_VERIFY_NOT_NULL(payloadValue, NULL);
573 size_t dimensionSize = calcDimTotal(payloadValue->arr.dimensions);
574 NS_LOG_V(DEBUG, "DimensionSize: %d", (int)dimensionSize);
576 if (dimensionSize == 0 || payloadValue->type == OCREP_PROP_NULL ||
577 payloadValue->arr.objArray == NULL)
579 NS_LOG(DEBUG, "No TopicLL");
583 topicLLPayload = payloadValue->arr.objArray;
585 NSTopicLL * topicLL = NULL;
586 for (int i = 0; i < (int)dimensionSize; i++)
588 char * topicName = NULL;
591 NSTopicLL * topicNode = (NSTopicLL *) OICMalloc(sizeof(NSTopicLL));
592 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(topicNode, NULL, NSRemoveTopicLL(topicLL));
594 NS_LOG(DEBUG, "get topic selection");
595 getResult = OCRepPayloadGetPropInt(topicLLPayload[i],
596 NS_ATTRIBUTE_TOPIC_SELECTION, & state);
597 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(getResult == true ? (void *) 1 : NULL,
598 NULL, NSRemoveTopicLL(topicLL));
600 NS_LOG(DEBUG, "get topic name");
601 getResult = OCRepPayloadGetPropString(topicLLPayload[i],
602 NS_ATTRIBUTE_TOPIC_NAME, & topicName);
603 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(getResult == true ? (void *) 1 : NULL,
604 NULL, NSRemoveTopicLL(topicLL));
605 NS_LOG_V(DEBUG, "topic name: %s", topicName);
606 NS_LOG_V(DEBUG, "topic selection: %d", (int)state);
608 topicNode->topicName = topicName;
609 topicNode->state = state;
614 topicNode->next = NULL;
618 NSResult ret = NSInsertTopicNode(topicLL, topicNode);
619 NS_VERIFY_STACK_SUCCESS_WITH_POST_CLEANING(ret, NULL, NSRemoveTopicLL(topicLL));
625 OCStackApplicationResult NSIntrospectTopic(
626 void * ctx, OCDoHandle handle, OCClientResponse * clientResponse)
630 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(clientResponse, OC_STACK_KEEP_TRANSACTION,
631 NSRemoveProvider_internal((NSProvider_internal *) ctx));
632 NS_VERIFY_STACK_SUCCESS_WITH_POST_CLEANING(NSOCResultToSuccess(clientResponse->result),
633 OC_STACK_KEEP_TRANSACTION, NSRemoveProvider_internal((NSProvider_internal *) ctx));
635 NS_LOG_V(DEBUG, "GET response income : %s:%d",
636 clientResponse->devAddr.addr, clientResponse->devAddr.port);
637 NS_LOG_V(DEBUG, "GET response result : %d",
638 clientResponse->result);
639 NS_LOG_V(DEBUG, "GET response sequenceNum : %d",
640 clientResponse->sequenceNumber);
641 NS_LOG_V(DEBUG, "GET response resource uri : %s",
642 clientResponse->resourceUri);
643 NS_LOG_V(DEBUG, "GET response Transport Type : %d",
644 clientResponse->devAddr.adapter);
646 NSTopicLL * newTopicLL = NSGetTopicLL(clientResponse);
647 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(newTopicLL, OC_STACK_KEEP_TRANSACTION,
648 NSRemoveProvider_internal((NSProvider_internal *) ctx));
650 NSProvider_internal * provider = (NSProvider_internal *) ctx;
651 provider->topicLL = NSCopyTopicLL(newTopicLL);
653 NS_LOG(DEBUG, "build NSTask");
654 NSTask * task = NSMakeTask(TASK_CONSUMER_RECV_TOPIC_LIST, (void *) provider);
655 NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(task, NS_ERROR, NSRemoveProvider_internal(provider));
657 NSConsumerPushEvent(task);
658 NSRemoveTopicLL(newTopicLL);
660 return OC_STACK_KEEP_TRANSACTION;