Fix bug for Cloud service of consumer service.
[platform/upstream/iotivity.git] / service / notification / src / consumer / NSConsumerInterface.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 "NSConsumerInterface.h"
22
23 #include <stdlib.h>
24 #include <stdbool.h>
25
26 #include "NSCommon.h"
27 #include "NSConsumerCommon.h"
28 #include "NSConstants.h"
29 #include "NSConsumerScheduler.h"
30 #include "oic_malloc.h"
31 #include "oic_string.h"
32
33 // Public APIs
34 NSResult NSStartConsumer(NSConsumerConfig config)
35 {
36     bool isStartedConsumer = NSIsStartedConsumer();
37     NS_VERIFY_NOT_NULL(isStartedConsumer == false ? (void *) 1 : NULL, NS_OK);
38
39     NS_VERIFY_NOT_NULL(config.messageCb, NS_ERROR);
40     NS_VERIFY_NOT_NULL(config.syncInfoCb, NS_ERROR);
41     NS_VERIFY_NOT_NULL(config.changedCb, NS_ERROR);
42
43     NSSetMessagePostedCb(config.messageCb);
44     NSSetNotificationSyncCb(config.syncInfoCb);
45     NSSetProviderChangedCb(config.changedCb);
46     NSSetIsStartedConsumer(true);
47
48     NSResult ret = NSConsumerMessageHandlerInit();
49     NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(ret == NS_OK ? (void *) 1 : NULL,
50             NS_ERROR, NSStopConsumer());
51
52     return NS_OK;
53 }
54
55 NSResult NSStopConsumer()
56 {
57     bool isStartedConsumer = NSIsStartedConsumer();
58     NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
59
60     NSSetMessagePostedCb(NULL);
61     NSSetNotificationSyncCb(NULL);
62     NSSetProviderChangedCb(NULL);
63     NSSetIsStartedConsumer(false);
64
65     NSConsumerMessageHandlerExit();
66
67     return NS_OK;
68 }
69
70 NSResult NSConsumerEnableRemoteService(char *serverAddress)
71 {
72     bool isStartedConsumer = NSIsStartedConsumer();
73     NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
74
75     char * queryAddr = NULL;
76     if (strstr(serverAddress, "coap+tcp://"))
77     {
78         queryAddr = OICStrdup(serverAddress+11);
79     }
80     else if (strstr(serverAddress, "coap://"))
81     {
82         queryAddr = OICStrdup(serverAddress+7);
83     }
84     else
85     {
86         queryAddr = OICStrdup(serverAddress);
87     }
88     NS_VERIFY_NOT_NULL(queryAddr, NS_ERROR);
89
90     NSTask * discoverTask = NSMakeTask(TASK_CONSUMER_REQ_DISCOVER, (void *)queryAddr);
91     NS_VERIFY_NOT_NULL(discoverTask, NS_ERROR);
92
93     return NSConsumerPushEvent(discoverTask);
94 }
95
96 NSResult NSSubscribe(NSProvider * provider)
97 {
98     bool isStartedConsumer = NSIsStartedConsumer();
99     NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
100
101     NSProvider * prov = (NSProvider *)NSCopyProvider((NSProvider_internal *) provider);
102     NS_VERIFY_NOT_NULL(prov, NS_ERROR);
103
104     NSTask * subscribeTask = NSMakeTask(TASK_CONSUMER_REQ_SUBSCRIBE, (void *) prov);
105     NS_VERIFY_NOT_NULL(subscribeTask, NS_ERROR);
106
107     return NSConsumerPushEvent(subscribeTask);
108 }
109
110 NSResult NSUnsubscribe(NSProvider * provider)
111 {
112     bool isStartedConsumer = NSIsStartedConsumer();
113     NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
114
115     NSProvider * prov = (NSProvider *)NSCopyProvider((NSProvider_internal *) provider);
116     NS_VERIFY_NOT_NULL(prov, NS_ERROR);
117
118     NSTask * unsubscribeTask = NSMakeTask(TASK_CONSUMER_REQ_SUBSCRIBE_CANCEL, (void *) prov);
119     NS_VERIFY_NOT_NULL(unsubscribeTask, NS_ERROR);
120
121     return NSConsumerPushEvent(unsubscribeTask);
122 }
123
124 NSResult NSConsumerSendSyncInfo(const char * providerId, uint64_t messageId, NSSyncType type)
125 {
126     bool isStartedConsumer = NSIsStartedConsumer();
127     NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
128
129     NSSyncInfo * syncInfo = (NSSyncInfo *)OICMalloc(sizeof(NSSyncInfo));
130     NS_VERIFY_NOT_NULL(syncInfo, NS_ERROR);
131
132     OICStrcpy(syncInfo->providerId, sizeof(char) * NS_DEVICE_ID_LENGTH, providerId);
133     syncInfo->messageId = messageId;
134     syncInfo->state = type;
135
136     NSTask * syncTask = NSMakeTask(TASK_MAKE_SYNCINFO, (void *) syncInfo);
137     NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(syncTask, NS_ERROR, NSOICFree(syncInfo));
138
139     return NSConsumerPushEvent(syncTask);
140 }
141
142 NSResult NSRescanProvider()
143 {
144     bool isStartedConsumer = NSIsStartedConsumer();
145     NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
146
147     NSTask * discoverTask = NSMakeTask(TASK_CONSUMER_REQ_DISCOVER, NULL);
148     NS_VERIFY_NOT_NULL(discoverTask, NS_ERROR);
149
150     return NSConsumerPushEvent(discoverTask);
151 }
152
153 NSProvider * NSConsumerGetProvider(const char * providerId)
154 {
155     bool isStartedConsumer = NSIsStartedConsumer();
156     NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NULL);
157
158     NS_VERIFY_NOT_NULL(providerId, NULL);
159
160     NSProvider_internal * prov = NSConsumerFindNSProvider(providerId);
161     NS_VERIFY_NOT_NULL(prov, NULL);
162
163     NSProvider * retProv = NSCopyProvider(prov);
164     NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(retProv, NULL, NSRemoveProvider_internal(prov));
165     NSRemoveProvider_internal(prov);
166
167     return retProv;
168 }
169
170 NSMessage * NSConsumerGetMessage(uint64_t messageId)
171 {
172     bool isStartedConsumer = NSIsStartedConsumer();
173     NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NULL);
174
175     char msgId[NS_DEVICE_ID_LENGTH] = { 0, };
176     snprintf(msgId, NS_DEVICE_ID_LENGTH, "%lld", (long long int)messageId);
177
178     return (NSMessage *) NSConsumerFindNSMessage(msgId);
179 }
180
181 NSResult NSConsumerGetInterestTopics(NSProvider * provider)
182 {
183     bool isStartedConsumer = NSIsStartedConsumer();
184     NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
185
186     NS_VERIFY_NOT_NULL(provider, NS_ERROR);
187
188     NS_LOG_V(DEBUG, "NSProvider ID: %s", provider->providerId);
189     NSProvider_internal * prov_internal = NSConsumerFindNSProvider(provider->providerId);
190     NS_VERIFY_NOT_NULL(prov_internal, NS_ERROR);
191
192     NSSelector selector = prov_internal->accessPolicy;
193     NSRemoveProvider_internal(prov_internal);
194     NS_VERIFY_NOT_NULL(selector == NS_SELECTION_CONSUMER ? (void *) 1 : NULL, NS_ERROR);
195
196     NSProvider * prov = (NSProvider *)NSCopyProvider((NSProvider_internal *) provider);
197     NS_VERIFY_NOT_NULL(prov, NS_ERROR);
198
199     NSTask * topicTask = NSMakeTask(TASK_CONSUMER_GET_TOPIC_LIST, (void *) prov);
200     NS_VERIFY_NOT_NULL(topicTask, NS_ERROR);
201
202     return NSConsumerPushEvent(topicTask);
203 }
204
205 NSResult NSConsumerSelectInterestTopics(NSProvider * provider)
206 {
207     bool isStartedConsumer = NSIsStartedConsumer();
208     NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
209
210     NS_VERIFY_NOT_NULL(provider, NS_ERROR);
211     NS_VERIFY_NOT_NULL(provider->topicLL, NS_ERROR);
212
213     NSProvider_internal * prov_internal = NSConsumerFindNSProvider(provider->providerId);
214     NS_VERIFY_NOT_NULL(prov_internal, NS_ERROR);
215
216     NSSelector selector = prov_internal->accessPolicy;
217     NSRemoveProvider_internal(prov_internal);
218     NS_VERIFY_NOT_NULL(selector == NS_SELECTION_CONSUMER ? (void *) 1 : NULL, NS_ERROR);
219
220     NSProvider * prov = (NSProvider *)NSCopyProvider((NSProvider_internal *) provider);
221     NS_VERIFY_NOT_NULL(prov, NS_ERROR);
222
223     NSTask * topicTask = NSMakeTask(TASK_CONSUMER_SELECT_TOPIC_LIST, (void *) prov);
224     NS_VERIFY_NOT_NULL(topicTask, NS_ERROR);
225
226     return NSConsumerPushEvent(topicTask);
227 }
228
229 NSResult NSDropNSMessage(NSMessage * obj)
230 {
231     NS_VERIFY_NOT_NULL(obj, NS_ERROR);
232
233     obj->messageId = 0;
234     NSOICFree(obj->title);
235     NSOICFree(obj->contentText);
236     NSOICFree(obj->sourceName);
237     NSOICFree(obj);
238
239     return NS_OK;
240 }