remove not required function and rename the function, const variable.
[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 "NSCacheAdapter.h"\r
25 #include "NSProviderSubscription.h"\r
26 #include "NSProviderNotification.h"\r
27 #include "NSProviderMemoryCache.h"\r
28 #include "oic_malloc.h"\r
29 #include "oic_string.h"\r
30 #include "cautilinterface.h"\r
31 \r
32 bool initProvider = false;\r
33 static NSSubscribeRequestCallback g_subscribeRequestCb = NULL;\r
34 static NSSyncCallback g_syncCb = NULL;\r
35 \r
36 pthread_mutex_t nsInitMutex;\r
37 \r
38 void initializeMutex()\r
39 {\r
40     static pthread_mutex_t initMutex = PTHREAD_MUTEX_INITIALIZER;\r
41     nsInitMutex = initMutex;\r
42 }\r
43 \r
44 void NSRegisterSubscribeRequestCb(NSSubscribeRequestCallback subscribeRequestCb)\r
45 {\r
46     NS_LOG(DEBUG, "NSRegisterSubscribeRequestCb - IN");\r
47     g_subscribeRequestCb = subscribeRequestCb;\r
48     NS_LOG(DEBUG, "NSRegisterSubscribeRequestCb - OUT");\r
49 }\r
50 \r
51 void  NSRegisterSyncCb(NSSyncCallback syncCb)\r
52 {\r
53     NS_LOG(DEBUG, "NSRegisterSyncCb - IN");\r
54     g_syncCb = syncCb;\r
55     NS_LOG(DEBUG, "NSRegisterSyncCb - OUT");\r
56 }\r
57 \r
58 void NSSubscribeRequestCb(NSConsumer *consumer)\r
59 {\r
60     NS_LOG(DEBUG, "NSSubscribeRequestCb - IN");\r
61     g_subscribeRequestCb(consumer);\r
62     NS_LOG(DEBUG, "NSSubscribeRequestCb - OUT");\r
63 }\r
64 \r
65 void NSSyncCb(NSSync *sync)\r
66 {\r
67     NS_LOG(DEBUG, "NSSyncCb - IN");\r
68     g_syncCb(sync);\r
69     NS_LOG(DEBUG, "NSSyncCb - OUT");\r
70 }\r
71 \r
72 NSResult NSStartProvider(NSAccessPolicy policy, NSSubscribeRequestCallback subscribeRequestCb,\r
73         NSSyncCallback syncCb)\r
74 {\r
75     NS_LOG(DEBUG, "NSStartProvider - IN");\r
76 \r
77     initializeMutex();\r
78 \r
79     pthread_mutex_lock(&nsInitMutex);\r
80 \r
81     if (!initProvider)\r
82     {\r
83         NS_LOG(DEBUG, "Init Provider");\r
84         initProvider = true;\r
85         NSSetSubscriptionAcceptPolicy(policy);\r
86         NSRegisterSubscribeRequestCb(subscribeRequestCb);\r
87         NSRegisterSyncCb(syncCb);\r
88         CARegisterNetworkMonitorHandler(NSProviderAdapterStateListener,\r
89                 NSProviderConnectionStateListener);\r
90 \r
91         NSSetList();\r
92         NSInitScheduler();\r
93         NSStartScheduler();\r
94 \r
95         NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);\r
96         NSPushQueue(DISCOVERY_SCHEDULER, TASK_REGISTER_RESOURCE, NULL);\r
97     }\r
98     else\r
99     {\r
100         NS_LOG(DEBUG, "Already started Notification Provider");\r
101     }\r
102     pthread_mutex_unlock(&nsInitMutex);\r
103 \r
104     NS_LOG(DEBUG, "NSStartProvider - OUT");\r
105 \r
106     return NS_OK;\r
107 }\r
108 \r
109 void NSSetList()\r
110 {\r
111     NS_LOG(DEBUG, "NSSetList - IN");\r
112     pthread_mutex_init(&NSCacheMutex, NULL);\r
113     NSInitSubscriptionList();\r
114     NSInitMessageList();\r
115     NS_LOG(DEBUG, "NSSetList - OUT");\r
116 }\r
117 \r
118 NSResult NSStopProvider()\r
119 {\r
120     NS_LOG(DEBUG, "NSStopProvider - IN");\r
121 \r
122     pthread_mutex_lock(&nsInitMutex);\r
123 \r
124     if(initProvider)\r
125     {\r
126         NSUnRegisterResource();\r
127         NSRegisterSubscribeRequestCb((NSSubscribeRequestCallback)NULL);\r
128         NSRegisterSyncCb((NSSyncCallback)NULL);\r
129         NSStopScheduler();\r
130         NSCacheDestroy(consumerSubList);\r
131         NSCacheDestroy(messageList);\r
132 \r
133         initProvider = false;\r
134     }\r
135 \r
136     pthread_mutex_unlock(&nsInitMutex);\r
137     NS_LOG(DEBUG, "NSStopProvider - OUT");\r
138     return NS_OK;\r
139 }\r
140 \r
141 NSResult NSSendNotification(NSMessage *msg)\r
142 {\r
143     NS_LOG(DEBUG, "NSSendNotification - IN");\r
144 \r
145     pthread_mutex_lock(&nsInitMutex);\r
146 \r
147     if(msg == NULL)\r
148     {\r
149         NS_LOG(ERROR, "Msg is NULL");\r
150         pthread_mutex_unlock(&nsInitMutex);\r
151         return NS_ERROR;\r
152     }\r
153 \r
154     NSMessage * newMsg = NSDuplicateMessage(msg);\r
155 \r
156     NSPushQueue(NOTIFICATION_SCHEDULER, TASK_SEND_NOTIFICATION, newMsg);\r
157 \r
158     pthread_mutex_unlock(&nsInitMutex);\r
159 \r
160     NS_LOG(DEBUG, "NSSendNotification - OUT");\r
161     return NS_OK;\r
162 }\r
163 \r
164 NSResult NSProviderReadCheck(NSMessage *msg)\r
165 {\r
166     NS_LOG(DEBUG, "NSProviderReadCheck - IN");\r
167 \r
168     pthread_mutex_lock(&nsInitMutex);\r
169     NSPushQueue(NOTIFICATION_SCHEDULER, TASK_SEND_READ, msg);\r
170     pthread_mutex_unlock(&nsInitMutex);\r
171 \r
172     NS_LOG(DEBUG, "NSProviderReadCheck - OUT");\r
173     return NS_OK;\r
174 }\r
175 \r
176 NSResult NSAccept(NSConsumer *consumer, bool accepted)\r
177 {\r
178     NS_LOG(DEBUG, "NSAccept - IN");\r
179 \r
180     pthread_mutex_lock(&nsInitMutex);\r
181 \r
182     NSConsumer * newConsumer = NSDuplicateConsumer(consumer);\r
183 \r
184     if(accepted)\r
185     {\r
186         NS_LOG(DEBUG, "accepted is true - ALLOW");\r
187         NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_ALLOW, newConsumer);\r
188     }\r
189     else\r
190     {\r
191         NS_LOG(DEBUG, "accepted is false - DENY");\r
192         NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_DENY, newConsumer);\r
193     }\r
194 \r
195     pthread_mutex_unlock(&nsInitMutex);\r
196     NS_LOG(DEBUG, "NSAccept - OUT");\r
197     return NS_OK;\r
198 }\r
199 \r
200 void * NSCallbackSchedule(void * ptr)\r
201 {\r
202     if (ptr == NULL)\r
203     {\r
204         NS_LOG(DEBUG, "Create NSReponseSchedule");\r
205     }\r
206 \r
207     while (NSIsRunning[CALLBACK_SCHEDULER])\r
208     {\r
209         sem_wait(&NSSemaphore[CALLBACK_SCHEDULER]);\r
210         pthread_mutex_lock(&NSMutex[CALLBACK_SCHEDULER]);\r
211 \r
212         if (NSHeadMsg[CALLBACK_SCHEDULER] != NULL)\r
213         {\r
214             NSTask *node = NSHeadMsg[CALLBACK_SCHEDULER];\r
215             NSHeadMsg[CALLBACK_SCHEDULER] = node->nextTask;\r
216 \r
217             switch (node->taskType)\r
218             {\r
219                 case TASK_CB_SUBSCRIPTION:\r
220                 {\r
221                     NS_LOG(DEBUG, "CASE TASK_CB_SUBSCRIPTION : ");\r
222 \r
223                     OCEntityHandlerRequest * request = (OCEntityHandlerRequest*)node->taskData;\r
224                     NSConsumer * consumer = (NSConsumer *)OICMalloc(sizeof(NSConsumer));\r
225                     consumer->mDeviceId = OICStrdup(request->devAddr.addr);\r
226                     consumer->mAddress = OICStrdup(request->devAddr.addr);\r
227 \r
228                     NSSubscribeRequestCb(consumer);\r
229                     NSFreeConsumer(consumer);\r
230                     NSFreeOCEntityHandlerRequest(request);\r
231 \r
232                     break;\r
233                 }\r
234                 case TASK_CB_SYNC:\r
235                 {\r
236                     NS_LOG(DEBUG, "CASE TASK_CB_SYNC : ");\r
237                     NSSync * sync = (NSSync*)node->taskData;\r
238                     NSSyncCb(sync);\r
239                     break;\r
240                 }\r
241                 default:\r
242                     NS_LOG(DEBUG, "No Task Type");\r
243                     break;\r
244             }\r
245             OICFree(node);\r
246         }\r
247 \r
248         pthread_mutex_unlock(&NSMutex[CALLBACK_SCHEDULER]);\r
249 \r
250     }\r
251 \r
252     NS_LOG(DEBUG, "Destroy NSResponseSchedule");\r
253     return NULL;\r
254 }\r
255 \r