added cacheadapter interface and memorycache of notification.
[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     g_subscribeRequestCb = subscribeRequestCb;\r
37 }\r
38 \r
39 void  NSRegisterSyncCb(NSSyncCallback syncCb)\r
40 {\r
41     g_syncCb = syncCb;\r
42 }\r
43 \r
44 void NSSubscribeRequestCb(NSConsumer *consumer)\r
45 {\r
46     g_subscribeRequestCb(consumer);\r
47 }\r
48 \r
49 void NSSyncCb(NSSync *sync)\r
50 {\r
51     g_syncCb(sync);\r
52 }\r
53 \r
54 NSResult NSStartProvider(NSAccessPolicy policy, NSSubscribeRequestCallback subscribeRequestCb,\r
55         NSSyncCallback syncCb)\r
56 {\r
57     OIC_LOG(INFO, INTERFACE_TAG, "Notification Service Start Provider..");\r
58 \r
59     NSSetSubscriptionAcceptPolicy(policy);\r
60 \r
61     if (!initProvider)\r
62     {\r
63         initProvider = true;\r
64 \r
65         NSSetList();\r
66         NSInitScheduler();\r
67         NSStartScheduler();\r
68     }\r
69 \r
70     NSRegisterSubscribeRequestCb(subscribeRequestCb);\r
71     NSRegisterSyncCb(syncCb);\r
72 \r
73     CARegisterNetworkMonitorHandler(NSProviderAdapterStateListener,\r
74             NSProviderConnectionStateListener);\r
75 \r
76     NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);\r
77     NSPushQueue(DISCOVERY_SCHEDULER, TASK_REGISTER_RESOURCE, NULL);\r
78 \r
79     return NS_OK;\r
80 }\r
81 \r
82 void NSSetList()\r
83 {\r
84     pthread_mutex_init(&NSCacheMutex, NULL);\r
85     NSInitSubscriptionList();\r
86     NSInitMessageList();\r
87 }\r
88 \r
89 NSResult NSStopProvider()\r
90 {\r
91     NSRegisterSubscribeRequestCb((NSSubscribeRequestCallback)NULL);\r
92     NSRegisterSyncCb((NSSyncCallback)NULL);\r
93     initProvider = false;\r
94     return NS_OK;\r
95 }\r
96 \r
97 NSResult NSSendNotification(NSMessage *msg)\r
98 {\r
99     OIC_LOG(INFO, INTERFACE_TAG, "Send Notification");\r
100 \r
101     NSPushQueue(NOTIFICATION_SCHEDULER, TASK_SEND_NOTIFICATION, msg);\r
102 \r
103     return NS_OK;\r
104 }\r
105 \r
106 NSResult NSProviderReadCheck(NSMessage *msg)\r
107 {\r
108     OIC_LOG(INFO, INTERFACE_TAG, "Read Sync");\r
109 \r
110     NSPushQueue(NOTIFICATION_SCHEDULER, TASK_SEND_READ, msg);\r
111 \r
112     return NS_OK;\r
113 }\r
114 \r
115 NSResult NSAccept(NSConsumer *consumer, bool accepted)\r
116 {\r
117     OIC_LOG(INFO, INTERFACE_TAG, "Response Acceptance");\r
118 \r
119     if(accepted)\r
120     {\r
121         NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_ALLOW, consumer);\r
122     }\r
123     else\r
124     {\r
125         NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_DENY, consumer);\r
126     }\r
127 \r
128     return NS_OK;\r
129 }\r
130 \r
131 /*\r
132 NSResult NSGetConsumerList(uint8_t *list, uint32_t size)\r
133 {\r
134     OIC_LOG(INFO, INTERFACE_TAG, "Get consumer list");\r
135 \r
136     NSGetObsIdList(list);\r
137     size = NSGetNumberOfObsList();\r
138 \r
139     return NS_OK;\r
140 }*/\r
141 \r
142 void * NSResponseSchedule(void * ptr)\r
143 {\r
144     if (ptr == NULL)\r
145     {\r
146         OIC_LOG(INFO, INTERFACE_TAG, "Init NSResponseSchedule");\r
147     }\r
148 \r
149     while (NSIsRunning[RESPONSE_SCHEDULER])\r
150     {\r
151         sem_wait(&NSSemaphore[RESPONSE_SCHEDULER]);\r
152         pthread_mutex_lock(&NSMutex[RESPONSE_SCHEDULER]);\r
153 \r
154         if (NSHeadMsg[RESPONSE_SCHEDULER] != NULL)\r
155         {\r
156             NSTask *node = NSHeadMsg[RESPONSE_SCHEDULER];\r
157             NSHeadMsg[RESPONSE_SCHEDULER] = node->nextTask;\r
158 \r
159             switch (node->taskType)\r
160             {\r
161                 case TASK_CB_SUBSCRIPTION:\r
162                 {\r
163                     printf("before - TASK_CB_SUBSCRIPTION :\n");\r
164                     OCEntityHandlerRequest * request = (OCEntityHandlerRequest*)node->taskData;\r
165                     NSConsumer consumer;\r
166 \r
167                     consumer.mId = strdup(request->devAddr.addr);\r
168                     int * obId = (int *) OICMalloc(sizeof(int));\r
169                     *obId = request->obsInfo.obsId;\r
170                     consumer.mUserData = obId;\r
171 \r
172                     NSSubscribeRequestCb(&consumer);\r
173                     printf("after - TASK_CB_SUBSCRIPTION :\n");\r
174                     break;\r
175                 }\r
176                 case TASK_CB_SYNC:\r
177                 {\r
178                     NSSync * sync = (NSSync*)node->taskData;\r
179                     NSSyncCb(sync);\r
180                     break;\r
181                 }\r
182                 default:\r
183                     OIC_LOG(INFO, INTERFACE_TAG, "Response to User");\r
184 \r
185                     // TODO: NSSubscribeRequestCb\r
186 \r
187                     // TODO: NSSyncCb\r
188 \r
189                     break;\r
190 \r
191             }\r
192             OICFree(node);\r
193         }\r
194 \r
195         pthread_mutex_unlock(&NSMutex[RESPONSE_SCHEDULER]);\r
196 \r
197     }\r
198     return NULL;\r
199 }\r
200 \r
201 NSResult NSTestStartPresence()\r
202 {\r
203     NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);\r
204     return NS_OK;\r
205 }\r
206 \r
207 NSResult NSTestStopPresence()\r
208 {\r
209     NSPushQueue(DISCOVERY_SCHEDULER, TASK_STOP_PRESENCE, NULL);\r
210     return NS_OK;\r
211 }\r
212 \r
213 \r