Fix for Memory leak results from static analyzer for NS C++ Wrapper.
[platform/upstream/iotivity.git] / service / notification / cpp-wrapper / examples / linux / notificationserviceconsumer.cpp
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 <iostream>\r
22 #include <limits>\r
23 \r
24 #include <unistd.h>\r
25 #include "NSConsumerService.h"\r
26 #include "NSMessage.h"\r
27 #include "NSProvider.h"\r
28 #include "NSTopicsList.h"\r
29 #include "ocstack.h"\r
30 \r
31 #define TAG "NotiConsumerWrapperExample"\r
32 using namespace std;\r
33 using namespace OIC::Service;\r
34 \r
35 bool isExit = false;\r
36 std::string REMOTE_SERVER_ADDRESS;\r
37 std::string mainProvider;\r
38 \r
39 FILE* server_fopen(const char *path, const char *mode)\r
40 {\r
41     (void)path;\r
42     return fopen("oic_ns_provider_db.dat", mode);\r
43 }\r
44 \r
45 void onNotificationPostedCb(OIC::Service::NSMessage *notification)\r
46 {\r
47     std::cout << "id : " << notification->getMessageId() << std::endl;\r
48     std::cout << "title : " << notification->getTitle() << std::endl;\r
49     std::cout << "content : " <<  notification->getContentText() << std::endl;\r
50     std::cout << "source : " <<  notification->getSourceName() << std::endl;\r
51     std::cout << "topic : " <<  notification->getTopic() << std::endl;\r
52 \r
53     auto provider = NSConsumerService::getInstance()->getProvider(notification->getProviderId());\r
54     if (provider != nullptr)\r
55     {\r
56         provider->sendSyncInfo(notification->getMessageId(),\r
57                                OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ);\r
58     }\r
59 }\r
60 \r
61 void onNotificationSyncCb(OIC::Service::NSSyncInfo *sync)\r
62 {\r
63     std::cout << "Sync ID : " <<  sync->getMessageId() << std::endl;\r
64     std::cout << "Sync STATE : " << (int) sync->getState() << std::endl;\r
65 }\r
66 \r
67 void onProviderStateChangedCb(OIC::Service::NSProviderState state)\r
68 {\r
69     std::cout << "onProviderStateChangedCb" << std::endl;\r
70     if (state == OIC::Service::NSProviderState::ALLOW)\r
71     {\r
72         std::cout << "Provider Subscription Accepted" << std::endl;\r
73     }\r
74     else if (state == OIC::Service::NSProviderState::DENY)\r
75     {\r
76         std::cout << "Provider Subscription Denied" << std::endl;\r
77     }\r
78     else if (state == OIC::Service::NSProviderState::TOPIC)\r
79     {\r
80         OIC::Service::NSProvider *provider = NSConsumerService::getInstance()->getProvider(mainProvider);\r
81         if (provider != nullptr)\r
82         {\r
83             auto topicList = provider->getTopicList();\r
84             if (topicList != nullptr)\r
85             {\r
86                 for (auto it : topicList->getTopicsList())\r
87                 {\r
88                     std::cout << "Topic Name: " << it->getTopicName() << std::endl;\r
89                     std::cout << "Topic state: " << (int) it->getState() << std::endl;\r
90                 }\r
91             }\r
92         }\r
93     }\r
94     else if (state == OIC::Service::NSProviderState::STOPPED)\r
95     {\r
96         std::cout << "Provider Stopped" << std::endl;\r
97     }\r
98 }\r
99 \r
100 void onDiscoverNotificationCb(OIC::Service::NSProvider *provider)\r
101 {\r
102     std::cout << "notification resource discovered" << std::endl;\r
103     std::cout << "SetListeners for callbacks" << std::endl;\r
104     provider->setListener(onProviderStateChangedCb, onNotificationPostedCb, onNotificationSyncCb);\r
105     if (!provider->isSubscribed())\r
106     {\r
107         std::cout << "startSubscribing" << std::endl;\r
108         provider->subscribe();\r
109     }\r
110     if (mainProvider.empty())\r
111     {\r
112         mainProvider = provider->getProviderId();\r
113     }\r
114 }\r
115 \r
116 void *OCProcessThread(void *ptr)\r
117 {\r
118     (void) ptr;\r
119 \r
120     while (!isExit)\r
121     {\r
122         usleep(2000);\r
123         if (OCProcess() != OC_STACK_OK)\r
124         {\r
125             OCStop();\r
126             break;\r
127         }\r
128     }\r
129 \r
130     return NULL;\r
131 }\r
132 \r
133 int main(void)\r
134 {\r
135     pthread_t OCThread = 0;\r
136 \r
137     std::cout << "start Iotivity" << std::endl;\r
138 \r
139     // open oic_db\r
140     static OCPersistentStorage ps = {server_fopen, fread, fwrite, fclose, unlink};\r
141     OCRegisterPersistentStorageHandler(&ps);\r
142 \r
143     if (OCInit1(OC_CLIENT_SERVER, OC_DEFAULT_FLAGS, OC_DEFAULT_FLAGS) != OC_STACK_OK)\r
144     {\r
145         std::cout << "OCInit fail" << std::endl;\r
146         return 0;\r
147     }\r
148 \r
149     pthread_create(&OCThread, NULL, OCProcessThread, NULL);\r
150 \r
151     std::cout << "Start notification consumer service" << std::endl;\r
152     while (!isExit)\r
153     {\r
154         int num = 0;\r
155 \r
156         std::cout << "1. Start Consumer" << std::endl;\r
157         std::cout << "2. Stop Consumer" << std::endl;\r
158         std::cout << "3. GetTopicList" << std::endl;\r
159         std::cout << "4. UpdateTopicList" << std::endl;\r
160 #ifdef WITH_CLOUD\r
161         std::cout << "5. Enable  NS Consumer RemoteService" << std::endl;\r
162 #endif\r
163         std::cout << "6. Exit" << std::endl;\r
164 \r
165         std::cout << "Input: " << std::endl;\r
166         std::cin >> num;\r
167         switch (num)\r
168         {\r
169             case 1:\r
170                 std::cout << "1. Start the Notification Consumer" << std::endl;\r
171                 NSConsumerService::getInstance()->start(onDiscoverNotificationCb);\r
172                 break;\r
173             case 2:\r
174                 std::cout << "2. Stop the Notification Consumer" << std::endl;\r
175                 NSConsumerService::getInstance()->stop();\r
176                 break;\r
177             case 3:\r
178                 {\r
179                     std::cout <<  "GetTopicList" << std::endl;\r
180                     OIC::Service::NSProvider *provider = NSConsumerService::getInstance()->getProvider(mainProvider);\r
181                     if (provider != nullptr)\r
182                     {\r
183                         auto topicList = provider->getTopicList();\r
184                         if (topicList != nullptr)\r
185                         {\r
186                             for (auto it : topicList->getTopicsList())\r
187                             {\r
188                                 std::cout << "Topic Name: " << it->getTopicName() << std::endl;\r
189                                 std::cout << "Topic state: " << (int) it->getState() << std::endl;\r
190                             }\r
191                         }\r
192                     }\r
193                 }\r
194                 break;\r
195             case 4:\r
196                 {\r
197                     std::cout <<  "UpdateTopicList" << std::endl;\r
198                     OIC::Service::NSProvider *provider = NSConsumerService::getInstance()->getProvider(mainProvider);\r
199                     if (provider != nullptr)\r
200                     {\r
201                         NSTopicsList *topicList = new NSTopicsList();\r
202                         topicList->addTopic("OCF_TOPIC1", NSTopic::NSTopicState::SUBSCRIBED);\r
203                         topicList->addTopic("OCF_TOPIC2", NSTopic::NSTopicState::SUBSCRIBED);\r
204                         topicList->addTopic("OCF_TOPIC3", NSTopic::NSTopicState::UNSUBSCRIBED);\r
205 \r
206                         provider->updateTopicList(topicList);\r
207                         delete topicList;\r
208                         delete provider;\r
209                     }\r
210                 }\r
211                 break;\r
212 #ifdef WITH_CLOUD\r
213             case 5:\r
214                 {\r
215                     std::cout << "5. Enable NS Consumer RemoteService" << std::endl;\r
216                     std::cout << "Input the Server Address :";\r
217                     std::cin >> REMOTE_SERVER_ADDRESS;\r
218                     NSConsumerService::getInstance()->enableRemoteService(REMOTE_SERVER_ADDRESS);\r
219                     break;\r
220                 }\r
221 #endif\r
222             case 6:\r
223                 std::cout << "6. Exit" << std::endl;\r
224                 NSConsumerService::getInstance()->stop();\r
225                 isExit = true;\r
226                 break;\r
227             default:\r
228                 std::cin.clear();\r
229                 std::cin.ignore(numeric_limits<streamsize>::max(), '\n');\r
230                 break;\r
231         }\r
232     }\r
233 \r
234     return 0;\r
235 }\r