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
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 OICFree(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 if (NSGetPolicy() == NS_POLICY_CONSUMER)
\r
144 else if(ocObAction == OC_OBSERVE_DEREGISTER)
\r
146 NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OC_OBSERVE_DEREGISTER");
\r
147 NS_LOG_V(DEBUG, "NSEntityHandlerMessageCb\n - "
\r
148 "Deregister Message observerID : %d\n", entityHandlerRequest->obsInfo.obsId);
\r
149 NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_RECV_UNSUBSCRIPTION,
\r
150 NSCopyOCEntityHandlerRequest(entityHandlerRequest));
\r
151 ehResult = OC_EH_OK;
\r
155 ehResult = NSProviderSendResponse(entityHandlerRequest, payload, reqInterface, ehResult,
\r
156 NS_INTERFACE_TYPE_READ, NS_RESOURCE_MESSAGE);
\r
157 OICFree(reqInterface);
\r
158 NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OUT");
\r
162 OCEntityHandlerResult NSEntityHandlerSyncCb(OCEntityHandlerFlag flag,
\r
163 OCEntityHandlerRequest *entityHandlerRequest, void* callback)
\r
165 NS_LOG(DEBUG, "NSEntityHandlerSyncCb - IN");
\r
166 OCEntityHandlerResult ehResult = OC_EH_ERROR;
\r
167 char * reqInterface = NULL;
\r
168 OCRepPayload * payload = NULL;
\r
172 if (!entityHandlerRequest)
\r
174 NS_LOG(ERROR, "Invalid request pointer");
\r
178 if (flag & OC_REQUEST_FLAG)
\r
180 NS_LOG(DEBUG, "Flag includes OC_REQUEST_FLAG");
\r
182 if (OC_REST_GET == entityHandlerRequest->method)
\r
185 char * copyQuery = OICStrdup(entityHandlerRequest->query);
\r
186 reqInterface = OICStrdup(NSGetValueFromQuery(copyQuery, NS_QUERY_INTERFACE));
\r
187 OICFree(copyQuery);
\r
189 if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) != 0
\r
190 && strcmp(reqInterface, NS_INTERFACE_READWRITE) != 0)
\r
192 NS_LOG(ERROR, "Invalid interface");
\r
196 ehResult = OC_EH_OK;
\r
198 else if (OC_REST_POST == entityHandlerRequest->method)
\r
200 /** Receive sync data from consumer which read or dismiss notification message.
\r
201 And broadcast the sync data to all subscribers including provider app
\r
202 to synchronize the notification message status. */
\r
204 NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OC_REST_POST");
\r
206 if(NSProviderIsSyncAttributes((OCRepPayload *)entityHandlerRequest->payload))
\r
208 NSPushQueue(NOTIFICATION_SCHEDULER, TASK_RECV_READ,
\r
209 NSGetSyncInfo(entityHandlerRequest->payload));
\r
210 ehResult = OC_EH_OK;
\r
215 NS_LOG_V(DEBUG, "Received method %d from client", entityHandlerRequest->method);
\r
219 if (flag & OC_OBSERVE_FLAG)
\r
221 /** Requested by consumers to synchronize notification message status.
\r
222 Store the observer IDs to storage or cache */
\r
224 NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OC_OBSERVE_FLAG");
\r
226 OCObserveAction ocObAction = entityHandlerRequest->obsInfo.action;
\r
228 if (ocObAction == OC_OBSERVE_REGISTER)
\r
230 NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OC_OBSERVE_REGISTER");
\r
231 NS_LOG_V(DEBUG, "NSEntityHandlerSyncCb\n - "
\r
232 "Register Sync observerID : %d\n", entityHandlerRequest->obsInfo.obsId);
\r
233 NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SYNC_SUBSCRIPTION,
\r
234 NSCopyOCEntityHandlerRequest(entityHandlerRequest));
\r
236 else if(ocObAction == OC_OBSERVE_DEREGISTER)
\r
238 NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OC_OBSERVE_DEREGISTER");
\r
239 NS_LOG_V(DEBUG, "NSEntityHandlerSyncCb\n - "
\r
240 "Deregister Sync observerID : %d\n", entityHandlerRequest->obsInfo.obsId);
\r
241 NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_RECV_UNSUBSCRIPTION,
\r
242 NSCopyOCEntityHandlerRequest(entityHandlerRequest));
\r
246 NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OUT");
\r
248 ehResult = NSProviderSendResponse(entityHandlerRequest, payload, reqInterface, ehResult,
\r
249 NS_INTERFACE_TYPE_READ, NS_RESOURCE_MESSAGE);
\r
250 OICFree(reqInterface);
\r
255 OCEntityHandlerResult NSEntityHandlerTopicCb(OCEntityHandlerFlag flag,
\r
256 OCEntityHandlerRequest *entityHandlerRequest, void* callback)
\r
258 NS_LOG(DEBUG, "NSEntityHandlerTopicCb - IN");
\r
259 OCEntityHandlerResult ehResult = OC_EH_ERROR;
\r
260 char * reqInterface = NULL;
\r
261 OCRepPayload * payload = NULL;
\r
265 if (!entityHandlerRequest)
\r
267 NS_LOG(ERROR, "Invalid request pointer");
\r
271 if (flag & OC_REQUEST_FLAG)
\r
273 NS_LOG(DEBUG, "Flag includes OC_REQUEST_FLAG");
\r
275 if (OC_REST_GET == entityHandlerRequest->method)
\r
277 NS_LOG(DEBUG, "NSEntityHandlerTopicCb - OC_REST_GET");
\r
279 char * copyReq = OICStrdup(entityHandlerRequest->query);
\r
280 reqInterface = OICStrdup(NSGetValueFromQuery(copyReq, NS_QUERY_INTERFACE));
\r
283 if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) != 0
\r
284 && strcmp(reqInterface, NS_INTERFACE_READWRITE) != 0)
\r
286 NS_LOG(ERROR, "Invalid interface");
\r
289 // send consumer's interesting topic list if consumer id exists
\r
290 // otherwise send registered topic list
\r
291 NSPushQueue(TOPIC_SCHEDULER, TASK_SEND_TOPICS,
\r
292 NSCopyOCEntityHandlerRequest(entityHandlerRequest));
\r
294 ehResult = OC_EH_OK;
\r
296 else if (OC_REST_POST == entityHandlerRequest->method)
\r
298 // Receive interesting topic list from consumers
\r
299 // Send topic notice message(id = TOPIC) to the consumer
\r
300 // which requests to post.
\r
301 NS_LOG(DEBUG, "NSEntityHandlerTopicCb - OC_REST_POST");
\r
302 // Accepter is provider. our service is not support sendtopiclist from OC_REST_POST
\r
303 // Accepter is consumer. our service is support sendtopiclist from OC_REST_POST
\r
304 if(NSGetPolicy() == false &&
\r
305 NSProviderIsTopicAttributes(OCRepPayloadClone((OCRepPayload *)
\r
306 entityHandlerRequest->payload)))
\r
308 NSPushQueue(TOPIC_SCHEDULER, TASK_POST_TOPIC,
\r
309 NSCopyOCEntityHandlerRequest(entityHandlerRequest));
\r
310 ehResult = OC_EH_OK;
\r
315 NS_LOG_V(DEBUG, "Received unsupported method %d from client",
\r
316 entityHandlerRequest->method);
\r
317 ehResult = OC_EH_ERROR;
\r
321 NS_LOG(DEBUG, "NSEntityHandlerTopicCb - OUT");
\r
322 ehResult = NSProviderSendResponse(entityHandlerRequest, payload, reqInterface, ehResult,
\r
323 NS_INTERFACE_TYPE_READWRITE, NS_RESOURCE_TOPIC);
\r
324 OICFree(reqInterface);
\r
328 void NSProviderConnectionStateListener(const CAEndpoint_t * info, bool connected)
\r
330 NS_LOG(DEBUG, "NSProviderConnectionStateListener - IN");
\r
334 NS_LOG(DEBUG, "CONNECTED");
\r
336 // Set Connection State
\r
337 NSSetProviderConnectionState(CONNECTED);
\r
340 NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);
\r
342 if(info->adapter == CA_ADAPTER_TCP)
\r
344 NS_LOG_V(DEBUG, "TCP Connected remote address: %s:%d", info->addr, info->port);
\r
349 NS_LOG(DEBUG, "DISCONNECTED");
\r
351 // Set Connection State
\r
352 NSSetProviderConnectionState(DISCONNECTED);
\r
354 if(info->adapter == CA_ADAPTER_TCP)
\r
356 NS_LOG_V(DEBUG, "TCP Disconnected remote address: %s:%d", info->addr, info->port);
\r
360 NS_LOG(DEBUG, "NSProviderConnectionStateListener - OUT");
\r
363 void NSProviderAdapterStateListener(CATransportAdapter_t adapter, bool enabled)
\r
367 NS_LOG(DEBUG, "NSProviderAdapterStateListener - IN");
\r
371 NS_LOG(DEBUG, "CONNECTED");
\r
373 // Set Connection State
\r
374 NSSetProviderConnectionState(CONNECTED);
\r
377 NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);
\r
382 NS_LOG(DEBUG, "DISCONNECTED");
\r
384 // Set Connection State
\r
385 NSSetProviderConnectionState(DISCONNECTED);
\r
388 NS_LOG(DEBUG, "NSProviderAdapterStateListener - OUT");
\r
391 bool NSProviderCompareSyncAttributes(const char * name)
\r
393 if (!strcmp(name, NS_ATTRIBUTE_MESSAGE_ID) ||
\r
394 !strcmp(name, NS_ATTRIBUTE_PROVIDER_ID) ||
\r
395 !strcmp(name, NS_ATTRIBUTE_STATE))
\r
403 bool NSProviderIsSyncAttributes(OCRepPayload * payload)
\r
405 NS_LOG(DEBUG, "get extra info");
\r
407 OCRepPayloadValue * curr = payload->values;
\r
410 if (!NSProviderCompareSyncAttributes(curr->name))
\r
420 bool NSProviderCompareTopicAttributes(const char * name)
\r
422 if (!strcmp(name, NS_ATTRIBUTE_TOPIC_LIST) ||
\r
423 !strcmp(name, NS_ATTRIBUTE_CONSUMER_ID))
\r
431 bool NSProviderCompareSubTopicAttributes(const char * name)
\r
433 if (!strcmp(name, NS_ATTRIBUTE_TOPIC_NAME) ||
\r
434 !strcmp(name, NS_ATTRIBUTE_TOPIC_SELECTION))
\r
442 bool NSProviderIsTopicAttributes(OCRepPayload * payload)
\r
444 NS_LOG(DEBUG, "get extra info");
\r
446 OCRepPayloadValue * curr = payload->values;
\r
449 if (!NSProviderCompareTopicAttributes(curr->name))
\r
454 if (!strcmp(curr->name, NS_ATTRIBUTE_TOPIC_LIST))
\r
456 OCRepPayload ** topicListPayload = NULL;
\r
457 OCRepPayloadValue * payloadValue = NULL;
\r
458 payloadValue = NSPayloadFindValue(payload, NS_ATTRIBUTE_TOPIC_LIST);
\r
459 size_t dimensionSize = calcDimTotal(payloadValue->arr.dimensions);
\r
460 size_t dimensions[3] = { dimensionSize, 0, 0 };
\r
462 if (!dimensionSize)
\r
467 OCRepPayloadGetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST, &topicListPayload,
\r
470 for (int i = 0; i < (int) dimensionSize; i++)
\r
472 OCRepPayloadValue * subCurr = topicListPayload[i]->values;
\r
475 if (!NSProviderCompareSubTopicAttributes(subCurr->name))
\r
477 for(int j = i; j < (int) dimensionSize; ++j)
\r
479 OCRepPayloadDestroy(topicListPayload[i]);
\r
482 OCRepPayloadDestroy(payload);
\r
485 subCurr = subCurr->next;
\r
487 OCRepPayloadDestroy(topicListPayload[i]);
\r
493 OCRepPayloadDestroy(payload);
\r
497 OCStackResult NSProviderSendResponse(OCEntityHandlerRequest * entityHandlerRequest,
\r
498 OCRepPayload * payload, char * reqInterface, OCEntityHandlerResult ehResult,
\r
499 NSInterfaceType interfaceType, NSResourceType resourceType)
\r
501 if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) == 0)
\r
503 payload = OCRepPayloadCreate();
\r
507 NS_LOG(ERROR, "payload is NULL");
\r
511 OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_BASELINE);
\r
512 interfaceType == NS_INTERFACE_TYPE_READ ?
\r
513 OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_READ)
\r
514 : OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_READWRITE);
\r
516 char * rtStr = NULL;
\r
517 switch (resourceType)
\r
519 case NS_RESOURCE_MESSAGE:
\r
520 rtStr = NS_COLLECTION_MESSAGE_TYPE;
\r
522 case NS_RESOURCE_SYNC:
\r
523 rtStr = NS_COLLECTION_SYNC_TYPE;
\r
525 case NS_RESOURCE_TOPIC:
\r
526 rtStr = NS_COLLECTION_TOPIC_TYPE;
\r
529 NS_LOG(ERROR, "sendResponseError");
\r
533 OCResourcePayloadAddStringLL(&payload->types, rtStr);
\r
536 if (resourceType == NS_RESOURCE_TOPIC && entityHandlerRequest->method == OC_REST_GET)
\r
538 OCRepPayloadDestroy(payload);
\r
542 OCEntityHandlerResponse response;
\r
543 response.numSendVendorSpecificHeaderOptions = 0;
\r
544 memset(response.sendVendorSpecificHeaderOptions, 0,
\r
545 sizeof response.sendVendorSpecificHeaderOptions);
\r
546 memset(response.resourceUri, 0, sizeof response.resourceUri);
\r
548 response.requestHandle = entityHandlerRequest->requestHandle;
\r
549 response.resourceHandle = entityHandlerRequest->resource;
\r
550 response.persistentBufferFlag = 0;
\r
551 response.ehResult = ehResult;
\r
552 response.payload = (OCPayload *) payload;
\r
554 if (OCDoResponse(&response) != OC_STACK_OK)
\r
556 NS_LOG(ERROR, "Fail to AccessPolicy send response");
\r
557 ehResult = OC_STACK_ERROR;
\r
560 OCRepPayloadDestroy(payload);
\r