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 OIC_LOG_V (INFO, LISTENER_TAG, "Inside entity handler - flags: 0x%x", flag);
\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 OIC_LOG (ERROR, LISTENER_TAG, "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 OIC_LOG (INFO, LISTENER_TAG, "Flag includes OC_REQUEST_FLAG");
\r
54 if (OC_REST_GET == entityHandlerRequest->method)
\r
56 OIC_LOG (INFO, LISTENER_TAG, "Received OC_REST_GET from client");
\r
58 NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_POLICY, (void *)entityHandlerRequest);
\r
59 ehResult = OC_EH_OK;
\r
62 else if (OC_REST_PUT == entityHandlerRequest->method)
\r
64 OIC_LOG (INFO, LISTENER_TAG, "Received OC_REST_PUT from client");
\r
65 ehResult = OC_EH_OK;
\r
67 else if (OC_REST_POST == entityHandlerRequest->method)
\r
69 OIC_LOG (INFO, LISTENER_TAG, "Received OC_REST_POST from client");
\r
70 ehResult = OC_EH_OK;
\r
72 else if (OC_REST_DELETE == entityHandlerRequest->method)
\r
74 OIC_LOG (INFO, LISTENER_TAG, "Received OC_REST_DELETE from client");
\r
75 ehResult = OC_EH_OK;
\r
79 OIC_LOG_V (INFO, LISTENER_TAG, "Received unsupported method %d from client",
\r
80 entityHandlerRequest->method);
\r
81 ehResult = OC_EH_OK;
\r
84 // If the result isn't an error or forbidden, send response
\r
85 if (!((ehResult == OC_EH_ERROR) || (ehResult == OC_EH_FORBIDDEN)))
\r
87 // Format the response. Note this requires some info about the request
\r
88 response.requestHandle = entityHandlerRequest->requestHandle;
\r
89 response.resourceHandle = entityHandlerRequest->resource;
\r
90 response.ehResult = ehResult;
\r
91 //response.payload = reinterpret_cast<OCPayload*>(payload);
\r
92 response.payload = (OCPayload*) payload;
\r
93 // Indicate that response is NOT in a persistent buffer
\r
94 response.persistentBufferFlag = 0;
\r
96 // Handle vendor specific options
\r
97 if (entityHandlerRequest->rcvdVendorSpecificHeaderOptions
\r
98 && entityHandlerRequest->numRcvdVendorSpecificHeaderOptions)
\r
100 OIC_LOG (INFO, LISTENER_TAG, "Received vendor specific options");
\r
102 OCHeaderOption * rcvdOptions = entityHandlerRequest->rcvdVendorSpecificHeaderOptions;
\r
103 for (i = 0; i < entityHandlerRequest->numRcvdVendorSpecificHeaderOptions; i++)
\r
105 if (((OCHeaderOption) rcvdOptions[i]).protocolID == OC_COAP_ID)
\r
107 OIC_LOG_V(INFO, LISTENER_TAG, "Received option with OC_COAP_ID and ID %u with",
\r
108 ((OCHeaderOption)rcvdOptions[i]).optionID );
\r
110 OIC_LOG_BUFFER(INFO, LISTENER_TAG, ((OCHeaderOption)rcvdOptions[i]).optionData,
\r
111 MAX_HEADER_OPTION_DATA_LENGTH);
\r
114 OCHeaderOption * sendOptions = response.sendVendorSpecificHeaderOptions;
\r
115 uint8_t option2[] =
\r
116 { 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 };
\r
117 uint8_t option3[] =
\r
118 { 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 };
\r
119 sendOptions[0].protocolID = OC_COAP_ID;
\r
120 sendOptions[0].optionID = 2248;
\r
121 memcpy(sendOptions[0].optionData, option2, sizeof(option2));
\r
122 sendOptions[0].optionLength = 10;
\r
123 sendOptions[1].protocolID = OC_COAP_ID;
\r
124 sendOptions[1].optionID = 2600;
\r
125 memcpy(sendOptions[1].optionData, option3, sizeof(option3));
\r
126 sendOptions[1].optionLength = 10;
\r
127 response.numSendVendorSpecificHeaderOptions = 2;
\r
132 OCPayloadDestroy(response.payload);
\r
136 OCEntityHandlerResult NSEntityHandlerMessageCb(OCEntityHandlerFlag flag,
\r
137 OCEntityHandlerRequest *entityHandlerRequest, void* callback)
\r
139 OIC_LOG_V (INFO, LISTENER_TAG, "Inside entity handler - flags: 0x%x", flag);
\r
141 OCEntityHandlerResult ehResult = OC_EH_OK;
\r
142 OCEntityHandlerResponse response =
\r
143 { 0, 0, OC_EH_ERROR, 0, 0,
\r
149 // Validate pointer
\r
150 if (!entityHandlerRequest)
\r
152 OIC_LOG (ERROR, LISTENER_TAG, "Invalid request pointer");
\r
153 return OC_EH_ERROR;
\r
156 // Initialize certain response fields
\r
157 response.numSendVendorSpecificHeaderOptions = 0;
\r
158 memset(response.sendVendorSpecificHeaderOptions, 0,
\r
159 sizeof response.sendVendorSpecificHeaderOptions);
\r
160 memset(response.resourceUri, 0, sizeof response.resourceUri);
\r
161 OCRepPayload* payload = NULL;
\r
163 if (flag & OC_REQUEST_FLAG)
\r
165 OIC_LOG (INFO, LISTENER_TAG, "Flag includes OC_REQUEST_FLAG");
\r
167 if (OC_REST_GET == entityHandlerRequest->method)
\r
169 OIC_LOG (INFO, LISTENER_TAG, "Received OC_REST_GET from client");
\r
170 ehResult = OC_EH_OK;
\r
172 else if (OC_REST_PUT == entityHandlerRequest->method)
\r
174 OIC_LOG (INFO, LISTENER_TAG, "Received OC_REST_PUT from client");
\r
175 ehResult = OC_EH_OK;
\r
177 else if (OC_REST_POST == entityHandlerRequest->method)
\r
179 OIC_LOG (INFO, LISTENER_TAG, "Received OC_REST_POST from client");
\r
180 ehResult = OC_EH_OK;
\r
182 else if (OC_REST_DELETE == entityHandlerRequest->method)
\r
184 OIC_LOG (INFO, LISTENER_TAG, "Received OC_REST_DELETE from client");
\r
185 ehResult = OC_EH_OK;
\r
189 OIC_LOG_V (INFO, LISTENER_TAG, "Received unsupported method %d from client",
\r
190 entityHandlerRequest->method);
\r
191 ehResult = OC_EH_OK;
\r
194 // If the result isn't an error or forbidden, send response
\r
195 if (!((ehResult == OC_EH_ERROR) || (ehResult == OC_EH_FORBIDDEN)))
\r
197 // Format the response. Note this requires some info about the request
\r
198 response.requestHandle = entityHandlerRequest->requestHandle;
\r
199 response.resourceHandle = entityHandlerRequest->resource;
\r
200 response.ehResult = ehResult;
\r
201 //response.payload = reinterpret_cast<OCPayload*>(payload);
\r
202 response.payload = (OCPayload*) payload;
\r
203 // Indicate that response is NOT in a persistent buffer
\r
204 response.persistentBufferFlag = 0;
\r
206 // Handle vendor specific options
\r
207 if (entityHandlerRequest->rcvdVendorSpecificHeaderOptions
\r
208 && entityHandlerRequest->numRcvdVendorSpecificHeaderOptions)
\r
210 OIC_LOG (INFO, LISTENER_TAG, "Received vendor specific options");
\r
212 OCHeaderOption * rcvdOptions = entityHandlerRequest->rcvdVendorSpecificHeaderOptions;
\r
213 for (i = 0; i < entityHandlerRequest->numRcvdVendorSpecificHeaderOptions; i++)
\r
215 if (((OCHeaderOption) rcvdOptions[i]).protocolID == OC_COAP_ID)
\r
217 OIC_LOG_V(INFO, LISTENER_TAG, "Received option with OC_COAP_ID and ID %u with",
\r
218 ((OCHeaderOption)rcvdOptions[i]).optionID );
\r
220 OIC_LOG_BUFFER(INFO, LISTENER_TAG, ((OCHeaderOption)rcvdOptions[i]).optionData,
\r
221 MAX_HEADER_OPTION_DATA_LENGTH);
\r
224 OCHeaderOption * sendOptions = response.sendVendorSpecificHeaderOptions;
\r
225 uint8_t option2[] =
\r
226 { 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 };
\r
227 uint8_t option3[] =
\r
228 { 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 };
\r
229 sendOptions[0].protocolID = OC_COAP_ID;
\r
230 sendOptions[0].optionID = 2248;
\r
231 memcpy(sendOptions[0].optionData, option2, sizeof(option2));
\r
232 sendOptions[0].optionLength = 10;
\r
233 sendOptions[1].protocolID = OC_COAP_ID;
\r
234 sendOptions[1].optionID = 2600;
\r
235 memcpy(sendOptions[1].optionData, option3, sizeof(option3));
\r
236 sendOptions[1].optionLength = 10;
\r
237 response.numSendVendorSpecificHeaderOptions = 2;
\r
242 if (flag & OC_OBSERVE_FLAG)
\r
244 OIC_LOG(INFO, LISTENER_TAG, "Flag includes OC_OBSERVE_FLAG");
\r
246 if (OC_OBSERVE_REGISTER == entityHandlerRequest->obsInfo.action)
\r
248 OIC_LOG (INFO, LISTENER_TAG, "Received OC_OBSERVE_REGISTER from client");
\r
250 printf("NS_ register message observerID : %d\n", entityHandlerRequest->obsInfo.obsId);
\r
251 NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_RECV_SUBSCRIPTION, entityHandlerRequest);
\r
256 OCPayloadDestroy(response.payload);
\r
260 OCEntityHandlerResult NSEntityHandlerSyncCb(OCEntityHandlerFlag flag,
\r
261 OCEntityHandlerRequest *entityHandlerRequest, void* callback)
\r
263 OIC_LOG_V (INFO, LISTENER_TAG, "Inside entity handler - flags: 0x%x", flag);
\r
265 OCEntityHandlerResult ehResult = OC_EH_OK;
\r
266 OCEntityHandlerResponse response =
\r
267 { 0, 0, OC_EH_ERROR, 0, 0,
\r
273 // Validate pointer
\r
274 if (!entityHandlerRequest)
\r
276 OIC_LOG (ERROR, LISTENER_TAG, "Invalid request pointer");
\r
277 return OC_EH_ERROR;
\r
280 // Initialize certain response fields
\r
281 response.numSendVendorSpecificHeaderOptions = 0;
\r
282 memset(response.sendVendorSpecificHeaderOptions, 0,
\r
283 sizeof response.sendVendorSpecificHeaderOptions);
\r
284 memset(response.resourceUri, 0, sizeof response.resourceUri);
\r
285 OCRepPayload* payload = NULL;
\r
287 if (flag & OC_REQUEST_FLAG)
\r
289 OIC_LOG (INFO, LISTENER_TAG, "Flag includes OC_REQUEST_FLAG");
\r
291 if (OC_REST_GET == entityHandlerRequest->method)
\r
293 OIC_LOG (INFO, LISTENER_TAG, "Received OC_REST_GET from client");
\r
294 ehResult = OC_EH_OK;
\r
296 else if (OC_REST_PUT == entityHandlerRequest->method)
\r
298 OIC_LOG (INFO, LISTENER_TAG, "Received OC_REST_PUT from client");
\r
299 ehResult = OC_EH_OK;
\r
301 else if (OC_REST_POST == entityHandlerRequest->method)
\r
303 OIC_LOG (INFO, LISTENER_TAG, "Received OC_REST_POST from client");
\r
305 NSPushQueue(NOTIFICATION_SCHEDULER, TASK_SEND_READ, NSBuildOICNotificationSync(entityHandlerRequest->payload));
\r
306 ehResult = OC_EH_OK;
\r
308 else if (OC_REST_DELETE == entityHandlerRequest->method)
\r
310 OIC_LOG (INFO, LISTENER_TAG, "Received OC_REST_DELETE from client");
\r
311 ehResult = OC_EH_OK;
\r
315 OIC_LOG_V (INFO, LISTENER_TAG, "Received unsupported method %d from client",
\r
316 entityHandlerRequest->method);
\r
317 ehResult = OC_EH_OK;
\r
320 // If the result isn't an error or forbidden, send response
\r
321 if (!((ehResult == OC_EH_ERROR) || (ehResult == OC_EH_FORBIDDEN)))
\r
323 // Format the response. Note this requires some info about the request
\r
324 response.requestHandle = entityHandlerRequest->requestHandle;
\r
325 response.resourceHandle = entityHandlerRequest->resource;
\r
326 response.ehResult = ehResult;
\r
327 //response.payload = reinterpret_cast<OCPayload*>(payload);
\r
328 response.payload = (OCPayload*) payload;
\r
329 // Indicate that response is NOT in a persistent buffer
\r
330 response.persistentBufferFlag = 0;
\r
332 // Handle vendor specific options
\r
333 if (entityHandlerRequest->rcvdVendorSpecificHeaderOptions
\r
334 && entityHandlerRequest->numRcvdVendorSpecificHeaderOptions)
\r
336 OIC_LOG (INFO, LISTENER_TAG, "Received vendor specific options");
\r
338 OCHeaderOption * rcvdOptions = entityHandlerRequest->rcvdVendorSpecificHeaderOptions;
\r
339 for (i = 0; i < entityHandlerRequest->numRcvdVendorSpecificHeaderOptions; i++)
\r
341 if (((OCHeaderOption) rcvdOptions[i]).protocolID == OC_COAP_ID)
\r
343 OIC_LOG_V(INFO, LISTENER_TAG, "Received option with OC_COAP_ID and ID %u with",
\r
344 ((OCHeaderOption)rcvdOptions[i]).optionID );
\r
346 OIC_LOG_BUFFER(INFO, LISTENER_TAG, ((OCHeaderOption)rcvdOptions[i]).optionData,
\r
347 MAX_HEADER_OPTION_DATA_LENGTH);
\r
350 OCHeaderOption * sendOptions = response.sendVendorSpecificHeaderOptions;
\r
351 uint8_t option2[] =
\r
352 { 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 };
\r
353 uint8_t option3[] =
\r
354 { 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 };
\r
355 sendOptions[0].protocolID = OC_COAP_ID;
\r
356 sendOptions[0].optionID = 2248;
\r
357 memcpy(sendOptions[0].optionData, option2, sizeof(option2));
\r
358 sendOptions[0].optionLength = 10;
\r
359 sendOptions[1].protocolID = OC_COAP_ID;
\r
360 sendOptions[1].optionID = 2600;
\r
361 memcpy(sendOptions[1].optionData, option3, sizeof(option3));
\r
362 sendOptions[1].optionLength = 10;
\r
363 response.numSendVendorSpecificHeaderOptions = 2;
\r
368 if (flag & OC_OBSERVE_FLAG)
\r
370 OIC_LOG(INFO, LISTENER_TAG, "Flag includes OC_OBSERVE_FLAG");
\r
372 if (OC_OBSERVE_REGISTER == entityHandlerRequest->obsInfo.action)
\r
374 OIC_LOG (INFO, LISTENER_TAG, "Received OC_OBSERVE_REGISTER from client");
\r
375 printf("NS_ register sync observerID : %d\n", entityHandlerRequest->obsInfo.obsId);
\r
376 NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SYNC_SUBSCRIPTION, entityHandlerRequest);
\r
380 OCPayloadDestroy(response.payload);
\r
384 void NSProviderConnectionStateListener(CATransportAdapter_t adapter, const char *remote_address,
\r
388 // should be implementation
\r
390 (void)remote_address;
\r
392 OIC_LOG (INFO, LISTENER_TAG, "Connection State Changed");
\r
396 OIC_LOG (INFO, LISTENER_TAG, "CONNECTED");
\r
398 // Set Connection State
\r
399 NSSetProviderConnectionState(CONNECTED);
\r
402 NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);
\r
406 void NSProviderAdapterStateListener(CATransportAdapter_t adapter, bool enabled)
\r
408 // should be implementation
\r
411 OIC_LOG (INFO, LISTENER_TAG, "Adapter State Changed");
\r
415 OIC_LOG (INFO, LISTENER_TAG, "CONNECTED");
\r
417 // Set Connection State
\r
418 NSSetProviderConnectionState(CONNECTED);
\r
421 NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);
\r
425 NSSync * NSBuildOICNotificationSync(OCPayload * payload)
\r
431 NSSync * retSync = (NSSync *)OICMalloc(sizeof(NSSync));
\r
437 retSync->mMessageId = NULL;
\r
438 retSync->mState = Notification_Read;
\r
440 OCRepPayload * repPayload = (OCRepPayload *)payload;
\r
441 if (!OCRepPayloadGetPropString(repPayload, NS_ATTRIBUTE_ID, &retSync->mMessageId))
\r
443 OIC_LOG(DEBUG, LISTENER_TAG, "id of received sync is null");
\r
448 if (!OCRepPayloadGetPropInt(repPayload, NS_ATTRIBUTE_STATE, & state))
\r
451 OIC_LOG(DEBUG, LISTENER_TAG, "id of received sync is null");
\r
453 OICFree(retSync->mMessageId);
\r
458 retSync->mState = (NSSyncTypes) state;
\r
460 OIC_LOG_V(DEBUG, LISTENER_TAG, "Sync ID : %s", retSync->mMessageId);
\r
461 OIC_LOG_V(DEBUG, LISTENER_TAG, "Sync State : %d", (int) retSync->mState);
\r
466 NSResult NSMakeTask(NSTaskType type, OCEntityHandlerRequest *request, NSTask * task)
\r
468 task = (NSTask*) OICMalloc(sizeof(NSTask));
\r
471 OIC_LOG(ERROR, LISTENER_TAG, PCF("Fail to allocate memory"));
\r
475 task->taskType = type;
\r
476 task->taskData = request;
\r
477 task->nextTask = NULL;
\r