Modified consumer internal function call flow.
[platform/upstream/iotivity.git] / service / notification / src / consumer / NSConsumerCommon.c
1 //******************************************************************
2 //
3 // Copyright 2016 Samsung Electronics All Rights Reserved.
4 //
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
6 //
7 // Licensed under the Apache License, Version 2.0 (the "License");
8 // you may not use this file except in compliance with the License.
9 // You may obtain a copy of the License at
10 //
11 //      http://www.apache.org/licenses/LICENSE-2.0
12 //
13 // Unless required by applicable law or agreed to in writing, software
14 // distributed under the License is distributed on an "AS IS" BASIS,
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 // See the License for the specific language governing permissions and
17 // limitations under the License.
18 //
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
20
21 #include "NSConsumerCommon.h"
22 #include "NSConstants.h"
23 #include "NSThread.h"
24 #include "oic_malloc.h"
25 #include "oic_string.h"
26
27 #define NS_QUERY_CONSUMER_ID "consumerid"
28
29 char ** NSGetConsumerId()
30 {
31     static char * g_consumerId = NULL;
32     return & g_consumerId;
33 }
34
35 void NSSetConsumerId(char * cId)
36 {
37     NS_VERTIFY_NOT_NULL_V(cId);
38     char ** consumerId = NSGetConsumerId();
39     NSOICFree(*consumerId);
40     *consumerId = (char *)OICMalloc(sizeof(char) * NS_DEVICE_ID_LENGTH);
41     NS_VERTIFY_NOT_NULL_V(*consumerId);
42
43     OICStrcpy(*consumerId, sizeof(char) * NS_DEVICE_ID_LENGTH, cId);
44 }
45
46 char * NSGetQuery(const char * uri)
47 {
48     NS_VERTIFY_NOT_NULL(uri, NULL);
49
50     char * consumerId = OICStrdup(*NSGetConsumerId());
51     NS_VERTIFY_NOT_NULL(consumerId, NULL);
52
53     size_t uriLen = strlen(uri) + 1;
54     size_t qKeyLen = sizeof(NS_QUERY_CONSUMER_ID);
55     size_t queryLen = NS_DEVICE_ID_LENGTH + uriLen + qKeyLen + 2;
56
57     char * retQuery = (char *)OICMalloc(sizeof(char) * queryLen);
58     NS_VERTIFY_NOT_NULL(retQuery, NULL);
59
60     size_t index = 0;
61     OICStrcpy((retQuery + index), uriLen, uri);
62     index += uriLen - 1;
63     OICStrcpy((retQuery + index), 2, "?");
64     index += 1;
65     OICStrcpy((retQuery + index), qKeyLen, NS_QUERY_CONSUMER_ID);
66     index += qKeyLen - 1;
67     OICStrcpy((retQuery + index), 2, "=");
68     index += 1;
69     OICStrcpy((retQuery + index), NS_DEVICE_ID_LENGTH, consumerId);
70
71     NSOICFree(consumerId);
72
73     return retQuery;
74 }
75
76 bool * NSGetBoneIsStartedConsumer()
77 {
78     static bool g_isStartedConsumer = false;
79
80     return & g_isStartedConsumer;
81 }
82
83 void NSSetIsStartedConsumer(bool setValue)
84 {
85     * NSGetBoneIsStartedConsumer() = setValue;
86 }
87
88 bool NSIsStartedConsumer()
89 {
90     return * NSGetBoneIsStartedConsumer();
91 }
92
93 NSProviderDiscoveredCallback * NSGetBoneDiscoverCb()
94 {
95     static NSProviderDiscoveredCallback g_discoverCb = NULL;
96
97     return & g_discoverCb;
98 }
99
100 void NSSetDiscoverProviderCb(NSProviderDiscoveredCallback cb)
101 {
102     * NSGetBoneDiscoverCb() = cb;
103 }
104
105 NSProviderDiscoveredCallback NSGetDiscoverCb()
106 {
107     return * NSGetBoneDiscoverCb();
108 }
109
110 void * NSDiscoveredProviderFunc(void * provider)
111 {
112     NSGetDiscoverCb()((NSProvider *) provider);
113
114     return NULL;
115 }
116
117 void NSDiscoveredProvider(NSProvider * provider)
118 {
119     NSConsumerThread * thread = NSThreadInit(NSDiscoveredProviderFunc, (void *) provider);
120     NS_VERTIFY_NOT_NULL_V(thread);
121 }
122
123 NSSyncCallback * NSGetBoneNotificationSyncCb()
124 {
125     static NSSyncCallback g_syncCb = NULL;
126
127     return & g_syncCb;
128 }
129
130 void NSSetNotificationSyncCb(NSSyncCallback cb)
131 {
132     * NSGetBoneNotificationSyncCb() = cb;
133 }
134
135 typedef struct
136 {
137     NSProvider * provider;
138     NSSyncInfo * sync;
139 } NSSyncData;
140
141 void * NSNotificationSyncFunc(void * obj)
142 {
143     NSProvider * provider = ((NSSyncData *) obj)->provider;
144     NSSyncInfo * syncData = ((NSSyncData *) obj)->sync;
145     (* NSGetBoneNotificationSyncCb())(provider, syncData);
146     return NULL;
147 }
148
149 void NSNotificationSync(NSProvider * provider, NSSyncInfo * sync)
150 {
151     NSSyncData * obj = (NSSyncData *)OICMalloc(sizeof(NSSyncData));
152     NS_VERTIFY_NOT_NULL_V(obj);
153     obj->provider = provider;
154     obj->sync = sync;
155
156     NSConsumerThread * thread = NSThreadInit(NSNotificationSyncFunc, (void *) obj);
157     NS_VERTIFY_NOT_NULL_V(thread);
158 }
159
160 NSNotificationReceivedCallback  * NSGetBoneMessagePostedCb()
161 {
162     static NSNotificationReceivedCallback  g_postCb = NULL;
163
164     return & g_postCb;
165 }
166
167 void NSSetMessagePostedCb(NSNotificationReceivedCallback  cb)
168 {
169     * NSGetBoneMessagePostedCb() = cb;
170 }
171
172 NSNotificationReceivedCallback  NSGetMessagePostedCb()
173 {
174     return * NSGetBoneMessagePostedCb();
175 }
176
177 typedef struct
178 {
179     NSProvider * provider;
180     NSMessage * msg;
181 } NSMessageData;
182
183 void * NSMessagePostFunc(void * obj)
184 {
185     NSMessageData * msgData = (NSMessageData *) obj;
186
187     NSGetMessagePostedCb()((NSProvider *) msgData->provider,
188             (NSMessage *) msgData->msg);
189     return NULL;
190 }
191
192 void NSMessagePost(NSProvider * provider, NSMessage * msg)
193 {
194     NSMessageData * obj = (NSMessageData *)OICMalloc(sizeof(NSMessageData));
195     NS_VERTIFY_NOT_NULL_V(obj);
196     obj->provider = provider;
197     obj->msg = msg;
198
199     NSConsumerThread * thread = NSThreadInit(NSMessagePostFunc, (void *) obj);
200     NS_VERTIFY_NOT_NULL_V(thread);
201 }
202
203 NSTask * NSMakeTask(NSTaskType type, void * data)
204 {
205     NSTask * retTask = OICMalloc(sizeof(NSTask));
206     NS_VERTIFY_NOT_NULL(retTask, NULL);
207
208     retTask->taskType = type;
209     retTask->taskData = data;
210     retTask->nextTask = NULL;
211
212     return retTask;
213 }
214
215 NSMessage_consumer * NSCopyMessage(NSMessage_consumer * msg)
216 {
217     NS_VERTIFY_NOT_NULL(msg, NULL);
218
219     NSMessage_consumer * newMsg = (NSMessage_consumer *)OICMalloc(sizeof(NSMessage_consumer));
220     NS_VERTIFY_NOT_NULL(newMsg, NULL);
221
222     newMsg->addr = (OCDevAddr *)OICMalloc(sizeof(OCDevAddr));
223     NS_VERTIFY_NOT_NULL_WITH_POST_CLEANING(newMsg, NULL, OICFree(newMsg));
224     memcpy(newMsg->addr, msg->addr, sizeof(OCDevAddr));
225
226     newMsg->messageId = msg->messageId;
227     newMsg->title = OICStrdup(msg->title);
228     newMsg->contentText = OICStrdup(msg->contentText);
229     newMsg->sourceName = OICStrdup(msg->sourceName);
230
231     return newMsg;
232 }
233 void NSRemoveMessage(NSMessage_consumer * msg)
234 {
235     msg->messageId = 0;
236     NSOICFree(msg->title);
237     NSOICFree(msg->contentText);
238     NSOICFree(msg->sourceName);
239     NSOICFree(msg->addr);
240
241     NSOICFree(msg);
242 }
243
244 OCStackResult NSInvokeRequest(OCDoHandle * handle,
245         OCMethod method, const OCDevAddr * addr,
246         const char * queryUrl, OCPayload * payload,
247         void * callbackFunc, void * callbackData)
248 {
249     OCCallbackData cbdata;
250
251     cbdata.cb = callbackFunc;
252     cbdata.context = callbackData;
253     cbdata.cd = NULL;
254
255     return OCDoResource(handle, method, queryUrl, addr,
256             payload, CT_DEFAULT, NS_QOS, &cbdata, NULL, 0);
257 }