Replace conditional compilation marcro WITH_CLOUD 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 "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     pthread_mutexattr_settype(&NSCacheMutexAttr, PTHREAD_MUTEX_RECURSIVE);\r
88     pthread_mutex_init(&NSCacheMutex, &NSCacheMutexAttr);\r
89 \r
90     NSInitSubscriptionList();\r
91     NSInitTopicList();\r
92     NS_LOG(DEBUG, "NSSetList - OUT");\r
93 }\r
94 \r
95 void NSDestroyList()\r
96 {\r
97     NSStorageDestroy(consumerSubList);\r
98     NSStorageDestroy(consumerTopicList);\r
99     NSStorageDestroy(registeredTopicList);\r
100 \r
101     pthread_mutex_destroy(&NSCacheMutex);\r
102     pthread_mutexattr_destroy(&NSCacheMutexAttr);\r
103 }\r
104 \r
105 NSResult NSStopProvider()\r
106 {\r
107     NS_LOG(DEBUG, "NSStopProvider - IN");\r
108     pthread_mutex_lock(&nsInitMutex);\r
109 \r
110     if(initProvider)\r
111     {\r
112         NSPushQueue(DISCOVERY_SCHEDULER, TASK_STOP_PRESENCE, NULL);\r
113         NSDeinitProviderInfo();\r
114         NSUnRegisterResource();\r
115         NSRegisterSubscribeRequestCb((NSSubscribeRequestCallback)NULL);\r
116         NSRegisterSyncCb((NSProviderSyncInfoCallback)NULL);\r
117         NSStopScheduler();\r
118         NSDestroyList();\r
119 \r
120         initProvider = false;\r
121     }\r
122 \r
123     pthread_mutex_unlock(&nsInitMutex);\r
124     NS_LOG(DEBUG, "NSStopProvider - OUT");\r
125     return NS_OK;\r
126 }\r
127 \r
128 NSResult NSProviderEnableRemoteService(char *serverAddress)\r
129 {\r
130 #if(defined WITH_CLOUD && defined RD_CLIENT)\r
131     NS_LOG(DEBUG, "NSProviderEnableRemoteService - IN");\r
132     pthread_mutex_lock(&nsInitMutex);\r
133 \r
134     if(!initProvider)\r
135     {\r
136         NS_LOG(DEBUG, "Provider service has not been started yet");\r
137         pthread_mutex_unlock(&nsInitMutex);\r
138         return NS_FAIL;\r
139     }\r
140     NS_LOG_V(DEBUG, "Remote server address: %s", serverAddress);\r
141     NS_LOG(DEBUG, "Request to publish resource");\r
142     NSPushQueue(DISCOVERY_SCHEDULER, TASK_PUBLISH_RESOURCE, serverAddress);\r
143 \r
144     pthread_mutex_unlock(&nsInitMutex);\r
145     NS_LOG(DEBUG, "NSProviderEnableRemoteService - OUT");\r
146     return NS_OK;\r
147 #endif\r
148     NS_LOG_V(DEBUG, "Not logged in remote server: %s", serverAddress);\r
149     return NS_FAIL;\r
150 }\r
151 \r
152 NSResult NSProviderDisableRemoteService(char *serverAddress)\r
153 {\r
154 #if(defined WITH_CLOUD && defined RD_CLIENT)\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 \r
165     NS_LOG(DEBUG, "Delete remote server info");\r
166     NSDeleteRemoteServerAddress(serverAddress);\r
167 \r
168     pthread_mutex_unlock(&nsInitMutex);\r
169     NS_LOG(DEBUG, "NSProviderDisableRemoteService - OUT");\r
170     return NS_OK;\r
171 #endif\r
172     NS_LOG_V(DEBUG, "Not logged in remote server : %s", serverAddress);\r
173     return NS_FAIL;\r
174 }\r
175 \r
176 NSResult NSSendMessage(NSMessage * msg)\r
177 {\r
178     NS_LOG(DEBUG, "NSSendNotification - IN");\r
179 \r
180     pthread_mutex_lock(&nsInitMutex);\r
181 \r
182     if(msg == NULL)\r
183     {\r
184         NS_LOG(ERROR, "Msg is NULL");\r
185         pthread_mutex_unlock(&nsInitMutex);\r
186         return NS_ERROR;\r
187     }\r
188 \r
189     NSMessage * newMsg = NSDuplicateMessage(msg);\r
190     NSPushQueue(NOTIFICATION_SCHEDULER, TASK_SEND_NOTIFICATION, newMsg);\r
191 \r
192     pthread_mutex_unlock(&nsInitMutex);\r
193 \r
194     NS_LOG(DEBUG, "NSSendNotification - OUT");\r
195     return NS_OK;\r
196 }\r
197 \r
198 NSResult NSProviderSendSyncInfo(uint64_t messageId, NSSyncType type)\r
199 {\r
200     NS_LOG(DEBUG, "NSProviderReadCheck - IN");\r
201     pthread_mutex_lock(&nsInitMutex);\r
202 \r
203     NSSyncInfo * syncInfo = (NSSyncInfo *)OICMalloc(sizeof(NSSyncInfo));\r
204     OICStrcpy(syncInfo->providerId, UUID_STRING_SIZE, NSGetProviderInfo()->providerId);\r
205     syncInfo->messageId = messageId;\r
206     syncInfo->state = type;\r
207     NSPushQueue(NOTIFICATION_SCHEDULER, TASK_SEND_READ, syncInfo);\r
208 \r
209     pthread_mutex_unlock(&nsInitMutex);\r
210     NS_LOG(DEBUG, "NSProviderReadCheck - OUT");\r
211     return NS_OK;\r
212 }\r
213 \r
214 NSResult NSAcceptSubscription(const char * consumerId, bool accepted)\r
215 {\r
216     NS_LOG(DEBUG, "NSAccept - IN");\r
217 \r
218     pthread_mutex_lock(&nsInitMutex);\r
219 \r
220     char * newConsumerId = OICStrdup(consumerId);\r
221     if(accepted)\r
222     {\r
223         NS_LOG(DEBUG, "accepted is true - ALLOW");\r
224         NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_ALLOW, newConsumerId);\r
225     }\r
226     else\r
227     {\r
228         NS_LOG(DEBUG, "accepted is false - DENY");\r
229         NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_DENY, newConsumerId);\r
230     }\r
231 \r
232     pthread_mutex_unlock(&nsInitMutex);\r
233     NS_LOG(DEBUG, "NSAccept - OUT");\r
234     return NS_OK;\r
235 }\r
236 \r
237 NSMessage * NSCreateMessage()\r
238 {\r
239     NS_LOG(DEBUG, "NSCreateMessage - IN");\r
240     pthread_mutex_lock(&nsInitMutex);\r
241 \r
242     NSMessage * msg = NSInitializeMessage();\r
243     OICStrcpy(msg->providerId, UUID_STRING_SIZE, NSGetProviderInfo()->providerId);\r
244 \r
245     pthread_mutex_unlock(&nsInitMutex);\r
246     NS_LOG(DEBUG, "NSCreateMessage - OUT");\r
247     return msg;\r
248 }\r
249 \r
250 NSTopicLL * NSProviderGetConsumerTopics(const char * consumerId)\r
251 {\r
252     NS_LOG(DEBUG, "NSProviderGetConsumerTopics - IN");\r
253     pthread_mutex_lock(&nsInitMutex);\r
254 \r
255     if(!consumerId)\r
256     {\r
257         NS_LOG(DEBUG, "consumer id should be set");\r
258         pthread_mutex_unlock(&nsInitMutex);\r
259         return NULL;\r
260     }\r
261 \r
262     NSTopicLL * topics = NSProviderGetConsumerTopicsCacheData(registeredTopicList,\r
263             consumerTopicList, consumerId);\r
264 \r
265     pthread_mutex_unlock(&nsInitMutex);\r
266     return topics;\r
267 }\r
268 \r
269 NSTopicLL * NSProviderGetTopics()\r
270 {\r
271     NS_LOG(DEBUG, "NSProviderGetTopics - IN");\r
272     pthread_mutex_lock(&nsInitMutex);\r
273 \r
274     NSTopicLL * topics = NSProviderGetTopicsCacheData(registeredTopicList);\r
275 \r
276     pthread_mutex_unlock(&nsInitMutex);\r
277     NS_LOG(DEBUG, "NSProviderGetTopics - OUT");\r
278 \r
279     return topics;\r
280 }\r
281 \r
282 NSResult NSProviderRegisterTopic(const char * topicName)\r
283 {\r
284     NS_LOG(DEBUG, "NSProviderAddTopics - IN");\r
285     pthread_mutex_lock(&nsInitMutex);\r
286 \r
287     if(!topicName)\r
288     {\r
289         pthread_mutex_unlock(&nsInitMutex);\r
290         NS_LOG(DEBUG, "topic Name should be set");\r
291         return NS_FAIL;\r
292     }\r
293 \r
294     NSPushQueue(TOPIC_SCHEDULER, TASK_ADD_TOPIC, OICStrdup(topicName));\r
295 \r
296     pthread_mutex_unlock(&nsInitMutex);\r
297     NS_LOG(DEBUG, "NSProviderAddTopics - OUT");\r
298     return NS_OK;\r
299 }\r
300 \r
301 NSResult NSProviderUnregisterTopic(const char * topicName)\r
302 {\r
303     NS_LOG(DEBUG, "NSProviderDeleteTopics - IN");\r
304     pthread_mutex_lock(&nsInitMutex);\r
305 \r
306     if(!topicName)\r
307     {\r
308         pthread_mutex_unlock(&nsInitMutex);\r
309         NS_LOG(DEBUG, "topic Name should be set");\r
310         return NS_FAIL;\r
311     }\r
312 \r
313     NSPushQueue(TOPIC_SCHEDULER, TASK_DELETE_TOPIC, (void *) topicName);\r
314 \r
315     pthread_mutex_unlock(&nsInitMutex);\r
316     NS_LOG(DEBUG, "NSProviderDeleteTopics - OUT");\r
317     return NS_OK;\r
318 }\r
319 \r
320 NSResult NSProviderSetConsumerTopic(const char * consumerId, const char * topicName)\r
321 {\r
322     NS_LOG(DEBUG, "NSProviderSelectTopics - IN");\r
323     pthread_mutex_lock(&nsInitMutex);\r
324 \r
325     if(!consumerId || !topicName || !NSGetPolicy())\r
326     {\r
327         NS_LOG(DEBUG, "consumer id should be set for topic subscription or "\r
328                 "Configuration must set to true.");\r
329         pthread_mutex_unlock(&nsInitMutex);\r
330         return NS_FAIL;\r
331     }\r
332 \r
333     NSCacheTopicSubData * topicSubData =\r
334             (NSCacheTopicSubData *) OICMalloc(sizeof(NSCacheTopicSubData));\r
335 \r
336     OICStrcpy(topicSubData->id, NS_UUID_STRING_SIZE, consumerId);\r
337     topicSubData->topicName = OICStrdup(topicName);\r
338 \r
339     NSPushQueue(TOPIC_SCHEDULER, TASK_SUBSCRIBE_TOPIC, (void *)topicSubData);\r
340 \r
341     pthread_mutex_unlock(&nsInitMutex);\r
342     NS_LOG(DEBUG, "NSProviderSelectTopics - OUT");\r
343     return NS_OK;\r
344 }\r
345 \r
346 NSResult NSProviderUnsetConsumerTopic(const char * consumerId, const char * topicName)\r
347 {\r
348     NS_LOG(DEBUG, "NSProviderUnselectTopics - IN");\r
349     pthread_mutex_lock(&nsInitMutex);\r
350 \r
351     if(!consumerId || !topicName || !NSGetPolicy())\r
352     {\r
353         NS_LOG(DEBUG, "consumer id should be set for topic subscription or "\r
354                 "Configuration must set to true.");\r
355         pthread_mutex_unlock(&nsInitMutex);\r
356         return NS_FAIL;\r
357     }\r
358 \r
359     NSCacheTopicSubData * topicSubData =\r
360             (NSCacheTopicSubData *) OICMalloc(sizeof(NSCacheTopicSubData));\r
361 \r
362     OICStrcpy(topicSubData->id, NS_UUID_STRING_SIZE, consumerId);\r
363     topicSubData->topicName = OICStrdup(topicName);\r
364 \r
365     NSPushQueue(TOPIC_SCHEDULER, TASK_UNSUBSCRIBE_TOPIC, (void *)topicSubData);\r
366 \r
367     pthread_mutex_unlock(&nsInitMutex);\r
368     NS_LOG(DEBUG, "NSProviderUnselectTopics - OUT");\r
369     return NS_OK;\r
370 }\r
371 \r