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