Modify about Provider Configuration.
[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 "oic_malloc.h"\r
30 #include "oic_string.h"\r
31 #include "cautilinterface.h"\r
32 #include "NSProviderSystem.h"\r
33 #include "oic_time.h"\r
34 \r
35 bool initProvider = false;\r
36 \r
37 pthread_mutex_t nsInitMutex;\r
38 \r
39 void initializeMutex()\r
40 {\r
41     static pthread_mutex_t initMutex = PTHREAD_MUTEX_INITIALIZER;\r
42     nsInitMutex = initMutex;\r
43 }\r
44 \r
45 NSResult NSStartProvider(NSProviderConfig config)\r
46 {\r
47     NS_LOG(DEBUG, "NSStartProvider - IN");\r
48 \r
49     initializeMutex();\r
50 \r
51     pthread_mutex_lock(&nsInitMutex);\r
52 \r
53     if (!initProvider)\r
54     {\r
55         NS_LOG(DEBUG, "Init Provider");\r
56         initProvider = true;\r
57         NSInitProviderInfo(config.userInfo);\r
58         NSSetSubscriptionAccessPolicy(config.policy);\r
59         NSRegisterSubscribeRequestCb(config.subRequestCallback);\r
60         NSRegisterSyncCb(config.syncInfoCallback);\r
61         CARegisterNetworkMonitorHandler((CAAdapterStateChangedCB)NSProviderAdapterStateListener,\r
62                 (CAConnectionStateChangedCB)NSProviderConnectionStateListener);\r
63 \r
64         NSSetList();\r
65         NSInitScheduler();\r
66         NSStartScheduler();\r
67 \r
68         NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);\r
69         NSPushQueue(DISCOVERY_SCHEDULER, TASK_REGISTER_RESOURCE, NULL);\r
70     }\r
71     else\r
72     {\r
73         NS_LOG(DEBUG, "Already started Notification Provider");\r
74     }\r
75     pthread_mutex_unlock(&nsInitMutex);\r
76 \r
77     NS_LOG(DEBUG, "NSStartProvider - OUT");\r
78     return NS_OK;\r
79 }\r
80 \r
81 void NSSetList()\r
82 {\r
83     NS_LOG(DEBUG, "NSSetList - IN");\r
84 \r
85     pthread_mutexattr_init(&NSCacheMutexAttr);\r
86     int pthreadResult = pthread_mutexattr_settype(&NSCacheMutexAttr, PTHREAD_MUTEX_RECURSIVE);\r
87     pthread_mutex_init(&NSCacheMutex, &NSCacheMutexAttr);\r
88 \r
89     NSInitSubscriptionList();\r
90     NSInitMessageList();\r
91     NS_LOG(DEBUG, "NSSetList - OUT");\r
92 }\r
93 \r
94 void NSDestroyList()\r
95 {\r
96     NSStorageDestroy(consumerSubList);\r
97     NSStorageDestroy(messageList);\r
98 \r
99     pthread_mutex_destroy(&NSCacheMutex);\r
100     pthread_mutexattr_destroy(&NSCacheMutexAttr);\r
101 }\r
102 \r
103 NSResult NSStopProvider()\r
104 {\r
105     NS_LOG(DEBUG, "NSStopProvider - IN");\r
106     pthread_mutex_lock(&nsInitMutex);\r
107 \r
108     if(initProvider)\r
109     {\r
110         NSPushQueue(DISCOVERY_SCHEDULER, TASK_STOP_PRESENCE, NULL);\r
111         NSDeinitProviderInfo();\r
112         NSUnRegisterResource();\r
113         NSRegisterSubscribeRequestCb((NSSubscribeRequestCallback)NULL);\r
114         NSRegisterSyncCb((NSProviderSyncInfoCallback)NULL);\r
115         NSStopScheduler();\r
116         NSDestroyList();\r
117 \r
118         initProvider = false;\r
119     }\r
120 \r
121     pthread_mutex_unlock(&nsInitMutex);\r
122     NS_LOG(DEBUG, "NSStopProvider - OUT");\r
123     return NS_OK;\r
124 }\r
125 \r
126 #ifdef WITH_CLOUD\r
127 NSResult NSProviderEnableRemoteService(char *serverAddress)\r
128 {\r
129     NS_LOG(DEBUG, "NSProviderEnableRemoteService - IN");\r
130     pthread_mutex_lock(&nsInitMutex);\r
131  \r
132     if(!initProvider)\r
133     {\r
134         NS_LOG(DEBUG, "Provider service has not been started yet");\r
135         pthread_mutex_unlock(&nsInitMutex);\r
136         return NS_FAIL;\r
137     }\r
138 \r
139     NS_LOG_V(DEBUG, "Remote server address: %s", serverAddress);\r
140     NSPushQueue(DISCOVERY_SCHEDULER, TASK_PUBLISH_RESOURCE, serverAddress);\r
141 \r
142     pthread_mutex_unlock(&nsInitMutex);\r
143     NS_LOG(DEBUG, "NSProviderEnableRemoteService - OUT");\r
144     return NS_OK;\r
145 }\r
146 \r
147 NSResult NSProviderDisableRemoteService(char *serverAddress)\r
148 {\r
149     NS_LOG(DEBUG, "NSProviderDisableRemoteService - IN");\r
150     pthread_mutex_lock(&nsInitMutex);\r
151 \r
152     if(!initProvider)\r
153     {\r
154         NS_LOG(DEBUG, "Provider service has not been started yet");\r
155         return NS_FAIL;\r
156     }\r
157     NS_LOG_V(DEBUG, "Remote server address: %s", serverAddress);\r
158 \r
159     pthread_mutex_unlock(&nsInitMutex);\r
160     NS_LOG(DEBUG, "NSProviderDisableRemoteService - OUT");\r
161     return NS_OK;\r
162 }\r
163 #endif\r
164 \r
165 NSResult NSSendMessage(NSMessage *msg)\r
166 {\r
167     NS_LOG(DEBUG, "NSSendNotification - IN");\r
168 \r
169     pthread_mutex_lock(&nsInitMutex);\r
170 \r
171     if(msg == NULL)\r
172     {\r
173         NS_LOG(ERROR, "Msg is NULL");\r
174         pthread_mutex_unlock(&nsInitMutex);\r
175         return NS_ERROR;\r
176     }\r
177 \r
178     NSMessage * newMsg = NSDuplicateMessage(msg);\r
179     NSPushQueue(NOTIFICATION_SCHEDULER, TASK_SEND_NOTIFICATION, newMsg);\r
180 \r
181     pthread_mutex_unlock(&nsInitMutex);\r
182 \r
183     NS_LOG(DEBUG, "NSSendNotification - OUT");\r
184     return NS_OK;\r
185 }\r
186 \r
187 NSResult NSProviderSendSyncInfo(uint64_t messageId, NSSyncType type)\r
188 {\r
189     NS_LOG(DEBUG, "NSProviderReadCheck - IN");\r
190     pthread_mutex_lock(&nsInitMutex);\r
191 \r
192     NSSyncInfo * syncInfo = (NSSyncInfo *)OICMalloc(sizeof(NSSyncInfo));\r
193     OICStrcpy(syncInfo->providerId, UUID_STRING_SIZE, NSGetProviderInfo()->providerId);\r
194     syncInfo->messageId = messageId;\r
195     syncInfo->state = type;\r
196     NSPushQueue(NOTIFICATION_SCHEDULER, TASK_SEND_READ, syncInfo);\r
197 \r
198     pthread_mutex_unlock(&nsInitMutex);\r
199     NS_LOG(DEBUG, "NSProviderReadCheck - OUT");\r
200     return NS_OK;\r
201 }\r
202 \r
203 NSResult NSAcceptSubscription(NSConsumer *consumer, bool accepted)\r
204 {\r
205     NS_LOG(DEBUG, "NSAccept - IN");\r
206 \r
207     pthread_mutex_lock(&nsInitMutex);\r
208 \r
209     NSConsumer * newConsumer = NSDuplicateConsumer(consumer);\r
210 \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