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 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 OICFree(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 OICFree(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 OICFree(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
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 OICFree(reqInterface);
\r
323 void NSProviderConnectionStateListener(const CAEndpoint_t * info, bool connected)
\r
325 NS_LOG(DEBUG, "NSProviderConnectionStateListener - IN");
\r
329 NS_LOG(DEBUG, "CONNECTED");
\r
331 // Set Connection State
\r
332 NSSetProviderConnectionState(CONNECTED);
\r
335 NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);
\r
337 if(info->adapter == CA_ADAPTER_TCP)
\r
339 NS_LOG_V(DEBUG, "TCP Connected remote address: %s:%d", info->addr, info->port);
\r
344 NS_LOG(DEBUG, "DISCONNECTED");
\r
346 // Set Connection State
\r
347 NSSetProviderConnectionState(DISCONNECTED);
\r
349 if(info->adapter == CA_ADAPTER_TCP)
\r
351 NS_LOG_V(DEBUG, "TCP Disconnected remote address: %s:%d", info->addr, info->port);
\r
355 NS_LOG(DEBUG, "NSProviderConnectionStateListener - OUT");
\r
358 void NSProviderAdapterStateListener(CATransportAdapter_t adapter, bool enabled)
\r
362 NS_LOG(DEBUG, "NSProviderAdapterStateListener - IN");
\r
366 NS_LOG(DEBUG, "CONNECTED");
\r
368 // Set Connection State
\r
369 NSSetProviderConnectionState(CONNECTED);
\r
372 NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);
\r
377 NS_LOG(DEBUG, "DISCONNECTED");
\r
379 // Set Connection State
\r
380 NSSetProviderConnectionState(DISCONNECTED);
\r
383 NS_LOG(DEBUG, "NSProviderAdapterStateListener - OUT");
\r
386 bool NSProviderCompareSyncAttributes(const char * name)
\r
388 if (!strcmp(name, NS_ATTRIBUTE_MESSAGE_ID) ||
\r
389 !strcmp(name, NS_ATTRIBUTE_PROVIDER_ID) ||
\r
390 !strcmp(name, NS_ATTRIBUTE_STATE))
\r
398 bool NSProviderIsSyncAttributes(OCRepPayload * payload)
\r
400 NS_LOG(DEBUG, "get extra info");
\r
402 OCRepPayloadValue * curr = payload->values;
\r
405 if (!NSProviderCompareSyncAttributes(curr->name))
\r
415 bool NSProviderCompareTopicAttributes(const char * name)
\r
417 if (!strcmp(name, NS_ATTRIBUTE_TOPIC_LIST) ||
\r
418 !strcmp(name, NS_ATTRIBUTE_CONSUMER_ID))
\r
426 bool NSProviderCompareSubTopicAttributes(const char * name)
\r
428 if (!strcmp(name, NS_ATTRIBUTE_TOPIC_NAME) ||
\r
429 !strcmp(name, NS_ATTRIBUTE_TOPIC_SELECTION))
\r
437 bool NSProviderIsTopicAttributes(OCRepPayload * payload)
\r
439 NS_LOG(DEBUG, "get extra info");
\r
441 OCRepPayloadValue * curr = payload->values;
\r
444 if (!NSProviderCompareTopicAttributes(curr->name))
\r
449 if (!strcmp(curr->name, NS_ATTRIBUTE_TOPIC_LIST))
\r
451 OCRepPayload ** topicListPayload = NULL;
\r
452 OCRepPayloadValue * payloadValue = NULL;
\r
453 payloadValue = NSPayloadFindValue(payload, NS_ATTRIBUTE_TOPIC_LIST);
\r
454 size_t dimensionSize = calcDimTotal(payloadValue->arr.dimensions);
\r
455 size_t dimensions[3] = { dimensionSize, 0, 0 };
\r
457 if (!dimensionSize)
\r
462 OCRepPayloadGetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST, &topicListPayload,
\r
465 for (int i = 0; i < (int) dimensionSize; i++)
\r
467 OCRepPayloadValue * subCurr = topicListPayload[i]->values;
\r
470 if (!NSProviderCompareSubTopicAttributes(subCurr->name))
\r
472 for(int j = i; j < (int) dimensionSize; ++j)
\r
474 OCRepPayloadDestroy(topicListPayload[i]);
\r
477 OCRepPayloadDestroy(payload);
\r
480 subCurr = subCurr->next;
\r
482 OCRepPayloadDestroy(topicListPayload[i]);
\r
488 OCRepPayloadDestroy(payload);
\r
492 OCStackResult NSProviderSendResponse(OCEntityHandlerRequest * entityHandlerRequest,
\r
493 OCRepPayload * payload, char * reqInterface, OCEntityHandlerResult ehResult,
\r
494 NSInterfaceType interfaceType, NSResourceType resourceType)
\r
496 if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) == 0)
\r
498 payload = OCRepPayloadCreate();
\r
502 NS_LOG(ERROR, "payload is NULL");
\r
506 OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_BASELINE);
\r
507 interfaceType == NS_INTERFACE_TYPE_READ ?
\r
508 OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_READ)
\r
509 : OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_READWRITE);
\r
511 char * rtStr = NULL;
\r
512 switch (resourceType)
\r
514 case NS_RESOURCE_MESSAGE:
\r
515 rtStr = NS_COLLECTION_MESSAGE_TYPE;
\r
517 case NS_RESOURCE_SYNC:
\r
518 rtStr = NS_COLLECTION_SYNC_TYPE;
\r
520 case NS_RESOURCE_TOPIC:
\r
521 rtStr = NS_COLLECTION_TOPIC_TYPE;
\r
524 NS_LOG(ERROR, "sendResponseError");
\r
528 OCResourcePayloadAddStringLL(&payload->types, rtStr);
\r
531 if (resourceType == NS_RESOURCE_TOPIC && entityHandlerRequest->method == OC_REST_GET)
\r
533 OCRepPayloadDestroy(payload);
\r
537 OCEntityHandlerResponse response;
\r
538 response.numSendVendorSpecificHeaderOptions = 0;
\r
539 memset(response.sendVendorSpecificHeaderOptions, 0,
\r
540 sizeof response.sendVendorSpecificHeaderOptions);
\r
541 memset(response.resourceUri, 0, sizeof response.resourceUri);
\r
543 response.requestHandle = entityHandlerRequest->requestHandle;
\r
544 response.resourceHandle = entityHandlerRequest->resource;
\r
545 response.persistentBufferFlag = 0;
\r
546 response.ehResult = ehResult;
\r
547 response.payload = (OCPayload *) payload;
\r
549 if (OCDoResponse(&response) != OC_STACK_OK)
\r
551 NS_LOG(ERROR, "Fail to AccessPolicy send response");
\r
552 ehResult = OC_STACK_ERROR;
\r
555 OCRepPayloadDestroy(payload);
\r