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