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