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 OCEntityHandlerResult NSEntityHandlerNotificationCb(OCEntityHandlerFlag flag,
\r
24 OCEntityHandlerRequest *entityHandlerRequest, void* callback)
\r
26 NS_LOG(DEBUG, "NSEntityHandlerNotificationCb - IN");
\r
28 OCEntityHandlerResult ehResult = OC_EH_OK;
\r
29 OCEntityHandlerResponse response =
\r
30 { 0, 0, OC_EH_ERROR, 0, 0,
\r
37 if (!entityHandlerRequest)
\r
39 NS_LOG(ERROR, "Invalid request pointer");
\r
43 // Initialize certain response fields
\r
44 response.numSendVendorSpecificHeaderOptions = 0;
\r
45 memset(response.sendVendorSpecificHeaderOptions, 0,
\r
46 sizeof response.sendVendorSpecificHeaderOptions);
\r
47 memset(response.resourceUri, 0, sizeof response.resourceUri);
\r
48 OCRepPayload* payload = NULL;
\r
50 if (flag & OC_REQUEST_FLAG)
\r
52 NS_LOG(DEBUG, "Flag includes OC_REQUEST_FLAG");
\r
54 if (OC_REST_GET == entityHandlerRequest->method)
\r
56 NS_LOG(DEBUG, "NSEntityHandlerNotificationCb - OC_REST_GET");
\r
58 NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_POLICY,
\r
59 NSCopyOCEntityHandlerRequest(entityHandlerRequest));
\r
60 ehResult = OC_EH_OK;
\r
63 else if (OC_REST_PUT == entityHandlerRequest->method)
\r
65 NS_LOG(DEBUG, "NSEntityHandlerNotificationCb - OC_REST_PUT");
\r
66 ehResult = OC_EH_OK;
\r
68 else if (OC_REST_POST == entityHandlerRequest->method)
\r
70 NS_LOG(DEBUG, "NSEntityHandlerNotificationCb - OC_REST_POST");
\r
71 ehResult = OC_EH_OK;
\r
73 else if (OC_REST_DELETE == entityHandlerRequest->method)
\r
75 NS_LOG(DEBUG, "NSEntityHandlerNotificationCb - OC_REST_DELETE");
\r
76 ehResult = OC_EH_OK;
\r
80 NS_LOG_V (DEBUG, "Received unsupported method %d from client",
\r
81 entityHandlerRequest->method);
\r
82 ehResult = OC_EH_OK;
\r
85 // If the result isn't an error or forbidden, send response
\r
86 if (!((ehResult == OC_EH_ERROR) || (ehResult == OC_EH_FORBIDDEN)))
\r
88 // Format the response. Note this requires some info about the request
\r
89 response.requestHandle = entityHandlerRequest->requestHandle;
\r
90 response.resourceHandle = entityHandlerRequest->resource;
\r
91 response.ehResult = ehResult;
\r
92 //response.payload = reinterpret_cast<OCPayload*>(payload);
\r
93 response.payload = (OCPayload*) payload;
\r
94 // Indicate that response is NOT in a persistent buffer
\r
95 response.persistentBufferFlag = 0;
\r
97 // Handle vendor specific options
\r
98 if (entityHandlerRequest->rcvdVendorSpecificHeaderOptions
\r
99 && entityHandlerRequest->numRcvdVendorSpecificHeaderOptions)
\r
101 NS_LOG (DEBUG, "Received vendor specific options");
\r
103 OCHeaderOption * rcvdOptions = entityHandlerRequest->rcvdVendorSpecificHeaderOptions;
\r
104 for (i = 0; i < entityHandlerRequest->numRcvdVendorSpecificHeaderOptions; i++)
\r
106 if (((OCHeaderOption) rcvdOptions[i]).protocolID == OC_COAP_ID)
\r
108 OIC_LOG_V(DEBUG, LISTENER_TAG, "Received option with OC_COAP_ID and ID %u with",
\r
109 ((OCHeaderOption)rcvdOptions[i]).optionID );
\r
111 OIC_LOG_BUFFER(DEBUG, LISTENER_TAG, ((OCHeaderOption)rcvdOptions[i]).optionData,
\r
112 MAX_HEADER_OPTION_DATA_LENGTH);
\r
115 OCHeaderOption * sendOptions = response.sendVendorSpecificHeaderOptions;
\r
116 uint8_t option2[] =
\r
117 { 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 };
\r
118 uint8_t option3[] =
\r
119 { 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 };
\r
120 sendOptions[0].protocolID = OC_COAP_ID;
\r
121 sendOptions[0].optionID = 2248;
\r
122 memcpy(sendOptions[0].optionData, option2, sizeof(option2));
\r
123 sendOptions[0].optionLength = 10;
\r
124 sendOptions[1].protocolID = OC_COAP_ID;
\r
125 sendOptions[1].optionID = 2600;
\r
126 memcpy(sendOptions[1].optionData, option3, sizeof(option3));
\r
127 sendOptions[1].optionLength = 10;
\r
128 response.numSendVendorSpecificHeaderOptions = 2;
\r
133 OCPayloadDestroy(response.payload);
\r
134 NS_LOG(DEBUG, "NSEntityHandlerNotificationCb - OUT");
\r
138 OCEntityHandlerResult NSEntityHandlerMessageCb(OCEntityHandlerFlag flag,
\r
139 OCEntityHandlerRequest *entityHandlerRequest, void* callback)
\r
141 NS_LOG(DEBUG, "NSEntityHandlerMessageCb - IN");
\r
143 OCEntityHandlerResult ehResult = OC_EH_OK;
\r
144 OCEntityHandlerResponse response =
\r
145 { 0, 0, OC_EH_ERROR, 0, 0,
\r
151 // Validate pointer
\r
152 if (!entityHandlerRequest)
\r
154 NS_LOG (ERROR,"Invalid request pointer");
\r
155 return OC_EH_ERROR;
\r
158 // Initialize certain response fields
\r
159 response.numSendVendorSpecificHeaderOptions = 0;
\r
160 memset(response.sendVendorSpecificHeaderOptions, 0,
\r
161 sizeof response.sendVendorSpecificHeaderOptions);
\r
162 memset(response.resourceUri, 0, sizeof response.resourceUri);
\r
163 OCRepPayload* payload = NULL;
\r
165 if (flag & OC_REQUEST_FLAG)
\r
167 NS_LOG(DEBUG, "Flag includes OC_REQUEST_FLAG");
\r
169 if (OC_REST_GET == entityHandlerRequest->method)
\r
171 NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OC_REST_GET");
\r
172 ehResult = OC_EH_OK;
\r
174 else if (OC_REST_PUT == entityHandlerRequest->method)
\r
176 NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OC_REST_PUT");
\r
177 ehResult = OC_EH_OK;
\r
179 else if (OC_REST_POST == entityHandlerRequest->method)
\r
181 NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OC_REST_POST");
\r
182 ehResult = OC_EH_OK;
\r
184 else if (OC_REST_DELETE == entityHandlerRequest->method)
\r
186 NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OC_REST_DELETE");
\r
187 ehResult = OC_EH_OK;
\r
191 NS_LOG_V(DEBUG, "Received unsupported method %d from client",
\r
192 entityHandlerRequest->method);
\r
193 ehResult = OC_EH_OK;
\r
196 // If the result isn't an error or forbidden, send response
\r
197 if (!((ehResult == OC_EH_ERROR) || (ehResult == OC_EH_FORBIDDEN)))
\r
199 // Format the response. Note this requires some info about the request
\r
200 response.requestHandle = entityHandlerRequest->requestHandle;
\r
201 response.resourceHandle = entityHandlerRequest->resource;
\r
202 response.ehResult = ehResult;
\r
203 //response.payload = reinterpret_cast<OCPayload*>(payload);
\r
204 response.payload = (OCPayload*) payload;
\r
205 // Indicate that response is NOT in a persistent buffer
\r
206 response.persistentBufferFlag = 0;
\r
208 // Handle vendor specific options
\r
209 if (entityHandlerRequest->rcvdVendorSpecificHeaderOptions
\r
210 && entityHandlerRequest->numRcvdVendorSpecificHeaderOptions)
\r
212 NS_LOG(DEBUG, "Received vendor specific options");
\r
214 OCHeaderOption * rcvdOptions = entityHandlerRequest->rcvdVendorSpecificHeaderOptions;
\r
215 for (i = 0; i < entityHandlerRequest->numRcvdVendorSpecificHeaderOptions; i++)
\r
217 if (((OCHeaderOption) rcvdOptions[i]).protocolID == OC_COAP_ID)
\r
219 OIC_LOG_V(DEBUG, LISTENER_TAG, "Received option with OC_COAP_ID and ID %u with",
\r
220 ((OCHeaderOption)rcvdOptions[i]).optionID );
\r
222 OIC_LOG_BUFFER(DEBUG, LISTENER_TAG, ((OCHeaderOption)rcvdOptions[i]).optionData,
\r
223 MAX_HEADER_OPTION_DATA_LENGTH);
\r
226 OCHeaderOption * sendOptions = response.sendVendorSpecificHeaderOptions;
\r
227 uint8_t option2[] =
\r
228 { 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 };
\r
229 uint8_t option3[] =
\r
230 { 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 };
\r
231 sendOptions[0].protocolID = OC_COAP_ID;
\r
232 sendOptions[0].optionID = 2248;
\r
233 memcpy(sendOptions[0].optionData, option2, sizeof(option2));
\r
234 sendOptions[0].optionLength = 10;
\r
235 sendOptions[1].protocolID = OC_COAP_ID;
\r
236 sendOptions[1].optionID = 2600;
\r
237 memcpy(sendOptions[1].optionData, option3, sizeof(option3));
\r
238 sendOptions[1].optionLength = 10;
\r
239 response.numSendVendorSpecificHeaderOptions = 2;
\r
244 if (flag & OC_OBSERVE_FLAG)
\r
246 NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OC_OBSERVE_FLAG");
\r
248 OCObserveAction ocObAction = entityHandlerRequest->obsInfo.action;
\r
250 if (ocObAction == OC_OBSERVE_REGISTER)
\r
252 NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OC_OBSERVE_REGISTER");
\r
253 NS_LOG_V(DEBUG, "NSEntityHandlerMessageCb\n"
\r
254 "Register message observerID : %d\n", entityHandlerRequest->obsInfo.obsId);
\r
255 NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_RECV_SUBSCRIPTION,
\r
256 NSCopyOCEntityHandlerRequest(entityHandlerRequest));
\r
258 else if(ocObAction == OC_OBSERVE_DEREGISTER)
\r
260 NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OC_OBSERVE_DEREGISTER");
\r
261 NS_LOG_V(DEBUG, "NSEntityHandlerMessageCb\n - "
\r
262 "Deregister Message observerID : %d\n", entityHandlerRequest->obsInfo.obsId);
\r
263 NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_RECV_UNSUBSCRIPTION,
\r
264 NSCopyOCEntityHandlerRequest(entityHandlerRequest));
\r
268 OCPayloadDestroy(response.payload);
\r
269 NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OUT");
\r
273 OCEntityHandlerResult NSEntityHandlerSyncCb(OCEntityHandlerFlag flag,
\r
274 OCEntityHandlerRequest *entityHandlerRequest, void* callback)
\r
276 NS_LOG(DEBUG, "NSEntityHandlerSyncCb - IN");
\r
277 OCEntityHandlerResult ehResult = OC_EH_OK;
\r
278 OCEntityHandlerResponse response =
\r
279 { 0, 0, OC_EH_ERROR, 0, 0,
\r
285 // Validate pointer
\r
286 if (!entityHandlerRequest)
\r
288 NS_LOG(ERROR, "Invalid request pointer");
\r
289 return OC_EH_ERROR;
\r
292 // Initialize certain response fields
\r
293 response.numSendVendorSpecificHeaderOptions = 0;
\r
294 memset(response.sendVendorSpecificHeaderOptions, 0,
\r
295 sizeof response.sendVendorSpecificHeaderOptions);
\r
296 memset(response.resourceUri, 0, sizeof response.resourceUri);
\r
297 OCRepPayload* payload = NULL;
\r
299 if (flag & OC_REQUEST_FLAG)
\r
301 NS_LOG(DEBUG, "Flag includes OC_REQUEST_FLAG");
\r
303 if (OC_REST_GET == entityHandlerRequest->method)
\r
305 NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OC_REST_GET");
\r
306 ehResult = OC_EH_OK;
\r
308 else if (OC_REST_PUT == entityHandlerRequest->method)
\r
310 NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OC_REST_PUT");
\r
311 ehResult = OC_EH_OK;
\r
313 else if (OC_REST_POST == entityHandlerRequest->method)
\r
315 /** Receive sync data from consumer which read or dismiss notification message.
\r
316 And broadcast the sync data to all subscribers including provider app
\r
317 to synchronize the notification message status. */
\r
319 NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OC_REST_POST");
\r
321 NSPushQueue(NOTIFICATION_SCHEDULER, TASK_RECV_READ,
\r
322 NSGetSyncInfo(entityHandlerRequest->payload));
\r
323 ehResult = OC_EH_OK;
\r
325 else if (OC_REST_DELETE == entityHandlerRequest->method)
\r
327 NS_LOG(DEBUG, "Received OC_REST_DELETE from client");
\r
328 ehResult = OC_EH_OK;
\r
332 NS_LOG_V(DEBUG, "Received unsupported method %d from client",
\r
333 entityHandlerRequest->method);
\r
334 ehResult = OC_EH_OK;
\r
337 // If the result isn't an error or forbidden, send response
\r
338 if (!((ehResult == OC_EH_ERROR) || (ehResult == OC_EH_FORBIDDEN)))
\r
340 // Format the response. Note this requires some info about the request
\r
341 response.requestHandle = entityHandlerRequest->requestHandle;
\r
342 response.resourceHandle = entityHandlerRequest->resource;
\r
343 response.ehResult = ehResult;
\r
344 //response.payload = reinterpret_cast<OCPayload*>(payload);
\r
345 response.payload = (OCPayload*) payload;
\r
346 // Indicate that response is NOT in a persistent buffer
\r
347 response.persistentBufferFlag = 0;
\r
349 // Handle vendor specific options
\r
350 if (entityHandlerRequest->rcvdVendorSpecificHeaderOptions
\r
351 && entityHandlerRequest->numRcvdVendorSpecificHeaderOptions)
\r
353 NS_LOG(DEBUG, "Received vendor specific options");
\r
355 OCHeaderOption * rcvdOptions = entityHandlerRequest->rcvdVendorSpecificHeaderOptions;
\r
356 for (i = 0; i < entityHandlerRequest->numRcvdVendorSpecificHeaderOptions; i++)
\r
358 if (((OCHeaderOption) rcvdOptions[i]).protocolID == OC_COAP_ID)
\r
360 OIC_LOG_V(DEBUG, LISTENER_TAG, "Received option with OC_COAP_ID and ID %u with",
\r
361 ((OCHeaderOption)rcvdOptions[i]).optionID );
\r
363 OIC_LOG_BUFFER(DEBUG, LISTENER_TAG, ((OCHeaderOption)rcvdOptions[i]).optionData,
\r
364 MAX_HEADER_OPTION_DATA_LENGTH);
\r
367 OCHeaderOption * sendOptions = response.sendVendorSpecificHeaderOptions;
\r
368 uint8_t option2[] =
\r
369 { 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 };
\r
370 uint8_t option3[] =
\r
371 { 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 };
\r
372 sendOptions[0].protocolID = OC_COAP_ID;
\r
373 sendOptions[0].optionID = 2248;
\r
374 memcpy(sendOptions[0].optionData, option2, sizeof(option2));
\r
375 sendOptions[0].optionLength = 10;
\r
376 sendOptions[1].protocolID = OC_COAP_ID;
\r
377 sendOptions[1].optionID = 2600;
\r
378 memcpy(sendOptions[1].optionData, option3, sizeof(option3));
\r
379 sendOptions[1].optionLength = 10;
\r
380 response.numSendVendorSpecificHeaderOptions = 2;
\r
385 if (flag & OC_OBSERVE_FLAG)
\r
387 /** Requested by consumers to synchronize notification message status.
\r
388 Store the observer IDs to storage or cache */
\r
390 NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OC_OBSERVE_FLAG");
\r
393 OCObserveAction ocObAction = entityHandlerRequest->obsInfo.action;
\r
395 if (ocObAction == OC_OBSERVE_REGISTER)
\r
397 NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OC_OBSERVE_REGISTER");
\r
398 NS_LOG_V(DEBUG, "NSEntityHandlerSyncCb\n - "
\r
399 "Register Sync observerID : %d\n", entityHandlerRequest->obsInfo.obsId);
\r
400 NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SYNC_SUBSCRIPTION,
\r
401 NSCopyOCEntityHandlerRequest(entityHandlerRequest));
\r
403 else if(ocObAction == OC_OBSERVE_DEREGISTER)
\r
405 NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OC_OBSERVE_DEREGISTER");
\r
406 NS_LOG_V(DEBUG, "NSEntityHandlerSyncCb\n - "
\r
407 "Deregister Sync observerID : %d\n", entityHandlerRequest->obsInfo.obsId);
\r
408 NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_RECV_UNSUBSCRIPTION,
\r
409 NSCopyOCEntityHandlerRequest(entityHandlerRequest));
\r
413 OCPayloadDestroy(response.payload);
\r
414 NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OUT");
\r
418 void NSProviderConnectionStateListener(const CAEndpoint_t * info, bool connected)
\r
421 NS_LOG(DEBUG, "NSProviderConnectionStateListener - IN");
\r
425 NS_LOG(DEBUG, "CONNECTED");
\r
427 // Set Connection State
\r
428 NSSetProviderConnectionState(CONNECTED);
\r
431 NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);
\r
433 if(info->adapter == CA_ADAPTER_TCP)
\r
435 NS_LOG_V(DEBUG, "TCP Connected remote address: %s:%d", info->addr, info->port);
\r
441 NS_LOG(DEBUG, "DISCONNECTED");
\r
443 // Set Connection State
\r
444 NSSetProviderConnectionState(DISCONNECTED);
\r
446 if(info->adapter == CA_ADAPTER_TCP)
\r
448 NS_LOG_V(DEBUG, "TCP Disconnected remote address: %s:%d", info->addr, info->port);
\r
452 NS_LOG(DEBUG, "NSProviderConnectionStateListener - OUT");
\r
455 void NSProviderAdapterStateListener(CATransportAdapter_t adapter, bool enabled)
\r
459 NS_LOG(DEBUG, "NSProviderAdapterStateListener - IN");
\r
463 NS_LOG(DEBUG, "CONNECTED");
\r
465 // Set Connection State
\r
466 NSSetProviderConnectionState(CONNECTED);
\r
469 NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);
\r
474 NS_LOG(DEBUG, "DISCONNECTED");
\r
476 // Set Connection State
\r
477 NSSetProviderConnectionState(DISCONNECTED);
\r
480 NS_LOG(DEBUG, "NSProviderAdapterStateListener - OUT");
\r