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