Merge branch 'notification-service'
[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 "NSProviderCallbackResponse.h"\r
27 #include "NSStorageAdapter.h"\r
28 #include "NSProviderMemoryCache.h"\r
29 #include "NSProviderTopic.h"\r
30 #include "oic_malloc.h"\r
31 #include "oic_string.h"\r
32 #include "cautilinterface.h"\r
33 #include "NSProviderSystem.h"\r
34 #include "oic_time.h"\r
35 \r
36 bool initProvider = false;\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 NSResult NSStartProvider(NSProviderConfig config)\r
47 {\r
48     NS_LOG(DEBUG, "NSStartProvider - IN");\r
49 \r
50     initializeMutex();\r
51 \r
52     pthread_mutex_lock(&nsInitMutex);\r
53 \r
54     if (!initProvider)\r
55     {\r
56         NS_LOG(DEBUG, "Init Provider");\r
57         initProvider = true;\r
58         NSInitProviderInfo(config.userInfo);\r
59         NSSetSubscriptionAccessPolicy(config.policy);\r
60         NSRegisterSubscribeRequestCb(config.subRequestCallback);\r
61         NSRegisterSyncCb(config.syncInfoCallback);\r
62         CARegisterNetworkMonitorHandler((CAAdapterStateChangedCB)NSProviderAdapterStateListener,\r
63                 (CAConnectionStateChangedCB)NSProviderConnectionStateListener);\r
64 \r
65         NSSetList();\r
66         NSInitScheduler();\r
67         NSStartScheduler();\r
68 \r
69         NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);\r
70         NSPushQueue(DISCOVERY_SCHEDULER, TASK_REGISTER_RESOURCE, NULL);\r
71     }\r
72     else\r
73     {\r
74         NS_LOG(DEBUG, "Already started Notification Provider");\r
75     }\r
76     pthread_mutex_unlock(&nsInitMutex);\r
77 \r
78     NS_LOG(DEBUG, "NSStartProvider - OUT");\r
79     return NS_OK;\r
80 }\r
81 \r
82 void NSSetList()\r
83 {\r
84     NS_LOG(DEBUG, "NSSetList - IN");\r
85 \r
86     pthread_mutexattr_init(&NSCacheMutexAttr);\r
87     int pthreadResult = pthread_mutexattr_settype(&NSCacheMutexAttr, PTHREAD_MUTEX_RECURSIVE);\r
88     pthread_mutex_init(&NSCacheMutex, &NSCacheMutexAttr);\r
89 \r
90     NSInitSubscriptionList();\r
91     NSInitMessageList();\r
92     NSInitTopicList();\r
93     NS_LOG(DEBUG, "NSSetList - OUT");\r
94 }\r
95 \r
96 void NSDestroyList()\r
97 {\r
98     NSStorageDestroy(consumerSubList);\r
99     NSStorageDestroy(messageList);\r
100     NSStorageDestroy(consumerTopicList);\r
101     NSStorageDestroy(registeredTopicList);\r
102 \r
103     pthread_mutex_destroy(&NSCacheMutex);\r
104     pthread_mutexattr_destroy(&NSCacheMutexAttr);\r
105 }\r
106 \r
107 NSResult NSStopProvider()\r
108 {\r
109     NS_LOG(DEBUG, "NSStopProvider - IN");\r
110     pthread_mutex_lock(&nsInitMutex);\r
111 \r
112     if(initProvider)\r
113     {\r
114         NSPushQueue(DISCOVERY_SCHEDULER, TASK_STOP_PRESENCE, NULL);\r
115         NSDeinitProviderInfo();\r
116         NSUnRegisterResource();\r
117         NSRegisterSubscribeRequestCb((NSSubscribeRequestCallback)NULL);\r
118         NSRegisterSyncCb((NSProviderSyncInfoCallback)NULL);\r
119         NSStopScheduler();\r
120         NSDestroyList();\r
121 \r
122         initProvider = false;\r
123     }\r
124 \r
125     pthread_mutex_unlock(&nsInitMutex);\r
126     NS_LOG(DEBUG, "NSStopProvider - OUT");\r
127     return NS_OK;\r
128 }\r
129 \r
130 NSResult NSProviderEnableRemoteService(char *serverAddress)\r
131 {\r
132     NS_LOG(DEBUG, "NSProviderEnableRemoteService - IN");\r
133     pthread_mutex_lock(&nsInitMutex);\r
134 \r
135 if(!initProvider)\r
136     {\r
137         NS_LOG(DEBUG, "Provider service has not been started yet");\r
138         pthread_mutex_unlock(&nsInitMutex);\r
139         return NS_FAIL;\r
140     }\r
141     NS_LOG(DEBUG, "Check the remote server login");\r
142     NS_LOG_V(DEBUG, "Remote server address: %s", serverAddress);\r
143 #ifdef RD_CLIENT\r
144     NS_LOG(DEBUG, "Request to publish resource");\r
145     NSPushQueue(DISCOVERY_SCHEDULER, TASK_PUBLISH_RESOURCE, serverAddress);\r
146 #endif\r
147 \r
148     pthread_mutex_unlock(&nsInitMutex);\r
149     NS_LOG(DEBUG, "NSProviderEnableRemoteService - OUT");\r
150     return NS_OK;\r
151 }\r
152 \r
153 NSResult NSProviderDisableRemoteService(char *serverAddress)\r
154 {\r
155     NS_LOG(DEBUG, "NSProviderDisableRemoteService - IN");\r
156     pthread_mutex_lock(&nsInitMutex);\r
157 \r
158     if(!initProvider)\r
159     {\r
160         NS_LOG(DEBUG, "Provider service has not been started yet");\r
161         return NS_FAIL;\r
162     }\r
163     NS_LOG_V(DEBUG, "Remote server address: %s", serverAddress);\r
164 #ifdef RD_CLIENT\r
165     NS_LOG(DEBUG, "Delete remote server info");\r
166     NSDeleteRemoteServerAddress(serverAddress);\r
167 #endif\r
168 \r
169     pthread_mutex_unlock(&nsInitMutex);\r
170     NS_LOG(DEBUG, "NSProviderDisableRemoteService - OUT");\r
171     return NS_OK;\r
172 }\r
173 \r
174 NSResult NSSendMessage(NSMessage *msg)\r
175 {\r
176     NS_LOG(DEBUG, "NSSendNotification - IN");\r
177 \r
178     pthread_mutex_lock(&nsInitMutex);\r
179 \r
180     if(msg == NULL)\r
181     {\r
182         NS_LOG(ERROR, "Msg is NULL");\r
183         pthread_mutex_unlock(&nsInitMutex);\r
184         return NS_ERROR;\r
185     }\r
186 \r
187     NSMessage * newMsg = NSDuplicateMessage(msg);\r
188     NSPushQueue(NOTIFICATION_SCHEDULER, TASK_SEND_NOTIFICATION, newMsg);\r
189 \r
190     pthread_mutex_unlock(&nsInitMutex);\r
191 \r
192     NS_LOG(DEBUG, "NSSendNotification - OUT");\r
193     return NS_OK;\r
194 }\r
195 \r
196 NSResult NSProviderSendSyncInfo(uint64_t messageId, NSSyncType type)\r
197 {\r
198     NS_LOG(DEBUG, "NSProviderReadCheck - IN");\r
199     pthread_mutex_lock(&nsInitMutex);\r
200 \r
201     NSSyncInfo * syncInfo = (NSSyncInfo *)OICMalloc(sizeof(NSSyncInfo));\r
202     OICStrcpy(syncInfo->providerId, UUID_STRING_SIZE, NSGetProviderInfo()->providerId);\r
203     syncInfo->messageId = messageId;\r
204     syncInfo->state = type;\r
205     NSPushQueue(NOTIFICATION_SCHEDULER, TASK_SEND_READ, syncInfo);\r
206 \r
207     pthread_mutex_unlock(&nsInitMutex);\r
208     NS_LOG(DEBUG, "NSProviderReadCheck - OUT");\r
209     return NS_OK;\r
210 }\r
211 \r
212 NSResult NSAcceptSubscription(NSConsumer *consumer, bool accepted)\r
213 {\r
214     NS_LOG(DEBUG, "NSAccept - IN");\r
215 \r
216     pthread_mutex_lock(&nsInitMutex);\r
217 \r
218     NSConsumer * newConsumer = NSDuplicateConsumer(consumer);\r
219     if(accepted)\r
220     {\r
221         NS_LOG(DEBUG, "accepted is true - ALLOW");\r
222         NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_ALLOW, newConsumer);\r
223     }\r
224     else\r
225     {\r
226         NS_LOG(DEBUG, "accepted is false - DENY");\r
227         NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_DENY, newConsumer);\r
228     }\r
229 \r
230     pthread_mutex_unlock(&nsInitMutex);\r
231     NS_LOG(DEBUG, "NSAccept - OUT");\r
232     return NS_OK;\r
233 }\r
234 \r
235 NSMessage * NSCreateMessage()\r
236 {\r
237     NS_LOG(DEBUG, "NSCreateMessage - IN");\r
238     pthread_mutex_lock(&nsInitMutex);\r
239 \r
240     NSMessage * msg = NSInitializeMessage();\r
241     OICStrcpy(msg->providerId, UUID_STRING_SIZE, NSGetProviderInfo()->providerId);\r
242 \r
243     pthread_mutex_unlock(&nsInitMutex);\r
244     NS_LOG(DEBUG, "NSCreateMessage - OUT");\r
245     return msg;\r
246 }\r
247 \r
248 NSTopicLL * NSProviderGetConsumerTopics(char *consumerId)\r
249 {\r
250     NS_LOG(DEBUG, "NSProviderGetConsumerTopics - IN");\r
251     pthread_mutex_lock(&nsInitMutex);\r
252 \r
253     if(!consumerId)\r
254     {\r
255         NS_LOG(DEBUG, "consumer id should be set");\r
256         pthread_mutex_unlock(&nsInitMutex);\r
257         return NS_FAIL;\r
258     }\r
259 \r
260     NSTopicLL * topics = NSProviderGetConsumerTopicsCacheData(registeredTopicList,\r
261             consumerTopicList, consumerId);\r
262 \r
263     pthread_mutex_unlock(&nsInitMutex);\r
264     return topics;\r
265 }\r
266 \r
267 NSTopicLL * NSProviderGetTopics()\r
268 {\r
269     NS_LOG(DEBUG, "NSProviderGetTopics - IN");\r
270     pthread_mutex_lock(&nsInitMutex);\r
271 \r
272     NSTopicLL * topics = NSProviderGetTopicsCacheData(registeredTopicList);\r
273 \r
274     pthread_mutex_unlock(&nsInitMutex);\r
275     NS_LOG(DEBUG, "NSProviderGetTopics - OUT");\r
276 \r
277     return topics;\r
278 }\r
279 \r
280 NSResult NSProviderAddTopic(char *topicName)\r
281 {\r
282     NS_LOG(DEBUG, "NSProviderAddTopics - IN");\r
283     pthread_mutex_lock(&nsInitMutex);\r
284 \r
285     if(!topicName)\r
286     {\r
287         pthread_mutex_unlock(&nsInitMutex);\r
288         NS_LOG(DEBUG, "topic Name should be set");\r
289         return NS_FAIL;\r
290     }\r
291 \r
292     NSPushQueue(TOPIC_SCHEDULER, TASK_ADD_TOPIC, OICStrdup(topicName));\r
293 \r
294     pthread_mutex_unlock(&nsInitMutex);\r
295     NS_LOG(DEBUG, "NSProviderAddTopics - OUT");\r
296     return NS_OK;\r
297 }\r
298 \r
299 NSResult NSProviderDeleteTopic(char *topicName)\r
300 {\r
301     NS_LOG(DEBUG, "NSProviderDeleteTopics - IN");\r
302     pthread_mutex_lock(&nsInitMutex);\r
303 \r
304     if(!topicName)\r
305     {\r
306         pthread_mutex_unlock(&nsInitMutex);\r
307         NS_LOG(DEBUG, "topic Name should be set");\r
308         return NS_FAIL;\r
309     }\r
310 \r
311     NSPushQueue(TOPIC_SCHEDULER, TASK_DELETE_TOPIC, topicName);\r
312 \r
313     pthread_mutex_unlock(&nsInitMutex);\r
314     NS_LOG(DEBUG, "NSProviderDeleteTopics - OUT");\r
315     return NS_OK;\r
316 }\r
317 \r
318 NSResult NSProviderSelectTopic(char *consumerId, char *topicName)\r
319 {\r
320     NS_LOG(DEBUG, "NSProviderSelectTopics - IN");\r
321     pthread_mutex_lock(&nsInitMutex);\r
322 \r
323     if(!consumerId || !topicName)\r
324     {\r
325         pthread_mutex_unlock(&nsInitMutex);\r
326         NS_LOG(DEBUG, "consumer id should be set for topic subscription");\r
327         return NS_FAIL;\r
328     }\r
329 \r
330     NSCacheTopicSubData * topicSubData =\r
331             (NSCacheTopicSubData *) OICMalloc(sizeof(NSCacheTopicSubData));\r
332 \r
333     OICStrcpy(topicSubData->id, NS_UUID_STRING_SIZE, consumerId);\r
334     topicSubData->topicName = OICStrdup(topicName);\r
335 \r
336     NSPushQueue(TOPIC_SCHEDULER, TASK_SUBSCRIBE_TOPIC, (void *)topicSubData);\r
337 \r
338     pthread_mutex_unlock(&nsInitMutex);\r
339     NS_LOG(DEBUG, "NSProviderSelectTopics - OUT");\r
340     return NS_OK;\r
341 }\r
342 \r
343 NSResult NSProviderUnselectTopic(char *consumerId, char *topicName)\r
344 {\r
345     NS_LOG(DEBUG, "NSProviderUnselectTopics - IN");\r
346     pthread_mutex_lock(&nsInitMutex);\r
347 \r
348     if(!consumerId || !topicName)\r
349     {\r
350         NS_LOG(DEBUG, "consumer id should be set for topic subscription");\r
351         pthread_mutex_unlock(&nsInitMutex);\r
352         return NS_FAIL;\r
353     }\r
354 \r
355     NSCacheTopicSubData * topicSubData =\r
356             (NSCacheTopicSubData *) OICMalloc(sizeof(NSCacheTopicSubData));\r
357 \r
358     OICStrcpy(topicSubData->id, NS_UUID_STRING_SIZE, consumerId);\r
359     topicSubData->topicName = OICStrdup(topicName);\r
360 \r
361     NSPushQueue(TOPIC_SCHEDULER, TASK_UNSUBSCRIBE_TOPIC, (void *)topicSubData);\r
362 \r
363     pthread_mutex_unlock(&nsInitMutex);\r
364     NS_LOG(DEBUG, "NSProviderUnselectTopics - OUT");\r
365     return NS_OK;\r
366 }\r
367 \r