NSDuplicateMessage copy logic not working(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 "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     OIC_LOG(INFO, INTERFACE_TAG, "Notification Service Start Provider..");\r
76     NS_LOG(DEBUG, "NSStartProvider - IN");\r
77 \r
78     initializeMutex();\r
79 \r
80     pthread_mutex_lock(&nsInitMutex);\r
81 \r
82     if (!initProvider)\r
83     {\r
84         NS_LOG(DEBUG, "Init Provider");\r
85         initProvider = true;\r
86         NSSetSubscriptionAcceptPolicy(policy);\r
87         NSRegisterSubscribeRequestCb(subscribeRequestCb);\r
88         NSRegisterSyncCb(syncCb);\r
89         CARegisterNetworkMonitorHandler(NSProviderAdapterStateListener,\r
90                 NSProviderConnectionStateListener);\r
91 \r
92         NSSetList();\r
93         NSInitScheduler();\r
94         NSStartScheduler();\r
95 \r
96         NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);\r
97         NSPushQueue(DISCOVERY_SCHEDULER, TASK_REGISTER_RESOURCE, NULL);\r
98     }\r
99     else\r
100     {\r
101         NS_LOG(DEBUG, "Already started Notification Provider");\r
102     }\r
103 \r
104     pthread_mutex_unlock(&nsInitMutex);\r
105 \r
106     NS_LOG(DEBUG, "NSStartProvider - OUT");\r
107 \r
108     return NS_OK;\r
109 }\r
110 \r
111 void NSSetList()\r
112 {\r
113     NS_LOG(DEBUG, "NSSetList - IN");\r
114     pthread_mutex_init(&NSCacheMutex, NULL);\r
115     NSInitSubscriptionList();\r
116     NSInitMessageList();\r
117     NS_LOG(DEBUG, "NSSetList - OUT");\r
118 }\r
119 \r
120 NSResult NSStopProvider()\r
121 {\r
122     NS_LOG(DEBUG, "NSStopProvider - IN");\r
123 \r
124     pthread_mutex_lock(&nsInitMutex);\r
125 \r
126     NSRegisterSubscribeRequestCb((NSSubscribeRequestCallback)NULL);\r
127     NSRegisterSyncCb((NSSyncCallback)NULL);\r
128     initProvider = false;\r
129 \r
130     pthread_mutex_unlock(&nsInitMutex);\r
131     NS_LOG(DEBUG, "NSStopProvider - OUT");\r
132     return NS_OK;\r
133 }\r
134 \r
135 NSResult NSSendNotification(NSMessage *msg)\r
136 {\r
137     OIC_LOG(INFO, INTERFACE_TAG, "Send Notification");\r
138     NS_LOG(DEBUG, "NSSendNotification - IN");\r
139 \r
140     NSMessage * newMsg = NSDuplicateMessage(msg);\r
141 \r
142     if(newMsg == NULL)\r
143     {\r
144         NS_LOG(ERROR, "Msg is NULL");\r
145         return NS_ERROR;\r
146     }\r
147 \r
148     NSPushQueue(NOTIFICATION_SCHEDULER, TASK_SEND_NOTIFICATION, newMsg);\r
149     NS_LOG(DEBUG, "NSSendNotification - OUT");\r
150     return NS_OK;\r
151 }\r
152 \r
153 NSResult NSProviderReadCheck(NSMessage *msg)\r
154 {\r
155     OIC_LOG(INFO, INTERFACE_TAG, "Read Sync");\r
156     NS_LOG(DEBUG, "NSProviderReadCheck - IN");\r
157     NSPushQueue(NOTIFICATION_SCHEDULER, TASK_SEND_READ, msg);\r
158     NS_LOG(DEBUG, "NSProviderReadCheck - OUT");\r
159     return NS_OK;\r
160 }\r
161 \r
162 NSResult NSAccept(NSConsumer *consumer, bool accepted)\r
163 {\r
164     OIC_LOG(INFO, INTERFACE_TAG, "Response Acceptance");\r
165     NS_LOG(DEBUG, "NSAccept - IN");\r
166 \r
167     if(accepted)\r
168     {\r
169         NS_LOG(DEBUG, "accepted is true - ALLOW");\r
170         NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_ALLOW, consumer);\r
171     }\r
172     else\r
173     {\r
174         NS_LOG(DEBUG, "accepted is false - DENY");\r
175         NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_DENY, consumer);\r
176     }\r
177 \r
178     NS_LOG(DEBUG, "NSAccept - OUT");\r
179     return NS_OK;\r
180 }\r
181 \r
182 void * NSResponseSchedule(void * ptr)\r
183 {\r
184     if (ptr == NULL)\r
185     {\r
186         OIC_LOG(INFO, INTERFACE_TAG, "Init NSResponseSchedule");\r
187         NS_LOG(DEBUG, "Create NSReponseSchedule");\r
188     }\r
189 \r
190     while (NSIsRunning[RESPONSE_SCHEDULER])\r
191     {\r
192         sem_wait(&NSSemaphore[RESPONSE_SCHEDULER]);\r
193         pthread_mutex_lock(&NSMutex[RESPONSE_SCHEDULER]);\r
194 \r
195         if (NSHeadMsg[RESPONSE_SCHEDULER] != NULL)\r
196         {\r
197             NSTask *node = NSHeadMsg[RESPONSE_SCHEDULER];\r
198             NSHeadMsg[RESPONSE_SCHEDULER] = node->nextTask;\r
199 \r
200             switch (node->taskType)\r
201             {\r
202                 case TASK_CB_SUBSCRIPTION:\r
203                 {\r
204                     NS_LOG(DEBUG, "CASE TASK_CB_SUBSCRIPTION : ");\r
205                     OCEntityHandlerRequest * request = (OCEntityHandlerRequest*)node->taskData;\r
206                     NSConsumer consumer;\r
207 \r
208                     consumer.mId = OICStrdup(request->devAddr.addr);\r
209                     int * obId = (int *) OICMalloc(sizeof(int));\r
210                     *obId = request->obsInfo.obsId;\r
211                     consumer.mUserData = obId;\r
212 \r
213                     NSSubscribeRequestCb(&consumer);\r
214                     NSFreeOCEntityHandlerRequest(request);\r
215 \r
216                     break;\r
217                 }\r
218                 case TASK_CB_SYNC:\r
219                 {\r
220                     NS_LOG(DEBUG, "CASE TASK_CB_SYNC : ");\r
221                     NSSync * sync = (NSSync*)node->taskData;\r
222                     NSSyncCb(sync);\r
223                     break;\r
224                 }\r
225                 default:\r
226                     OIC_LOG(INFO, INTERFACE_TAG, "Response to User");\r
227 \r
228                     break;\r
229             }\r
230             OICFree(node);\r
231         }\r
232 \r
233         pthread_mutex_unlock(&NSMutex[RESPONSE_SCHEDULER]);\r
234 \r
235     }\r
236     return NULL;\r
237 }\r
238 \r
239 NSResult NSTestStartPresence()\r
240 {\r
241     NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);\r
242     return NS_OK;\r
243 }\r
244 \r
245 NSResult NSTestStopPresence()\r
246 {\r
247     NSPushQueue(DISCOVERY_SCHEDULER, TASK_STOP_PRESENCE, NULL);\r
248     return NS_OK;\r
249 }\r
250 \r
251 \r