Merge branch 'cloud-interface'
[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 NS_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     // Validate pointer\r
219     if (!entityHandlerRequest)\r
220     {\r
221         NS_LOG(ERROR, "Invalid request pointer");\r
222         return OC_EH_ERROR;\r
223     }\r
224 \r
225     if (flag & OC_REQUEST_FLAG)\r
226     {\r
227         NS_LOG(DEBUG, "Flag includes OC_REQUEST_FLAG");\r
228 \r
229         if (OC_REST_GET == entityHandlerRequest->method)\r
230         {\r
231             NS_LOG(DEBUG, "NSEntityHandlerTopicCb - OC_REST_GET");\r
232 \r
233             // send consumer's interesting topic list if consumer id exists\r
234             // otherwise send  registered topic list\r
235             NSPushQueue(TOPIC_SCHEDULER, TASK_SEND_TOPICS,\r
236                     NSCopyOCEntityHandlerRequest(entityHandlerRequest));\r
237 \r
238             ehResult = OC_EH_OK;\r
239         }\r
240         else if (OC_REST_POST == entityHandlerRequest->method)\r
241         {\r
242             // Receive interesting topic list from consumers\r
243             NS_LOG(DEBUG, "NSEntityHandlerTopicCb - OC_REST_POST");\r
244 \r
245             // Send topic notice message(id = TOPIC) to the consumer \r
246             // which requests to post.\r
247             NSPushQueue(TOPIC_SCHEDULER, TASK_POST_TOPIC,\r
248                     NSCopyOCEntityHandlerRequest(entityHandlerRequest));\r
249 \r
250             ehResult = OC_EH_OK;\r
251         }\r
252         else\r
253         {\r
254             NS_LOG_V(DEBUG, "Received unsupported method %d from client",\r
255                     entityHandlerRequest->method);\r
256             ehResult = OC_EH_OK;\r
257         }\r
258     }\r
259 \r
260     NS_LOG(DEBUG, "NSEntityHandlerTopicCb - OUT");\r
261     return ehResult;\r
262 }\r
263 \r
264 void NSProviderConnectionStateListener(const CAEndpoint_t * info, bool connected)\r
265 {\r
266 \r
267     NS_LOG(DEBUG, "NSProviderConnectionStateListener - IN");\r
268 \r
269     if (connected)\r
270     {\r
271         NS_LOG(DEBUG, "CONNECTED");\r
272 \r
273         // Set Connection State\r
274         NSSetProviderConnectionState(CONNECTED);\r
275 \r
276         // Start Presence\r
277         NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);\r
278 \r
279         if(info->adapter == CA_ADAPTER_TCP)\r
280         {\r
281             NS_LOG_V(DEBUG, "TCP Connected remote address: %s:%d", info->addr, info->port);\r
282         }\r
283     }\r
284     else\r
285     {\r
286 \r
287         NS_LOG(DEBUG, "DISCONNECTED");\r
288 \r
289         // Set Connection State\r
290         NSSetProviderConnectionState(DISCONNECTED);\r
291 \r
292         if(info->adapter == CA_ADAPTER_TCP)\r
293         {\r
294             NS_LOG_V(DEBUG, "TCP Disconnected remote address: %s:%d", info->addr, info->port);\r
295         }\r
296     }\r
297 \r
298     NS_LOG(DEBUG, "NSProviderConnectionStateListener - OUT");\r
299 }\r
300 \r
301 void NSProviderAdapterStateListener(CATransportAdapter_t adapter, bool enabled)\r
302 {\r
303     (void)adapter;\r
304 \r
305     NS_LOG(DEBUG, "NSProviderAdapterStateListener - IN");\r
306 \r
307     if (enabled)\r
308     {\r
309         NS_LOG(DEBUG, "CONNECTED");\r
310 \r
311         // Set Connection State\r
312         NSSetProviderConnectionState(CONNECTED);\r
313 \r
314         // Start Presence\r
315         NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);\r
316     }\r
317     else\r
318     {\r
319 \r
320         NS_LOG(DEBUG, "DISCONNECTED");\r
321 \r
322         // Set Connection State\r
323         NSSetProviderConnectionState(DISCONNECTED);\r
324     }\r
325 \r
326     NS_LOG(DEBUG, "NSProviderAdapterStateListener - OUT");\r
327 }\r
328 \r