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
306 NSPushQueue(TOPIC_SCHEDULER, TASK_POST_TOPIC,
\r
307 NSCopyOCEntityHandlerRequest(entityHandlerRequest));
\r
308 ehResult = OC_EH_OK;
\r
313 NS_LOG_V(DEBUG, "Received unsupported method %d from client",
\r
314 entityHandlerRequest->method);
\r
315 ehResult = OC_EH_ERROR;
\r
319 NS_LOG(DEBUG, "NSEntityHandlerTopicCb - OUT");
\r
320 ehResult = NSProviderSendResponse(entityHandlerRequest, payload, reqInterface, ehResult,
\r
321 NS_INTERFACE_TYPE_READWRITE, NS_RESOURCE_TOPIC);
\r
322 OICFree(reqInterface);
\r
326 void NSProviderConnectionStateListener(const CAEndpoint_t * info, bool connected)
\r
328 NS_LOG(DEBUG, "NSProviderConnectionStateListener - IN");
\r
332 NS_LOG(DEBUG, "CONNECTED");
\r
334 // Set Connection State
\r
335 NSSetProviderConnectionState(CONNECTED);
\r
338 NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);
\r
340 if(info->adapter == CA_ADAPTER_TCP)
\r
342 NS_LOG_V(DEBUG, "TCP Connected remote address: %s:%d", info->addr, info->port);
\r
347 NS_LOG(DEBUG, "DISCONNECTED");
\r
349 // Set Connection State
\r
350 NSSetProviderConnectionState(DISCONNECTED);
\r
352 if(info->adapter == CA_ADAPTER_TCP)
\r
354 NS_LOG_V(DEBUG, "TCP Disconnected remote address: %s:%d", info->addr, info->port);
\r
358 NS_LOG(DEBUG, "NSProviderConnectionStateListener - OUT");
\r
361 void NSProviderAdapterStateListener(CATransportAdapter_t adapter, bool enabled)
\r
365 NS_LOG(DEBUG, "NSProviderAdapterStateListener - IN");
\r
369 NS_LOG(DEBUG, "CONNECTED");
\r
371 // Set Connection State
\r
372 NSSetProviderConnectionState(CONNECTED);
\r
375 NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);
\r
380 NS_LOG(DEBUG, "DISCONNECTED");
\r
382 // Set Connection State
\r
383 NSSetProviderConnectionState(DISCONNECTED);
\r
386 NS_LOG(DEBUG, "NSProviderAdapterStateListener - OUT");
\r
389 bool NSProviderCompareSyncAttributes(const char * name)
\r
391 if (!strcmp(name, NS_ATTRIBUTE_MESSAGE_ID) ||
\r
392 !strcmp(name, NS_ATTRIBUTE_PROVIDER_ID) ||
\r
393 !strcmp(name, NS_ATTRIBUTE_STATE))
\r
401 bool NSProviderIsSyncAttributes(OCRepPayload * payload)
\r
403 NS_LOG(DEBUG, "get extra info");
\r
405 OCRepPayloadValue * curr = payload->values;
\r
408 if (!NSProviderCompareSyncAttributes(curr->name))
\r
418 bool NSProviderCompareTopicAttributes(const char * name)
\r
420 if (!strcmp(name, NS_ATTRIBUTE_TOPIC_LIST) ||
\r
421 !strcmp(name, NS_ATTRIBUTE_CONSUMER_ID))
\r
429 bool NSProviderCompareSubTopicAttributes(const char * name)
\r
431 if (!strcmp(name, NS_ATTRIBUTE_TOPIC_NAME) ||
\r
432 !strcmp(name, NS_ATTRIBUTE_TOPIC_SELECTION))
\r
440 bool NSProviderIsTopicAttributes(OCRepPayload * payload)
\r
442 NS_LOG(DEBUG, "get extra info");
\r
444 OCRepPayloadValue * curr = payload->values;
\r
447 if (!NSProviderCompareSyncAttributes(curr->name))
\r
452 if (!strcmp(curr->name, NS_ATTRIBUTE_TOPIC_LIST))
\r
454 OCRepPayload ** topicListPayload = NULL;
\r
455 OCRepPayloadValue * payloadValue = NULL;
\r
456 payloadValue = NSPayloadFindValue(payload, NS_ATTRIBUTE_TOPIC_LIST);
\r
457 size_t dimensionSize = calcDimTotal(payloadValue->arr.dimensions);
\r
458 size_t dimensions[3] = { dimensionSize, 0, 0 };
\r
460 if (!dimensionSize)
\r
465 OCRepPayloadGetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST, &topicListPayload,
\r
468 for (int i = 0; i < (int) dimensionSize; i++)
\r
470 OCRepPayloadValue * subCurr = topicListPayload[i]->values;
\r
473 if (!NSProviderCompareSubTopicAttributes(subCurr->name))
\r
475 for(int j = i; j < (int) dimensionSize; ++j)
\r
477 OCRepPayloadDestroy(topicListPayload[i]);
\r
480 OCRepPayloadDestroy(payload);
\r
483 subCurr = subCurr->next;
\r
485 OCRepPayloadDestroy(topicListPayload[i]);
\r
491 OCRepPayloadDestroy(payload);
\r
495 OCStackResult NSProviderSendResponse(OCEntityHandlerRequest * entityHandlerRequest,
\r
496 OCRepPayload * payload, char * reqInterface, OCEntityHandlerResult ehResult,
\r
497 NSInterfaceType interfaceType, NSResourceType resourceType)
\r
499 if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) == 0)
\r
501 payload = OCRepPayloadCreate();
\r
505 NS_LOG(ERROR, "payload is NULL");
\r
509 OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_BASELINE);
\r
510 interfaceType == NS_INTERFACE_TYPE_READ ?
\r
511 OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_READ)
\r
512 : OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_READWRITE);
\r
514 char * rtStr = NULL;
\r
515 switch (resourceType)
\r
517 case NS_RESOURCE_MESSAGE:
\r
518 rtStr = NS_COLLECTION_MESSAGE_TYPE;
\r
520 case NS_RESOURCE_SYNC:
\r
521 rtStr = NS_COLLECTION_SYNC_TYPE;
\r
523 case NS_RESOURCE_TOPIC:
\r
524 rtStr = NS_COLLECTION_TOPIC_TYPE;
\r
527 NS_LOG(ERROR, "sendResponseError");
\r
531 OCResourcePayloadAddStringLL(&payload->types, rtStr);
\r
534 if(resourceType != NS_RESOURCE_TOPIC)
\r
536 OCEntityHandlerResponse response;
\r
537 response.numSendVendorSpecificHeaderOptions = 0;
\r
538 memset(response.sendVendorSpecificHeaderOptions, 0,
\r
539 sizeof response.sendVendorSpecificHeaderOptions);
\r
540 memset(response.resourceUri, 0, sizeof response.resourceUri);
\r
542 response.requestHandle = entityHandlerRequest->requestHandle;
\r
543 response.resourceHandle = entityHandlerRequest->resource;
\r
544 response.persistentBufferFlag = 0;
\r
545 response.ehResult = ehResult;
\r
546 response.payload = (OCPayload *) payload;
\r
548 if (OCDoResponse(&response) != OC_STACK_OK)
\r
550 NS_LOG(ERROR, "Fail to AccessPolicy send response");
\r
551 OCRepPayloadDestroy(payload);
\r
556 OCRepPayloadDestroy(payload);
\r