Add response logic for TopicListener.
[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     NS_LOG(DEBUG, "NSEntityHandlerNotificationCb - IN");\r
27 \r
28     OCEntityHandlerResult ehResult = OC_EH_OK;\r
29 \r
30     (void)callback;\r
31 \r
32     if (!entityHandlerRequest)\r
33     {\r
34         NS_LOG(ERROR, "Invalid request pointer");\r
35         return OC_EH_ERROR;\r
36     }\r
37 \r
38     if (flag & OC_REQUEST_FLAG)\r
39     {\r
40         NS_LOG(DEBUG, "Flag includes OC_REQUEST_FLAG");\r
41 \r
42         if (OC_REST_GET == entityHandlerRequest->method)\r
43         {\r
44             NS_LOG(DEBUG, "NSEntityHandlerNotificationCb - OC_REST_GET");\r
45 \r
46             NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_POLICY,\r
47                     NSCopyOCEntityHandlerRequest(entityHandlerRequest));\r
48 \r
49         }\r
50         else\r
51         {\r
52             NS_LOG_V (DEBUG, "Received method %d from client", entityHandlerRequest->method);\r
53         }\r
54     }\r
55 \r
56     NS_LOG(DEBUG, "NSEntityHandlerNotificationCb - OUT");\r
57     return ehResult;\r
58 }\r
59 \r
60 OCEntityHandlerResult NSEntityHandlerMessageCb(OCEntityHandlerFlag flag,\r
61         OCEntityHandlerRequest *entityHandlerRequest, void* callback)\r
62 {\r
63     NS_LOG(DEBUG, "NSEntityHandlerMessageCb - IN");\r
64 \r
65     OCEntityHandlerResult ehResult = OC_EH_OK;\r
66 \r
67     (void)callback;\r
68 \r
69     if (!entityHandlerRequest)\r
70     {\r
71         NS_LOG (ERROR,"Invalid request pointer");\r
72         return OC_EH_ERROR;\r
73     }\r
74 \r
75     OCEntityHandlerResponse response;\r
76     response.numSendVendorSpecificHeaderOptions = 0;\r
77     memset(response.sendVendorSpecificHeaderOptions, 0,\r
78             sizeof response.sendVendorSpecificHeaderOptions);\r
79     memset(response.resourceUri, 0, sizeof response.resourceUri);\r
80 \r
81     if (flag & OC_REQUEST_FLAG)\r
82     {\r
83         NS_LOG(DEBUG, "Flag includes OC_REQUEST_FLAG");\r
84         NS_LOG_V(DEBUG, "Received method %d from client", entityHandlerRequest->method);\r
85     }\r
86 \r
87     if (flag & OC_OBSERVE_FLAG)\r
88     {\r
89         NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OC_OBSERVE_FLAG");\r
90 \r
91         OCObserveAction ocObAction = entityHandlerRequest->obsInfo.action;\r
92 \r
93         if (ocObAction == OC_OBSERVE_REGISTER)\r
94         {\r
95             NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OC_OBSERVE_REGISTER");\r
96             NS_LOG_V(DEBUG, "NSEntityHandlerMessageCb\n"\r
97                     "Register message observerID : %d\n", entityHandlerRequest->obsInfo.obsId);\r
98             NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_RECV_SUBSCRIPTION,\r
99                     NSCopyOCEntityHandlerRequest(entityHandlerRequest));\r
100         }\r
101         else if(ocObAction == OC_OBSERVE_DEREGISTER)\r
102         {\r
103             NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OC_OBSERVE_DEREGISTER");\r
104             NS_LOG_V(DEBUG, "NSEntityHandlerMessageCb\n - "\r
105                     "Deregister Message observerID : %d\n", entityHandlerRequest->obsInfo.obsId);\r
106             NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_RECV_UNSUBSCRIPTION,\r
107                     NSCopyOCEntityHandlerRequest(entityHandlerRequest));\r
108         }\r
109     }\r
110 \r
111     response.requestHandle = entityHandlerRequest->requestHandle;\r
112     response.resourceHandle = entityHandlerRequest->resource;\r
113     response.persistentBufferFlag = 0;\r
114     response.ehResult = OC_EH_OK;\r
115     response.payload = (OCPayload *) NULL;\r
116 \r
117     if (OCDoResponse(&response) != OC_STACK_OK)\r
118     {\r
119         NS_LOG(ERROR, "Fail to AccessPolicy send response");\r
120         return NS_ERROR;\r
121     }\r
122 \r
123     NS_LOG(DEBUG, "NSEntityHandlerMessageCb - OUT");\r
124     return ehResult;\r
125 }\r
126 \r
127 OCEntityHandlerResult NSEntityHandlerSyncCb(OCEntityHandlerFlag flag,\r
128         OCEntityHandlerRequest *entityHandlerRequest, void* callback)\r
129 {\r
130     NS_LOG(DEBUG, "NSEntityHandlerSyncCb - IN");\r
131     OCEntityHandlerResult ehResult = OC_EH_OK;\r
132 \r
133     (void)callback;\r
134 \r
135     if (!entityHandlerRequest)\r
136     {\r
137         NS_LOG(ERROR, "Invalid request pointer");\r
138         return OC_EH_ERROR;\r
139     }\r
140 \r
141     OCEntityHandlerResponse response;\r
142     response.numSendVendorSpecificHeaderOptions = 0;\r
143     memset(response.sendVendorSpecificHeaderOptions, 0,\r
144             sizeof response.sendVendorSpecificHeaderOptions);\r
145     memset(response.resourceUri, 0, sizeof response.resourceUri);\r
146 \r
147     if (flag & OC_REQUEST_FLAG)\r
148     {\r
149         NS_LOG(DEBUG, "Flag includes OC_REQUEST_FLAG");\r
150 \r
151         if (OC_REST_POST == entityHandlerRequest->method)\r
152         {\r
153             /** Receive sync data from consumer which read or dismiss notification message.\r
154                 And broadcast the sync data to all subscribers including provider app\r
155                 to synchronize the notification message status. */\r
156 \r
157             NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OC_REST_POST");\r
158 \r
159             NSPushQueue(NOTIFICATION_SCHEDULER, TASK_RECV_READ,\r
160                     NSGetSyncInfo(entityHandlerRequest->payload));\r
161 \r
162         }\r
163 \r
164         NS_LOG_V(DEBUG, "Received method %d from client", entityHandlerRequest->method);\r
165     }\r
166 \r
167     if (flag & OC_OBSERVE_FLAG)\r
168     {\r
169         /** Requested by consumers to synchronize notification message status.\r
170             Store the observer IDs to storage or cache */\r
171 \r
172         NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OC_OBSERVE_FLAG");\r
173 \r
174         OCObserveAction ocObAction = entityHandlerRequest->obsInfo.action;\r
175 \r
176         if (ocObAction == OC_OBSERVE_REGISTER)\r
177         {\r
178             NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OC_OBSERVE_REGISTER");\r
179             NS_LOG_V(DEBUG, "NSEntityHandlerSyncCb\n - "\r
180                     "Register Sync observerID : %d\n", entityHandlerRequest->obsInfo.obsId);\r
181             NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SYNC_SUBSCRIPTION,\r
182                     NSCopyOCEntityHandlerRequest(entityHandlerRequest));\r
183         }\r
184         else if(ocObAction == OC_OBSERVE_DEREGISTER)\r
185         {\r
186             NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OC_OBSERVE_DEREGISTER");\r
187             NS_LOG_V(DEBUG, "NSEntityHandlerSyncCb\n - "\r
188                     "Deregister Sync observerID : %d\n", entityHandlerRequest->obsInfo.obsId);\r
189             NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_RECV_UNSUBSCRIPTION,\r
190                     NSCopyOCEntityHandlerRequest(entityHandlerRequest));\r
191         }\r
192     }\r
193 \r
194     response.requestHandle = entityHandlerRequest->requestHandle;\r
195     response.resourceHandle = entityHandlerRequest->resource;\r
196     response.persistentBufferFlag = 0;\r
197     response.ehResult = OC_EH_OK;\r
198     response.payload = (OCPayload *) NULL;\r
199 \r
200     if (OCDoResponse(&response) != OC_STACK_OK)\r
201     {\r
202         NS_LOG(ERROR, "Fail to AccessPolicy send response");\r
203         return OC_EH_ERROR;\r
204     }\r
205 \r
206     NS_LOG(DEBUG, "NSEntityHandlerSyncCb - OUT");\r
207     return ehResult;\r
208 }\r
209 \r
210 OCEntityHandlerResult NSEntityHandlerTopicCb(OCEntityHandlerFlag flag,\r
211         OCEntityHandlerRequest *entityHandlerRequest, void* callback)\r
212 {\r
213     NS_LOG(DEBUG, "NSEntityHandlerTopicCb - IN");\r
214     OCEntityHandlerResult ehResult = OC_EH_OK;\r
215 \r
216     (void)callback;\r
217 \r
218     if (!entityHandlerRequest)\r
219     {\r
220         NS_LOG(ERROR, "Invalid request pointer");\r
221         return OC_EH_ERROR;\r
222     }\r
223 \r
224     if (flag & OC_REQUEST_FLAG)\r
225     {\r
226         NS_LOG(DEBUG, "Flag includes OC_REQUEST_FLAG");\r
227 \r
228         if (OC_REST_GET == entityHandlerRequest->method)\r
229         {\r
230             NS_LOG(DEBUG, "NSEntityHandlerTopicCb - OC_REST_GET");\r
231 \r
232             // send consumer's interesting topic list if consumer id exists\r
233             // otherwise send  registered topic list\r
234             NSPushQueue(TOPIC_SCHEDULER, TASK_SEND_TOPICS,\r
235                     NSCopyOCEntityHandlerRequest(entityHandlerRequest));\r
236 \r
237             ehResult = OC_EH_OK;\r
238         }\r
239         else if (OC_REST_POST == entityHandlerRequest->method)\r
240         {\r
241             // Receive interesting topic list from consumers\r
242             // Send topic notice message(id = TOPIC) to the consumer \r
243             // which requests to post.\r
244             NS_LOG(DEBUG, "NSEntityHandlerTopicCb - OC_REST_POST");\r
245 \r
246             // Accepter is provider. our service is not support sendtopiclist from OC_REST_POST\r
247             ehResult = OC_EH_ERROR;\r
248 \r
249             // Accepter is consumer. our service is support sendtopiclist from OC_REST_POST\r
250             if(NSGetPolicy() == false)\r
251             {\r
252                 NSPushQueue(TOPIC_SCHEDULER, TASK_POST_TOPIC,\r
253                         NSCopyOCEntityHandlerRequest(entityHandlerRequest));\r
254                 ehResult = OC_EH_OK;\r
255                 OCEntityHandlerResponse response;\r
256                 response.numSendVendorSpecificHeaderOptions = 0;\r
257                 memset(response.sendVendorSpecificHeaderOptions, 0,\r
258                         sizeof response.sendVendorSpecificHeaderOptions);\r
259                 memset(response.resourceUri, 0, sizeof response.resourceUri);\r
260 \r
261                 response.requestHandle = entityHandlerRequest->requestHandle;\r
262                 response.resourceHandle = entityHandlerRequest->resource;\r
263                 response.persistentBufferFlag = 0;\r
264                 response.ehResult = ehResult;\r
265                 response.payload = (OCPayload *) NULL;\r
266 \r
267                 if (OCDoResponse(&response) != OC_STACK_OK)\r
268                 {\r
269                     NS_LOG(ERROR, "Fail to AccessPolicy send response");\r
270                     return OC_EH_ERROR;\r
271                 }\r
272             }\r
273         }\r
274         else\r
275         {\r
276             NS_LOG_V(DEBUG, "Received unsupported method %d from client",\r
277                     entityHandlerRequest->method);\r
278             ehResult = OC_EH_ERROR;\r
279         }\r
280     }\r
281 \r
282     NS_LOG(DEBUG, "NSEntityHandlerTopicCb - OUT");\r
283     return ehResult;\r
284 }\r
285 \r
286 void NSProviderConnectionStateListener(const CAEndpoint_t * info, bool connected)\r
287 {\r
288 \r
289     NS_LOG(DEBUG, "NSProviderConnectionStateListener - IN");\r
290 \r
291     if (connected)\r
292     {\r
293         NS_LOG(DEBUG, "CONNECTED");\r
294 \r
295         // Set Connection State\r
296         NSSetProviderConnectionState(CONNECTED);\r
297 \r
298         // Start Presence\r
299         NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);\r
300 \r
301         if(info->adapter == CA_ADAPTER_TCP)\r
302         {\r
303             NS_LOG_V(DEBUG, "TCP Connected remote address: %s:%d", info->addr, info->port);\r
304         }\r
305     }\r
306     else\r
307     {\r
308 \r
309         NS_LOG(DEBUG, "DISCONNECTED");\r
310 \r
311         // Set Connection State\r
312         NSSetProviderConnectionState(DISCONNECTED);\r
313 \r
314         if(info->adapter == CA_ADAPTER_TCP)\r
315         {\r
316             NS_LOG_V(DEBUG, "TCP Disconnected remote address: %s:%d", info->addr, info->port);\r
317         }\r
318     }\r
319 \r
320     NS_LOG(DEBUG, "NSProviderConnectionStateListener - OUT");\r
321 }\r
322 \r
323 void NSProviderAdapterStateListener(CATransportAdapter_t adapter, bool enabled)\r
324 {\r
325     (void)adapter;\r
326 \r
327     NS_LOG(DEBUG, "NSProviderAdapterStateListener - IN");\r
328 \r
329     if (enabled)\r
330     {\r
331         NS_LOG(DEBUG, "CONNECTED");\r
332 \r
333         // Set Connection State\r
334         NSSetProviderConnectionState(CONNECTED);\r
335 \r
336         // Start Presence\r
337         NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);\r
338     }\r
339     else\r
340     {\r
341 \r
342         NS_LOG(DEBUG, "DISCONNECTED");\r
343 \r
344         // Set Connection State\r
345         NSSetProviderConnectionState(DISCONNECTED);\r
346     }\r
347 \r
348     NS_LOG(DEBUG, "NSProviderAdapterStateListener - OUT");\r
349 }\r
350 \r