implementation NSStopProvider and bug fixed.
[platform/upstream/iotivity.git] / service / notification / src / provider / NSProviderInterface.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 "NSProviderInterface.h"\r
22 #include "NSProviderScheduler.h"\r
23 #include "NSProviderListener.h"\r
24 #include "NSCacheAdapter.h"\r
25 #include "NSProviderSubscription.h"\r
26 #include "NSProviderNotification.h"\r
27 #include "NSProviderMemoryCache.h"\r
28 #include "oic_malloc.h"\r
29 #include "oic_string.h"\r
30 #include "cautilinterface.h"\r
31 \r
32 bool initProvider = false;\r
33 static NSSubscribeRequestCallback g_subscribeRequestCb = NULL;\r
34 static NSSyncCallback g_syncCb = NULL;\r
35 \r
36 pthread_mutex_t nsInitMutex;\r
37 \r
38 void initializeMutex()\r
39 {\r
40     static pthread_mutex_t initMutex = PTHREAD_MUTEX_INITIALIZER;\r
41     nsInitMutex = initMutex;\r
42 }\r
43 \r
44 void NSRegisterSubscribeRequestCb(NSSubscribeRequestCallback subscribeRequestCb)\r
45 {\r
46     NS_LOG(DEBUG, "NSRegisterSubscribeRequestCb - IN");\r
47     g_subscribeRequestCb = subscribeRequestCb;\r
48     NS_LOG(DEBUG, "NSRegisterSubscribeRequestCb - OUT");\r
49 }\r
50 \r
51 void  NSRegisterSyncCb(NSSyncCallback syncCb)\r
52 {\r
53     NS_LOG(DEBUG, "NSRegisterSyncCb - IN");\r
54     g_syncCb = syncCb;\r
55     NS_LOG(DEBUG, "NSRegisterSyncCb - OUT");\r
56 }\r
57 \r
58 void NSSubscribeRequestCb(NSConsumer *consumer)\r
59 {\r
60     NS_LOG(DEBUG, "NSSubscribeRequestCb - IN");\r
61     g_subscribeRequestCb(consumer);\r
62     NS_LOG(DEBUG, "NSSubscribeRequestCb - OUT");\r
63 }\r
64 \r
65 void NSSyncCb(NSSync *sync)\r
66 {\r
67     NS_LOG(DEBUG, "NSSyncCb - IN");\r
68     g_syncCb(sync);\r
69     NS_LOG(DEBUG, "NSSyncCb - OUT");\r
70 }\r
71 \r
72 NSResult NSStartProvider(NSAccessPolicy policy, NSSubscribeRequestCallback subscribeRequestCb,\r
73         NSSyncCallback syncCb)\r
74 {\r
75     NS_LOG(DEBUG, "NSStartProvider - IN");\r
76 \r
77     initializeMutex();\r
78 \r
79     pthread_mutex_lock(&nsInitMutex);\r
80 \r
81     if (!initProvider)\r
82     {\r
83         NS_LOG(DEBUG, "Init Provider");\r
84         initProvider = true;\r
85         NSSetSubscriptionAcceptPolicy(policy);\r
86         NSRegisterSubscribeRequestCb(subscribeRequestCb);\r
87         NSRegisterSyncCb(syncCb);\r
88         CARegisterNetworkMonitorHandler(NSProviderAdapterStateListener,\r
89                 NSProviderConnectionStateListener);\r
90 \r
91         NSSetList();\r
92         NSInitScheduler();\r
93         NSStartScheduler();\r
94 \r
95 \r
96         NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);\r
97         NSPushQueue(DISCOVERY_SCHEDULER, TASK_REGISTER_RESOURCE, NULL);\r
98     }\r
99     else\r
100     {\r
101         NS_LOG(DEBUG, "Already started Notification Provider");\r
102     }\r
103     pthread_mutex_unlock(&nsInitMutex);\r
104 \r
105     NS_LOG(DEBUG, "NSStartProvider - OUT");\r
106 \r
107     return NS_OK;\r
108 }\r
109 \r
110 void NSSetList()\r
111 {\r
112     NS_LOG(DEBUG, "NSSetList - IN");\r
113     pthread_mutex_init(&NSCacheMutex, NULL);\r
114     NSInitSubscriptionList();\r
115     NSInitMessageList();\r
116     NS_LOG(DEBUG, "NSSetList - OUT");\r
117 }\r
118 \r
119 NSResult NSStopProvider()\r
120 {\r
121     NS_LOG(DEBUG, "NSStopProvider - IN");\r
122 \r
123     pthread_mutex_lock(&nsInitMutex);\r
124 \r
125     if(initProvider)\r
126     {\r
127         NSUnRegisterResource();\r
128         NSRegisterSubscribeRequestCb((NSSubscribeRequestCallback)NULL);\r
129         NSRegisterSyncCb((NSSyncCallback)NULL);\r
130         NSStopScheduler();\r
131         NSCacheDestroy(consumerSubList);\r
132         NSCacheDestroy(messageList);\r
133 \r
134         initProvider = false;\r
135     }\r
136 \r
137     pthread_mutex_unlock(&nsInitMutex);\r
138     NS_LOG(DEBUG, "NSStopProvider - OUT");\r
139     return NS_OK;\r
140 }\r
141 \r
142 NSResult NSSendNotification(NSMessage *msg)\r
143 {\r
144     NS_LOG(DEBUG, "NSSendNotification - IN");\r
145 \r
146     pthread_mutex_lock(&nsInitMutex);\r
147 \r
148     if(msg == NULL)\r
149     {\r
150         NS_LOG(ERROR, "Msg is NULL");\r
151         pthread_mutex_unlock(&nsInitMutex);\r
152         return NS_ERROR;\r
153     }\r
154 \r
155     NSMessage * newMsg = NSDuplicateMessage(msg);\r
156 \r
157     NSPushQueue(NOTIFICATION_SCHEDULER, TASK_SEND_NOTIFICATION, newMsg);\r
158 \r
159     pthread_mutex_unlock(&nsInitMutex);\r
160 \r
161     NS_LOG(DEBUG, "NSSendNotification - OUT");\r
162     return NS_OK;\r
163 }\r
164 \r
165 NSResult NSProviderReadCheck(NSMessage *msg)\r
166 {\r
167     NS_LOG(DEBUG, "NSProviderReadCheck - IN");\r
168 \r
169     pthread_mutex_lock(&nsInitMutex);\r
170     NSPushQueue(NOTIFICATION_SCHEDULER, TASK_SEND_READ, msg);\r
171     pthread_mutex_unlock(&nsInitMutex);\r
172 \r
173     NS_LOG(DEBUG, "NSProviderReadCheck - OUT");\r
174     return NS_OK;\r
175 }\r
176 \r
177 NSResult NSAccept(NSConsumer *consumer, bool accepted)\r
178 {\r
179     NS_LOG(DEBUG, "NSAccept - IN");\r
180 \r
181     pthread_mutex_lock(&nsInitMutex);\r
182 \r
183     NSConsumer * newConsumer = NSDuplicateConsumer(consumer);\r
184 \r
185     if(accepted)\r
186     {\r
187         NS_LOG(DEBUG, "accepted is true - ALLOW");\r
188         NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_ALLOW, newConsumer);\r
189     }\r
190     else\r
191     {\r
192         NS_LOG(DEBUG, "accepted is false - DENY");\r
193         NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_DENY, newConsumer);\r
194     }\r
195 \r
196     pthread_mutex_unlock(&nsInitMutex);\r
197     NS_LOG(DEBUG, "NSAccept - OUT");\r
198     return NS_OK;\r
199 }\r
200 \r
201 void * NSResponseSchedule(void * ptr)\r
202 {\r
203     if (ptr == NULL)\r
204     {\r
205         NS_LOG(DEBUG, "Create NSReponseSchedule");\r
206     }\r
207 \r
208     while (NSIsRunning[RESPONSE_SCHEDULER])\r
209     {\r
210         sem_wait(&NSSemaphore[RESPONSE_SCHEDULER]);\r
211         pthread_mutex_lock(&NSMutex[RESPONSE_SCHEDULER]);\r
212 \r
213         if (NSHeadMsg[RESPONSE_SCHEDULER] != NULL)\r
214         {\r
215             NSTask *node = NSHeadMsg[RESPONSE_SCHEDULER];\r
216             NSHeadMsg[RESPONSE_SCHEDULER] = node->nextTask;\r
217 \r
218             switch (node->taskType)\r
219             {\r
220                 case TASK_CB_SUBSCRIPTION:\r
221                 {\r
222                     NS_LOG(DEBUG, "CASE TASK_CB_SUBSCRIPTION : ");\r
223 \r
224                     OCEntityHandlerRequest * request = (OCEntityHandlerRequest*)node->taskData;\r
225                     NSConsumer * consumer = (NSConsumer *)OICMalloc(sizeof(NSConsumer));\r
226                     consumer->mDeviceId = OICStrdup(request->devAddr.addr);\r
227                     consumer->mAddress = OICStrdup(request->devAddr.addr);\r
228 \r
229                     NSSubscribeRequestCb(consumer);\r
230                     NSFreeConsumer(consumer);\r
231                     NSFreeOCEntityHandlerRequest(request);\r
232 \r
233                     break;\r
234                 }\r
235                 case TASK_CB_SYNC:\r
236                 {\r
237                     NS_LOG(DEBUG, "CASE TASK_CB_SYNC : ");\r
238                     NSSync * sync = (NSSync*)node->taskData;\r
239                     NSSyncCb(sync);\r
240                     break;\r
241                 }\r
242                 default:\r
243                     NS_LOG(DEBUG, "No Task Type");\r
244                     break;\r
245             }\r
246             OICFree(node);\r
247         }\r
248 \r
249         pthread_mutex_unlock(&NSMutex[RESPONSE_SCHEDULER]);\r
250 \r
251     }\r
252 \r
253     NS_LOG(DEBUG, "Destroy NSResponseSchedule");\r
254     return NULL;\r
255 }\r
256 \r
257 NSResult NSTestStartPresence()\r
258 {\r
259     NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);\r
260     return NS_OK;\r
261 }\r
262 \r
263 NSResult NSTestStopPresence()\r
264 {\r
265     NSPushQueue(DISCOVERY_SCHEDULER, TASK_STOP_PRESENCE, NULL);\r
266     return NS_OK;\r
267 }\r
268 \r
269 \r