Bug fix about memory leak.
[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             {\r
306                 NSPushQueue(TOPIC_SCHEDULER, TASK_POST_TOPIC,\r
307                         NSCopyOCEntityHandlerRequest(entityHandlerRequest));\r
308                 ehResult = OC_EH_OK;\r
309             }\r
310         }\r
311         else\r
312         {\r
313             NS_LOG_V(DEBUG, "Received unsupported method %d from client",\r
314                     entityHandlerRequest->method);\r
315             ehResult = OC_EH_ERROR;\r
316         }\r
317     }\r
318 \r
319     NS_LOG(DEBUG, "NSEntityHandlerTopicCb - OUT");\r
320     ehResult = NSProviderSendResponse(entityHandlerRequest, payload, reqInterface, ehResult,\r
321             NS_INTERFACE_TYPE_READWRITE, NS_RESOURCE_TOPIC);\r
322     OICFree(reqInterface);\r
323     return ehResult;\r
324 }\r
325 \r
326 void NSProviderConnectionStateListener(const CAEndpoint_t * info, bool connected)\r
327 {\r
328     NS_LOG(DEBUG, "NSProviderConnectionStateListener - IN");\r
329 \r
330     if (connected)\r
331     {\r
332         NS_LOG(DEBUG, "CONNECTED");\r
333 \r
334         // Set Connection State\r
335         NSSetProviderConnectionState(CONNECTED);\r
336 \r
337         // Start Presence\r
338         NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);\r
339 \r
340         if(info->adapter == CA_ADAPTER_TCP)\r
341         {\r
342             NS_LOG_V(DEBUG, "TCP Connected remote address: %s:%d", info->addr, info->port);\r
343         }\r
344     }\r
345     else\r
346     {\r
347         NS_LOG(DEBUG, "DISCONNECTED");\r
348 \r
349         // Set Connection State\r
350         NSSetProviderConnectionState(DISCONNECTED);\r
351 \r
352         if(info->adapter == CA_ADAPTER_TCP)\r
353         {\r
354             NS_LOG_V(DEBUG, "TCP Disconnected remote address: %s:%d", info->addr, info->port);\r
355         }\r
356     }\r
357 \r
358     NS_LOG(DEBUG, "NSProviderConnectionStateListener - OUT");\r
359 }\r
360 \r
361 void NSProviderAdapterStateListener(CATransportAdapter_t adapter, bool enabled)\r
362 {\r
363     (void)adapter;\r
364 \r
365     NS_LOG(DEBUG, "NSProviderAdapterStateListener - IN");\r
366 \r
367     if (enabled)\r
368     {\r
369         NS_LOG(DEBUG, "CONNECTED");\r
370 \r
371         // Set Connection State\r
372         NSSetProviderConnectionState(CONNECTED);\r
373 \r
374         // Start Presence\r
375         NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);\r
376     }\r
377     else\r
378     {\r
379 \r
380         NS_LOG(DEBUG, "DISCONNECTED");\r
381 \r
382         // Set Connection State\r
383         NSSetProviderConnectionState(DISCONNECTED);\r
384     }\r
385 \r
386     NS_LOG(DEBUG, "NSProviderAdapterStateListener - OUT");\r
387 }\r
388 \r
389 bool NSProviderCompareSyncAttributes(const char * name)\r
390 {\r
391     if (!strcmp(name, NS_ATTRIBUTE_MESSAGE_ID) ||\r
392         !strcmp(name, NS_ATTRIBUTE_PROVIDER_ID) ||\r
393         !strcmp(name, NS_ATTRIBUTE_STATE))\r
394     {\r
395         return true;\r
396     }\r
397 \r
398     return false;\r
399 }\r
400 \r
401 bool NSProviderIsSyncAttributes(OCRepPayload * payload)\r
402 {\r
403     NS_LOG(DEBUG, "get extra info");\r
404 \r
405     OCRepPayloadValue * curr = payload->values;\r
406     while(curr)\r
407     {\r
408         if (!NSProviderCompareSyncAttributes(curr->name))\r
409         {\r
410             return false;\r
411         }\r
412         curr = curr->next;\r
413     }\r
414 \r
415     return true;\r
416 }\r
417 \r
418 bool NSProviderCompareTopicAttributes(const char * name)\r
419 {\r
420     if (!strcmp(name, NS_ATTRIBUTE_TOPIC_LIST) ||\r
421         !strcmp(name, NS_ATTRIBUTE_CONSUMER_ID))\r
422     {\r
423         return true;\r
424     }\r
425 \r
426     return false;\r
427 }\r
428 \r
429 bool NSProviderCompareSubTopicAttributes(const char * name)\r
430 {\r
431     if (!strcmp(name, NS_ATTRIBUTE_TOPIC_NAME) ||\r
432         !strcmp(name, NS_ATTRIBUTE_TOPIC_SELECTION))\r
433     {\r
434         return true;\r
435     }\r
436 \r
437     return false;\r
438 }\r
439 \r
440 bool NSProviderIsTopicAttributes(OCRepPayload * payload)\r
441 {\r
442     NS_LOG(DEBUG, "get extra info");\r
443 \r
444     OCRepPayloadValue * curr = payload->values;\r
445     while(curr)\r
446     {\r
447         if (!NSProviderCompareSyncAttributes(curr->name))\r
448         {\r
449             return false;\r
450         }\r
451 \r
452         if (!strcmp(curr->name, NS_ATTRIBUTE_TOPIC_LIST))\r
453         {\r
454             OCRepPayload ** topicListPayload = NULL;\r
455             OCRepPayloadValue * payloadValue = NULL;\r
456             payloadValue = NSPayloadFindValue(payload, NS_ATTRIBUTE_TOPIC_LIST);\r
457             size_t dimensionSize = calcDimTotal(payloadValue->arr.dimensions);\r
458             size_t dimensions[3] = { dimensionSize, 0, 0 };\r
459 \r
460             if (!dimensionSize)\r
461             {\r
462                 return false;\r
463             }\r
464 \r
465             OCRepPayloadGetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST, &topicListPayload,\r
466                     dimensions);\r
467 \r
468             for (int i = 0; i < (int) dimensionSize; i++)\r
469             {\r
470                 OCRepPayloadValue * subCurr = topicListPayload[i]->values;\r
471                 while(subCurr)\r
472                 {\r
473                     if (!NSProviderCompareSubTopicAttributes(subCurr->name))\r
474                     {\r
475                         for(int j = i; j < (int) dimensionSize; ++j)\r
476                         {\r
477                             OCRepPayloadDestroy(topicListPayload[i]);\r
478                         }\r
479 \r
480                         OCRepPayloadDestroy(payload);\r
481                         return false;\r
482                     }\r
483                     subCurr = subCurr->next;\r
484                 }\r
485                 OCRepPayloadDestroy(topicListPayload[i]);\r
486             }\r
487         }\r
488         curr = curr->next;\r
489     }\r
490 \r
491     OCRepPayloadDestroy(payload);\r
492     return true;\r
493 }\r
494 \r
495 OCStackResult NSProviderSendResponse(OCEntityHandlerRequest * entityHandlerRequest,\r
496         OCRepPayload * payload, char * reqInterface, OCEntityHandlerResult ehResult,\r
497         NSInterfaceType interfaceType, NSResourceType resourceType)\r
498 {\r
499     if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) == 0)\r
500     {\r
501         payload = OCRepPayloadCreate();\r
502 \r
503         if (!payload)\r
504         {\r
505             NS_LOG(ERROR, "payload is NULL");\r
506             return ehResult;\r
507         }\r
508 \r
509         OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_BASELINE);\r
510         interfaceType == NS_INTERFACE_TYPE_READ ?\r
511                 OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_READ)\r
512                 : OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_READWRITE);\r
513 \r
514         char * rtStr = NULL;\r
515         switch (resourceType)\r
516         {\r
517             case NS_RESOURCE_MESSAGE:\r
518                 rtStr = NS_COLLECTION_MESSAGE_TYPE;\r
519                 break;\r
520             case NS_RESOURCE_SYNC:\r
521                 rtStr = NS_COLLECTION_SYNC_TYPE;\r
522                 break;\r
523             case NS_RESOURCE_TOPIC:\r
524                 rtStr = NS_COLLECTION_TOPIC_TYPE;\r
525                 break;\r
526             default:\r
527                 NS_LOG(ERROR, "sendResponseError");\r
528                 return ehResult;\r
529         }\r
530 \r
531         OCResourcePayloadAddStringLL(&payload->types, rtStr);\r
532     }\r
533 \r
534     if(resourceType != NS_RESOURCE_TOPIC)\r
535     {\r
536         OCEntityHandlerResponse response;\r
537         response.numSendVendorSpecificHeaderOptions = 0;\r
538         memset(response.sendVendorSpecificHeaderOptions, 0,\r
539                 sizeof response.sendVendorSpecificHeaderOptions);\r
540         memset(response.resourceUri, 0, sizeof response.resourceUri);\r
541 \r
542         response.requestHandle = entityHandlerRequest->requestHandle;\r
543         response.resourceHandle = entityHandlerRequest->resource;\r
544         response.persistentBufferFlag = 0;\r
545         response.ehResult = ehResult;\r
546         response.payload = (OCPayload *) payload;\r
547 \r
548         if (OCDoResponse(&response) != OC_STACK_OK)\r
549         {\r
550             NS_LOG(ERROR, "Fail to AccessPolicy send response");\r
551             OCRepPayloadDestroy(payload);\r
552             return ehResult;\r
553         }\r
554     }\r
555 \r
556     OCRepPayloadDestroy(payload);\r
557     return ehResult;\r
558 }\r