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