Fix bugs for copy provider
[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 = OICStrdup(serverAddress);
76     NS_VERIFY_NOT_NULL(queryAddr, NS_ERROR);
77
78     NSTask * discoverTask = NSMakeTask(TASK_CONSUMER_REQ_DISCOVER, (void *)queryAddr);
79     NS_VERIFY_NOT_NULL(discoverTask, NS_ERROR);
80
81     return NSConsumerPushEvent(discoverTask);
82 }
83
84 NSResult NSSubscribe(NSProvider * provider)
85 {
86     bool isStartedConsumer = NSIsStartedConsumer();
87     NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
88
89     NSProvider * prov = (NSProvider *)NSCopyProvider((NSProvider_internal *) provider);
90     NS_VERIFY_NOT_NULL(prov, NS_ERROR);
91
92     NSTask * subscribeTask = NSMakeTask(TASK_CONSUMER_REQ_SUBSCRIBE, (void *) prov);
93     NS_VERIFY_NOT_NULL(subscribeTask, NS_ERROR);
94
95     return NSConsumerPushEvent(subscribeTask);
96 }
97
98 NSResult NSUnsubscribe(NSProvider * provider)
99 {
100     bool isStartedConsumer = NSIsStartedConsumer();
101     NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
102
103     NSProvider * prov = (NSProvider *)NSCopyProvider((NSProvider_internal *) provider);
104     NS_VERIFY_NOT_NULL(prov, NS_ERROR);
105
106     NSTask * unsubscribeTask = NSMakeTask(TASK_CONSUMER_REQ_SUBSCRIBE_CANCEL, (void *) prov);
107     NS_VERIFY_NOT_NULL(unsubscribeTask, NS_ERROR);
108
109     return NSConsumerPushEvent(unsubscribeTask);
110 }
111
112 NSResult NSConsumerSendSyncInfo(const char * providerId, uint64_t messageId, NSSyncType type)
113 {
114     bool isStartedConsumer = NSIsStartedConsumer();
115     NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
116
117     NSSyncInfo * syncInfo = (NSSyncInfo *)OICMalloc(sizeof(NSSyncInfo));
118     NS_VERIFY_NOT_NULL(syncInfo, NS_ERROR);
119
120     OICStrcpy(syncInfo->providerId, sizeof(char) * NS_DEVICE_ID_LENGTH, providerId);
121     syncInfo->messageId = messageId;
122     syncInfo->state = type;
123
124     NSTask * syncTask = NSMakeTask(TASK_MAKE_SYNCINFO, (void *) syncInfo);
125     NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(syncTask, NS_ERROR, NSOICFree(syncInfo));
126
127     return NSConsumerPushEvent(syncTask);
128 }
129
130 NSResult NSRescanProvider()
131 {
132     bool isStartedConsumer = NSIsStartedConsumer();
133     NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
134
135     NSTask * discoverTask = NSMakeTask(TASK_CONSUMER_REQ_DISCOVER, NULL);
136     NS_VERIFY_NOT_NULL(discoverTask, NS_ERROR);
137
138     return NSConsumerPushEvent(discoverTask);
139 }
140
141 NSProvider * NSConsumerGetProvider(const char * providerId)
142 {
143     bool isStartedConsumer = NSIsStartedConsumer();
144     NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NULL);
145
146     NS_VERIFY_NOT_NULL(providerId, NULL);
147
148     NSProvider_internal * prov = NSConsumerFindNSProvider(providerId);
149     NS_VERIFY_NOT_NULL(prov, NULL);
150
151     NSProvider * retProv = NSCopyProvider(prov);
152     NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(retProv, NULL, NSRemoveProvider_internal(prov));
153     NSRemoveProvider_internal(prov);
154
155     return retProv;
156 }
157
158 NSMessage * NSConsumerGetMessage(uint64_t messageId)
159 {
160     bool isStartedConsumer = NSIsStartedConsumer();
161     NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NULL);
162
163     char msgId[NS_DEVICE_ID_LENGTH] = { 0, };
164     snprintf(msgId, NS_DEVICE_ID_LENGTH, "%lld", (long long int)messageId);
165
166     return (NSMessage *) NSConsumerFindNSMessage(msgId);
167 }
168
169 NSResult NSConsumerGetInterestTopics(NSProvider * provider)
170 {
171     bool isStartedConsumer = NSIsStartedConsumer();
172     NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
173
174     NS_VERIFY_NOT_NULL(provider, NS_ERROR);
175
176     NS_LOG_V(DEBUG, "NSProvider ID: %s", provider->providerId);
177     NSProvider_internal * prov_internal = NSConsumerFindNSProvider(provider->providerId);
178     NS_VERIFY_NOT_NULL(prov_internal, NS_ERROR);
179
180     NSSelector selector = prov_internal->accessPolicy;
181     NSRemoveProvider_internal(prov_internal);
182     NS_VERIFY_NOT_NULL(selector == NS_SELECTION_CONSUMER ? (void *) 1 : NULL, NS_ERROR);
183
184     NSProvider * prov = (NSProvider *)NSCopyProvider((NSProvider_internal *) provider);
185     NS_VERIFY_NOT_NULL(prov, NS_ERROR);
186
187     NSTask * topicTask = NSMakeTask(TASK_CONSUMER_GET_TOPIC_LIST, (void *) prov);
188     NS_VERIFY_NOT_NULL(topicTask, NS_ERROR);
189
190     return NSConsumerPushEvent(topicTask);
191 }
192
193 NSResult NSConsumerSelectInterestTopics(NSProvider * provider)
194 {
195     bool isStartedConsumer = NSIsStartedConsumer();
196     NS_VERIFY_NOT_NULL(isStartedConsumer == true ? (void *) 1 : NULL, NS_ERROR);
197
198     NS_VERIFY_NOT_NULL(provider, NS_ERROR);
199     NS_VERIFY_NOT_NULL(provider->topicLL, NS_ERROR);
200
201     NSProvider_internal * prov_internal = NSConsumerFindNSProvider(provider->providerId);
202     NS_VERIFY_NOT_NULL(prov_internal, NS_ERROR);
203
204     NSSelector selector = prov_internal->accessPolicy;
205     NSRemoveProvider_internal(prov_internal);
206     NS_VERIFY_NOT_NULL(selector == NS_SELECTION_CONSUMER ? (void *) 1 : NULL, NS_ERROR);
207
208     NSProvider * prov = (NSProvider *)NSCopyProvider((NSProvider_internal *) provider);
209     NS_VERIFY_NOT_NULL(prov, NS_ERROR);
210
211     NSTask * topicTask = NSMakeTask(TASK_CONSUMER_SELECT_TOPIC_LIST, (void *) prov);
212     NS_VERIFY_NOT_NULL(topicTask, NS_ERROR);
213
214     return NSConsumerPushEvent(topicTask);
215 }
216
217 NSResult NSDropNSMessage(NSMessage * obj)
218 {
219     NS_VERIFY_NOT_NULL(obj, NS_ERROR);
220
221     obj->messageId = 0;
222     NSOICFree(obj->title);
223     NSOICFree(obj->contentText);
224     NSOICFree(obj->sourceName);
225     NSOICFree(obj);
226
227     return NS_OK;
228 }