Remove MessagList in Provider side.
[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     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     NS_LOG(DEBUG, "NSProviderEnableRemoteService - IN");\r
131     pthread_mutex_lock(&nsInitMutex);\r
132 \r
133     if(!initProvider)\r
134     {\r
135         NS_LOG(DEBUG, "Provider service has not been started yet");\r
136         pthread_mutex_unlock(&nsInitMutex);\r
137         return NS_FAIL;\r
138     }\r
139     NS_LOG(DEBUG, "Check the remote server login");\r
140     NS_LOG_V(DEBUG, "Remote server address: %s", serverAddress);\r
141 #ifdef RD_CLIENT\r
142     NS_LOG(DEBUG, "Request to publish resource");\r
143     NSPushQueue(DISCOVERY_SCHEDULER, TASK_PUBLISH_RESOURCE, serverAddress);\r
144 #endif\r
145 \r
146     pthread_mutex_unlock(&nsInitMutex);\r
147     NS_LOG(DEBUG, "NSProviderEnableRemoteService - OUT");\r
148     return NS_OK;\r
149 }\r
150 \r
151 NSResult NSProviderDisableRemoteService(char *serverAddress)\r
152 {\r
153     NS_LOG(DEBUG, "NSProviderDisableRemoteService - IN");\r
154     pthread_mutex_lock(&nsInitMutex);\r
155 \r
156     if(!initProvider)\r
157     {\r
158         NS_LOG(DEBUG, "Provider service has not been started yet");\r
159         return NS_FAIL;\r
160     }\r
161     NS_LOG_V(DEBUG, "Remote server address: %s", serverAddress);\r
162 #ifdef RD_CLIENT\r
163     NS_LOG(DEBUG, "Delete remote server info");\r
164     NSDeleteRemoteServerAddress(serverAddress);\r
165 #endif\r
166 \r
167     pthread_mutex_unlock(&nsInitMutex);\r
168     NS_LOG(DEBUG, "NSProviderDisableRemoteService - OUT");\r
169     return NS_OK;\r
170 }\r
171 \r
172 NSResult NSSendMessage(NSMessage * msg)\r
173 {\r
174     NS_LOG(DEBUG, "NSSendNotification - IN");\r
175 \r
176     pthread_mutex_lock(&nsInitMutex);\r
177 \r
178     if(msg == NULL)\r
179     {\r
180         NS_LOG(ERROR, "Msg is NULL");\r
181         pthread_mutex_unlock(&nsInitMutex);\r
182         return NS_ERROR;\r
183     }\r
184 \r
185     NSMessage * newMsg = NSDuplicateMessage(msg);\r
186     NSPushQueue(NOTIFICATION_SCHEDULER, TASK_SEND_NOTIFICATION, newMsg);\r
187 \r
188     pthread_mutex_unlock(&nsInitMutex);\r
189 \r
190     NS_LOG(DEBUG, "NSSendNotification - OUT");\r
191     return NS_OK;\r
192 }\r
193 \r
194 NSResult NSProviderSendSyncInfo(uint64_t messageId, NSSyncType type)\r
195 {\r
196     NS_LOG(DEBUG, "NSProviderReadCheck - IN");\r
197     pthread_mutex_lock(&nsInitMutex);\r
198 \r
199     NSSyncInfo * syncInfo = (NSSyncInfo *)OICMalloc(sizeof(NSSyncInfo));\r
200     OICStrcpy(syncInfo->providerId, UUID_STRING_SIZE, NSGetProviderInfo()->providerId);\r
201     syncInfo->messageId = messageId;\r
202     syncInfo->state = type;\r
203     NSPushQueue(NOTIFICATION_SCHEDULER, TASK_SEND_READ, syncInfo);\r
204 \r
205     pthread_mutex_unlock(&nsInitMutex);\r
206     NS_LOG(DEBUG, "NSProviderReadCheck - OUT");\r
207     return NS_OK;\r
208 }\r
209 \r
210 NSResult NSAcceptSubscription(const char * consumerId, bool accepted)\r
211 {\r
212     NS_LOG(DEBUG, "NSAccept - IN");\r
213 \r
214     pthread_mutex_lock(&nsInitMutex);\r
215 \r
216     char * newConsumerId = OICStrdup(consumerId);\r
217     if(accepted)\r
218     {\r
219         NS_LOG(DEBUG, "accepted is true - ALLOW");\r
220         NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_ALLOW, newConsumerId);\r
221     }\r
222     else\r
223     {\r
224         NS_LOG(DEBUG, "accepted is false - DENY");\r
225         NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_DENY, newConsumerId);\r
226     }\r
227 \r
228     pthread_mutex_unlock(&nsInitMutex);\r
229     NS_LOG(DEBUG, "NSAccept - OUT");\r
230     return NS_OK;\r
231 }\r
232 \r
233 NSMessage * NSCreateMessage()\r
234 {\r
235     NS_LOG(DEBUG, "NSCreateMessage - IN");\r
236     pthread_mutex_lock(&nsInitMutex);\r
237 \r
238     NSMessage * msg = NSInitializeMessage();\r
239     OICStrcpy(msg->providerId, UUID_STRING_SIZE, NSGetProviderInfo()->providerId);\r
240 \r
241     pthread_mutex_unlock(&nsInitMutex);\r
242     NS_LOG(DEBUG, "NSCreateMessage - OUT");\r
243     return msg;\r
244 }\r
245 \r
246 NSTopicLL * NSProviderGetConsumerTopics(const char * consumerId)\r
247 {\r
248     NS_LOG(DEBUG, "NSProviderGetConsumerTopics - IN");\r
249     pthread_mutex_lock(&nsInitMutex);\r
250 \r
251     if(!consumerId)\r
252     {\r
253         NS_LOG(DEBUG, "consumer id should be set");\r
254         pthread_mutex_unlock(&nsInitMutex);\r
255         return NS_FAIL;\r
256     }\r
257 \r
258     NSTopicLL * topics = NSProviderGetConsumerTopicsCacheData(registeredTopicList,\r
259             consumerTopicList, consumerId);\r
260 \r
261     pthread_mutex_unlock(&nsInitMutex);\r
262     return topics;\r
263 }\r
264 \r
265 NSTopicLL * NSProviderGetTopics()\r
266 {\r
267     NS_LOG(DEBUG, "NSProviderGetTopics - IN");\r
268     pthread_mutex_lock(&nsInitMutex);\r
269 \r
270     NSTopicLL * topics = NSProviderGetTopicsCacheData(registeredTopicList);\r
271 \r
272     pthread_mutex_unlock(&nsInitMutex);\r
273     NS_LOG(DEBUG, "NSProviderGetTopics - OUT");\r
274 \r
275     return topics;\r
276 }\r
277 \r
278 NSResult NSProviderRegisterTopic(const char * topicName)\r
279 {\r
280     NS_LOG(DEBUG, "NSProviderAddTopics - IN");\r
281     pthread_mutex_lock(&nsInitMutex);\r
282 \r
283     if(!topicName)\r
284     {\r
285         pthread_mutex_unlock(&nsInitMutex);\r
286         NS_LOG(DEBUG, "topic Name should be set");\r
287         return NS_FAIL;\r
288     }\r
289 \r
290     NSPushQueue(TOPIC_SCHEDULER, TASK_ADD_TOPIC, OICStrdup(topicName));\r
291 \r
292     pthread_mutex_unlock(&nsInitMutex);\r
293     NS_LOG(DEBUG, "NSProviderAddTopics - OUT");\r
294     return NS_OK;\r
295 }\r
296 \r
297 NSResult NSProviderUnregisterTopic(const char * topicName)\r
298 {\r
299     NS_LOG(DEBUG, "NSProviderDeleteTopics - IN");\r
300     pthread_mutex_lock(&nsInitMutex);\r
301 \r
302     if(!topicName)\r
303     {\r
304         pthread_mutex_unlock(&nsInitMutex);\r
305         NS_LOG(DEBUG, "topic Name should be set");\r
306         return NS_FAIL;\r
307     }\r
308 \r
309     NSPushQueue(TOPIC_SCHEDULER, TASK_DELETE_TOPIC, topicName);\r
310 \r
311     pthread_mutex_unlock(&nsInitMutex);\r
312     NS_LOG(DEBUG, "NSProviderDeleteTopics - OUT");\r
313     return NS_OK;\r
314 }\r
315 \r
316 NSResult NSProviderSetConsumerTopic(const char * consumerId, const char * topicName)\r
317 {\r
318     NS_LOG(DEBUG, "NSProviderSelectTopics - IN");\r
319     pthread_mutex_lock(&nsInitMutex);\r
320 \r
321     if(!consumerId || !topicName || !NSGetPolicy())\r
322     {\r
323         NS_LOG(DEBUG, "consumer id should be set for topic subscription or "\r
324                 "Configuration must set to true.");\r
325         pthread_mutex_unlock(&nsInitMutex);\r
326         return NS_FAIL;\r
327     }\r
328 \r
329     NSCacheTopicSubData * topicSubData =\r
330             (NSCacheTopicSubData *) OICMalloc(sizeof(NSCacheTopicSubData));\r
331 \r
332     OICStrcpy(topicSubData->id, NS_UUID_STRING_SIZE, consumerId);\r
333     topicSubData->topicName = OICStrdup(topicName);\r
334 \r
335     NSPushQueue(TOPIC_SCHEDULER, TASK_SUBSCRIBE_TOPIC, (void *)topicSubData);\r
336 \r
337     pthread_mutex_unlock(&nsInitMutex);\r
338     NS_LOG(DEBUG, "NSProviderSelectTopics - OUT");\r
339     return NS_OK;\r
340 }\r
341 \r
342 NSResult NSProviderUnsetConsumerTopic(const char * consumerId, const char * topicName)\r
343 {\r
344     NS_LOG(DEBUG, "NSProviderUnselectTopics - IN");\r
345     pthread_mutex_lock(&nsInitMutex);\r
346 \r
347     if(!consumerId || !topicName || !NSGetPolicy())\r
348     {\r
349         NS_LOG(DEBUG, "consumer id should be set for topic subscription or "\r
350                 "Configuration must set to true.");\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