remove not required function and rename the function, const variable.
[platform/upstream/iotivity.git] / service / notification / src / provider / NSProviderSubscription.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 "NSProviderSubscription.h"\r
22 \r
23 NSResult NSInitSubscriptionList()\r
24 {\r
25     NS_LOG(DEBUG, "NSInitSubscriptionList - IN");\r
26 \r
27     consumerSubList = NSCacheCreate();\r
28     consumerSubList->cacheType = NS_PROVIDER_CACHE_SUBSCRIBER;\r
29 \r
30     NS_LOG(DEBUG, "NSInitSubscriptionList - OUT");\r
31     return NS_OK;\r
32 }\r
33 \r
34 NSResult NSSetSubscriptionAcceptPolicy(NSAccessPolicy policy)\r
35 {\r
36     NS_LOG(DEBUG, "NSSetSubscriptionAcceptPolicy - IN");\r
37 \r
38     if (policy == NS_ACCEPTER_PROVIDER)\r
39     {\r
40         NS_LOG(DEBUG, "Place Provider as a subscription accepter");\r
41     }\r
42     else if (policy == NS_ACCEPTER_CONSUMER)\r
43     {\r
44         NS_LOG(DEBUG, "Place Consumer as a subscription accepter");\r
45     }\r
46 \r
47     NSSubscriptionAccepter = policy;\r
48 \r
49     NS_LOG(DEBUG, "NSSetSubscriptionAcceptPolicy - OUT");\r
50     return NS_OK;\r
51 }\r
52 \r
53 int NSGetSubscriptionAccepter()\r
54 {\r
55     return NSSubscriptionAccepter;\r
56 }\r
57 \r
58 NSResult NSSendAccessPolicyResponse(OCEntityHandlerRequest *entityHandlerRequest)\r
59 {\r
60     NS_LOG(DEBUG, "NSSendAccessPolicyResponse - IN");\r
61 \r
62     // put notification resource\r
63     OCResourceHandle notificationResourceHandle;\r
64     if (NSPutNotificationResource(NSGetSubscriptionAccepter(), &notificationResourceHandle)\r
65             != NS_OK)\r
66     {\r
67         NS_LOG(ERROR, "Fail to put notification resource");\r
68         return NS_ERROR;\r
69     }\r
70 \r
71     // make response for the Get Request\r
72     OCEntityHandlerResponse response;\r
73     response.numSendVendorSpecificHeaderOptions = 0;\r
74     memset(response.sendVendorSpecificHeaderOptions, 0,\r
75             sizeof response.sendVendorSpecificHeaderOptions);\r
76     memset(response.resourceUri, 0, sizeof response.resourceUri);\r
77 \r
78     OCRepPayload* payload = OCRepPayloadCreate();\r
79     if (!payload)\r
80     {\r
81         NS_LOG(ERROR, "payload is NULL");\r
82         return NS_ERROR;\r
83     }\r
84 \r
85     OCRepPayloadSetUri(payload, NS_ROOT_URI);\r
86     OCRepPayloadSetPropInt(payload, NS_ATTRIBUTE_POLICY, NSGetSubscriptionAccepter());\r
87     OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_MESSAGE, NS_COLLECTION_MESSAGE_URI);\r
88     OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_SYNC, NS_COLLECTION_SYNC_URI);\r
89 \r
90     response.requestHandle = entityHandlerRequest->requestHandle;\r
91     response.resourceHandle = entityHandlerRequest->resource;\r
92     response.persistentBufferFlag = 0;\r
93     response.ehResult = OC_EH_OK;\r
94     response.payload = (OCPayload *) payload;\r
95 \r
96     // Send Response\r
97     if (OCDoResponse(&response) != OC_STACK_OK)\r
98     {\r
99         NS_LOG(ERROR, "Fail to AccessPolicy send response");\r
100         return NS_ERROR;\r
101     }\r
102     OCRepPayloadDestroy(payload);\r
103     NSFreeOCEntityHandlerRequest(entityHandlerRequest);\r
104 \r
105     NS_LOG(DEBUG, "NSSendAccessPolicyResponse - OUT");\r
106     return NS_OK;\r
107 }\r
108 \r
109 void NSHandleSubscription(OCEntityHandlerRequest *entityHandlerRequest, NSResourceType resourceType)\r
110 {\r
111     NS_LOG(DEBUG, "NSHandleSubscription - IN");\r
112 \r
113     if (resourceType == NS_RESOURCE_MESSAGE)\r
114     {\r
115         NS_LOG(DEBUG, "resourceType == NS_RESOURCE_MESSAGE");\r
116         NSCacheElement * element = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement));\r
117         NSCacheSubData * subData = (NSCacheSubData *) OICMalloc(sizeof(NSCacheSubData));\r
118 \r
119         subData->id = OICStrdup(entityHandlerRequest->devAddr.addr);\r
120         subData->isWhite = false;\r
121         subData->messageObId = entityHandlerRequest->obsInfo.obsId;\r
122         subData->syncObId = 0;\r
123 \r
124         element->data = (void*) subData;\r
125         element->next = NULL;\r
126 \r
127         NS_LOG_V(DEBUG, "SubList IP[ID] = [%s]", subData->id);\r
128         NS_LOG_V(DEBUG, "SubList message observation ID = [%d]", subData->messageObId);\r
129 \r
130         if (NSCacheWrite(consumerSubList, element) != NS_OK)\r
131         {\r
132             NS_LOG(DEBUG, "fail to write cache");\r
133         }\r
134 \r
135         if (NSGetSubscriptionAccepter() == NS_ACCEPTER_PROVIDER)\r
136         {\r
137             NS_LOG(DEBUG, "NSGetSubscriptionAccepter == NS_ACCEPTER_PROVIDER");\r
138             NSAskAcceptanceToUser(entityHandlerRequest);\r
139         }\r
140         else if (NSGetSubscriptionAccepter() == NS_ACCEPTER_CONSUMER)\r
141         {\r
142             NS_LOG(DEBUG, "NSGetSubscriptionAccepter == NS_ACCEPTER_CONSUMER");\r
143             NSSendSubscriptionResponse(entityHandlerRequest, true);\r
144         }\r
145     }\r
146     else if (resourceType == NS_RESOURCE_SYNC)\r
147     {\r
148         NS_LOG(DEBUG, "resourceType == NS_RESOURCE_SYNC");\r
149         NSCacheElement * element = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement));\r
150 \r
151         NSCacheSubData * subData = (NSCacheSubData *) OICMalloc(sizeof(NSCacheSubData));\r
152 \r
153         subData->id = OICStrdup(entityHandlerRequest->devAddr.addr);\r
154         subData->isWhite = false;\r
155         subData->syncObId = entityHandlerRequest->obsInfo.obsId;\r
156         subData->messageObId = 0;\r
157 \r
158         element->data = (void*) subData;\r
159         element->next = NULL;\r
160 \r
161         NS_LOG_V(DEBUG, "SubList IP[ID] = [%s]", subData->id);\r
162         NS_LOG_V(DEBUG, "SubList sync observation ID = [%d]", subData->syncObId);\r
163 \r
164         if (NSCacheWrite(consumerSubList, element) != NS_OK)\r
165         {\r
166             NS_LOG(ERROR, "Fail to write cache");\r
167         }\r
168     }\r
169 \r
170     NS_LOG(DEBUG, "NSHandleSubscription - OUT");\r
171 }\r
172 \r
173 void NSHandleUnsubscription(OCEntityHandlerRequest *entityHandlerRequest)\r
174 {\r
175     NS_LOG(DEBUG, "NSHandleUnsubscription - IN");\r
176 \r
177     NSCacheElement * element = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement));\r
178     NSCacheSubData * subData = (NSCacheSubData *) OICMalloc(sizeof(NSCacheSubData));\r
179     subData->id = OICStrdup(entityHandlerRequest->devAddr.addr);\r
180     subData->isWhite = false;\r
181     subData->messageObId = entityHandlerRequest->obsInfo.obsId;\r
182 \r
183     element->data = (void*) subData;\r
184     element->next = NULL;\r
185 \r
186     NS_LOG_V(DEBUG, "SubList IP[ID] = [%s]", subData->id);\r
187     NS_LOG_V(DEBUG, "SubList observation ID = [%d]", subData->syncObId);\r
188 \r
189     if (NSCacheWrite(consumerSubList, element) != NS_OK)\r
190     {\r
191         NS_LOG(ERROR, "fail to write consumer white list");\r
192     }\r
193 \r
194     NS_LOG(DEBUG, "NSHandleUnsubscription - IN");\r
195     NSFreeOCEntityHandlerRequest(entityHandlerRequest);\r
196 }\r
197 \r
198 void NSAskAcceptanceToUser(OCEntityHandlerRequest *entityHandlerRequest)\r
199 {\r
200     NS_LOG(DEBUG, "NSAskAcceptanceToUser - IN");\r
201 \r
202     NSPushQueue(CALLBACK_SCHEDULER, TASK_CB_SUBSCRIPTION, entityHandlerRequest);\r
203 \r
204     NS_LOG(DEBUG, "NSAskAcceptanceToUser - OUT");\r
205 }\r
206 \r
207 NSResult NSSendResponse(const char * id, bool accepted)\r
208 {\r
209     NS_LOG(DEBUG, "NSSendResponse - IN");\r
210 \r
211     OCRepPayload* payload = OCRepPayloadCreate();\r
212     if (!payload)\r
213     {\r
214         NS_LOG(ERROR, "fail to create playload");\r
215         return NS_ERROR;\r
216     }\r
217 \r
218     OCResourceHandle rHandle;\r
219     if (NSPutMessageResource(NULL, &rHandle) != NS_OK)\r
220     {\r
221         NS_LOG(ERROR, "Fail to put notification resource");\r
222         return NS_ERROR;\r
223     }\r
224 \r
225     OCRepPayloadSetUri(payload, NS_COLLECTION_MESSAGE_URI);\r
226     OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_ID, "0000-0000-0000-0000");\r
227     OCRepPayloadSetPropBool(payload, NS_ATTRIBUTE_ACCPETANCE, accepted);\r
228 \r
229     NSCacheElement * element = NSCacheRead(consumerSubList, id);\r
230 \r
231     if(element == NULL)\r
232     {\r
233         NS_LOG(ERROR, "element is NULL");\r
234         return NS_ERROR;\r
235     }\r
236     NSCacheSubData * subData = (NSCacheSubData*) element->data;\r
237 \r
238     if (OCNotifyListOfObservers(rHandle, (OCObservationId*)&subData->messageObId, 1, payload, OC_HIGH_QOS)\r
239             != OC_STACK_OK)\r
240     {\r
241         NS_LOG(ERROR, "fail to send Acceptance");\r
242         OCRepPayloadDestroy(payload);\r
243         return NS_ERROR;\r
244 \r
245     }\r
246     OCRepPayloadDestroy(payload);\r
247 \r
248     NS_LOG(DEBUG, "NSSendResponse - OUT");\r
249     return NS_OK;\r
250 }\r
251 \r
252 NSResult NSSendSubscriptionResponse(OCEntityHandlerRequest *entityHandlerRequest, bool accepted)\r
253 {\r
254     NS_LOG(DEBUG, "NSSendSubscriptionResponse - IN");\r
255 \r
256     if (!entityHandlerRequest)\r
257     {\r
258         NS_LOG(ERROR, "Invalid request pointer");\r
259         return OC_EH_ERROR;\r
260     }\r
261 \r
262     if (accepted)\r
263     {\r
264         NS_LOG(DEBUG, "accepted is true");\r
265         NSCacheElement * element = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement));\r
266 \r
267         NSCacheSubData * subData = (NSCacheSubData *) OICMalloc(sizeof(NSCacheSubData));\r
268         subData->id = OICStrdup(entityHandlerRequest->devAddr.addr);\r
269         subData->isWhite = true;\r
270         subData->messageObId = entityHandlerRequest->obsInfo.obsId;\r
271 \r
272         element->data = (void*) subData;\r
273         element->next = NULL;\r
274 \r
275         if (NSCacheWrite(consumerSubList, element) != NS_OK)\r
276         {\r
277             NS_LOG(ERROR, "fail to write consumer white list");\r
278         }\r
279     }\r
280 \r
281     NSSendResponse(entityHandlerRequest->devAddr.addr, accepted);\r
282     NSFreeOCEntityHandlerRequest(entityHandlerRequest);\r
283 \r
284     NS_LOG(DEBUG, "NSSendSubscriptionResponse - OUT");\r
285     return NS_OK;\r
286 }\r
287 \r
288 void * NSSubScriptionSchedule(void *ptr)\r
289 {\r
290     if (ptr == NULL)\r
291     {\r
292         NS_LOG(DEBUG, "Create NSSubScriptionSchedule");\r
293     }\r
294 \r
295     while (NSIsRunning[SUBSCRIPTION_SCHEDULER])\r
296     {\r
297         sem_wait(&NSSemaphore[SUBSCRIPTION_SCHEDULER]);\r
298         pthread_mutex_lock(&NSMutex[SUBSCRIPTION_SCHEDULER]);\r
299 \r
300         if (NSHeadMsg[SUBSCRIPTION_SCHEDULER] != NULL)\r
301         {\r
302             NSTask *node = NSHeadMsg[SUBSCRIPTION_SCHEDULER];\r
303             NSHeadMsg[SUBSCRIPTION_SCHEDULER] = node->nextTask;\r
304 \r
305             switch (node->taskType)\r
306             {\r
307                 case TASK_SEND_POLICY:\r
308                     NS_LOG(DEBUG, "CASE TASK_SEND_POLICY : ");\r
309                     NSSendAccessPolicyResponse((OCEntityHandlerRequest*) node->taskData);\r
310                     break;\r
311 \r
312                 case TASK_RECV_SUBSCRIPTION:\r
313                     NS_LOG(DEBUG, "CASE TASK_RECV_SUBSCRIPTION : ");\r
314                     NSHandleSubscription((OCEntityHandlerRequest*) node->taskData,\r
315                             NS_RESOURCE_MESSAGE);\r
316                     break;\r
317 \r
318                 case TASK_RECV_UNSUBSCRIPTION:\r
319                     NS_LOG(DEBUG, "CASE TASK_RECV_UNSUBSCRIPTION : ");\r
320                     NSHandleUnsubscription((OCEntityHandlerRequest*) node->taskData);\r
321                     break;\r
322 \r
323                 case TASK_SEND_ALLOW:\r
324                 {\r
325                     NS_LOG(DEBUG, "CASE TASK_SEND_ALLOW : ");\r
326                     NSConsumer * consumer = (NSConsumer *) node->taskData;\r
327 \r
328                     char * id = OICStrdup(consumer->mDeviceId);\r
329 \r
330                     NSCacheUpdateSubScriptionState(consumerSubList, id, true);\r
331                     NSSendResponse(id, true);\r
332                     OICFree(id);\r
333                     NSFreeConsumer(consumer);\r
334                     break;\r
335                 }\r
336                 case TASK_SEND_DENY:\r
337                 {\r
338                     NS_LOG(DEBUG, "CASE TASK_SEND_DENY : ");\r
339                     NSConsumer * consumer = (NSConsumer *) node->taskData;\r
340 \r
341                     char * id = OICStrdup(consumer->mDeviceId);\r
342 \r
343                     NSCacheUpdateSubScriptionState(consumerSubList, id, false);\r
344                     NSSendResponse(id, false);\r
345                     OICFree(id);\r
346                     NSFreeConsumer(consumer);\r
347 \r
348                     break;\r
349                 }\r
350                 case TASK_SYNC_SUBSCRIPTION:\r
351                     NS_LOG(DEBUG, "CASE TASK_SYNC_SUBSCRIPTION : ");\r
352                     NSHandleSubscription((OCEntityHandlerRequest*) node->taskData,\r
353                             NS_RESOURCE_SYNC);\r
354                     break;\r
355                 default:\r
356                     break;\r
357 \r
358             }\r
359             OICFree(node);\r
360         }\r
361 \r
362         pthread_mutex_unlock(&NSMutex[SUBSCRIPTION_SCHEDULER]);\r
363 \r
364     }\r
365     NS_LOG(INFO, "Destroy NSSubScriptionSchedule");\r
366     return NULL;\r
367 }\r