Merge "Merge remote-tracking branch 'origin/master' into notification-service" into...
[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     NS_LOG(DEBUG, "NSSetList - OUT");\r
93 }\r
94 \r
95 void NSDestroyList()\r
96 {\r
97     NSStorageDestroy(consumerSubList);\r
98     NSStorageDestroy(messageList);\r
99 \r
100     pthread_mutex_destroy(&NSCacheMutex);\r
101     pthread_mutexattr_destroy(&NSCacheMutexAttr);\r
102 }\r
103 \r
104 NSResult NSStopProvider()\r
105 {\r
106     NS_LOG(DEBUG, "NSStopProvider - IN");\r
107     pthread_mutex_lock(&nsInitMutex);\r
108 \r
109     if(initProvider)\r
110     {\r
111         NSPushQueue(DISCOVERY_SCHEDULER, TASK_STOP_PRESENCE, NULL);\r
112         NSDeinitProviderInfo();\r
113         NSUnRegisterResource();\r
114         NSRegisterSubscribeRequestCb((NSSubscribeRequestCallback)NULL);\r
115         NSRegisterSyncCb((NSProviderSyncInfoCallback)NULL);\r
116         NSStopScheduler();\r
117         NSDestroyList();\r
118 \r
119         initProvider = false;\r
120     }\r
121 \r
122     pthread_mutex_unlock(&nsInitMutex);\r
123     NS_LOG(DEBUG, "NSStopProvider - OUT");\r
124     return NS_OK;\r
125 }\r
126 \r
127 #ifdef WITH_CLOUD\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 \r
140     NS_LOG_V(DEBUG, "Remote server address: %s", serverAddress);\r
141     NSPushQueue(DISCOVERY_SCHEDULER, TASK_PUBLISH_RESOURCE, serverAddress);\r
142 \r
143     pthread_mutex_unlock(&nsInitMutex);\r
144     NS_LOG(DEBUG, "NSProviderEnableRemoteService - OUT");\r
145     return NS_OK;\r
146 }\r
147 \r
148 NSResult NSProviderDisableRemoteService(char *serverAddress)\r
149 {\r
150     NS_LOG(DEBUG, "NSProviderDisableRemoteService - IN");\r
151     pthread_mutex_lock(&nsInitMutex);\r
152 \r
153     if(!initProvider)\r
154     {\r
155         NS_LOG(DEBUG, "Provider service has not been started yet");\r
156         return NS_FAIL;\r
157     }\r
158     NS_LOG_V(DEBUG, "Remote server address: %s", serverAddress);\r
159 \r
160     pthread_mutex_unlock(&nsInitMutex);\r
161     NS_LOG(DEBUG, "NSProviderDisableRemoteService - OUT");\r
162     return NS_OK;\r
163 }\r
164 #endif\r
165 \r
166 NSResult NSSendMessage(NSMessage *msg)\r
167 {\r
168     NS_LOG(DEBUG, "NSSendNotification - IN");\r
169 \r
170     pthread_mutex_lock(&nsInitMutex);\r
171 \r
172     if(msg == NULL)\r
173     {\r
174         NS_LOG(ERROR, "Msg is NULL");\r
175         pthread_mutex_unlock(&nsInitMutex);\r
176         return NS_ERROR;\r
177     }\r
178 \r
179     NSMessage * newMsg = NSDuplicateMessage(msg);\r
180     NSPushQueue(NOTIFICATION_SCHEDULER, TASK_SEND_NOTIFICATION, newMsg);\r
181 \r
182     pthread_mutex_unlock(&nsInitMutex);\r
183 \r
184     NS_LOG(DEBUG, "NSSendNotification - OUT");\r
185     return NS_OK;\r
186 }\r
187 \r
188 NSResult NSProviderSendSyncInfo(uint64_t messageId, NSSyncType type)\r
189 {\r
190     NS_LOG(DEBUG, "NSProviderReadCheck - IN");\r
191     pthread_mutex_lock(&nsInitMutex);\r
192 \r
193     NSSyncInfo * syncInfo = (NSSyncInfo *)OICMalloc(sizeof(NSSyncInfo));\r
194     OICStrcpy(syncInfo->providerId, UUID_STRING_SIZE, NSGetProviderInfo()->providerId);\r
195     syncInfo->messageId = messageId;\r
196     syncInfo->state = type;\r
197     NSPushQueue(NOTIFICATION_SCHEDULER, TASK_SEND_READ, syncInfo);\r
198 \r
199     pthread_mutex_unlock(&nsInitMutex);\r
200     NS_LOG(DEBUG, "NSProviderReadCheck - OUT");\r
201     return NS_OK;\r
202 }\r
203 \r
204 NSResult NSAcceptSubscription(NSConsumer *consumer, bool accepted)\r
205 {\r
206     NS_LOG(DEBUG, "NSAccept - IN");\r
207 \r
208     pthread_mutex_lock(&nsInitMutex);\r
209 \r
210     NSConsumer * newConsumer = NSDuplicateConsumer(consumer);\r
211     if(accepted)\r
212     {\r
213         NS_LOG(DEBUG, "accepted is true - ALLOW");\r
214         NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_ALLOW, newConsumer);\r
215     }\r
216     else\r
217     {\r
218         NS_LOG(DEBUG, "accepted is false - DENY");\r
219         NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_DENY, newConsumer);\r
220     }\r
221 \r
222     pthread_mutex_unlock(&nsInitMutex);\r
223     NS_LOG(DEBUG, "NSAccept - OUT");\r
224     return NS_OK;\r
225 }\r
226 \r
227 NSMessage * NSCreateMessage()\r
228 {\r
229     NS_LOG(DEBUG, "NSCreateMessage - IN");\r
230     pthread_mutex_lock(&nsInitMutex);\r
231 \r
232     NSMessage * msg = NSInitializeMessage();\r
233     OICStrcpy(msg->providerId, UUID_STRING_SIZE, NSGetProviderInfo()->providerId);\r
234 \r
235     pthread_mutex_unlock(&nsInitMutex);\r
236     NS_LOG(DEBUG, "NSCreateMessage - OUT");\r
237     return msg;\r
238 }\r
239 \r
240 NSTopicList * NSProviderGetTopics(char *consumerId)\r
241 {\r
242     NS_LOG(DEBUG, "NSProviderGetTopics - IN");\r
243     pthread_mutex_lock(&nsInitMutex);\r
244 \r
245     if(consumerId == NULL)\r
246     {\r
247         NS_LOG(DEBUG, "Get all the topics registered by user");\r
248     }\r
249 \r
250     NSTopicList * topicList = NSInitializeTopicList();\r
251     OICStrcpy(topicList->consumerId, UUID_STRING_SIZE, consumerId);\r
252     // OICStrcpy(topicList->topics, sizeof(NSTopic), NSGetTopics(consumerId));\r
253 \r
254     pthread_mutex_unlock(&nsInitMutex);\r
255     NS_LOG(DEBUG, "NSProviderGetTopics - OUT");\r
256 \r
257     return topicList;\r
258 }\r
259 \r
260 NSResult NSProviderSetTopics(NSTopicList *topicList)\r
261 {\r
262     NS_LOG(DEBUG, "NSProviderSetTopics - IN");\r
263     pthread_mutex_lock(&nsInitMutex);\r
264 \r
265     if(topicList->consumerId != NULL)\r
266     {\r
267         NS_LOG(DEBUG, "consumer id should be set by NULL to register topics");\r
268         return NS_FAIL;\r
269     }\r
270 \r
271     NSPushQueue(TOPIC_SCHEDULER, TASK_REGISTER_TOPICS, topicList);\r
272 \r
273     pthread_mutex_unlock(&nsInitMutex);\r
274     NS_LOG(DEBUG, "NSProviderSetTopics - OUT");\r
275     \r
276     return NS_OK;\r
277 }\r
278 \r
279 NSResult NSProviderRecommendTopics(NSTopicList *topicList)\r
280 {\r
281     NS_LOG(DEBUG, "NSProviderRecommendTopics - IN");\r
282     pthread_mutex_lock(&nsInitMutex);\r
283 \r
284     if(topicList->consumerId == NULL)\r
285     {\r
286         NS_LOG(DEBUG, "consumer id should be set for topic subscription");\r
287         return NS_FAIL;\r
288     }\r
289 \r
290     NSPushQueue(TOPIC_SCHEDULER, TASK_SUBSCRIBE_TOPICS, topicList);\r
291 \r
292     pthread_mutex_unlock(&nsInitMutex);\r
293     NS_LOG(DEBUG, "NSProviderRecommendTopics - OUT");\r
294     return NS_OK;\r
295 }\r
296 \r