Added CA BLE packet format changed codes
[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 \r
47 void onNotificationSyncCb(OIC::Service::NSSyncInfo *sync)\r
48 {\r
49     std::cout << "Sync ID : " <<  sync->getMessageId() << std::endl;\r
50     std::cout << "Sync STATE : " << (int) sync->getState() << std::endl;\r
51 }\r
52 \r
53 void onDiscoverNotificationCb(OIC::Service::NSProvider *provider)\r
54 {\r
55     std::cout << "notification resource discovered" << std::endl;\r
56     provider->subscribe();\r
57     std::cout << "startSubscribing" << std::endl;\r
58 }\r
59 \r
60 void onProviderChangedCb(OIC::Service::NSProvider *provider, OIC::Service::NSResponse response)\r
61 {\r
62     std::cout << "Subscription accepted" << std::endl;\r
63     std::cout << "subscribed provider Id : " << provider->getProviderId() << std::endl;\r
64     if (response == OIC::Service::NSResponse::ALLOW)\r
65     {\r
66         provider->setListener(onNotificationPostedCb, onNotificationSyncCb);\r
67         if (mainProvider.empty())\r
68             mainProvider = provider->getProviderId();\r
69     }\r
70     else if (response == OIC::Service::NSResponse::TOPIC)\r
71     {\r
72         std::cout << "Provider Topic Updated" << std::endl;\r
73         for (auto it : provider->getTopicList()->getTopicsList())\r
74         {\r
75             std::cout << "Topic Name: " << it->getTopicName() << std::endl;\r
76             std::cout << "Topic state: " << (int) it->getState() << std::endl;\r
77         }\r
78 \r
79         std::cout << "7. Get Topics" << std::endl;\r
80         std::cout << "8. Select Topics" << std::endl;\r
81         std::cout << "0. Exit" << std::endl;\r
82         std::cout << "input: " << std::endl;\r
83 \r
84         int num = 0;\r
85         std::cin >> num;\r
86         switch (num)\r
87         {\r
88             case 7:\r
89                 {\r
90                     std::cout <<  "getInterestTopics" << std::endl;\r
91                     if (provider != nullptr)\r
92                     {\r
93                         auto topicList = provider->getTopicList();\r
94                         if (topicList != nullptr)\r
95                             for (auto it : topicList->getTopicsList())\r
96                             {\r
97                                 std::cout << "Topic Name: " << it->getTopicName() << std::endl;\r
98                                 std::cout << "Topic state: " << (int) it->getState() << std::endl;\r
99                             }\r
100                     }\r
101                 }\r
102                 break;\r
103             case 8:\r
104                 {\r
105                     std::cout <<  "selectInterestTopics" << std::endl;\r
106                     if (provider != nullptr)\r
107                     {\r
108                         NSTopicsList *topicList = new NSTopicsList();\r
109                         topicList->addTopic("OCF_TOPIC1", NSTopic::NSTopicState::UNSUBSCRIBED);\r
110                         topicList->addTopic("OCF_TOPIC2", NSTopic::NSTopicState::UNSUBSCRIBED);\r
111                         topicList->addTopic("OCF_TOPIC3", NSTopic::NSTopicState::UNSUBSCRIBED);\r
112 \r
113                         provider->selectInterestTopics(topicList);\r
114                     }\r
115                 }\r
116                 break;\r
117             case 0:\r
118             default:\r
119                 break;\r
120         }\r
121     }\r
122 }\r
123 \r
124 void *OCProcessThread(void *ptr)\r
125 {\r
126     (void) ptr;\r
127 \r
128     while (!isExit)\r
129     {\r
130         usleep(2000);\r
131         if (OCProcess() != OC_STACK_OK)\r
132         {\r
133             OCStop();\r
134             break;\r
135         }\r
136     }\r
137 \r
138     return NULL;\r
139 }\r
140 \r
141 int main(void)\r
142 {\r
143     pthread_t OCThread;\r
144 \r
145     std::cout << "start Iotivity" << std::endl;\r
146     if (OCInit1(OC_CLIENT, OC_DEFAULT_FLAGS, OC_DEFAULT_FLAGS) != OC_STACK_OK)\r
147     {\r
148         std::cout << "OCInit fail" << std::endl;\r
149         return 0;\r
150     }\r
151 \r
152     NSConsumerService::ConsumerConfig cfg;\r
153     cfg.m_discoverCb = onDiscoverNotificationCb;\r
154     cfg.m_changedCb = onProviderChangedCb;\r
155 \r
156     pthread_create(&OCThread, NULL, OCProcessThread, NULL);\r
157 \r
158     std::cout << "Start notification consumer service" << std::endl;\r
159     while (!isExit)\r
160     {\r
161         int num;\r
162 \r
163         std::cout << "1. Start Consumer" << std::endl;\r
164         std::cout << "2. Stop Consumer" << std::endl;\r
165         std::cout << "3. getInterestTopics" << std::endl;\r
166         std::cout << "4. selectInterestTopics" << std::endl;\r
167 #ifdef WITH_CLOUD\r
168         std::cout << "5. Enable  NS Consumer RemoteService" << std::endl;\r
169 #endif\r
170         std::cout << "6. Exit" << std::endl;\r
171 \r
172         std::cout << "Input: " << std::endl;\r
173         std::cin >> num;\r
174         switch (num)\r
175         {\r
176             case 1:\r
177                 std::cout << "1. Start the Notification Consumer" << std::endl;\r
178                 NSConsumerService::getInstance()->Start(cfg);\r
179                 break;\r
180             case 2:\r
181                 std::cout << "2. Stop the Notification Consumer" << std::endl;\r
182                 NSConsumerService::getInstance()->Stop();\r
183                 break;\r
184             case 3:\r
185                 {\r
186                     std::cout <<  "getInterestTopics" << std::endl;\r
187                     OIC::Service::NSProvider *provider = NSConsumerService::getInstance()->getProvider(mainProvider);\r
188                     if (provider != nullptr)\r
189                     {\r
190                         auto topicList = provider->getTopicList();\r
191                         if (topicList != nullptr)\r
192                             for (auto it : topicList->getTopicsList())\r
193                             {\r
194                                 std::cout << "Topic Name: " << it->getTopicName() << std::endl;\r
195                                 std::cout << "Topic state: " << (int) it->getState() << std::endl;\r
196                             }\r
197                     }\r
198                 }\r
199                 break;\r
200             case 4:\r
201                 {\r
202                     std::cout <<  "selectInterestTopics" << std::endl;\r
203                     OIC::Service::NSProvider *provider = NSConsumerService::getInstance()->getProvider(mainProvider);\r
204                     if (provider != nullptr)\r
205                     {\r
206                         NSTopicsList *topicList = new NSTopicsList();\r
207                         topicList->addTopic("OCF_TOPIC1", NSTopic::NSTopicState::UNSUBSCRIBED);\r
208                         topicList->addTopic("OCF_TOPIC2", NSTopic::NSTopicState::UNSUBSCRIBED);\r
209                         topicList->addTopic("OCF_TOPIC3", NSTopic::NSTopicState::UNSUBSCRIBED);\r
210 \r
211                         provider->selectInterestTopics(topicList);\r
212                     }\r
213                 }\r
214                 break;\r
215 #ifdef WITH_CLOUD\r
216             case 5:\r
217                 {\r
218                     std::cout << "5. Enable NS Consumer RemoteService" << std::endl;\r
219                     std::cout << "Input the Server Address :";\r
220                     std::cin >> REMOTE_SERVER_ADDRESS;\r
221                     NSConsumerService::getInstance()->EnableRemoteService(REMOTE_SERVER_ADDRESS);\r
222                     break;\r
223                 }\r
224 #endif\r
225             case 6:\r
226                 std::cout << "6. Exit" << std::endl;\r
227                 isExit = true;\r
228                 break;\r
229             default:\r
230                 break;\r
231         }\r
232     }\r
233 \r
234     return 0;\r
235 }\r