Merge branch '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     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     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             }\r
256         }\r
257         else\r
258         {\r
259             NS_LOG_V(DEBUG, "Received unsupported method %d from client",\r
260                     entityHandlerRequest->method);\r
261             ehResult = OC_EH_ERROR;\r
262         }\r
263     }\r
264 \r
265     NS_LOG(DEBUG, "NSEntityHandlerTopicCb - OUT");\r
266     return ehResult;\r
267 }\r
268 \r
269 void NSProviderConnectionStateListener(const CAEndpoint_t * info, bool connected)\r
270 {\r
271 \r
272     NS_LOG(DEBUG, "NSProviderConnectionStateListener - IN");\r
273 \r
274     if (connected)\r
275     {\r
276         NS_LOG(DEBUG, "CONNECTED");\r
277 \r
278         // Set Connection State\r
279         NSSetProviderConnectionState(CONNECTED);\r
280 \r
281         // Start Presence\r
282         NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);\r
283 \r
284         if(info->adapter == CA_ADAPTER_TCP)\r
285         {\r
286             NS_LOG_V(DEBUG, "TCP Connected remote address: %s:%d", info->addr, info->port);\r
287         }\r
288     }\r
289     else\r
290     {\r
291 \r
292         NS_LOG(DEBUG, "DISCONNECTED");\r
293 \r
294         // Set Connection State\r
295         NSSetProviderConnectionState(DISCONNECTED);\r
296 \r
297         if(info->adapter == CA_ADAPTER_TCP)\r
298         {\r
299             NS_LOG_V(DEBUG, "TCP Disconnected remote address: %s:%d", info->addr, info->port);\r
300         }\r
301     }\r
302 \r
303     NS_LOG(DEBUG, "NSProviderConnectionStateListener - OUT");\r
304 }\r
305 \r
306 void NSProviderAdapterStateListener(CATransportAdapter_t adapter, bool enabled)\r
307 {\r
308     (void)adapter;\r
309 \r
310     NS_LOG(DEBUG, "NSProviderAdapterStateListener - IN");\r
311 \r
312     if (enabled)\r
313     {\r
314         NS_LOG(DEBUG, "CONNECTED");\r
315 \r
316         // Set Connection State\r
317         NSSetProviderConnectionState(CONNECTED);\r
318 \r
319         // Start Presence\r
320         NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);\r
321     }\r
322     else\r
323     {\r
324 \r
325         NS_LOG(DEBUG, "DISCONNECTED");\r
326 \r
327         // Set Connection State\r
328         NSSetProviderConnectionState(DISCONNECTED);\r
329     }\r
330 \r
331     NS_LOG(DEBUG, "NSProviderAdapterStateListener - OUT");\r
332 }\r
333 \r