add subscriber list for remote server
[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 "NSProviderSubscription.h"\r
25 #include "NSProviderNotification.h"\r
26 #include "NSStorageAdapter.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 #include "NSProviderSystem.h"\r
32 #include "oic_time.h"\r
33 \r
34 bool initProvider = false;\r
35 static NSSubscribeRequestCallback g_subscribeRequestCb = NULL;\r
36 static NSProviderSyncInfoCallback g_syncCb = NULL;\r
37 \r
38 pthread_mutex_t nsInitMutex;\r
39 \r
40 void initializeMutex()\r
41 {\r
42     static pthread_mutex_t initMutex = PTHREAD_MUTEX_INITIALIZER;\r
43     nsInitMutex = initMutex;\r
44 }\r
45 \r
46 void NSRegisterSubscribeRequestCb(NSSubscribeRequestCallback subscribeRequestCb)\r
47 {\r
48     NS_LOG(DEBUG, "NSRegisterSubscribeRequestCb - IN");\r
49     g_subscribeRequestCb = subscribeRequestCb;\r
50     NS_LOG(DEBUG, "NSRegisterSubscribeRequestCb - OUT");\r
51 }\r
52 \r
53 void  NSRegisterSyncCb(NSProviderSyncInfoCallback syncCb)\r
54 {\r
55     NS_LOG(DEBUG, "NSRegisterSyncCb - IN");\r
56     g_syncCb = syncCb;\r
57     NS_LOG(DEBUG, "NSRegisterSyncCb - OUT");\r
58 }\r
59 \r
60 void NSSubscribeRequestCb(NSConsumer *consumer)\r
61 {\r
62     NS_LOG(DEBUG, "NSSubscribeRequestCb - IN");\r
63     g_subscribeRequestCb(consumer);\r
64     NS_LOG(DEBUG, "NSSubscribeRequestCb - OUT");\r
65 }\r
66 \r
67 void NSSyncCb(NSSyncInfo *sync)\r
68 {\r
69     NS_LOG(DEBUG, "NSSyncCb - IN");\r
70     g_syncCb(sync);\r
71     NS_LOG(DEBUG, "NSSyncCb - OUT");\r
72 }\r
73 \r
74 NSResult NSStartProvider(NSAccessPolicy policy, NSSubscribeRequestCallback subscribeRequestCb,\r
75         NSProviderSyncInfoCallback syncCb)\r
76 {\r
77     NS_LOG(DEBUG, "NSStartProvider - IN");\r
78 \r
79     initializeMutex();\r
80 \r
81     pthread_mutex_lock(&nsInitMutex);\r
82 \r
83     if (!initProvider)\r
84     {\r
85         NS_LOG(DEBUG, "Init Provider");\r
86         initProvider = true;\r
87         NSInitProviderInfo();\r
88         NSSetSubscriptionAccessPolicy(policy);\r
89         NSRegisterSubscribeRequestCb(subscribeRequestCb);\r
90         NSRegisterSyncCb(syncCb);\r
91         CARegisterNetworkMonitorHandler(NSProviderAdapterStateListener,\r
92                 NSProviderConnectionStateListener);\r
93 \r
94         NSSetList();\r
95         NSInitScheduler();\r
96         NSStartScheduler();\r
97 \r
98         NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);\r
99         NSPushQueue(DISCOVERY_SCHEDULER, TASK_REGISTER_RESOURCE, NULL);\r
100     }\r
101     else\r
102     {\r
103         NS_LOG(DEBUG, "Already started Notification Provider");\r
104     }\r
105     pthread_mutex_unlock(&nsInitMutex);\r
106 \r
107     NS_LOG(DEBUG, "NSStartProvider - OUT");\r
108     return NS_OK;\r
109 }\r
110 \r
111 void NSSetList()\r
112 {\r
113     NS_LOG(DEBUG, "NSSetList - IN");\r
114     pthread_mutex_init(&NSCacheMutex, NULL);\r
115     NSInitSubscriptionList();\r
116     NSInitMessageList();\r
117     NS_LOG(DEBUG, "NSSetList - OUT");\r
118 }\r
119 \r
120 NSResult NSStopProvider()\r
121 {\r
122     NS_LOG(DEBUG, "NSStopProvider - IN");\r
123     pthread_mutex_lock(&nsInitMutex);\r
124 \r
125     if(initProvider)\r
126     {\r
127         NSDeinitProviderInfo();\r
128         NSUnRegisterResource();\r
129         NSRegisterSubscribeRequestCb((NSSubscribeRequestCallback)NULL);\r
130         NSRegisterSyncCb((NSProviderSyncInfoCallback)NULL);\r
131         NSStopScheduler();\r
132         NSStorageDestroy(consumerSubList);\r
133         NSStorageDestroy(messageList);\r
134 \r
135         initProvider = false;\r
136     }\r
137 \r
138     pthread_mutex_unlock(&nsInitMutex);\r
139     NS_LOG(DEBUG, "NSStopProvider - OUT");\r
140     return NS_OK;\r
141 }\r
142 \r
143 NSResult NSProviderEnableRemoteService(char *serverAddress)\r
144 {\r
145     NS_LOG(DEBUG, "NSProviderEnableRemoteService - IN");\r
146     pthread_mutex_lock(&nsInitMutex);\r
147  \r
148     if(!initProvider)\r
149     {\r
150         NS_LOG(DEBUG, "Provider service has not been started yet");\r
151         return NS_FAIL;\r
152     }\r
153 \r
154     NS_LOG_V(DEBUG, "Remote server address: %s", serverAddress);\r
155     NSSetRemoteServerAddress(serverAddress);\r
156 \r
157     NSPushQueue(DISCOVERY_SCHEDULER, TASK_PUBLISH_RESOURCE, serverAddress);\r
158 \r
159     pthread_mutex_unlock(&nsInitMutex);\r
160     NS_LOG(DEBUG, "NSProviderEnableRemoteService - OUT");\r
161     return NS_OK;\r
162 }\r
163 \r
164 NSResult NSProviderDisableRemoteService(char *serverAddress)\r
165 {\r
166     NS_LOG(DEBUG, "NSProviderDisableRemoteService - IN");\r
167     pthread_mutex_lock(&nsInitMutex);\r
168 \r
169     if(!initProvider)\r
170     {\r
171         NS_LOG(DEBUG, "Provider service has not been started yet");\r
172         return NS_FAIL;\r
173     }\r
174     NS_LOG_V(DEBUG, "Remote server address: %s", serverAddress);\r
175     NSDeleteRemoteServerAddress(serverAddress);\r
176 \r
177     pthread_mutex_unlock(&nsInitMutex);\r
178     NS_LOG(DEBUG, "NSProviderDisableRemoteService - OUT");\r
179     return NS_OK;\r
180 }\r
181 \r
182 NSResult NSSendMessage(NSMessage *msg)\r
183 {\r
184     NS_LOG(DEBUG, "NSSendNotification - IN");\r
185 \r
186     pthread_mutex_lock(&nsInitMutex);\r
187 \r
188     if(msg == NULL)\r
189     {\r
190         NS_LOG(ERROR, "Msg is NULL");\r
191         pthread_mutex_unlock(&nsInitMutex);\r
192         return NS_ERROR;\r
193     }\r
194 \r
195     NSMessage * newMsg = NSDuplicateMessage(msg);\r
196     NSPushQueue(NOTIFICATION_SCHEDULER, TASK_SEND_NOTIFICATION, newMsg);\r
197 \r
198     pthread_mutex_unlock(&nsInitMutex);\r
199 \r
200     NS_LOG(DEBUG, "NSSendNotification - OUT");\r
201     return NS_OK;\r
202 }\r
203 \r
204 NSResult NSProviderSendSyncInfo(uint64_t messageId, NSSyncType type)\r
205 {\r
206     NS_LOG(DEBUG, "NSProviderReadCheck - IN");\r
207     pthread_mutex_lock(&nsInitMutex);\r
208 \r
209     NSSyncInfo * syncInfo = (NSSyncInfo *)OICMalloc(sizeof(NSSyncInfo));\r
210     OICStrcpy(syncInfo->providerId, UUID_STRING_SIZE, NSGetProviderInfo()->providerId);\r
211     syncInfo->messageId = messageId;\r
212     syncInfo->state = type;\r
213     NSPushQueue(NOTIFICATION_SCHEDULER, TASK_SEND_READ, syncInfo);\r
214 \r
215     pthread_mutex_unlock(&nsInitMutex);\r
216     NS_LOG(DEBUG, "NSProviderReadCheck - OUT");\r
217     return NS_OK;\r
218 }\r
219 \r
220 NSResult NSAccept(NSConsumer *consumer, bool accepted)\r
221 {\r
222     NS_LOG(DEBUG, "NSAccept - IN");\r
223 \r
224     pthread_mutex_lock(&nsInitMutex);\r
225 \r
226     NSConsumer * newConsumer = NSDuplicateConsumer(consumer);\r
227 \r
228     if(accepted)\r
229     {\r
230         NS_LOG(DEBUG, "accepted is true - ALLOW");\r
231         NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_ALLOW, newConsumer);\r
232     }\r
233     else\r
234     {\r
235         NS_LOG(DEBUG, "accepted is false - DENY");\r
236         NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_DENY, newConsumer);\r
237     }\r
238 \r
239     pthread_mutex_unlock(&nsInitMutex);\r
240     NS_LOG(DEBUG, "NSAccept - OUT");\r
241     return NS_OK;\r
242 }\r
243 \r
244 NSMessage * NSCreateMessage()\r
245 {\r
246     NS_LOG(DEBUG, "NSCreateMessage - IN");\r
247     pthread_mutex_lock(&nsInitMutex);\r
248 \r
249     NSMessage * msg = NSInitializeMessage();\r
250     OICStrcpy(msg->providerId, UUID_STRING_SIZE, NSGetProviderInfo()->providerId);\r
251 \r
252     pthread_mutex_unlock(&nsInitMutex);\r
253     NS_LOG(DEBUG, "NSCreateMessage - OUT");\r
254     return msg;\r
255 }\r
256 \r
257 void * NSInterfaceSchedule(void * ptr)\r
258 {\r
259     if (ptr == NULL)\r
260     {\r
261         NS_LOG(DEBUG, "Create NSReponseSchedule");\r
262     }\r
263 \r
264     while (NSIsRunning[INTERFACE_SCHEDULER])\r
265     {\r
266         sem_wait(&NSSemaphore[INTERFACE_SCHEDULER]);\r
267         pthread_mutex_lock(&NSMutex[INTERFACE_SCHEDULER]);\r
268 \r
269         if (NSHeadMsg[INTERFACE_SCHEDULER] != NULL)\r
270         {\r
271             NSTask *node = NSHeadMsg[INTERFACE_SCHEDULER];\r
272             NSHeadMsg[INTERFACE_SCHEDULER] = node->nextTask;\r
273 \r
274             switch (node->taskType)\r
275             {\r
276                 case TASK_CB_SUBSCRIPTION:\r
277                 {\r
278                     NS_LOG(DEBUG, "CASE TASK_CB_SUBSCRIPTION : ");\r
279 \r
280                     OCEntityHandlerRequest * request = (OCEntityHandlerRequest*)node->taskData;\r
281                     NSConsumer * consumer = (NSConsumer *)OICMalloc(sizeof(NSConsumer));\r
282 \r
283                     char * consumerId = NSGetValueFromQuery(OICStrdup(request->query),\r
284                             NS_QUERY_CONSUMER_ID);\r
285 \r
286                     if(consumerId)\r
287                     {\r
288                         OICStrcpy(consumer->consumerId, UUID_STRING_SIZE, consumerId);\r
289                         NSSubscribeRequestCb(consumer);\r
290                     }\r
291 \r
292                     NSFreeConsumer(consumer);\r
293                     NSFreeOCEntityHandlerRequest(request);\r
294 \r
295                     break;\r
296                 }\r
297                 case TASK_CB_SYNC:\r
298                 {\r
299                     NS_LOG(DEBUG, "CASE TASK_CB_SYNC : ");\r
300                     NSSyncInfo * sync = (NSSyncInfo*)node->taskData;\r
301                     NSSyncCb(NSDuplicateSync(sync));\r
302                     NSFreeSync(sync);\r
303                     break;\r
304                 }\r
305                 default:\r
306                     NS_LOG(DEBUG, "No Task Type");\r
307                     break;\r
308             }\r
309             OICFree(node);\r
310         }\r
311 \r
312         pthread_mutex_unlock(&NSMutex[INTERFACE_SCHEDULER]);\r
313     }\r
314 \r
315     NS_LOG(DEBUG, "Destroy NSResponseSchedule");\r
316     return NULL;\r
317 }\r