Issue fixed about OCEntityHandlerRequest same pointer address.
[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 "cautilinterface.h"\r
26 #include "NSProviderSubscription.h"\r
27 #include "NSProviderNotification.h"\r
28 \r
29 bool initProvider = false;\r
30 static NSSubscribeRequestCallback g_subscribeRequestCb = NULL;\r
31 static NSSyncCallback g_syncCb = NULL;\r
32 pthread_mutex_t NSCacheMutex;\r
33 \r
34 void NSRegisterSubscribeRequestCb(NSSubscribeRequestCallback subscribeRequestCb)\r
35 {\r
36     NS_LOG(DEBUG, "NSRegisterSubscribeRequestCb - IN");\r
37     g_subscribeRequestCb = subscribeRequestCb;\r
38     NS_LOG(DEBUG, "NSRegisterSubscribeRequestCb - OUT");\r
39 }\r
40 \r
41 void  NSRegisterSyncCb(NSSyncCallback syncCb)\r
42 {\r
43     NS_LOG(DEBUG, "NSRegisterSyncCb - IN");\r
44     g_syncCb = syncCb;\r
45     NS_LOG(DEBUG, "NSRegisterSyncCb - OUT");\r
46 }\r
47 \r
48 void NSSubscribeRequestCb(NSConsumer *consumer)\r
49 {\r
50     NS_LOG(DEBUG, "NSSubscribeRequestCb - IN");\r
51     g_subscribeRequestCb(consumer);\r
52     NS_LOG(DEBUG, "NSSubscribeRequestCb - OUT");\r
53 }\r
54 \r
55 void NSSyncCb(NSSync *sync)\r
56 {\r
57     NS_LOG(DEBUG, "NSSyncCb - IN");\r
58     g_syncCb(sync);\r
59     NS_LOG(DEBUG, "NSSyncCb - OUT");\r
60 }\r
61 \r
62 NSResult NSStartProvider(NSAccessPolicy policy, NSSubscribeRequestCallback subscribeRequestCb,\r
63         NSSyncCallback syncCb)\r
64 {\r
65     OIC_LOG(INFO, INTERFACE_TAG, "Notification Service Start Provider..");\r
66     NS_LOG(DEBUG, "NSStartProvider - IN");\r
67     NSSetSubscriptionAcceptPolicy(policy);\r
68 \r
69     if (!initProvider)\r
70     {\r
71         NS_LOG(DEBUG, "Init Provider");\r
72         initProvider = true;\r
73 \r
74         NSSetList();\r
75         NSInitScheduler();\r
76         NSStartScheduler();\r
77     }\r
78 \r
79     NSRegisterSubscribeRequestCb(subscribeRequestCb);\r
80     NSRegisterSyncCb(syncCb);\r
81 \r
82     CARegisterNetworkMonitorHandler(NSProviderAdapterStateListener,\r
83             NSProviderConnectionStateListener);\r
84 \r
85     NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);\r
86     NSPushQueue(DISCOVERY_SCHEDULER, TASK_REGISTER_RESOURCE, NULL);\r
87 \r
88     NS_LOG(DEBUG, "NSStartProvider - OUT");\r
89 \r
90     return NS_OK;\r
91 }\r
92 \r
93 void NSSetList()\r
94 {\r
95     NS_LOG(DEBUG, "NSSetList - IN");\r
96     pthread_mutex_init(&NSCacheMutex, NULL);\r
97     NSInitSubscriptionList();\r
98     NSInitMessageList();\r
99     NS_LOG(DEBUG, "NSSetList - OUT");\r
100 }\r
101 \r
102 NSResult NSStopProvider()\r
103 {\r
104     NS_LOG(DEBUG, "NSStopProvider - IN");\r
105     NSRegisterSubscribeRequestCb((NSSubscribeRequestCallback)NULL);\r
106     NSRegisterSyncCb((NSSyncCallback)NULL);\r
107     initProvider = false;\r
108     NS_LOG(DEBUG, "NSStopProvider - OUT");\r
109     return NS_OK;\r
110 }\r
111 \r
112 NSResult NSSendNotification(NSMessage *msg)\r
113 {\r
114     OIC_LOG(INFO, INTERFACE_TAG, "Send Notification");\r
115     NS_LOG(DEBUG, "NSSendNotification - IN");\r
116 \r
117     NSMessage * newMsg = NSDuplicateMessage(msg);\r
118 \r
119     if(newMsg == NULL)\r
120     {\r
121         NS_LOG(ERROR, "Msg is NULL");\r
122         return NS_ERROR;\r
123     }\r
124 \r
125     NSPushQueue(NOTIFICATION_SCHEDULER, TASK_SEND_NOTIFICATION, newMsg);\r
126     NS_LOG(DEBUG, "NSSendNotification - OUT");\r
127     return NS_OK;\r
128 }\r
129 \r
130 NSResult NSProviderReadCheck(NSMessage *msg)\r
131 {\r
132     OIC_LOG(INFO, INTERFACE_TAG, "Read Sync");\r
133     NS_LOG(DEBUG, "NSProviderReadCheck - IN");\r
134     NSPushQueue(NOTIFICATION_SCHEDULER, TASK_SEND_READ, msg);\r
135     NS_LOG(DEBUG, "NSProviderReadCheck - OUT");\r
136     return NS_OK;\r
137 }\r
138 \r
139 NSResult NSAccept(NSConsumer *consumer, bool accepted)\r
140 {\r
141     OIC_LOG(INFO, INTERFACE_TAG, "Response Acceptance");\r
142     NS_LOG(DEBUG, "NSAccept - IN");\r
143 \r
144     if(accepted)\r
145     {\r
146         NS_LOG(DEBUG, "accepted is true - ALLOW");\r
147         NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_ALLOW, consumer);\r
148 \r
149     }\r
150     else\r
151     {\r
152         NS_LOG(DEBUG, "accepted is false - DENY");\r
153         NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_DENY, consumer);\r
154     }\r
155 \r
156     NS_LOG(DEBUG, "NSAccept - OUT");\r
157     return NS_OK;\r
158 }\r
159 \r
160 void * NSResponseSchedule(void * ptr)\r
161 {\r
162     if (ptr == NULL)\r
163     {\r
164         OIC_LOG(INFO, INTERFACE_TAG, "Init NSResponseSchedule");\r
165         NS_LOG(DEBUG, "Create NSReponseSchedule");\r
166     }\r
167 \r
168     while (NSIsRunning[RESPONSE_SCHEDULER])\r
169     {\r
170         sem_wait(&NSSemaphore[RESPONSE_SCHEDULER]);\r
171         pthread_mutex_lock(&NSMutex[RESPONSE_SCHEDULER]);\r
172 \r
173         if (NSHeadMsg[RESPONSE_SCHEDULER] != NULL)\r
174         {\r
175             NSTask *node = NSHeadMsg[RESPONSE_SCHEDULER];\r
176             NSHeadMsg[RESPONSE_SCHEDULER] = node->nextTask;\r
177 \r
178             switch (node->taskType)\r
179             {\r
180                 case TASK_CB_SUBSCRIPTION:\r
181                 {\r
182                     NS_LOG(DEBUG, "CASE TASK_CB_SUBSCRIPTION : ");\r
183                     OCEntityHandlerRequest * request = (OCEntityHandlerRequest*)node->taskData;\r
184                     NSConsumer consumer;\r
185 \r
186                     consumer.mId = strdup(request->devAddr.addr);\r
187                     int * obId = (int *) OICMalloc(sizeof(int));\r
188                     *obId = request->obsInfo.obsId;\r
189                     consumer.mUserData = obId;\r
190 \r
191                     NSSubscribeRequestCb(&consumer);\r
192                     NSFreeOCEntityHandlerRequest(request);\r
193 \r
194                     break;\r
195                 }\r
196                 case TASK_CB_SYNC:\r
197                 {\r
198                     NS_LOG(DEBUG, "CASE TASK_CB_SYNC : ");\r
199                     NSSync * sync = (NSSync*)node->taskData;\r
200                     NSSyncCb(sync);\r
201                     break;\r
202                 }\r
203                 default:\r
204                     OIC_LOG(INFO, INTERFACE_TAG, "Response to User");\r
205 \r
206                     // TODO: NSSubscribeRequestCb\r
207 \r
208                     // TODO: NSSyncCb\r
209 \r
210                     break;\r
211 \r
212             }\r
213             OICFree(node);\r
214         }\r
215 \r
216         pthread_mutex_unlock(&NSMutex[RESPONSE_SCHEDULER]);\r
217 \r
218     }\r
219     return NULL;\r
220 }\r
221 \r
222 NSResult NSTestStartPresence()\r
223 {\r
224     NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);\r
225     return NS_OK;\r
226 }\r
227 \r
228 NSResult NSTestStopPresence()\r
229 {\r
230     NSPushQueue(DISCOVERY_SCHEDULER, TASK_STOP_PRESENCE, NULL);\r
231     return NS_OK;\r
232 }\r
233 \r
234 \r