Clean the warning message in notification service .
[platform/upstream/iotivity.git] / service / notification / src / provider / NSProviderListener.c
1 //******************************************************************\r
2 //\r
3 // Copyright 2016 Samsung Electronics All Rights Reserved.\r
4 //\r
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
6 //\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
10 //\r
11 //      http://www.apache.org/licenses/LICENSE-2.0\r
12 //\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
18 //\r
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
20 \r
21 #include "NSProviderListener.h"\r
22 \r
23 OCEntityHandlerResult NSEntityHandlerNotificationCb(OCEntityHandlerFlag flag,\r
24         OCEntityHandlerRequest *entityHandlerRequest, void* callback)\r
25 {\r
26     OIC_LOG_V (INFO, LISTENER_TAG, "Inside entity handler - flags: 0x%x", flag);\r
27 \r
28     OCEntityHandlerResult ehResult = OC_EH_OK;\r
29     OCEntityHandlerResponse response =\r
30     { 0, 0, OC_EH_ERROR, 0, 0,\r
31     { },\r
32     { 0 }, false };\r
33 \r
34     (void)callback;\r
35 \r
36     // Validate pointer\r
37     if (!entityHandlerRequest)\r
38     {\r
39         OIC_LOG (ERROR, LISTENER_TAG, "Invalid request pointer");\r
40         return OC_EH_ERROR;\r
41     }\r
42 \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
49 \r
50     if (flag & OC_REQUEST_FLAG)\r
51     {\r
52         OIC_LOG (INFO, LISTENER_TAG, "Flag includes OC_REQUEST_FLAG");\r
53 \r
54         if (OC_REST_GET == entityHandlerRequest->method)\r
55         {\r
56             OIC_LOG (INFO, LISTENER_TAG, "Received OC_REST_GET from client");\r
57 \r
58             NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_POLICY, (void *)entityHandlerRequest);\r
59             ehResult = OC_EH_OK;\r
60 \r
61         }\r
62         else if (OC_REST_PUT == entityHandlerRequest->method)\r
63         {\r
64             OIC_LOG (INFO, LISTENER_TAG, "Received OC_REST_PUT from client");\r
65             ehResult = OC_EH_OK;\r
66         }\r
67         else if (OC_REST_POST == entityHandlerRequest->method)\r
68         {\r
69             OIC_LOG (INFO, LISTENER_TAG, "Received OC_REST_POST from client");\r
70             ehResult = OC_EH_OK;\r
71         }\r
72         else if (OC_REST_DELETE == entityHandlerRequest->method)\r
73         {\r
74             OIC_LOG (INFO, LISTENER_TAG, "Received OC_REST_DELETE from client");\r
75             ehResult = OC_EH_OK;\r
76         }\r
77         else\r
78         {\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
82         }\r
83 \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
86         {\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
95 \r
96             // Handle vendor specific options\r
97             if (entityHandlerRequest->rcvdVendorSpecificHeaderOptions\r
98                     && entityHandlerRequest->numRcvdVendorSpecificHeaderOptions)\r
99             {\r
100                 OIC_LOG (INFO, LISTENER_TAG, "Received vendor specific options");\r
101                 uint8_t i = 0;\r
102                 OCHeaderOption * rcvdOptions = entityHandlerRequest->rcvdVendorSpecificHeaderOptions;\r
103                 for (i = 0; i < entityHandlerRequest->numRcvdVendorSpecificHeaderOptions; i++)\r
104                 {\r
105                     if (((OCHeaderOption) rcvdOptions[i]).protocolID == OC_COAP_ID)\r
106                     {\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
109 \r
110                         OIC_LOG_BUFFER(INFO, LISTENER_TAG, ((OCHeaderOption)rcvdOptions[i]).optionData,\r
111                                 MAX_HEADER_OPTION_DATA_LENGTH);\r
112                     }\r
113                 }\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
128             }\r
129         }\r
130     }\r
131 \r
132     OCPayloadDestroy(response.payload);\r
133     return ehResult;\r
134 }\r
135 \r
136 OCEntityHandlerResult NSEntityHandlerMessageCb(OCEntityHandlerFlag flag,\r
137         OCEntityHandlerRequest *entityHandlerRequest, void* callback)\r
138 {\r
139     OIC_LOG_V (INFO, LISTENER_TAG, "Inside entity handler - flags: 0x%x", flag);\r
140 \r
141     OCEntityHandlerResult ehResult = OC_EH_OK;\r
142     OCEntityHandlerResponse response =\r
143     { 0, 0, OC_EH_ERROR, 0, 0,\r
144     { },\r
145     { 0 }, false };\r
146 \r
147     (void)callback;\r
148 \r
149     // Validate pointer\r
150     if (!entityHandlerRequest)\r
151     {\r
152         OIC_LOG (ERROR, LISTENER_TAG, "Invalid request pointer");\r
153         return OC_EH_ERROR;\r
154     }\r
155 \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
162 \r
163     if (flag & OC_REQUEST_FLAG)\r
164     {\r
165         OIC_LOG (INFO, LISTENER_TAG, "Flag includes OC_REQUEST_FLAG");\r
166 \r
167         if (OC_REST_GET == entityHandlerRequest->method)\r
168         {\r
169             OIC_LOG (INFO, LISTENER_TAG, "Received OC_REST_GET from client");\r
170             ehResult = OC_EH_OK;\r
171         }\r
172         else if (OC_REST_PUT == entityHandlerRequest->method)\r
173         {\r
174             OIC_LOG (INFO, LISTENER_TAG, "Received OC_REST_PUT from client");\r
175             ehResult = OC_EH_OK;\r
176         }\r
177         else if (OC_REST_POST == entityHandlerRequest->method)\r
178         {\r
179             OIC_LOG (INFO, LISTENER_TAG, "Received OC_REST_POST from client");\r
180             ehResult = OC_EH_OK;\r
181         }\r
182         else if (OC_REST_DELETE == entityHandlerRequest->method)\r
183         {\r
184             OIC_LOG (INFO, LISTENER_TAG, "Received OC_REST_DELETE from client");\r
185             ehResult = OC_EH_OK;\r
186         }\r
187         else\r
188         {\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
192         }\r
193 \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
196         {\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
205 \r
206             // Handle vendor specific options\r
207             if (entityHandlerRequest->rcvdVendorSpecificHeaderOptions\r
208                     && entityHandlerRequest->numRcvdVendorSpecificHeaderOptions)\r
209             {\r
210                 OIC_LOG (INFO, LISTENER_TAG, "Received vendor specific options");\r
211                 uint8_t i = 0;\r
212                 OCHeaderOption * rcvdOptions = entityHandlerRequest->rcvdVendorSpecificHeaderOptions;\r
213                 for (i = 0; i < entityHandlerRequest->numRcvdVendorSpecificHeaderOptions; i++)\r
214                 {\r
215                     if (((OCHeaderOption) rcvdOptions[i]).protocolID == OC_COAP_ID)\r
216                     {\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
219 \r
220                         OIC_LOG_BUFFER(INFO, LISTENER_TAG, ((OCHeaderOption)rcvdOptions[i]).optionData,\r
221                                 MAX_HEADER_OPTION_DATA_LENGTH);\r
222                     }\r
223                 }\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
238             }\r
239         }\r
240     }\r
241 \r
242     if (flag & OC_OBSERVE_FLAG)\r
243     {\r
244         OIC_LOG(INFO, LISTENER_TAG, "Flag includes OC_OBSERVE_FLAG");\r
245 \r
246         if (OC_OBSERVE_REGISTER == entityHandlerRequest->obsInfo.action)\r
247         {\r
248             OIC_LOG (INFO, LISTENER_TAG, "Received OC_OBSERVE_REGISTER from client");\r
249 \r
250             printf("NS_ register message observerID : %d\n", entityHandlerRequest->obsInfo.obsId);\r
251             NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_RECV_SUBSCRIPTION, entityHandlerRequest);\r
252 \r
253         }\r
254     }\r
255 \r
256     OCPayloadDestroy(response.payload);\r
257     return ehResult;\r
258 }\r
259 \r
260 OCEntityHandlerResult NSEntityHandlerSyncCb(OCEntityHandlerFlag flag,\r
261         OCEntityHandlerRequest *entityHandlerRequest, void* callback)\r
262 {\r
263     OIC_LOG_V (INFO, LISTENER_TAG, "Inside entity handler - flags: 0x%x", flag);\r
264 \r
265     OCEntityHandlerResult ehResult = OC_EH_OK;\r
266     OCEntityHandlerResponse response =\r
267     { 0, 0, OC_EH_ERROR, 0, 0,\r
268     { },\r
269     { 0 }, false };\r
270 \r
271     (void)callback;\r
272 \r
273     // Validate pointer\r
274     if (!entityHandlerRequest)\r
275     {\r
276         OIC_LOG (ERROR, LISTENER_TAG, "Invalid request pointer");\r
277         return OC_EH_ERROR;\r
278     }\r
279 \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
286 \r
287     if (flag & OC_REQUEST_FLAG)\r
288     {\r
289         OIC_LOG (INFO, LISTENER_TAG, "Flag includes OC_REQUEST_FLAG");\r
290 \r
291         if (OC_REST_GET == entityHandlerRequest->method)\r
292         {\r
293             OIC_LOG (INFO, LISTENER_TAG, "Received OC_REST_GET from client");\r
294             ehResult = OC_EH_OK;\r
295         }\r
296         else if (OC_REST_PUT == entityHandlerRequest->method)\r
297         {\r
298             OIC_LOG (INFO, LISTENER_TAG, "Received OC_REST_PUT from client");\r
299             ehResult = OC_EH_OK;\r
300         }\r
301         else if (OC_REST_POST == entityHandlerRequest->method)\r
302         {\r
303             OIC_LOG (INFO, LISTENER_TAG, "Received OC_REST_POST from client");\r
304 \r
305             NSPushQueue(NOTIFICATION_SCHEDULER, TASK_SEND_READ, NSBuildOICNotificationSync(entityHandlerRequest->payload));\r
306             ehResult = OC_EH_OK;\r
307         }\r
308         else if (OC_REST_DELETE == entityHandlerRequest->method)\r
309         {\r
310             OIC_LOG (INFO, LISTENER_TAG, "Received OC_REST_DELETE from client");\r
311             ehResult = OC_EH_OK;\r
312         }\r
313         else\r
314         {\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
318         }\r
319 \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
322         {\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
331 \r
332             // Handle vendor specific options\r
333             if (entityHandlerRequest->rcvdVendorSpecificHeaderOptions\r
334                     && entityHandlerRequest->numRcvdVendorSpecificHeaderOptions)\r
335             {\r
336                 OIC_LOG (INFO, LISTENER_TAG, "Received vendor specific options");\r
337                 uint8_t i = 0;\r
338                 OCHeaderOption * rcvdOptions = entityHandlerRequest->rcvdVendorSpecificHeaderOptions;\r
339                 for (i = 0; i < entityHandlerRequest->numRcvdVendorSpecificHeaderOptions; i++)\r
340                 {\r
341                     if (((OCHeaderOption) rcvdOptions[i]).protocolID == OC_COAP_ID)\r
342                     {\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
345 \r
346                         OIC_LOG_BUFFER(INFO, LISTENER_TAG, ((OCHeaderOption)rcvdOptions[i]).optionData,\r
347                                 MAX_HEADER_OPTION_DATA_LENGTH);\r
348                     }\r
349                 }\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
364             }\r
365         }\r
366     }\r
367 \r
368     if (flag & OC_OBSERVE_FLAG)\r
369     {\r
370         OIC_LOG(INFO, LISTENER_TAG, "Flag includes OC_OBSERVE_FLAG");\r
371 \r
372         if (OC_OBSERVE_REGISTER == entityHandlerRequest->obsInfo.action)\r
373         {\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
377         }\r
378     }\r
379 \r
380     OCPayloadDestroy(response.payload);\r
381     return ehResult;\r
382 }\r
383 \r
384 void NSProviderConnectionStateListener(CATransportAdapter_t adapter, const char *remote_address,\r
385         bool connected)\r
386 {\r
387 \r
388     // should be implementation\r
389     (void)adapter;\r
390     (void)remote_address;\r
391 \r
392     OIC_LOG (INFO, LISTENER_TAG, "Connection State Changed");\r
393 \r
394     if (connected)\r
395     {\r
396         OIC_LOG (INFO, LISTENER_TAG, "CONNECTED");\r
397 \r
398         // Set Connection State\r
399         NSSetProviderConnectionState(CONNECTED);\r
400 \r
401         // Start Presence\r
402         NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);\r
403     }\r
404 }\r
405 \r
406 void NSProviderAdapterStateListener(CATransportAdapter_t adapter, bool enabled)\r
407 {\r
408     // should be implementation\r
409     (void)adapter;\r
410 \r
411     OIC_LOG (INFO, LISTENER_TAG, "Adapter State Changed");\r
412 \r
413     if (enabled)\r
414     {\r
415         OIC_LOG (INFO, LISTENER_TAG, "CONNECTED");\r
416 \r
417         // Set Connection State\r
418         NSSetProviderConnectionState(CONNECTED);\r
419 \r
420         // Start Presence\r
421         NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);\r
422     }\r
423 }\r
424 \r
425 NSSync * NSBuildOICNotificationSync(OCPayload * payload)\r
426 {\r
427     if(!payload)\r
428     {\r
429         return NULL;\r
430     }\r
431     NSSync * retSync = (NSSync *)OICMalloc(sizeof(NSSync));\r
432     if (!retSync)\r
433     {\r
434         return NULL;\r
435     }\r
436 \r
437     retSync->mMessageId = NULL;\r
438     retSync->mState = Notification_Read;\r
439 \r
440     OCRepPayload * repPayload = (OCRepPayload *)payload;\r
441     if (!OCRepPayloadGetPropString(repPayload, NS_ATTRIBUTE_ID, &retSync->mMessageId))\r
442     {\r
443         OIC_LOG(DEBUG, LISTENER_TAG, "id of received sync is null");\r
444         OICFree(retSync);\r
445         return NULL;\r
446     }\r
447     int64_t state;\r
448     if (!OCRepPayloadGetPropInt(repPayload, NS_ATTRIBUTE_STATE, & state))\r
449     {\r
450 \r
451         OIC_LOG(DEBUG, LISTENER_TAG, "id of received sync is null");\r
452 \r
453         OICFree(retSync->mMessageId);\r
454         OICFree(retSync);\r
455         return NULL;\r
456     }\r
457 \r
458     retSync->mState = (NSSyncTypes) state;\r
459 \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
462 \r
463     return retSync;\r
464 }\r
465 \r
466 NSResult NSMakeTask(NSTaskType type, OCEntityHandlerRequest *request, NSTask * task)\r
467 {\r
468     task = (NSTask*) OICMalloc(sizeof(NSTask));\r
469     if (!task)\r
470     {\r
471         OIC_LOG(ERROR, LISTENER_TAG, PCF("Fail to allocate memory"));\r
472         return NS_ERROR;\r
473     }\r
474 \r
475     task->taskType = type;\r
476     task->taskData = request;\r
477     task->nextTask = NULL;\r
478 \r
479     return NS_OK;\r
480 }\r
481 \r