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 if (OC_OBSERVE_REGISTER == entityHandlerRequest->obsInfo.action)
\r
250 NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OC_OBSERVE_REGISTER");
\r
251 NS_LOG_V(DEBUG, "NSEntityHandlerMessageCb\n"
\r
252 "Register message observerID : %d\n", entityHandlerRequest->obsInfo.obsId);
\r
253 NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_RECV_SUBSCRIPTION,
\r
254 NSCopyOCEntityHandlerRequest(entityHandlerRequest));
\r
258 OCPayloadDestroy(response.payload);
\r
259 NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OUT");
\r
263 OCEntityHandlerResult NSEntityHandlerSyncCb(OCEntityHandlerFlag flag,
\r
264 OCEntityHandlerRequest *entityHandlerRequest, void* callback)
\r
266 NS_LOG(DEBUG, "NSEntityHandlerSyncCb - IN");
\r
267 OCEntityHandlerResult ehResult = OC_EH_OK;
\r
268 OCEntityHandlerResponse response =
\r
269 { 0, 0, OC_EH_ERROR, 0, 0,
\r
275 // Validate pointer
\r
276 if (!entityHandlerRequest)
\r
278 NS_LOG(ERROR, "Invalid request pointer");
\r
279 return OC_EH_ERROR;
\r
282 // Initialize certain response fields
\r
283 response.numSendVendorSpecificHeaderOptions = 0;
\r
284 memset(response.sendVendorSpecificHeaderOptions, 0,
\r
285 sizeof response.sendVendorSpecificHeaderOptions);
\r
286 memset(response.resourceUri, 0, sizeof response.resourceUri);
\r
287 OCRepPayload* payload = NULL;
\r
289 if (flag & OC_REQUEST_FLAG)
\r
291 NS_LOG(DEBUG, "Flag includes OC_REQUEST_FLAG");
\r
293 if (OC_REST_GET == entityHandlerRequest->method)
\r
295 NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OC_REST_GET");
\r
296 ehResult = OC_EH_OK;
\r
298 else if (OC_REST_PUT == entityHandlerRequest->method)
\r
300 NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OC_REST_PUT");
\r
301 ehResult = OC_EH_OK;
\r
303 else if (OC_REST_POST == entityHandlerRequest->method)
\r
305 /** Receive sync data from consumer which read or dismiss notification message.
\r
306 And broadcast the sync data to all subscribers including provider app
\r
307 to synchronize the notification message status. */
\r
309 NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OC_REST_POST");
\r
311 NSPushQueue(NOTIFICATION_SCHEDULER, TASK_RECV_READ,
\r
312 NSBuildOICNotificationSync(entityHandlerRequest->payload));
\r
313 ehResult = OC_EH_OK;
\r
315 else if (OC_REST_DELETE == entityHandlerRequest->method)
\r
317 NS_LOG(DEBUG, "Received OC_REST_DELETE from client");
\r
318 ehResult = OC_EH_OK;
\r
322 NS_LOG_V(DEBUG, "Received unsupported method %d from client",
\r
323 entityHandlerRequest->method);
\r
324 ehResult = OC_EH_OK;
\r
327 // If the result isn't an error or forbidden, send response
\r
328 if (!((ehResult == OC_EH_ERROR) || (ehResult == OC_EH_FORBIDDEN)))
\r
330 // Format the response. Note this requires some info about the request
\r
331 response.requestHandle = entityHandlerRequest->requestHandle;
\r
332 response.resourceHandle = entityHandlerRequest->resource;
\r
333 response.ehResult = ehResult;
\r
334 //response.payload = reinterpret_cast<OCPayload*>(payload);
\r
335 response.payload = (OCPayload*) payload;
\r
336 // Indicate that response is NOT in a persistent buffer
\r
337 response.persistentBufferFlag = 0;
\r
339 // Handle vendor specific options
\r
340 if (entityHandlerRequest->rcvdVendorSpecificHeaderOptions
\r
341 && entityHandlerRequest->numRcvdVendorSpecificHeaderOptions)
\r
343 NS_LOG(DEBUG, "Received vendor specific options");
\r
345 OCHeaderOption * rcvdOptions = entityHandlerRequest->rcvdVendorSpecificHeaderOptions;
\r
346 for (i = 0; i < entityHandlerRequest->numRcvdVendorSpecificHeaderOptions; i++)
\r
348 if (((OCHeaderOption) rcvdOptions[i]).protocolID == OC_COAP_ID)
\r
350 OIC_LOG_V(DEBUG, LISTENER_TAG, "Received option with OC_COAP_ID and ID %u with",
\r
351 ((OCHeaderOption)rcvdOptions[i]).optionID );
\r
353 OIC_LOG_BUFFER(DEBUG, LISTENER_TAG, ((OCHeaderOption)rcvdOptions[i]).optionData,
\r
354 MAX_HEADER_OPTION_DATA_LENGTH);
\r
357 OCHeaderOption * sendOptions = response.sendVendorSpecificHeaderOptions;
\r
358 uint8_t option2[] =
\r
359 { 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 };
\r
360 uint8_t option3[] =
\r
361 { 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 };
\r
362 sendOptions[0].protocolID = OC_COAP_ID;
\r
363 sendOptions[0].optionID = 2248;
\r
364 memcpy(sendOptions[0].optionData, option2, sizeof(option2));
\r
365 sendOptions[0].optionLength = 10;
\r
366 sendOptions[1].protocolID = OC_COAP_ID;
\r
367 sendOptions[1].optionID = 2600;
\r
368 memcpy(sendOptions[1].optionData, option3, sizeof(option3));
\r
369 sendOptions[1].optionLength = 10;
\r
370 response.numSendVendorSpecificHeaderOptions = 2;
\r
375 if (flag & OC_OBSERVE_FLAG)
\r
377 /** Requested by consumers to synchronize notification message status.
\r
378 Store the observer IDs to storage or cache */
\r
380 NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OC_OBSERVE_FLAG");
\r
382 if (OC_OBSERVE_REGISTER == entityHandlerRequest->obsInfo.action)
\r
384 NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OC_OBSERVE_REGISTER");
\r
385 NS_LOG_V(DEBUG, "NSEntityHandlerSyncCb\n - "
\r
386 "Register Sync observerID : %d\n", entityHandlerRequest->obsInfo.obsId);
\r
387 NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SYNC_SUBSCRIPTION,
\r
388 NSCopyOCEntityHandlerRequest(entityHandlerRequest));
\r
392 OCPayloadDestroy(response.payload);
\r
393 NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OUT");
\r
397 void NSProviderConnectionStateListener(CATransportAdapter_t adapter, const char *remote_address,
\r
401 // should be implementation
\r
403 (void)remote_address;
\r
405 NS_LOG(DEBUG, "NSProviderConnectionStateListener - IN");
\r
409 NS_LOG(DEBUG, "CONNECTED");
\r
411 // Set Connection State
\r
412 NSSetProviderConnectionState(CONNECTED);
\r
415 NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);
\r
418 NS_LOG(DEBUG, "NSProviderConnectionStateListener - OUT");
\r
421 void NSProviderAdapterStateListener(CATransportAdapter_t adapter, bool enabled)
\r
423 // should be implementation
\r
426 NS_LOG(DEBUG, "NSProviderAdapterStateListener - IN");
\r
430 NS_LOG(DEBUG, "CONNECTED");
\r
432 // Set Connection State
\r
433 NSSetProviderConnectionState(CONNECTED);
\r
436 NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);
\r
439 NS_LOG(DEBUG, "NSProviderAdapterStateListener - OUT");
\r
442 NSSync * NSBuildOICNotificationSync(OCPayload * payload)
\r
444 NS_LOG(DEBUG, "NSBuildOICNotificationSync - IN");
\r
450 NSSync * retSync = (NSSync *)OICMalloc(sizeof(NSSync));
\r
456 retSync->mMessageId = NULL;
\r
457 retSync->mState = Notification_Read;
\r
459 OCRepPayload * repPayload = (OCRepPayload *)payload;
\r
460 if (!OCRepPayloadGetPropString(repPayload, NS_ATTRIBUTE_ID, &retSync->mMessageId))
\r
466 if (!OCRepPayloadGetPropInt(repPayload, NS_ATTRIBUTE_STATE, & state))
\r
468 OICFree(retSync->mMessageId);
\r
473 retSync->mState = (NSSyncTypes) state;
\r
475 NS_LOG_V(DEBUG, "Sync ID : %s", retSync->mMessageId);
\r
476 NS_LOG_V(DEBUG, "Sync State : %d", (int) retSync->mState);
\r
478 NS_LOG(DEBUG, "NSBuildOICNotificationSync - OUT");
\r