Added Initial version of notification.
[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 NSSetSubscriptionAcceptPolicy(NSAccessPolicy policy)\r
24 {\r
25     if (policy == NS_ACCEPTER_PROVIDER)\r
26     {\r
27         OIC_LOG(INFO, SUBSCRIPTION_TAG, "Place Provider as a subscription accepter");\r
28     }\r
29     else if (policy == NS_ACCEPTER_CONSUMER)\r
30     {\r
31         OIC_LOG(INFO, SUBSCRIPTION_TAG, "Place Consumer as a subscription accepter");\r
32     }\r
33 \r
34     NSSubscriptionAccepter = policy;\r
35 \r
36     return NS_OK;\r
37 }\r
38 \r
39 int NSGetSubscriptionAccepter()\r
40 {\r
41     return NSSubscriptionAccepter;\r
42 }\r
43 \r
44 NSResult NSSendAccessPolicyResponse(OCEntityHandlerRequest *entityHandlerRequest)\r
45 {\r
46     OIC_LOG(DEBUG, NOTIFICATION_TAG, "Send Notification Policy to consumer");\r
47 \r
48     // put notification resource\r
49     OCResourceHandle notificationResourceHandle;\r
50     if(NSPutNotificationResource(NSGetSubscriptionAccepter(), &notificationResourceHandle) != NS_OK)\r
51     {\r
52         OIC_LOG(ERROR, SUBSCRIPTION_TAG, PCF("Failed to put notification resource"));\r
53         return NS_ERROR;\r
54     }\r
55 \r
56     // make response for the Get Request\r
57     OCEntityHandlerResponse response;\r
58     response.numSendVendorSpecificHeaderOptions = 0;\r
59     memset(response.sendVendorSpecificHeaderOptions, 0,\r
60             sizeof response.sendVendorSpecificHeaderOptions);\r
61     memset(response.resourceUri, 0, sizeof response.resourceUri);\r
62 \r
63     OCRepPayload* payload = OCRepPayloadCreate();\r
64     //response.payload = OCRepPayloadCreate();\r
65     if (!payload)\r
66     {\r
67         OIC_LOG(ERROR, SUBSCRIPTION_TAG, PCF("Failed to allocate Payload"));\r
68         return NS_ERROR;\r
69     }\r
70 \r
71     OCRepPayloadSetUri(payload, NSGetNotificationUri());\r
72     OCRepPayloadSetPropInt(payload, NS_ATTRIBUTE_POLICY, NSGetSubscriptionAccepter());\r
73     OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_MESSAGE, NSGetNotificationMessageUri());\r
74     OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_SYNC, NSGetNotificationSyncUri());\r
75 \r
76     response.requestHandle = entityHandlerRequest->requestHandle;\r
77     response.resourceHandle = entityHandlerRequest->resource;\r
78     response.persistentBufferFlag = 0;\r
79     response.ehResult = OC_EH_OK;\r
80     response.payload = (OCPayload *)payload;\r
81 \r
82 \r
83     // Send Response\r
84     if (OCDoResponse(&response) != OC_STACK_OK)\r
85     {\r
86         OIC_LOG(ERROR, SUBSCRIPTION_TAG, PCF("Fail to send response"));\r
87         return NS_ERROR;\r
88     }\r
89     OCRepPayloadDestroy(payload);\r
90 \r
91     return NS_OK;\r
92 }\r
93 \r
94 void NSHandleSubscription(OCEntityHandlerRequest *entityHandlerRequest, int state)\r
95 {\r
96 \r
97     OIC_LOG(INFO, SUBSCRIPTION_TAG, "Start to subscription process");\r
98 \r
99     printf("state = 0 \n");\r
100 \r
101     // write consumer info to cache\r
102     if(state == 0)\r
103     {\r
104 \r
105         printf("state = 0 - 1\n");\r
106 \r
107         if (NSProviderWriteToCache(NS_CONSUMER_BLACKLIST, entityHandlerRequest->obsInfo.obsId, state) != NS_OK)\r
108         {\r
109             OIC_LOG(ERROR, SUBSCRIPTION_TAG, PCF("fail to write consumer black list"));\r
110         }\r
111         printf("state = 0 - 2\n");\r
112         // check access policy\r
113         if (NSGetSubscriptionAccepter() == NS_ACCEPTER_PROVIDER)\r
114         {\r
115             // OCDevAddr --> NSConsumer\r
116             printf("before NSGetSubscriptionAccepter() == NS_ACCEPTER_PROVIDER)\n");\r
117             NSAskAcceptanceToUser(entityHandlerRequest);\r
118             printf("After NSGetSubscriptionAccepter() == NS_ACCEPTER_PROVIDER)\n");\r
119         }\r
120         else if (NSGetSubscriptionAccepter() == NS_ACCEPTER_CONSUMER)\r
121         {\r
122             printf("state = 0 - 3\n");\r
123             NSSendSubscriptionResponse(entityHandlerRequest, NS_ACCEPTER_CONSUMER, true);\r
124         }\r
125     }\r
126     else if(state == 1)\r
127     {\r
128         printf("state = 1 - 0\n");\r
129         if (NSProviderWriteToCache(NS_CONSUMER_WHITELIST, entityHandlerRequest->obsInfo.obsId, state) != NS_OK)\r
130         {\r
131             OIC_LOG(ERROR, SUBSCRIPTION_TAG, PCF("fail to write consumer white list"));\r
132         }\r
133         printf("state = 1 - 1\n");\r
134     }\r
135 }\r
136 \r
137 void NSHandleUnsubscription(OCEntityHandlerRequest *entityHandlerRequest)\r
138 {\r
139     OIC_LOG(INFO, SUBSCRIPTION_TAG, "Start to unsubscription process");\r
140 \r
141     // ProcessObserveUnregister (entityHandlerRequest);\r
142 \r
143     // write consumer info to cache\r
144     if (NSProviderWriteToCache(NS_CONSUMER_BLACKLIST, entityHandlerRequest->devAddr) != NS_OK)\r
145     {\r
146         OIC_LOG(ERROR, SUBSCRIPTION_TAG, "fail to write consumer black list");\r
147     }\r
148 }\r
149 \r
150 void NSAskAcceptanceToUser(OCEntityHandlerRequest *entityHandlerRequest)\r
151 {\r
152     OIC_LOG(DEBUG, SUBSCRIPTION_TAG, "Ask for user to Allow or Deny");\r
153 \r
154     NSPushQueue(RESPONSE_SCHEDULER, TASK_CB_SUBSCRIPTION, entityHandlerRequest);\r
155     // one queue is required for response callback to ask subscription allowance\r
156 }\r
157 \r
158 NSResult NSSendResponse(int observeId, bool accepted)\r
159 {\r
160 \r
161     OCRepPayload* payload = OCRepPayloadCreate();\r
162     if (!payload)\r
163     {\r
164         OIC_LOG(ERROR, SUBSCRIPTION_TAG, PCF("Failed to allocate Payload"));\r
165         return NS_ERROR;\r
166     }\r
167 \r
168     OCResourceHandle rHandle;\r
169     if (NSPutMessageResource(NULL, &rHandle) != NS_OK)\r
170     {\r
171         OIC_LOG(ERROR, NOTIFICATION_TAG, PCF("Fail to put notification resource"));\r
172         return NS_ERROR;\r
173     }\r
174 \r
175     OCRepPayloadSetUri(payload, NSGetNotificationMessageUri());\r
176     OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_ID, "0000-0000-0000-0000");\r
177     OCRepPayloadSetPropBool(payload, NS_ATTRIBUTE_ACCPETANCE, accepted);\r
178 \r
179     if (OCNotifyListOfObservers(rHandle, &observeId, 1, payload, OC_HIGH_QOS) != OC_STACK_OK)\r
180     {\r
181         OIC_LOG(ERROR, SUBSCRIPTION_TAG, "fail to send Acceptance");\r
182         OCRepPayloadDestroy(payload);\r
183         return NS_ERROR;\r
184 \r
185     }\r
186     OCRepPayloadDestroy(payload);\r
187 \r
188     return NS_OK;\r
189 }\r
190 \r
191 NSResult NSSendSubscriptionResponse(OCEntityHandlerRequest *entityHandlerRequest,\r
192         NSAccessPolicy accepter, bool accepted)\r
193 {\r
194     OIC_LOG(INFO, SUBSCRIPTION_TAG, "Send ACCEPT message to consumer");\r
195 \r
196     if (!entityHandlerRequest)\r
197     {\r
198         OIC_LOG (ERROR, LISTENER_TAG, "Invalid request pointer");\r
199         return OC_EH_ERROR;\r
200     }\r
201 \r
202     // write consumer info to cache\r
203 \r
204     printf("accepted 1 \n");\r
205     if (accepted)\r
206     {\r
207         if (NSProviderWriteToCache(NS_CONSUMER_WHITELIST, entityHandlerRequest->obsInfo.obsId) != NS_OK)\r
208         {\r
209             OIC_LOG(ERROR, SUBSCRIPTION_TAG, "fail to write consumer white list");\r
210         }\r
211     }\r
212 \r
213     NSSendResponse(&entityHandlerRequest->obsInfo.obsId, accepted);\r
214 \r
215     return NS_OK;\r
216 \r
217 }\r
218 \r
219 void * NSSubScriptionSchedule(void *ptr)\r
220 {\r
221 \r
222     if (ptr == NULL)\r
223     {\r
224         OIC_LOG(INFO, SUBSCRIPTION_TAG, "Create NSSubscriptionSchedule");\r
225     }\r
226 \r
227     while (NSIsRunning[SUBSCRIPTION_SCHEDULER])\r
228     {\r
229         sem_wait(&NSSemaphore[SUBSCRIPTION_SCHEDULER]);\r
230         pthread_mutex_lock(&NSMutex[SUBSCRIPTION_SCHEDULER]);\r
231 \r
232         if (NSHeadMsg[SUBSCRIPTION_SCHEDULER] != NULL)\r
233         {\r
234             NSTask *node = NSHeadMsg[SUBSCRIPTION_SCHEDULER];\r
235             NSHeadMsg[SUBSCRIPTION_SCHEDULER] = node->nextTask;\r
236 \r
237             switch (node->taskType)\r
238             {\r
239 \r
240                 case TASK_SEND_POLICY:\r
241 \r
242                     NSSendAccessPolicyResponse((OCEntityHandlerRequest*) node->taskData);\r
243                     break;\r
244 \r
245                 case TASK_RECV_SUBSCRIPTION:\r
246                     printf("before TASK_RECV_SUBSCRIPTION:\n");\r
247                     NSHandleSubscription((OCEntityHandlerRequest*) node->taskData, 0);\r
248                     printf("after TASK_RECV_SUBSCRIPTION:\n");\r
249                     break;\r
250 \r
251                 case TASK_RECV_UNSUBSCRIPTION:\r
252 \r
253                     NSHandleUnsubscription((OCEntityHandlerRequest*) node->taskData);\r
254                     break;\r
255 \r
256                 case TASK_SEND_ALLOW:\r
257                 {\r
258                     NSConsumer * consumer = (NSConsumer *)node->taskData;\r
259                     int * pObId = (int *)consumer->mUserData;\r
260 \r
261                     printf("observer ID = %d\n", *pObId);\r
262 \r
263                     if (NSProviderWriteToCache(NS_CONSUMER_WHITELIST, *pObId, 0) != NS_OK)\r
264                     {\r
265                         OIC_LOG(ERROR, SUBSCRIPTION_TAG, "fail to write consumer white list");\r
266                     }\r
267                     NSSendResponse(*pObId, true);\r
268 \r
269                     break;\r
270                 }\r
271                 case TASK_SEND_DENY:\r
272 \r
273 //                    NSSendSubscriptionResponse((OCEntityHandlerRequest*) node->taskData,\r
274 //                            NS_ACCEPTER_PROVIDER, false);\r
275                     break;\r
276 \r
277                 case TASK_SYNC_SUBSCRIPTION:\r
278                     NSHandleSubscription((OCEntityHandlerRequest*) node->taskData, 1);\r
279                     break;\r
280 \r
281             }\r
282             OICFree(node);\r
283         }\r
284 \r
285         pthread_mutex_unlock(&NSMutex[SUBSCRIPTION_SCHEDULER]);\r
286 \r
287     }\r
288     return NULL;\r
289 }\r