Imported Upstream version 1.2.0
[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 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
28 \r
29 OCEntityHandlerResult NSEntityHandlerNotificationCb(OCEntityHandlerFlag flag,\r
30         OCEntityHandlerRequest *entityHandlerRequest, void* callback)\r
31 {\r
32     NS_LOG(DEBUG, "NSEntityHandlerNotificationCb - IN");\r
33 \r
34     OCEntityHandlerResult ehResult = OC_EH_ERROR;\r
35 \r
36     (void)callback;\r
37 \r
38     if (!entityHandlerRequest)\r
39     {\r
40         NS_LOG(ERROR, "Invalid request pointer");\r
41         return ehResult;\r
42     }\r
43 \r
44     if (flag & OC_REQUEST_FLAG)\r
45     {\r
46         NS_LOG(DEBUG, "Flag includes OC_REQUEST_FLAG");\r
47 \r
48         if (OC_REST_GET == entityHandlerRequest->method)\r
49         {\r
50             NS_LOG(DEBUG, "NSEntityHandlerNotificationCb - OC_REST_GET");\r
51 \r
52             char * copyQuery = OICStrdup(entityHandlerRequest->query);\r
53             char * reqInterface = NSGetValueFromQuery(copyQuery, NS_QUERY_INTERFACE);\r
54 \r
55             if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) != 0\r
56                     && strcmp(reqInterface, NS_INTERFACE_READ) != 0)\r
57             {\r
58                 NS_LOG(ERROR, "Invalid interface");\r
59                 OICFree(copyQuery);\r
60                 return ehResult;\r
61             }\r
62 \r
63             OICFree(copyQuery);\r
64             NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_POLICY,\r
65                     NSCopyOCEntityHandlerRequest(entityHandlerRequest));\r
66 \r
67             ehResult = OC_EH_OK;\r
68         }\r
69         else\r
70         {\r
71             NS_LOG_V (DEBUG, "Received method %d from client", entityHandlerRequest->method);\r
72         }\r
73     }\r
74 \r
75     NS_LOG(DEBUG, "NSEntityHandlerNotificationCb - OUT");\r
76     return ehResult;\r
77 }\r
78 \r
79 OCEntityHandlerResult NSEntityHandlerMessageCb(OCEntityHandlerFlag flag,\r
80         OCEntityHandlerRequest *entityHandlerRequest, void* callback)\r
81 {\r
82     NS_LOG(DEBUG, "NSEntityHandlerMessageCb - IN");\r
83 \r
84     OCEntityHandlerResult ehResult = OC_EH_ERROR;\r
85     char * reqInterface = NULL;\r
86     OCRepPayload * payload = NULL;\r
87 \r
88     (void)callback;\r
89 \r
90     if (!entityHandlerRequest)\r
91     {\r
92         NS_LOG (ERROR,"Invalid request pointer");\r
93         return ehResult;\r
94     }\r
95 \r
96     if (flag & OC_REQUEST_FLAG)\r
97     {\r
98         NS_LOG(DEBUG, "Flag includes OC_REQUEST_FLAG");\r
99         NS_LOG_V(DEBUG, "Received method %d from client", entityHandlerRequest->method);\r
100 \r
101         if (OC_REST_GET == entityHandlerRequest->method)\r
102         {\r
103             NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OC_REST_GET");\r
104 \r
105             char * copyQuery = OICStrdup(entityHandlerRequest->query);\r
106             reqInterface = OICStrdup(NSGetValueFromQuery(copyQuery, NS_QUERY_INTERFACE));\r
107             OICFree(copyQuery);\r
108 \r
109             if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) != 0\r
110                     && strcmp(reqInterface, NS_INTERFACE_READ) != 0)\r
111             {\r
112                 NS_LOG(ERROR, "Invalid interface");\r
113                 return ehResult;\r
114             }\r
115             ehResult = OC_EH_OK;\r
116         }\r
117         else\r
118         {\r
119             NS_LOG_V (DEBUG, "Received method %d from client", entityHandlerRequest->method);\r
120         }\r
121     }\r
122 \r
123     if (flag & OC_OBSERVE_FLAG)\r
124     {\r
125         NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OC_OBSERVE_FLAG");\r
126 \r
127         OCObserveAction ocObAction = entityHandlerRequest->obsInfo.action;\r
128 \r
129         if (ocObAction == OC_OBSERVE_REGISTER)\r
130         {\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
134 \r
135             NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_RECV_SUBSCRIPTION,\r
136                     NSCopyOCEntityHandlerRequest(entityHandlerRequest));\r
137             ehResult = OC_EH_OK;\r
138 \r
139             if (NSGetPolicy() == NS_POLICY_CONSUMER)\r
140             {\r
141                 return ehResult;\r
142             }\r
143         }\r
144         else if(ocObAction == OC_OBSERVE_DEREGISTER)\r
145         {\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
152         }\r
153     }\r
154 \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
159     return ehResult;\r
160 }\r
161 \r
162 OCEntityHandlerResult NSEntityHandlerSyncCb(OCEntityHandlerFlag flag,\r
163         OCEntityHandlerRequest *entityHandlerRequest, void* callback)\r
164 {\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
169 \r
170     (void)callback;\r
171 \r
172     if (!entityHandlerRequest)\r
173     {\r
174         NS_LOG(ERROR, "Invalid request pointer");\r
175         return ehResult;\r
176     }\r
177 \r
178     if (flag & OC_REQUEST_FLAG)\r
179     {\r
180         NS_LOG(DEBUG, "Flag includes OC_REQUEST_FLAG");\r
181 \r
182         if (OC_REST_GET == entityHandlerRequest->method)\r
183         {\r
184 \r
185             char * copyQuery = OICStrdup(entityHandlerRequest->query);\r
186             reqInterface = OICStrdup(NSGetValueFromQuery(copyQuery, NS_QUERY_INTERFACE));\r
187             OICFree(copyQuery);\r
188 \r
189             if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) != 0\r
190                     && strcmp(reqInterface, NS_INTERFACE_READWRITE) != 0)\r
191             {\r
192                 NS_LOG(ERROR, "Invalid interface");\r
193                 return ehResult;\r
194             }\r
195 \r
196             ehResult = OC_EH_OK;\r
197         }\r
198         else if (OC_REST_POST == entityHandlerRequest->method)\r
199         {\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
203 \r
204             NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OC_REST_POST");\r
205 \r
206             if(NSProviderIsSyncAttributes((OCRepPayload *)entityHandlerRequest->payload))\r
207             {\r
208                 NSPushQueue(NOTIFICATION_SCHEDULER, TASK_RECV_READ,\r
209                                     NSGetSyncInfo(entityHandlerRequest->payload));\r
210                 ehResult = OC_EH_OK;\r
211             }\r
212         }\r
213         else\r
214         {\r
215             NS_LOG_V(DEBUG, "Received method %d from client", entityHandlerRequest->method);\r
216         }\r
217     }\r
218 \r
219     if (flag & OC_OBSERVE_FLAG)\r
220     {\r
221         /** Requested by consumers to synchronize notification message status.\r
222             Store the observer IDs to storage or cache */\r
223 \r
224         NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OC_OBSERVE_FLAG");\r
225 \r
226         OCObserveAction ocObAction = entityHandlerRequest->obsInfo.action;\r
227 \r
228         if (ocObAction == OC_OBSERVE_REGISTER)\r
229         {\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
235         }\r
236         else if(ocObAction == OC_OBSERVE_DEREGISTER)\r
237         {\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
243         }\r
244     }\r
245 \r
246     NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OUT");\r
247 \r
248     ehResult = NSProviderSendResponse(entityHandlerRequest, payload, reqInterface, ehResult,\r
249             NS_INTERFACE_TYPE_READ, NS_RESOURCE_MESSAGE);\r
250     OICFree(reqInterface);\r
251 \r
252     return ehResult;\r
253 }\r
254 \r
255 OCEntityHandlerResult NSEntityHandlerTopicCb(OCEntityHandlerFlag flag,\r
256         OCEntityHandlerRequest *entityHandlerRequest, void* callback)\r
257 {\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
262 \r
263     (void)callback;\r
264 \r
265     if (!entityHandlerRequest)\r
266     {\r
267         NS_LOG(ERROR, "Invalid request pointer");\r
268         return ehResult;\r
269     }\r
270 \r
271     if (flag & OC_REQUEST_FLAG)\r
272     {\r
273         NS_LOG(DEBUG, "Flag includes OC_REQUEST_FLAG");\r
274 \r
275         if (OC_REST_GET == entityHandlerRequest->method)\r
276         {\r
277             NS_LOG(DEBUG, "NSEntityHandlerTopicCb - OC_REST_GET");\r
278 \r
279             char * copyReq = OICStrdup(entityHandlerRequest->query);\r
280             reqInterface = OICStrdup(NSGetValueFromQuery(copyReq, NS_QUERY_INTERFACE));\r
281             OICFree(copyReq);\r
282 \r
283             if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) != 0\r
284                     && strcmp(reqInterface, NS_INTERFACE_READWRITE) != 0)\r
285             {\r
286                 NS_LOG(ERROR, "Invalid interface");\r
287                 return ehResult;\r
288             }\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
293 \r
294             ehResult = OC_EH_OK;\r
295         }\r
296         else if (OC_REST_POST == entityHandlerRequest->method)\r
297         {\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
305                     NSProviderIsTopicAttributes(OCRepPayloadClone((OCRepPayload *)\r
306                             entityHandlerRequest->payload)))\r
307             {\r
308                 NSPushQueue(TOPIC_SCHEDULER, TASK_POST_TOPIC,\r
309                         NSCopyOCEntityHandlerRequest(entityHandlerRequest));\r
310                 ehResult = OC_EH_OK;\r
311             }\r
312         }\r
313         else\r
314         {\r
315             NS_LOG_V(DEBUG, "Received unsupported method %d from client",\r
316                     entityHandlerRequest->method);\r
317             ehResult = OC_EH_ERROR;\r
318         }\r
319     }\r
320 \r
321     NS_LOG(DEBUG, "NSEntityHandlerTopicCb - OUT");\r
322     ehResult = NSProviderSendResponse(entityHandlerRequest, payload, reqInterface, ehResult,\r
323             NS_INTERFACE_TYPE_READWRITE, NS_RESOURCE_TOPIC);\r
324     OICFree(reqInterface);\r
325     return ehResult;\r
326 }\r
327 \r
328 void NSProviderConnectionStateListener(const CAEndpoint_t * info, bool connected)\r
329 {\r
330     NS_LOG(DEBUG, "NSProviderConnectionStateListener - IN");\r
331 \r
332     if (connected)\r
333     {\r
334         NS_LOG(DEBUG, "CONNECTED");\r
335 \r
336         // Set Connection State\r
337         NSSetProviderConnectionState(CONNECTED);\r
338 \r
339         // Start Presence\r
340         NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);\r
341 \r
342         if(info->adapter == CA_ADAPTER_TCP)\r
343         {\r
344             NS_LOG_V(DEBUG, "TCP Connected remote address: %s:%d", info->addr, info->port);\r
345         }\r
346     }\r
347     else\r
348     {\r
349         NS_LOG(DEBUG, "DISCONNECTED");\r
350 \r
351         // Set Connection State\r
352         NSSetProviderConnectionState(DISCONNECTED);\r
353 \r
354         if(info->adapter == CA_ADAPTER_TCP)\r
355         {\r
356             NS_LOG_V(DEBUG, "TCP Disconnected remote address: %s:%d", info->addr, info->port);\r
357         }\r
358     }\r
359 \r
360     NS_LOG(DEBUG, "NSProviderConnectionStateListener - OUT");\r
361 }\r
362 \r
363 void NSProviderAdapterStateListener(CATransportAdapter_t adapter, bool enabled)\r
364 {\r
365     (void)adapter;\r
366 \r
367     NS_LOG(DEBUG, "NSProviderAdapterStateListener - IN");\r
368 \r
369     if (enabled)\r
370     {\r
371         NS_LOG(DEBUG, "CONNECTED");\r
372 \r
373         // Set Connection State\r
374         NSSetProviderConnectionState(CONNECTED);\r
375 \r
376         // Start Presence\r
377         NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);\r
378     }\r
379     else\r
380     {\r
381 \r
382         NS_LOG(DEBUG, "DISCONNECTED");\r
383 \r
384         // Set Connection State\r
385         NSSetProviderConnectionState(DISCONNECTED);\r
386     }\r
387 \r
388     NS_LOG(DEBUG, "NSProviderAdapterStateListener - OUT");\r
389 }\r
390 \r
391 bool NSProviderCompareSyncAttributes(const char * name)\r
392 {\r
393     if (!strcmp(name, NS_ATTRIBUTE_MESSAGE_ID) ||\r
394         !strcmp(name, NS_ATTRIBUTE_PROVIDER_ID) ||\r
395         !strcmp(name, NS_ATTRIBUTE_STATE))\r
396     {\r
397         return true;\r
398     }\r
399 \r
400     return false;\r
401 }\r
402 \r
403 bool NSProviderIsSyncAttributes(OCRepPayload * payload)\r
404 {\r
405     NS_LOG(DEBUG, "get extra info");\r
406 \r
407     OCRepPayloadValue * curr = payload->values;\r
408     while(curr)\r
409     {\r
410         if (!NSProviderCompareSyncAttributes(curr->name))\r
411         {\r
412             return false;\r
413         }\r
414         curr = curr->next;\r
415     }\r
416 \r
417     return true;\r
418 }\r
419 \r
420 bool NSProviderCompareTopicAttributes(const char * name)\r
421 {\r
422     if (!strcmp(name, NS_ATTRIBUTE_TOPIC_LIST) ||\r
423         !strcmp(name, NS_ATTRIBUTE_CONSUMER_ID))\r
424     {\r
425         return true;\r
426     }\r
427 \r
428     return false;\r
429 }\r
430 \r
431 bool NSProviderCompareSubTopicAttributes(const char * name)\r
432 {\r
433     if (!strcmp(name, NS_ATTRIBUTE_TOPIC_NAME) ||\r
434         !strcmp(name, NS_ATTRIBUTE_TOPIC_SELECTION))\r
435     {\r
436         return true;\r
437     }\r
438 \r
439     return false;\r
440 }\r
441 \r
442 bool NSProviderIsTopicAttributes(OCRepPayload * payload)\r
443 {\r
444     NS_LOG(DEBUG, "get extra info");\r
445 \r
446     OCRepPayloadValue * curr = payload->values;\r
447     while(curr)\r
448     {\r
449         if (!NSProviderCompareTopicAttributes(curr->name))\r
450         {\r
451             return false;\r
452         }\r
453 \r
454         if (!strcmp(curr->name, NS_ATTRIBUTE_TOPIC_LIST))\r
455         {\r
456             OCRepPayload ** topicListPayload = NULL;\r
457             OCRepPayloadValue * payloadValue = NULL;\r
458             payloadValue = NSPayloadFindValue(payload, NS_ATTRIBUTE_TOPIC_LIST);\r
459             size_t dimensionSize = calcDimTotal(payloadValue->arr.dimensions);\r
460             size_t dimensions[3] = { dimensionSize, 0, 0 };\r
461 \r
462             if (!dimensionSize)\r
463             {\r
464                 return false;\r
465             }\r
466 \r
467             OCRepPayloadGetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST, &topicListPayload,\r
468                     dimensions);\r
469 \r
470             for (int i = 0; i < (int) dimensionSize; i++)\r
471             {\r
472                 OCRepPayloadValue * subCurr = topicListPayload[i]->values;\r
473                 while(subCurr)\r
474                 {\r
475                     if (!NSProviderCompareSubTopicAttributes(subCurr->name))\r
476                     {\r
477                         for(int j = i; j < (int) dimensionSize; ++j)\r
478                         {\r
479                             OCRepPayloadDestroy(topicListPayload[i]);\r
480                         }\r
481 \r
482                         OCRepPayloadDestroy(payload);\r
483                         return false;\r
484                     }\r
485                     subCurr = subCurr->next;\r
486                 }\r
487                 OCRepPayloadDestroy(topicListPayload[i]);\r
488             }\r
489         }\r
490         curr = curr->next;\r
491     }\r
492 \r
493     OCRepPayloadDestroy(payload);\r
494     return true;\r
495 }\r
496 \r
497 OCStackResult NSProviderSendResponse(OCEntityHandlerRequest * entityHandlerRequest,\r
498         OCRepPayload * payload, char * reqInterface, OCEntityHandlerResult ehResult,\r
499         NSInterfaceType interfaceType, NSResourceType resourceType)\r
500 {\r
501     if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) == 0)\r
502     {\r
503         payload = OCRepPayloadCreate();\r
504 \r
505         if (!payload)\r
506         {\r
507             NS_LOG(ERROR, "payload is NULL");\r
508             return ehResult;\r
509         }\r
510 \r
511         OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_BASELINE);\r
512         interfaceType == NS_INTERFACE_TYPE_READ ?\r
513                 OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_READ)\r
514                 : OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_READWRITE);\r
515 \r
516         char * rtStr = NULL;\r
517         switch (resourceType)\r
518         {\r
519             case NS_RESOURCE_MESSAGE:\r
520                 rtStr = NS_COLLECTION_MESSAGE_TYPE;\r
521                 break;\r
522             case NS_RESOURCE_SYNC:\r
523                 rtStr = NS_COLLECTION_SYNC_TYPE;\r
524                 break;\r
525             case NS_RESOURCE_TOPIC:\r
526                 rtStr = NS_COLLECTION_TOPIC_TYPE;\r
527                 break;\r
528             default:\r
529                 NS_LOG(ERROR, "sendResponseError");\r
530                 return ehResult;\r
531         }\r
532 \r
533         OCResourcePayloadAddStringLL(&payload->types, rtStr);\r
534     }\r
535 \r
536     if (resourceType == NS_RESOURCE_TOPIC && entityHandlerRequest->method == OC_REST_GET)\r
537     {\r
538         OCRepPayloadDestroy(payload);\r
539         return ehResult;\r
540     }\r
541 \r
542     OCEntityHandlerResponse response;\r
543     response.numSendVendorSpecificHeaderOptions = 0;\r
544     memset(response.sendVendorSpecificHeaderOptions, 0,\r
545             sizeof response.sendVendorSpecificHeaderOptions);\r
546     memset(response.resourceUri, 0, sizeof response.resourceUri);\r
547 \r
548     response.requestHandle = entityHandlerRequest->requestHandle;\r
549     response.resourceHandle = entityHandlerRequest->resource;\r
550     response.persistentBufferFlag = 0;\r
551     response.ehResult = ehResult;\r
552     response.payload = (OCPayload *) payload;\r
553 \r
554     if (OCDoResponse(&response) != OC_STACK_OK)\r
555     {\r
556         NS_LOG(ERROR, "Fail to AccessPolicy send response");\r
557         ehResult = OC_STACK_ERROR;\r
558     }\r
559 \r
560     OCRepPayloadDestroy(payload);\r
561     return ehResult;\r
562 }\r