1 //******************************************************************
\r
3 // Copyright 2016 Samsung Electronics All Rights Reserved.
\r
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\r
7 // Licensed under the Apache License, Version 2.0 (the "License");
\r
8 // you may not use this file except in compliance with the License.
\r
9 // You may obtain a copy of the License at
\r
11 // http://www.apache.org/licenses/LICENSE-2.0
\r
13 // Unless required by applicable law or agreed to in writing, software
\r
14 // distributed under the License is distributed on an "AS IS" BASIS,
\r
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
16 // See the License for the specific language governing permissions and
\r
17 // limitations under the License.
\r
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\r
21 #include "NSProviderListener.h"
\r
23 bool NSProviderIsSyncAttributes(OCRepPayload * payload);
\r
24 bool NSProviderIsTopicAttributes(OCRepPayload * payload);
\r
25 OCStackResult NSProviderSendResponse(OCEntityHandlerRequest * entityHandlerRequest,
\r
26 OCRepPayload * payload, char * reqInterface, OCEntityHandlerResult ehResult,
\r
27 NSInterfaceType interfaceType, NSResourceType resourceType);
\r
29 OCEntityHandlerResult NSEntityHandlerNotificationCb(OCEntityHandlerFlag flag,
\r
30 OCEntityHandlerRequest *entityHandlerRequest, void* callback)
\r
32 NS_LOG(DEBUG, "NSEntityHandlerNotificationCb - IN");
\r
34 OCEntityHandlerResult ehResult = OC_EH_ERROR;
\r
38 if (!entityHandlerRequest)
\r
40 NS_LOG(ERROR, "Invalid request pointer");
\r
44 if (flag & OC_REQUEST_FLAG)
\r
46 NS_LOG(DEBUG, "Flag includes OC_REQUEST_FLAG");
\r
48 if (OC_REST_GET == entityHandlerRequest->method)
\r
50 NS_LOG(DEBUG, "NSEntityHandlerNotificationCb - OC_REST_GET");
\r
52 char * copyQuery = OICStrdup(entityHandlerRequest->query);
\r
53 char * reqInterface = NSGetValueFromQuery(copyQuery, NS_QUERY_INTERFACE);
\r
55 if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) != 0
\r
56 && strcmp(reqInterface, NS_INTERFACE_READ) != 0)
\r
58 NS_LOG(ERROR, "Invalid interface");
\r
59 NSOICFree(copyQuery);
\r
63 NSOICFree(copyQuery);
\r
64 NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_POLICY,
\r
65 NSCopyOCEntityHandlerRequest(entityHandlerRequest));
\r
67 ehResult = OC_EH_OK;
\r
71 NS_LOG_V (DEBUG, "Received method %d from client", entityHandlerRequest->method);
\r
75 NS_LOG(DEBUG, "NSEntityHandlerNotificationCb - OUT");
\r
79 OCEntityHandlerResult NSEntityHandlerMessageCb(OCEntityHandlerFlag flag,
\r
80 OCEntityHandlerRequest *entityHandlerRequest, void* callback)
\r
82 NS_LOG(DEBUG, "NSEntityHandlerMessageCb - IN");
\r
84 OCEntityHandlerResult ehResult = OC_EH_ERROR;
\r
85 char * reqInterface = NULL;
\r
86 OCRepPayload * payload = NULL;
\r
90 if (!entityHandlerRequest)
\r
92 NS_LOG (ERROR,"Invalid request pointer");
\r
96 if (flag & OC_REQUEST_FLAG)
\r
98 NS_LOG(DEBUG, "Flag includes OC_REQUEST_FLAG");
\r
99 NS_LOG_V(DEBUG, "Received method %d from client", entityHandlerRequest->method);
\r
101 if (OC_REST_GET == entityHandlerRequest->method)
\r
103 NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OC_REST_GET");
\r
105 char * copyQuery = OICStrdup(entityHandlerRequest->query);
\r
106 reqInterface = OICStrdup(NSGetValueFromQuery(copyQuery, NS_QUERY_INTERFACE));
\r
107 NSOICFree(copyQuery);
\r
109 if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) != 0
\r
110 && strcmp(reqInterface, NS_INTERFACE_READ) != 0)
\r
112 NS_LOG(ERROR, "Invalid interface");
\r
115 ehResult = OC_EH_OK;
\r
119 NS_LOG_V (DEBUG, "Received method %d from client", entityHandlerRequest->method);
\r
123 if (flag & OC_OBSERVE_FLAG)
\r
125 NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OC_OBSERVE_FLAG");
\r
127 OCObserveAction ocObAction = entityHandlerRequest->obsInfo.action;
\r
129 if (ocObAction == OC_OBSERVE_REGISTER)
\r
131 NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OC_OBSERVE_REGISTER");
\r
132 NS_LOG_V(DEBUG, "NSEntityHandlerMessageCb\n"
\r
133 "Register message observerID : %d\n", entityHandlerRequest->obsInfo.obsId);
\r
135 NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_RECV_SUBSCRIPTION,
\r
136 NSCopyOCEntityHandlerRequest(entityHandlerRequest));
\r
137 ehResult = OC_EH_OK;
\r
139 else if (ocObAction == OC_OBSERVE_DEREGISTER)
\r
141 NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OC_OBSERVE_DEREGISTER");
\r
142 NS_LOG_V(DEBUG, "NSEntityHandlerMessageCb\n - "
\r
143 "Deregister Message observerID : %d\n", entityHandlerRequest->obsInfo.obsId);
\r
144 NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_RECV_UNSUBSCRIPTION,
\r
145 NSCopyOCEntityHandlerRequest(entityHandlerRequest));
\r
146 ehResult = OC_EH_OK;
\r
150 ehResult = NSProviderSendResponse(entityHandlerRequest, payload, reqInterface, ehResult,
\r
151 NS_INTERFACE_TYPE_READ, NS_RESOURCE_MESSAGE);
\r
152 NSOICFree(reqInterface);
\r
153 NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OUT");
\r
157 OCEntityHandlerResult NSEntityHandlerSyncCb(OCEntityHandlerFlag flag,
\r
158 OCEntityHandlerRequest *entityHandlerRequest, void* callback)
\r
160 NS_LOG(DEBUG, "NSEntityHandlerSyncCb - IN");
\r
161 OCEntityHandlerResult ehResult = OC_EH_ERROR;
\r
162 char * reqInterface = NULL;
\r
163 OCRepPayload * payload = NULL;
\r
167 if (!entityHandlerRequest)
\r
169 NS_LOG(ERROR, "Invalid request pointer");
\r
173 if (flag & OC_REQUEST_FLAG)
\r
175 NS_LOG(DEBUG, "Flag includes OC_REQUEST_FLAG");
\r
177 if (OC_REST_GET == entityHandlerRequest->method)
\r
180 char * copyQuery = OICStrdup(entityHandlerRequest->query);
\r
181 reqInterface = OICStrdup(NSGetValueFromQuery(copyQuery, NS_QUERY_INTERFACE));
\r
182 NSOICFree(copyQuery);
\r
184 if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) != 0
\r
185 && strcmp(reqInterface, NS_INTERFACE_READWRITE) != 0)
\r
187 NS_LOG(ERROR, "Invalid interface");
\r
191 ehResult = OC_EH_OK;
\r
193 else if (OC_REST_POST == entityHandlerRequest->method)
\r
195 /** Receive sync data from consumer which read or dismiss notification message.
\r
196 And broadcast the sync data to all subscribers including provider app
\r
197 to synchronize the notification message status. */
\r
199 NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OC_REST_POST");
\r
201 if (NSProviderIsSyncAttributes((OCRepPayload *)entityHandlerRequest->payload))
\r
203 NSPushQueue(NOTIFICATION_SCHEDULER, TASK_RECV_READ,
\r
204 NSGetSyncInfo(entityHandlerRequest->payload));
\r
205 ehResult = OC_EH_OK;
\r
210 NS_LOG_V(DEBUG, "Received method %d from client", entityHandlerRequest->method);
\r
214 if (flag & OC_OBSERVE_FLAG)
\r
216 /** Requested by consumers to synchronize notification message status.
\r
217 Store the observer IDs to storage or cache */
\r
219 NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OC_OBSERVE_FLAG");
\r
221 OCObserveAction ocObAction = entityHandlerRequest->obsInfo.action;
\r
223 if (ocObAction == OC_OBSERVE_REGISTER)
\r
225 NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OC_OBSERVE_REGISTER");
\r
226 NS_LOG_V(DEBUG, "NSEntityHandlerSyncCb\n - "
\r
227 "Register Sync observerID : %d\n", entityHandlerRequest->obsInfo.obsId);
\r
228 NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SYNC_SUBSCRIPTION,
\r
229 NSCopyOCEntityHandlerRequest(entityHandlerRequest));
\r
231 else if (ocObAction == OC_OBSERVE_DEREGISTER)
\r
233 NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OC_OBSERVE_DEREGISTER");
\r
234 NS_LOG_V(DEBUG, "NSEntityHandlerSyncCb\n - "
\r
235 "Deregister Sync observerID : %d\n", entityHandlerRequest->obsInfo.obsId);
\r
236 NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_RECV_UNSUBSCRIPTION,
\r
237 NSCopyOCEntityHandlerRequest(entityHandlerRequest));
\r
241 NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OUT");
\r
243 ehResult = NSProviderSendResponse(entityHandlerRequest, payload, reqInterface, ehResult,
\r
244 NS_INTERFACE_TYPE_READ, NS_RESOURCE_MESSAGE);
\r
245 NSOICFree(reqInterface);
\r
250 OCEntityHandlerResult NSEntityHandlerTopicCb(OCEntityHandlerFlag flag,
\r
251 OCEntityHandlerRequest *entityHandlerRequest, void* callback)
\r
253 NS_LOG(DEBUG, "NSEntityHandlerTopicCb - IN");
\r
254 OCEntityHandlerResult ehResult = OC_EH_ERROR;
\r
255 char * reqInterface = NULL;
\r
256 OCRepPayload * payload = NULL;
\r
260 if (!entityHandlerRequest)
\r
262 NS_LOG(ERROR, "Invalid request pointer");
\r
266 if (flag & OC_REQUEST_FLAG)
\r
268 NS_LOG(DEBUG, "Flag includes OC_REQUEST_FLAG");
\r
270 if (OC_REST_GET == entityHandlerRequest->method)
\r
272 NS_LOG(DEBUG, "NSEntityHandlerTopicCb - OC_REST_GET");
\r
274 char * copyReq = OICStrdup(entityHandlerRequest->query);
\r
275 reqInterface = OICStrdup(NSGetValueFromQuery(copyReq, NS_QUERY_INTERFACE));
\r
276 NSOICFree(copyReq);
\r
278 if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) != 0
\r
279 && strcmp(reqInterface, NS_INTERFACE_READWRITE) != 0)
\r
281 NS_LOG(ERROR, "Invalid interface");
\r
284 // send consumer's interesting topic list if consumer id exists
\r
285 // otherwise send registered topic list
\r
286 NSPushQueue(TOPIC_SCHEDULER, TASK_SEND_TOPICS,
\r
287 NSCopyOCEntityHandlerRequest(entityHandlerRequest));
\r
289 ehResult = OC_EH_OK;
\r
291 else if (OC_REST_POST == entityHandlerRequest->method)
\r
293 // Receive interesting topic list from consumers
\r
294 // Send topic notice message(id = TOPIC) to the consumer
\r
295 // which requests to post.
\r
296 NS_LOG(DEBUG, "NSEntityHandlerTopicCb - OC_REST_POST");
\r
297 // Accepter is provider. our service is not support sendtopiclist from OC_REST_POST
\r
298 // Accepter is consumer. our service is support sendtopiclist from OC_REST_POST
\r
299 if (NSGetPolicy() == false &&
\r
300 NSProviderIsTopicAttributes(OCRepPayloadClone((OCRepPayload *)
\r
301 entityHandlerRequest->payload)))
\r
303 NSPushQueue(TOPIC_SCHEDULER, TASK_POST_TOPIC,
\r
304 NSCopyOCEntityHandlerRequest(entityHandlerRequest));
\r
305 ehResult = OC_EH_OK;
\r
310 NS_LOG_V(DEBUG, "Received unsupported method %d from client",
\r
311 entityHandlerRequest->method);
\r
312 ehResult = OC_EH_ERROR;
\r
316 NS_LOG(DEBUG, "NSEntityHandlerTopicCb - OUT");
\r
317 ehResult = NSProviderSendResponse(entityHandlerRequest, payload, reqInterface, ehResult,
\r
318 NS_INTERFACE_TYPE_READWRITE, NS_RESOURCE_TOPIC);
\r
319 NSOICFree(reqInterface);
\r
324 OCStackApplicationResult NSProviderMQListener(void * ctx, OCDoHandle handle,
\r
325 OCClientResponse * clientResponse)
\r
330 NS_LOG_V(DEBUG, "clientResponse->sequenceNumber = %d", clientResponse->sequenceNumber);
\r
332 if (clientResponse->sequenceNumber == OC_OBSERVE_REGISTER)
\r
334 NS_LOG(DEBUG, "MQ OC_OBSERVE_RIGSTER");
\r
335 NSSetMQServerInfo(clientResponse->resourceUri, &(clientResponse->devAddr));
\r
338 NS_VERIFY_NOT_NULL(clientResponse, OC_STACK_KEEP_TRANSACTION);
\r
339 NS_VERIFY_STACK_SUCCESS(NSOCResultToSuccess(clientResponse->result), OC_STACK_KEEP_TRANSACTION);
\r
340 NS_VERIFY_NOT_NULL(clientResponse->payload, OC_STACK_KEEP_TRANSACTION);
\r
342 NS_LOG(DEBUG, "income observe response of MQ notification");
\r
343 NS_LOG_V(INFO_PRIVATE, "MQ OBS response income : %s:%d",
\r
344 clientResponse->devAddr.addr, clientResponse->devAddr.port);
\r
345 NS_LOG_V(DEBUG, "MQ OBS response result : %d",
\r
346 clientResponse->result);
\r
347 NS_LOG_V(DEBUG, "MQ OBS response sequenceNum : %d",
\r
348 clientResponse->sequenceNumber);
\r
349 NS_LOG_V(DEBUG, "MQ OBS response resource uri : %s",
\r
350 clientResponse->resourceUri);
\r
351 NS_LOG_V(DEBUG, "MQ OBS response Transport Type : %d",
\r
352 clientResponse->devAddr.adapter);
\r
354 OCRepPayload * payload = (OCRepPayload *)clientResponse->payload;
\r
355 NS_VERIFY_NOT_NULL(payload, OC_STACK_KEEP_TRANSACTION);
\r
357 NSMessageType type = -1;
\r
358 bool getResult = OCRepPayloadGetPropInt(payload, NS_ATTRIBUTE_TYPE, (int64_t *) &type);
\r
359 NS_LOG_V (DEBUG, "message sync type : %d", (int) type);
\r
361 if (!getResult && (type == NS_MESSAGE_READ || type == NS_MESSAGE_DELETED))
\r
364 getResult = OCRepPayloadGetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID, &pId);
\r
365 NS_LOG_V (INFO_PRIVATE, "provider id: %s", pId);
\r
367 if (getResult && strcmp(pId, NSGetProviderInfo()->providerId) == 0)
\r
369 NSSyncInfo * syncInfo = (NSSyncInfo *)OICMalloc(sizeof(NSSyncInfo));
\r
370 syncInfo->state = (type == NS_MESSAGE_READ) ? NS_SYNC_READ : NS_SYNC_DELETED;
\r
371 OICStrcpy(syncInfo->providerId, NS_UUID_STRING_SIZE, pId);
\r
373 NSPushQueue(NOTIFICATION_SCHEDULER, TASK_RECV_READ, (void*) syncInfo);
\r
377 return OC_STACK_KEEP_TRANSACTION;
\r
380 OCStackApplicationResult NSProviderGetMQResponseCB(void * ctx, OCDoHandle handle,
\r
381 OCClientResponse * clientResponse)
\r
383 NS_LOG(DEBUG, "NSProviderGetMQResponseCB - IN");
\r
387 NS_VERIFY_NOT_NULL(clientResponse, OC_STACK_KEEP_TRANSACTION);
\r
388 NS_VERIFY_STACK_SUCCESS(NSOCResultToSuccess(clientResponse->result), OC_STACK_KEEP_TRANSACTION);
\r
389 NS_VERIFY_NOT_NULL(clientResponse->payload, OC_STACK_KEEP_TRANSACTION);
\r
391 NS_LOG(DEBUG, "income get response of MQ broker");
\r
392 NS_LOG_V(INFO_PRIVATE, "MQ GET response income : %s:%d",
\r
393 clientResponse->devAddr.addr, clientResponse->devAddr.port);
\r
394 NS_LOG_V(DEBUG, "MQ GET response result : %d",
\r
395 clientResponse->result);
\r
396 NS_LOG_V(DEBUG, "MQ GET response sequenceNum : %d",
\r
397 clientResponse->sequenceNumber);
\r
398 NS_LOG_V(DEBUG, "MQ GET response resource uri : %s",
\r
399 clientResponse->resourceUri);
\r
400 NS_LOG_V(DEBUG, "MQ GET response Transport Type : %d",
\r
401 clientResponse->devAddr.adapter);
\r
403 char ** topicList = NULL;
\r
404 size_t dimensions[MAX_REP_ARRAY_DEPTH] = {0};
\r
405 OCRepPayloadGetStringArray((OCRepPayload *) clientResponse->payload,
\r
406 NS_ATTIRBUTE_MQ_TOPICLIST, & topicList, dimensions);
\r
408 char * interestTopicName = (char *) ctx;
\r
410 NS_LOG_V(DEBUG, "interestTopicName = %s", interestTopicName);
\r
411 for (size_t i = 0; i < dimensions[0]; ++i)
\r
413 NS_LOG_V(DEBUG, "found MQ topic : %s", topicList[i]);
\r
414 if (!strcmp(topicList[i], interestTopicName))
\r
416 NS_LOG(DEBUG, "subscribe to MQ notification");
\r
418 OCCallbackData cbdata = { NULL, NULL, NULL };
\r
419 cbdata.cb = NSProviderMQListener;
\r
420 cbdata.context = NULL;
\r
423 OCStackResult ret = OCDoResource(NULL, OC_REST_OBSERVE, topicList[i],
\r
424 clientResponse->addr, NULL, CT_DEFAULT, OC_HIGH_QOS, &cbdata, NULL, 0);
\r
426 if (!NSOCResultToSuccess(ret))
\r
428 NS_LOG(DEBUG, "fail to subscribe to MQ notification");
\r
434 NS_LOG(DEBUG, "NSProviderGetMQResponseCB - OUT");
\r
435 return OC_STACK_KEEP_TRANSACTION;
\r
438 OCStackApplicationResult NSProviderPublishMQResponseCB(void *ctx, OCDoHandle handle,
\r
439 OCClientResponse *clientResponse)
\r
443 NS_LOG(DEBUG, "Publish Topic callback received");
\r
445 OCStackApplicationResult res = OC_STACK_ERROR;
\r
447 NS_LOG_V(DEBUG, "Publish Topic response received code: (%d)", clientResponse->result);
\r
449 if (clientResponse->payload != NULL &&
\r
450 clientResponse->payload->type == PAYLOAD_TYPE_REPRESENTATION)
\r
452 NS_LOG(DEBUG, "PAYLOAD_TYPE_REPRESENTATION received");
\r
454 OCRepPayloadValue *val = ((OCRepPayload *)clientResponse->payload)->values;
\r
457 if( val->type == OCREP_PROP_INT)
\r
459 NS_LOG_V(DEBUG, "Key: %s, Value: %lld, int", val->name, val->i);
\r
461 else if( val->type == OCREP_PROP_STRING)
\r
463 NS_LOG_V(DEBUG, "Key: %s, Value: %s, string", val->name, val->str);
\r
467 NS_LOG_V(DEBUG, "Un supported val Type.(0x%d)", val->type);
\r
473 res = OC_STACK_KEEP_TRANSACTION;
\r
480 void NSProviderConnectionStateListener(const CAEndpoint_t * info, bool connected)
\r
482 NS_LOG(DEBUG, "NSProviderConnectionStateListener - IN");
\r
486 NS_LOG(DEBUG, "CONNECTED");
\r
488 // Set Connection State
\r
489 NSSetProviderConnectionState(CONNECTED);
\r
492 NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);
\r
494 if (info->adapter == CA_ADAPTER_TCP)
\r
496 NS_LOG_V(INFO_PRIVATE, "TCP Connected remote address: %s:%d", info->addr, info->port);
\r
501 NS_LOG(DEBUG, "DISCONNECTED");
\r
503 // Set Connection State
\r
504 NSSetProviderConnectionState(DISCONNECTED);
\r
506 if (info->adapter == CA_ADAPTER_TCP)
\r
508 NS_LOG_V(INFO_PRIVATE, "TCP Disconnected remote address: %s:%d", info->addr, info->port);
\r
512 NS_LOG(DEBUG, "NSProviderConnectionStateListener - OUT");
\r
515 void NSProviderAdapterStateListener(CATransportAdapter_t adapter, bool enabled)
\r
519 NS_LOG(DEBUG, "NSProviderAdapterStateListener - IN");
\r
523 NS_LOG(DEBUG, "CONNECTED");
\r
525 // Set Connection State
\r
526 NSSetProviderConnectionState(CONNECTED);
\r
529 NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);
\r
534 NS_LOG(DEBUG, "DISCONNECTED");
\r
536 // Set Connection State
\r
537 NSSetProviderConnectionState(DISCONNECTED);
\r
540 NS_LOG(DEBUG, "NSProviderAdapterStateListener - OUT");
\r
543 bool NSProviderCompareSyncAttributes(const char * name)
\r
545 if (!strcmp(name, NS_ATTRIBUTE_MESSAGE_ID) ||
\r
546 !strcmp(name, NS_ATTRIBUTE_PROVIDER_ID) ||
\r
547 !strcmp(name, NS_ATTRIBUTE_STATE))
\r
555 bool NSProviderIsSyncAttributes(OCRepPayload * payload)
\r
557 NS_LOG(DEBUG, "get extra info");
\r
558 OCRepPayloadValue * curr = payload->values;
\r
562 if (!NSProviderCompareSyncAttributes(curr->name))
\r
573 bool NSProviderCompareTopicAttributes(const char * name)
\r
575 if (!strcmp(name, NS_ATTRIBUTE_TOPIC_LIST) ||
\r
576 !strcmp(name, NS_ATTRIBUTE_CONSUMER_ID))
\r
584 bool NSProviderCompareSubTopicAttributes(const char * name)
\r
586 if (!strcmp(name, NS_ATTRIBUTE_TOPIC_NAME) ||
\r
587 !strcmp(name, NS_ATTRIBUTE_TOPIC_SELECTION))
\r
595 bool NSProviderIsTopicAttributes(OCRepPayload * payload)
\r
597 NS_LOG(DEBUG, "get extra info");
\r
598 OCRepPayloadValue * curr = payload->values;
\r
602 if (!NSProviderCompareTopicAttributes(curr->name))
\r
604 OCRepPayloadDestroy(payload);
\r
608 if (!strcmp(curr->name, NS_ATTRIBUTE_TOPIC_LIST))
\r
610 OCRepPayload ** topicListPayload = NULL;
\r
611 OCRepPayloadValue * payloadValue = NULL;
\r
612 payloadValue = NSPayloadFindValue(payload, NS_ATTRIBUTE_TOPIC_LIST);
\r
613 size_t dimensionSize = calcDimTotal(payloadValue->arr.dimensions);
\r
614 size_t dimensions[3] = { dimensionSize, 0, 0 };
\r
616 if (!dimensionSize)
\r
618 OCRepPayloadDestroy(payload);
\r
622 OCRepPayloadGetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST, &topicListPayload,
\r
625 for (int i = 0; i < (int) dimensionSize; i++)
\r
627 OCRepPayloadValue * subCurr = topicListPayload[i]->values;
\r
631 if (!NSProviderCompareSubTopicAttributes(subCurr->name))
\r
633 for(int j = i; j < (int) dimensionSize; ++j)
\r
635 OCRepPayloadDestroy(topicListPayload[j]);
\r
638 NSOICFree(topicListPayload);
\r
639 OCRepPayloadDestroy(payload);
\r
642 subCurr = subCurr->next;
\r
644 OCRepPayloadDestroy(topicListPayload[i]);
\r
646 NSOICFree(topicListPayload);
\r
651 OCRepPayloadDestroy(payload);
\r
655 OCStackResult NSProviderSendResponse(OCEntityHandlerRequest * entityHandlerRequest,
\r
656 OCRepPayload * payload, char * reqInterface, OCEntityHandlerResult ehResult,
\r
657 NSInterfaceType interfaceType, NSResourceType resourceType)
\r
659 if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) == 0)
\r
661 payload = OCRepPayloadCreate();
\r
665 NS_LOG(ERROR, "payload is NULL");
\r
669 OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_BASELINE);
\r
670 interfaceType == NS_INTERFACE_TYPE_READ ?
\r
671 OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_READ)
\r
672 : OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_READWRITE);
\r
674 char * rtStr = NULL;
\r
675 switch (resourceType)
\r
677 case NS_RESOURCE_MESSAGE:
\r
678 rtStr = NS_COLLECTION_MESSAGE_TYPE;
\r
680 case NS_RESOURCE_SYNC:
\r
681 rtStr = NS_COLLECTION_SYNC_TYPE;
\r
683 case NS_RESOURCE_TOPIC:
\r
684 rtStr = NS_COLLECTION_TOPIC_TYPE;
\r
687 NS_LOG(ERROR, "sendResponseError");
\r
691 OCResourcePayloadAddStringLL(&payload->types, rtStr);
\r
694 if (resourceType == NS_RESOURCE_TOPIC && entityHandlerRequest->method == OC_REST_GET)
\r
696 OCRepPayloadDestroy(payload);
\r
700 OCEntityHandlerResponse response;
\r
701 response.numSendVendorSpecificHeaderOptions = 0;
\r
702 memset(response.sendVendorSpecificHeaderOptions, 0,
\r
703 sizeof response.sendVendorSpecificHeaderOptions);
\r
704 memset(response.resourceUri, 0, sizeof response.resourceUri);
\r
706 response.requestHandle = entityHandlerRequest->requestHandle;
\r
707 response.resourceHandle = entityHandlerRequest->resource;
\r
708 response.persistentBufferFlag = 0;
\r
709 response.ehResult = ehResult;
\r
710 response.payload = (OCPayload *) payload;
\r
712 if (OCDoResponse(&response) != OC_STACK_OK)
\r
714 NS_LOG(ERROR, "Fail to AccessPolicy send response");
\r
715 ehResult = OC_STACK_ERROR;
\r
718 OCRepPayloadDestroy(payload);
\r