NS_LOG(DEBUG, "Receive Subscribe confirm");
type = TASK_CONSUMER_RECV_SUBSCRIBE_CONFIRMED;
}
+ else if (newNoti->messageId == NS_TOPIC)
+ {
+ NS_LOG(DEBUG, "Receive Topic change");
+ type = TASK_CONSUMER_REQ_TOPIC_URI;
+ }
else
{
NS_LOG(DEBUG, "Receive new message");
connections = connections->next;
}
}
+ else if (task->taskType == TASK_CONSUMER_REQ_TOPIC_LIST)
+ {
+ NSProvider_internal * provider = (NSProvider_internal *)task->taskData;
+
+ NSProviderConnectionInfo * connections = provider->connection;
+ NS_VERIFY_NOT_NULL_V(connections);
+
+ char * topicUri = OICStrdup(provider->topicUri);
+
+ OCConnectivityType type = CT_DEFAULT;
+ if (connections->addr->adapter == OC_ADAPTER_TCP)
+ {
+ type = CT_ADAPTER_TCP;
+ if (connections->isCloudConnection == true)
+ {
+ topicUri = NSGetCloudUri(provider->providerId, topicUri);
+ }
+ }
+
+ OCStackResult ret = NSInvokeRequest(NULL, OC_REST_GET, connections->addr,
+ topicUri, NULL, NSIntrospectTopic, (void *) provider, type);
+ NS_VERIFY_STACK_SUCCESS_V(NSOCResultToSuccess(ret));
+ NSOICFree(topicUri);
+ }
+ else if (task->taskType == TASK_CONSUMER_GET_TOPIC_LIST)
+ {
+ NSProvider_internal * provider = (NSProvider_internal *)task->taskData;
+
+ NSProviderConnectionInfo * connections = provider->connection;
+ NS_VERIFY_NOT_NULL_V(connections);
+
+ char * topicUri = OICStrdup(provider->topicUri);
+
+ OCConnectivityType type = CT_DEFAULT;
+ if (connections->addr->adapter == OC_ADAPTER_TCP)
+ {
+ type = CT_ADAPTER_TCP;
+ if (connections->isCloudConnection == true)
+ {
+ topicUri = NSGetCloudUri(provider->providerId, topicUri);
+ }
+ }
+
+ NS_LOG(DEBUG, "get topic query");
+ char * query = NULL;
+ query = NSMakeRequestUriWithConsumerId(topicUri);
+ NS_VERIFY_NOT_NULL_V(query);
+ NS_LOG_V(DEBUG, "topic query : %s", query);
+
+ OCStackResult ret = NSInvokeRequest(NULL, OC_REST_GET, connections->addr,
+ query, NULL, NSIntrospectTopic, NULL, type);
+ NS_VERIFY_STACK_SUCCESS_V(NSOCResultToSuccess(ret));
+ NSOICFree(query);
+ NSOICFree(topicUri);
+ }
+ else if (task->taskType == TASK_CONSUMER_SELECT_TOPIC_LIST)
+ {
+ NSProvider_internal * provider = (NSProvider_internal *)task->taskData;
+
+ NSProviderConnectionInfo * connections = provider->connection;
+ NS_VERIFY_NOT_NULL_V(connections);
+
+ OCRepPayload * payload = OCRepPayloadCreate();
+ NS_VERIFY_NOT_NULL_V(payload);
+ OCRepPayload ** topicPayload = (OCRepPayload **) OICMalloc(
+ sizeof(OCRepPayload *)*provider->topicListSize);
+ NS_VERIFY_NOT_NULL_V(topicPayload);
+
+ OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_CONSUMER_ID, *NSGetConsumerId());
+
+ NSTopic ** topic = provider->topicList->topics;
+
+ for (int i = 0; i < (int)provider->topicListSize; i++)
+ {
+ topicPayload[i] = OCRepPayloadCreate();
+ OCRepPayloadSetPropString(topicPayload[i], NS_ATTRIBUTE_TOPIC_NAME, topic[i]->topicName);
+ OCRepPayloadSetPropInt(topicPayload[i], NS_ATTRIBUTE_TOPIC_SELECTION, topic[i]->state);
+ }
+
+ size_t dimensions[3] = {provider->topicListSize, 0, 0};
+ OCRepPayloadSetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST, (const OCRepPayload **)topicPayload, dimensions);
+
+ char * topicUri = OICStrdup(provider->topicUri);
+
+ OCConnectivityType type = CT_DEFAULT;
+ if (connections->addr->adapter == OC_ADAPTER_TCP)
+ {
+ type = CT_ADAPTER_TCP;
+ if (connections->isCloudConnection == true)
+ {
+ topicUri = NSGetCloudUri(provider->providerId, topicUri);
+ }
+ }
+
+ NS_LOG(DEBUG, "get topic query");
+ char * query = NULL;
+ query = NSMakeRequestUriWithConsumerId(topicUri);
+ NS_VERIFY_NOT_NULL_V(query);
+ NS_LOG_V(DEBUG, "topic query : %s", query);
+
+ OCStackResult ret = NSInvokeRequest(NULL, OC_REST_GET, connections->addr,
+ query, (OCPayload*)payload, NSConsumerCheckPostResult, NULL, type);
+ NS_VERIFY_STACK_SUCCESS_V(NSOCResultToSuccess(ret));
+ NSOICFree(query);
+ NSOICFree(topicUri);
+ }
else
{
NS_LOG(ERROR, "Unknown type message");
}
NSOICFree(task);
}
+
+void NSGetTopicPostClean(
+ char * cId, NSTopicList * tList, size_t dSize)
+{
+ NSOICFree(cId);
+ NSRemoveProviderTopicList(tList, dSize);
+}
+
+NSTopicList * NSGetTopic(OCClientResponse * clientResponse, size_t * topicListSize)
+{
+ NS_LOG(DEBUG, "create NSTopic");
+ NS_VERIFY_NOT_NULL(clientResponse->payload, NULL);
+
+ OCRepPayload * payload = (OCRepPayload *)clientResponse->payload;
+ while (payload)
+ {
+ NS_LOG_V(DEBUG, "Payload Key : %s", payload->values->name);
+ payload = payload->next;
+ }
+
+ payload = (OCRepPayload *)clientResponse->payload;
+
+ char * consumerId = NULL;
+ OCRepPayload ** topicListPayload = NULL;
+ NSTopicList * topicList = (NSTopicList *) OICMalloc(sizeof(NSTopicList));
+ NS_VERIFY_NOT_NULL(topicList, NULL);
+
+ NS_LOG(DEBUG, "get information of consumerId");
+ bool getResult = OCRepPayloadGetPropString(payload, NS_ATTRIBUTE_CONSUMER_ID, & consumerId); // is NULL possible? (initial getting)
+ NS_VERIFY_NOT_NULL(getResult == true ? (void *) 1 : NULL, NULL);
+
+ OICStrcpy(topicList->consumerId, NS_DEVICE_ID_LENGTH, consumerId);
+
+ OCRepPayloadValue * payloadValue = NULL;
+ payloadValue = NSPayloadFindValue(payload, NS_ATTRIBUTE_TOPIC_LIST);
+ NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(payloadValue, NULL, NSOICFree(consumerId));
+
+ size_t dimensionSize = calcDimTotal(payloadValue->arr.dimensions);
+ size_t dimensions[3] = {dimensionSize, 0, 0};
+ *topicListSize = dimensionSize;
+
+ NS_LOG(DEBUG, "get information of topicList(OCRepPayload)");
+ getResult = OCRepPayloadGetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST,
+ & topicListPayload, dimensions);
+ NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(getResult == true ? (void *) 1 : NULL,
+ NULL, NSOICFree(consumerId));
+
+ topicList->topics = (NSTopic **) OICMalloc(sizeof(NSTopic *)*dimensionSize);
+ NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(topicList->topics,
+ NULL, NSGetTopicPostClean(consumerId, topicList, -1));
+
+ for (int i = 0; i < (int)dimensionSize; i++)
+ {
+ char * topicName = NULL;
+ int64_t state = 0;
+
+ topicList->topics[i] = (NSTopic *) OICMalloc(sizeof(NSTopic));
+ NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(topicList->topics[i],
+ NULL, NSGetTopicPostClean(consumerId, topicList, i));
+
+ NS_LOG(DEBUG, "get topic name");
+ getResult = OCRepPayloadGetPropString(topicListPayload[i], NS_ATTRIBUTE_TOPIC_NAME, &topicName);
+ NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(getResult == true ? (void *) 1 : NULL,
+ NULL, NSGetTopicPostClean(consumerId, topicList, i));
+
+
+ NS_LOG(DEBUG, "get topic selection");
+ getResult = OCRepPayloadGetPropInt(topicListPayload[i], NS_ATTRIBUTE_TOPIC_SELECTION, &state);
+ NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(getResult == true ? (void *) 1 : NULL,
+ NULL, NSGetTopicPostClean(consumerId, topicList, i));
+
+ topicList->topics[i]->topicName = topicName;
+ topicList->topics[i]->state = state;
+ }
+
+ NSOICFree(consumerId);
+
+ return topicList;
+}
+
+OCStackApplicationResult NSIntrospectTopic(
+ void * ctx, OCDoHandle handle, OCClientResponse * clientResponse)
+{
+ (void) handle;
+
+ NS_VERIFY_NOT_NULL(clientResponse, OC_STACK_KEEP_TRANSACTION);
+ NS_VERIFY_STACK_SUCCESS(NSOCResultToSuccess(clientResponse->result), OC_STACK_KEEP_TRANSACTION);
+
+ NS_LOG_V(DEBUG, "GET response income : %s:%d",
+ clientResponse->devAddr.addr, clientResponse->devAddr.port);
+ NS_LOG_V(DEBUG, "GET response result : %d",
+ clientResponse->result);
+ NS_LOG_V(DEBUG, "GET response sequenceNum : %d",
+ clientResponse->sequenceNumber);
+ NS_LOG_V(DEBUG, "GET response resource uri : %s",
+ clientResponse->resourceUri);
+ NS_LOG_V(DEBUG, "GET response Transport Type : %d",
+ clientResponse->devAddr.adapter);
+
+ size_t topicListSize = 0;
+ NSTopicList * newTopicList = NSGetTopic(clientResponse, &topicListSize);
+ NS_VERIFY_NOT_NULL(newTopicList, OC_STACK_KEEP_TRANSACTION);
+
+ // TODO Call the callback function registered at the start
+ NSProvider_internal * provider = (NSProvider_internal *) ctx;
+ provider->topicList = NSCopyProviderTopicList(newTopicList, topicListSize);
+ provider->topicListSize = topicListSize;
+
+ NS_LOG(DEBUG, "build NSTask");
+ NSTask * task = NSMakeTask(TASK_CONSUMER_RECV_TOPIC_LIST, (void *) provider);
+ NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(task, NS_ERROR, NSRemoveProvider(provider));
+
+ NSConsumerPushEvent(task);
+ NSRemoveProviderTopicList(newTopicList, topicListSize);
+
+ return OC_STACK_KEEP_TRANSACTION;
+}