f7c027c128a6cf873c6905c5c5072228115dda31
[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 uint64_t mainMessageId = 0;\r
39 \r
40 FILE *server_fopen(const char *path, const char *mode)\r
41 {\r
42     (void)path;\r
43     return fopen("oic_ns_provider_db.dat", mode);\r
44 }\r
45 \r
46 void onNotificationPostedCb(OIC::Service::NSMessage *notification)\r
47 {\r
48     std::cout << "------------------------------------" << std::endl;\r
49     std::cout << "Message Received " << std::endl;\r
50     std::cout << "------------------------------------" << std::endl;\r
51     std::cout << "id : " << notification->getMessageId() << std::endl;\r
52     std::cout << "title : " << notification->getTitle() << std::endl;\r
53     std::cout << "content : " <<  notification->getContentText() << std::endl;\r
54     std::cout << "source : " <<  notification->getSourceName() << std::endl;\r
55     std::cout << "topic : " <<  notification->getTopic() << std::endl;\r
56     std::cout << "type : " <<  (int) notification->getType() << std::endl;\r
57     std::cout << "TTL : " <<  notification->getTTL() << std::endl;\r
58     std::cout << "time : " <<  notification->getTime() << std::endl;\r
59     if (notification->getMediaContents() != nullptr)\r
60     {\r
61         std::cout << "MediaContents IconImage : " <<  notification->getMediaContents()->getIconImage()\r
62                   << std::endl;\r
63     }\r
64     std::cout << "ExtraInfo " << std::endl;\r
65     OC::OCRepresentation rep = notification->getExtraInfo();\r
66     for (auto it : rep.getResourceTypes())\r
67     {\r
68         std::cout << "resourceType : " << it << std::endl;\r
69     }\r
70     for (auto it : rep.getResourceInterfaces())\r
71     {\r
72         std::cout << "Interface : " << it << std::endl;\r
73     }\r
74     for (auto it : rep.getValues())\r
75     {\r
76         std::cout << "Key : " << it.first << std::endl;\r
77     }\r
78     mainMessageId = notification->getMessageId();\r
79 }\r
80 \r
81 void onNotificationSyncCb(OIC::Service::NSSyncInfo *sync)\r
82 {\r
83     std::cout << "------------------------------------" << std::endl;\r
84     std::cout << "SyncInfo Received " << std::endl;\r
85     std::cout << "------------------------------------" << std::endl;\r
86     std::cout << "Sync ID : " <<  sync->getMessageId() << std::endl;\r
87     std::cout << "Provider ID : " <<  sync->getProviderId() << std::endl;\r
88     std::cout << "Sync STATE : " << (int) sync->getState() << std::endl;\r
89 }\r
90 \r
91 void onProviderStateChangedCb(OIC::Service::NSProviderState state)\r
92 {\r
93     std::cout << "onProviderStateChangedCb" << std::endl;\r
94     if (state == OIC::Service::NSProviderState::ALLOW)\r
95     {\r
96         std::cout << "Provider Subscription Accepted" << std::endl;\r
97     }\r
98     else if (state == OIC::Service::NSProviderState::DENY)\r
99     {\r
100         std::cout << "Provider Subscription Denied" << std::endl;\r
101         std::cout << "------------------------------------" << std::endl;\r
102     }\r
103     else if (state == OIC::Service::NSProviderState::TOPIC)\r
104     {\r
105         OIC::Service::NSProvider *provider = NSConsumerService::getInstance()->getProvider(mainProvider);\r
106         if (provider != nullptr)\r
107         {\r
108             auto topicList = provider->getTopicList();\r
109             if (topicList != nullptr)\r
110             {\r
111                 for (auto it : topicList->getTopicsList())\r
112                 {\r
113                     std::cout << "Topic Name: " << it->getTopicName() << std::endl;\r
114                     std::cout << "Topic state: " << (int) it->getState() << std::endl;\r
115                 }\r
116             }\r
117         }\r
118     }\r
119     else if (state == OIC::Service::NSProviderState::STOPPED)\r
120     {\r
121         std::cout << "Provider Stopped" << std::endl;\r
122         std::cout << "------------------------------------" << std::endl;\r
123     }\r
124 }\r
125 \r
126 void onDiscoverNotificationCb(OIC::Service::NSProvider *provider)\r
127 {\r
128     std::cout << "Notification Resource Discovered" << std::endl;\r
129     std::cout << "SetListeners for callbacks" << std::endl;\r
130     std::cout << "ProviderID : " << provider->getProviderId() << std::endl;\r
131     provider->setListener(onProviderStateChangedCb, onNotificationPostedCb, onNotificationSyncCb);\r
132     if (!provider->isSubscribed())\r
133     {\r
134         std::cout << "startSubscribing" << std::endl;\r
135         provider->subscribe();\r
136     }\r
137     if (mainProvider.empty())\r
138     {\r
139         mainProvider = provider->getProviderId();\r
140     }\r
141 }\r
142 \r
143 void *OCProcessThread(void *ptr)\r
144 {\r
145     (void) ptr;\r
146 \r
147     while (!isExit)\r
148     {\r
149         usleep(2000);\r
150         if (OCProcess() != OC_STACK_OK)\r
151         {\r
152             OCStop();\r
153             break;\r
154         }\r
155     }\r
156 \r
157     return NULL;\r
158 }\r
159 \r
160 int main(void)\r
161 {\r
162     pthread_t OCThread = 0;\r
163 \r
164     std::cout << "start Iotivity" << std::endl;\r
165 \r
166     // open oic_db\r
167     static OCPersistentStorage ps = {server_fopen, fread, fwrite, fclose, unlink};\r
168     OCRegisterPersistentStorageHandler(&ps);\r
169 \r
170     if (OCInit1(OC_CLIENT_SERVER, OC_DEFAULT_FLAGS, OC_DEFAULT_FLAGS) != OC_STACK_OK)\r
171     {\r
172         std::cout << "OCInit fail" << std::endl;\r
173         return 0;\r
174     }\r
175 \r
176     pthread_create(&OCThread, NULL, OCProcessThread, NULL);\r
177 \r
178     std::cout << "Start notification consumer service" << std::endl;\r
179     while (!isExit)\r
180     {\r
181         int num = 0;\r
182 \r
183         std::cout << "1. Start Consumer" << std::endl;\r
184         std::cout << "2. Stop Consumer" << std::endl;\r
185         std::cout << "3. SendSyncInfo" << std::endl;\r
186         std::cout << "4. GetTopicList" << std::endl;\r
187         std::cout << "5. UpdateTopicList" << std::endl;\r
188 #ifdef WITH_CLOUD\r
189         std::cout << "6. Enable  NS Consumer RemoteService" << std::endl;\r
190 #endif\r
191         std::cout << "7. Exit" << std::endl;\r
192 \r
193         std::cout << "Input: " << std::endl;\r
194         std::cin >> num;\r
195         switch (num)\r
196         {\r
197             case 1:\r
198                 {\r
199                     std::cout << "Start the Notification Consumer" << std::endl;\r
200                     NSConsumerService::getInstance()->start(onDiscoverNotificationCb);\r
201                     break;\r
202                 }\r
203             case 2:\r
204                 {\r
205                     std::cout << "Stop the Notification Consumer" << std::endl;\r
206                     NSConsumerService::getInstance()->stop();\r
207                     break;\r
208                 }\r
209             case 3:\r
210                 {\r
211                     std::cout <<  "SendSyncInfo" << std::endl;\r
212                     if (!mainMessageId)\r
213                     {\r
214                         std::cout <<  "Message ID is empty" << std::endl;\r
215                         break;\r
216                     }\r
217                     std::cout << "1. Send Read Sync" << std::endl;\r
218                     std::cout << "2. Send Delete Sync" << std::endl;\r
219                     int syn = 0;\r
220                     while (!(std::cin >> syn))\r
221                     {\r
222                         std::cout << "Bad value!" << std::endl;;\r
223                         std::cin.clear();\r
224                         std::cin.ignore(numeric_limits<streamsize>::max(), '\n');\r
225                     }\r
226                     switch (syn)\r
227                     {\r
228                         case 1:\r
229                             {\r
230                                 std::cout << "Sending Read Sync" << std::endl;\r
231                                 auto provider = NSConsumerService::getInstance()->getProvider(\r
232                                                     mainProvider);\r
233                                 if (provider != nullptr)\r
234                                 {\r
235                                     provider->sendSyncInfo(mainMessageId,\r
236                                                            OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ);\r
237                                 }\r
238                             }\r
239                             break;\r
240                         case 2:\r
241                             {\r
242                                 std::cout << "Sending Delete Sync" << std::endl;\r
243                                 auto provider = NSConsumerService::getInstance()->getProvider(\r
244                                                     mainProvider);\r
245                                 if (provider != nullptr)\r
246                                 {\r
247                                     provider->sendSyncInfo(mainMessageId,\r
248                                                            OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_DELETED);\r
249                                 }\r
250                             }\r
251                             break;\r
252                         default:\r
253                             {\r
254                                 cout << "Invalid Input!. sending default Read Sync";\r
255                                 auto provider = NSConsumerService::getInstance()->getProvider(\r
256                                                     mainProvider);\r
257                                 if (provider != nullptr)\r
258                                 {\r
259                                     provider->sendSyncInfo(mainMessageId,\r
260                                                            OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ);\r
261                                 }\r
262                                 std::cin.clear();\r
263                                 std::cin.ignore(numeric_limits<streamsize>::max(), '\n');\r
264                                 break;\r
265                             }\r
266                     }\r
267                     break;\r
268                 }\r
269             case 4:\r
270                 {\r
271                     std::cout <<  "GetTopicList" << std::endl;\r
272                     OIC::Service::NSProvider *provider = NSConsumerService::getInstance()->getProvider(mainProvider);\r
273                     if (provider != nullptr)\r
274                     {\r
275                         auto topicList = provider->getTopicList();\r
276                         if (topicList != nullptr)\r
277                         {\r
278                             for (auto it : topicList->getTopicsList())\r
279                             {\r
280                                 std::cout << "Topic Name: " << it->getTopicName() << std::endl;\r
281                                 std::cout << "Topic state: " << (int) it->getState() << std::endl;\r
282                             }\r
283                         }\r
284                     }\r
285                 }\r
286                 break;\r
287             case 5:\r
288                 {\r
289                     std::cout <<  "UpdateTopicList" << std::endl;\r
290                     OIC::Service::NSProvider *provider = NSConsumerService::getInstance()->getProvider(mainProvider);\r
291                     if (provider != nullptr)\r
292                     {\r
293                         NSTopicsList *topicList = new NSTopicsList();\r
294                         topicList->addTopic("OCF_TOPIC1", NSTopic::NSTopicState::SUBSCRIBED);\r
295                         topicList->addTopic("OCF_TOPIC2", NSTopic::NSTopicState::SUBSCRIBED);\r
296                         topicList->addTopic("OCF_TOPIC3", NSTopic::NSTopicState::UNSUBSCRIBED);\r
297 \r
298                         provider->updateTopicList(topicList);\r
299                         delete topicList;\r
300                         delete provider;\r
301                     }\r
302                 }\r
303                 break;\r
304 #ifdef WITH_CLOUD\r
305             case 6:\r
306                 {\r
307                     std::cout << "Enable NS Consumer RemoteService" << std::endl;\r
308                     std::cout << "Input the Server Address :";\r
309                     std::cin >> REMOTE_SERVER_ADDRESS;\r
310                     NSConsumerService::getInstance()->enableRemoteService(REMOTE_SERVER_ADDRESS);\r
311                     break;\r
312                 }\r
313 #endif\r
314             case 7:\r
315                 {\r
316                     std::cout << "Exit" << std::endl;\r
317                     NSConsumerService::getInstance()->stop();\r
318                     isExit = true;\r
319                     break;\r
320                 }\r
321             default:\r
322                 {\r
323                     std::cout << "Under Construction" << std::endl;\r
324                     std::cin.clear();\r
325                     std::cin.ignore(numeric_limits<streamsize>::max(), '\n');\r
326                     break;\r
327                 }\r
328         }\r
329     }\r
330 \r
331     return 0;\r
332 }\r