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
435 size_t count = calcDimTotal(dimensions);
\r
436 for (size_t k = 0; k < count; k++)
\r
438 OICFree(topicList[k]);
\r
440 OICFree(topicList);
\r
442 NS_LOG(DEBUG, "NSProviderGetMQResponseCB - OUT");
\r
443 return OC_STACK_KEEP_TRANSACTION;
\r
446 OCStackApplicationResult NSProviderPublishMQResponseCB(void *ctx, OCDoHandle handle,
\r
447 OCClientResponse *clientResponse)
\r
451 NS_LOG(DEBUG, "Publish Topic callback received");
\r
453 OCStackApplicationResult res = OC_STACK_ERROR;
\r
455 NS_LOG_V(DEBUG, "Publish Topic response received code: (%d)", clientResponse->result);
\r
457 if (clientResponse->payload != NULL &&
\r
458 clientResponse->payload->type == PAYLOAD_TYPE_REPRESENTATION)
\r
460 NS_LOG(DEBUG, "PAYLOAD_TYPE_REPRESENTATION received");
\r
462 OCRepPayloadValue *val = ((OCRepPayload *)clientResponse->payload)->values;
\r
465 if( val->type == OCREP_PROP_INT)
\r
467 NS_LOG_V(DEBUG, "Key: %s, Value: %lld, int", val->name, val->i);
\r
469 else if( val->type == OCREP_PROP_STRING)
\r
471 NS_LOG_V(DEBUG, "Key: %s, Value: %s, string", val->name, val->str);
\r
475 NS_LOG_V(DEBUG, "Un supported val Type.(0x%d)", val->type);
\r
481 res = OC_STACK_KEEP_TRANSACTION;
\r
488 void NSProviderConnectionStateListener(const CAEndpoint_t * info, bool connected)
\r
490 NS_LOG(DEBUG, "NSProviderConnectionStateListener - IN");
\r
494 NS_LOG(DEBUG, "CONNECTED");
\r
496 // Set Connection State
\r
497 NSSetProviderConnectionState(CONNECTED);
\r
500 NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);
\r
502 if (info->adapter == CA_ADAPTER_TCP)
\r
504 NS_LOG_V(INFO_PRIVATE, "TCP Connected remote address: %s:%d", info->addr, info->port);
\r
509 NS_LOG(DEBUG, "DISCONNECTED");
\r
511 // Set Connection State
\r
512 NSSetProviderConnectionState(DISCONNECTED);
\r
514 if (info->adapter == CA_ADAPTER_TCP)
\r
516 NS_LOG_V(INFO_PRIVATE, "TCP Disconnected remote address: %s:%d", info->addr, info->port);
\r
520 NS_LOG(DEBUG, "NSProviderConnectionStateListener - OUT");
\r
523 void NSProviderAdapterStateListener(CATransportAdapter_t adapter, bool enabled)
\r
527 NS_LOG(DEBUG, "NSProviderAdapterStateListener - IN");
\r
531 NS_LOG(DEBUG, "CONNECTED");
\r
533 // Set Connection State
\r
534 NSSetProviderConnectionState(CONNECTED);
\r
537 NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);
\r
542 NS_LOG(DEBUG, "DISCONNECTED");
\r
544 // Set Connection State
\r
545 NSSetProviderConnectionState(DISCONNECTED);
\r
548 NS_LOG(DEBUG, "NSProviderAdapterStateListener - OUT");
\r
551 bool NSProviderCompareSyncAttributes(const char * name)
\r
553 if (!strcmp(name, NS_ATTRIBUTE_MESSAGE_ID) ||
\r
554 !strcmp(name, NS_ATTRIBUTE_PROVIDER_ID) ||
\r
555 !strcmp(name, NS_ATTRIBUTE_STATE))
\r
563 bool NSProviderIsSyncAttributes(OCRepPayload * payload)
\r
565 NS_LOG(DEBUG, "get extra info");
\r
566 OCRepPayloadValue * curr = payload->values;
\r
570 if (!NSProviderCompareSyncAttributes(curr->name))
\r
581 bool NSProviderCompareTopicAttributes(const char * name)
\r
583 if (!strcmp(name, NS_ATTRIBUTE_TOPIC_LIST) ||
\r
584 !strcmp(name, NS_ATTRIBUTE_CONSUMER_ID))
\r
592 bool NSProviderCompareSubTopicAttributes(const char * name)
\r
594 if (!strcmp(name, NS_ATTRIBUTE_TOPIC_NAME) ||
\r
595 !strcmp(name, NS_ATTRIBUTE_TOPIC_SELECTION))
\r
603 bool NSProviderIsTopicAttributes(OCRepPayload * payload)
\r
605 NS_LOG(DEBUG, "get extra info");
\r
606 OCRepPayloadValue * curr = payload->values;
\r
610 if (!NSProviderCompareTopicAttributes(curr->name))
\r
612 OCRepPayloadDestroy(payload);
\r
616 if (!strcmp(curr->name, NS_ATTRIBUTE_TOPIC_LIST))
\r
618 OCRepPayload ** topicListPayload = NULL;
\r
619 OCRepPayloadValue * payloadValue = NULL;
\r
620 payloadValue = NSPayloadFindValue(payload, NS_ATTRIBUTE_TOPIC_LIST);
\r
621 size_t dimensionSize = calcDimTotal(payloadValue->arr.dimensions);
\r
622 size_t dimensions[3] = { dimensionSize, 0, 0 };
\r
624 if (!dimensionSize)
\r
626 OCRepPayloadDestroy(payload);
\r
630 OCRepPayloadGetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST, &topicListPayload,
\r
633 for (int i = 0; i < (int) dimensionSize; i++)
\r
635 OCRepPayloadValue * subCurr = topicListPayload[i]->values;
\r
639 if (!NSProviderCompareSubTopicAttributes(subCurr->name))
\r
641 for(int j = i; j < (int) dimensionSize; ++j)
\r
643 OCRepPayloadDestroy(topicListPayload[j]);
\r
646 NSOICFree(topicListPayload);
\r
647 OCRepPayloadDestroy(payload);
\r
650 subCurr = subCurr->next;
\r
652 OCRepPayloadDestroy(topicListPayload[i]);
\r
654 NSOICFree(topicListPayload);
\r
659 OCRepPayloadDestroy(payload);
\r
663 OCStackResult NSProviderSendResponse(OCEntityHandlerRequest * entityHandlerRequest,
\r
664 OCRepPayload * payload, char * reqInterface, OCEntityHandlerResult ehResult,
\r
665 NSInterfaceType interfaceType, NSResourceType resourceType)
\r
667 if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) == 0)
\r
669 payload = OCRepPayloadCreate();
\r
673 NS_LOG(ERROR, "payload is NULL");
\r
677 OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_BASELINE);
\r
678 interfaceType == NS_INTERFACE_TYPE_READ ?
\r
679 OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_READ)
\r
680 : OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_READWRITE);
\r
682 char * rtStr = NULL;
\r
683 switch (resourceType)
\r
685 case NS_RESOURCE_MESSAGE:
\r
686 rtStr = NS_COLLECTION_MESSAGE_TYPE;
\r
688 case NS_RESOURCE_SYNC:
\r
689 rtStr = NS_COLLECTION_SYNC_TYPE;
\r
691 case NS_RESOURCE_TOPIC:
\r
692 rtStr = NS_COLLECTION_TOPIC_TYPE;
\r
695 NS_LOG(ERROR, "sendResponseError");
\r
699 OCResourcePayloadAddStringLL(&payload->types, rtStr);
\r
702 if (resourceType == NS_RESOURCE_TOPIC && entityHandlerRequest->method == OC_REST_GET)
\r
704 OCRepPayloadDestroy(payload);
\r
708 OCEntityHandlerResponse response;
\r
709 response.numSendVendorSpecificHeaderOptions = 0;
\r
710 memset(response.sendVendorSpecificHeaderOptions, 0,
\r
711 sizeof response.sendVendorSpecificHeaderOptions);
\r
712 memset(response.resourceUri, 0, sizeof response.resourceUri);
\r
714 response.requestHandle = entityHandlerRequest->requestHandle;
\r
715 response.resourceHandle = entityHandlerRequest->resource;
\r
716 response.persistentBufferFlag = 0;
\r
717 response.ehResult = ehResult;
\r
718 response.payload = (OCPayload *) payload;
\r
720 if (OCDoResponse(&response) != OC_STACK_OK)
\r
722 NS_LOG(ERROR, "Fail to AccessPolicy send response");
\r
723 ehResult = OC_STACK_ERROR;
\r
726 OCRepPayloadDestroy(payload);
\r