Add including headers description.
[platform/upstream/iotivity.git] / service / notification / cpp-wrapper / examples / linux / notificationserviceprovider.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 // std\r
22 #include <iostream>\r
23 #include <stdlib.h>\r
24 #include <cstdint>\r
25 #include <limits>\r
26 \r
27 // ns\r
28 #include "NSCommon.h"\r
29 #include "NSProviderService.h"\r
30 #include "NSUtils.h"\r
31 #include "NSTopicsList.h"\r
32 \r
33 // base\r
34 #include "logger.h"\r
35 #include "octypes.h"\r
36 #include "oic_string.h"\r
37 #include "oic_malloc.h"\r
38 #include "ocstack.h"\r
39 \r
40 // external\r
41 #include "pthread.h"\r
42 \r
43 #define TAG "NotiProviderWrapperExample"\r
44 using namespace std;\r
45 using namespace OIC::Service;\r
46 std::vector<std::string> discoveredConsumers;\r
47 uint64_t mainMessageId = 0;\r
48 \r
49 extern char *strdup(const char *s);\r
50 \r
51 bool isExit = false;\r
52 \r
53 int id = 0;\r
54 std::string REMOTE_SERVER_ADDRESS;\r
55 \r
56 void *OCProcessThread(void *ptr)\r
57 {\r
58     (void) ptr;\r
59     while (!isExit)\r
60     {\r
61         if (OCProcess() != OC_STACK_OK)\r
62         {\r
63             std::cout << "OCStack process error" << std::endl;\r
64             return NULL;\r
65         }\r
66     }\r
67 \r
68     return NULL;\r
69 }\r
70 \r
71 void subscribeRequestCallback(OIC::Service::NSConsumer *consumer)\r
72 {\r
73     std::cout << "consumer requested to subscribe" << std::endl;\r
74 \r
75     std::cout << "Consumer Device ID: " << consumer->getConsumerId() << std::endl;\r
76     discoveredConsumers.push_back(consumer->getConsumerId());\r
77     consumer->acceptSubscription(true);\r
78 }\r
79 \r
80 void syncCallback(OIC::Service::NSSyncInfo *sync)\r
81 {\r
82     std::cout << "SyncInfo Received " << std::endl;\r
83     std::cout << "Sync ID : " <<  sync->getMessageId() << std::endl;\r
84     std::cout << "Provider ID : " <<  sync->getProviderId() << std::endl;\r
85     std::cout << "Sync State: " << (int) sync->getState() << std::endl;\r
86 }\r
87 \r
88 OIC::Service::NSConsumer *printAvailableConsumers()\r
89 {\r
90     std::cout << "Choose the Consumer ID for operation" << std::endl;\r
91     int pos = 1;\r
92     unsigned int option = 0;\r
93     for(auto it: discoveredConsumers)\r
94     {\r
95         std::cout << pos << ". " << it <<std::endl;\r
96         pos++;\r
97     }\r
98     while(!(std::cin >> option)){\r
99         std::cout << "Bad value!" <<std::endl;;\r
100         std::cin.clear();\r
101         std::cin.ignore(numeric_limits<streamsize>::max(), '\n');\r
102     }\r
103     option--;\r
104     if (option > discoveredConsumers.size())\r
105         return NULL;\r
106     std::string consumerId = discoveredConsumers[option];\r
107     OIC::Service::NSConsumer *consumer = NSProviderService::getInstance()->getConsumer(\r
108                                             consumerId);\r
109     return consumer;\r
110 }\r
111 \r
112 int main()\r
113 {\r
114     int num = 0;\r
115     pthread_t processThread = 0;\r
116 \r
117     std::cout << "start Iotivity" << std::endl;\r
118 \r
119 \r
120     if (OCInit(NULL, 0, OC_CLIENT_SERVER) != OC_STACK_OK)\r
121     {\r
122         std::cout << "OCStack init error" << std::endl;\r
123         return 0;\r
124     }\r
125 \r
126     pthread_create(&processThread, NULL, OCProcessThread, NULL);\r
127 \r
128     while (!isExit)\r
129     {\r
130         std::cout << "1. Start the Notification Provider(Accepter: Provider)" << std::endl;\r
131         std::cout << "2. Start the Notification Provider(Accepter: Consumer)" << std::endl;\r
132         std::cout << "3. Allow Subscription" << std::endl;\r
133         std::cout << "4. Deny Subscription" << std::endl;\r
134         std::cout << "5. SendMessage " << std::endl;\r
135         std::cout << "6. SendSyncInfo" << std::endl;\r
136 \r
137         std::cout << "7. RegisterTopic" << std::endl;\r
138         std::cout << "8. UnregisterTopic" << std::endl;\r
139         std::cout << "9. SetTopic" << std::endl;\r
140         std::cout << "10. UnsetTopic" << std::endl;\r
141         std::cout << "11. GetConsumerTopicList" << std::endl;\r
142         std::cout << "12. GetRegisteredTopicList" << std::endl;\r
143 #ifdef WITH_CLOUD\r
144         std::cout << "13. Enable NS Provider RemoteService" << std::endl;\r
145         std::cout << "14. Disable NS Provider RemoteService" << std::endl;\r
146 #endif\r
147         std::cout << "15. Stop the Notification Provider" << std::endl;\r
148         std::cout << "16. Exit()" << std::endl;\r
149 \r
150         std::cout << "input : ";\r
151 \r
152         std::cin >> num;\r
153 \r
154         switch (num)\r
155         {\r
156             case 1:\r
157                 {\r
158                     std::cout << "Start (Accepter: Provider)" << std::endl;\r
159                     NSProviderService::ProviderConfig cfg;\r
160                     cfg.m_subscribeRequestCb = subscribeRequestCallback;\r
161                     cfg.m_syncInfoCb = syncCallback;\r
162                     cfg.subControllability = true;\r
163 \r
164                     NSProviderService::getInstance()->start(cfg);\r
165                     break;\r
166                 }\r
167             case 2:\r
168                 {\r
169                     std::cout << "Start (Accepter: Consumer)" << std::endl;\r
170                     NSProviderService::ProviderConfig cfg;\r
171                     cfg.m_subscribeRequestCb = subscribeRequestCallback;\r
172                     cfg.m_syncInfoCb = syncCallback;\r
173                     cfg.subControllability = false;\r
174 \r
175                     NSProviderService::getInstance()->start(cfg);\r
176                     break;\r
177                 }\r
178             case 3:\r
179                 {\r
180                     std::cout << "Allow Subscription" << std::endl;\r
181                     OIC::Service::NSConsumer *consumer = printAvailableConsumers();\r
182                     if (consumer != nullptr)\r
183                     {\r
184                         std::cout << "ALLOW" << std::endl;\r
185                         consumer->acceptSubscription(true);\r
186                     }\r
187                     break;\r
188                 }\r
189             case 4:\r
190                 {\r
191                     std::cout << "Deny Subscription" << std::endl;\r
192                     OIC::Service::NSConsumer *consumer = printAvailableConsumers();\r
193                     if (consumer != nullptr)\r
194                     {\r
195                         std::cout << "DENY" << std::endl;\r
196                         consumer->acceptSubscription(false);\r
197                     }\r
198                     break;\r
199                 }\r
200             case 5:\r
201                 {\r
202                     std::cout << "------------------------------------" << std::endl;\r
203                     std::cout << "SendMessage" << std::endl;\r
204                     std::cout << "------------------------------------" << std::endl;\r
205 \r
206                     std::string dummy;\r
207                     std::string title;\r
208                     std::string body;\r
209                     std::string topic;\r
210 \r
211                     std::cout << "id : " << ++id << std::endl;\r
212                     std::cout << "title : ";\r
213 \r
214                     std::getline(std::cin, dummy);\r
215                     std::getline(std::cin, title);\r
216 \r
217                     std::cout << "body : ";\r
218                     std::getline(std::cin, body);\r
219 \r
220                     std::cout << "topic : ";\r
221                     std::getline(std::cin, topic);\r
222 \r
223                     std::cout << "app - mTitle : " << title << std::endl;\r
224                     std::cout << "app - mContentText : " << body << std::endl;\r
225                     std::cout << "app - mTopic : " << topic << std::endl;\r
226 \r
227                     OIC::Service::NSMessage *msg = NSProviderService::getInstance()->createMessage();\r
228 \r
229                     msg->setType(OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_INFO);\r
230                     msg->setTitle(title.c_str());\r
231                     msg->setContentText(body.c_str());\r
232                     msg->setSourceName("OCF");\r
233                     msg->setTopic(topic);\r
234                     msg->setTTL(40);\r
235                     msg->setTime("12:30");\r
236                     OIC::Service::NSMediaContents *mediaContents = \r
237                                             new OIC::Service::NSMediaContents("iconImage");\r
238                     msg->setMediaContents(mediaContents);\r
239 \r
240                     OC::OCRepresentation rep;\r
241                     rep.setValue("Key1","Value1");\r
242                     rep.setValue("Key2","Value2");\r
243                     msg->setExtraInfo(rep);\r
244 \r
245                     mainMessageId = msg->getMessageId();\r
246                     std::cout << "ProviderID for Message : " << msg->getProviderId() << std::endl;\r
247                     std::cout << "MessageID for Message : " << msg->getMessageId() << std::endl;\r
248 \r
249                     NSProviderService::getInstance()->sendMessage(msg);\r
250                     delete mediaContents;\r
251                     break;\r
252                 }\r
253             case 6:\r
254                 {\r
255                     std::cout << "------------------------------------" << std::endl;\r
256                     std::cout <<  "SendSyncInfo" << std::endl;\r
257                     std::cout << "------------------------------------" << std::endl;\r
258                     if(!mainMessageId)\r
259                     {\r
260                         std::cout <<  "Message ID is empty" << std::endl;\r
261                         break;\r
262                     }\r
263                     std::cout << "1. Send Read Sync" << std::endl;\r
264                     std::cout << "2. Send Delete Sync" << std::endl;\r
265                     int syn = 0;\r
266                     while(!(std::cin >> syn)){\r
267                         std::cout << "Bad value!" <<std::endl;;\r
268                         std::cin.clear();\r
269                         std::cin.ignore(numeric_limits<streamsize>::max(), '\n');\r
270                     }\r
271                     switch (syn)\r
272                     {\r
273                         case 1:\r
274                         {\r
275                             std::cout << "Sending Read Sync" << std::endl;\r
276                             NSProviderService::getInstance()->sendSyncInfo(mainMessageId,\r
277                                 OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ);\r
278                         }\r
279                         break;\r
280                         case 2:\r
281                         {\r
282                             std::cout << "Sending Delete Sync" << std::endl;\r
283                             NSProviderService::getInstance()->sendSyncInfo(mainMessageId,\r
284                                     OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_DELETED);\r
285                         }\r
286                         break;\r
287                         default:\r
288                         {\r
289                             cout << "Invalid Input!. sending default Read Sync";\r
290                             NSProviderService::getInstance()->sendSyncInfo(mainMessageId,\r
291                                 OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ);\r
292                             std::cin.clear();\r
293                             std::cin.ignore(numeric_limits<streamsize>::max(), '\n');\r
294                             break;\r
295                         }\r
296                     }\r
297                     break;\r
298                 }\r
299 \r
300             case 7:\r
301                 std::cout <<  "RegisterTopic" << std::endl;\r
302                 NSProviderService::getInstance()->registerTopic("OCF_TOPIC1");\r
303                 NSProviderService::getInstance()->registerTopic("OCF_TOPIC2");\r
304                 NSProviderService::getInstance()->registerTopic("OCF_TOPIC3");\r
305                 NSProviderService::getInstance()->registerTopic("OCF_TOPIC4");\r
306                 break;\r
307 \r
308             case 8:\r
309                 std::cout <<  "UnregisterTopic" << std::endl;\r
310                 NSProviderService::getInstance()->unregisterTopic("OCF_TOPIC2");\r
311                 break;\r
312 \r
313             case 9:\r
314                 {\r
315                     std::cout <<  "SetTopic" << std::endl;\r
316                     OIC::Service::NSConsumer *consumer = printAvailableConsumers();\r
317                     if (consumer != nullptr)\r
318                     {\r
319                         consumer->setTopic("OCF_TOPIC1");\r
320                         consumer->setTopic("OCF_TOPIC2");\r
321                         consumer->setTopic("OCF_TOPIC3");\r
322                         std::cout <<  "SelectTopic completed" << std::endl;\r
323                     }\r
324                     break;\r
325                 }\r
326             case 10:\r
327                 {\r
328                     std::cout <<  "UnsetTopic" << std::endl;\r
329                     OIC::Service::NSConsumer *consumer = printAvailableConsumers();\r
330                     if (consumer != nullptr)\r
331                     {\r
332                         consumer->unsetTopic("OCF_TOPIC1");\r
333                         std::cout <<  "UnSelectTopic completed" << std::endl;\r
334                     }\r
335                     break;\r
336                 }\r
337                 break;\r
338 \r
339             case 11:\r
340                 {\r
341                     std::cout <<  "GetConsumerTopicList" << std::endl;\r
342                     OIC::Service::NSConsumer *consumer = printAvailableConsumers();\r
343                     if (consumer != nullptr)\r
344                     {\r
345                         auto nsTopics = consumer->getConsumerTopicList();\r
346                         if (nsTopics != nullptr)\r
347                         {\r
348                             for (auto it : nsTopics->getTopicsList())\r
349                             {\r
350 \r
351                                 std::cout << it->getTopicName() << std::endl;\r
352                                 std::cout << (int) it->getState() << std::endl;\r
353                             }\r
354                             delete nsTopics;\r
355                         }\r
356                         std::cout <<  "GetConsumerTopicList completed" << std::endl;\r
357                     }\r
358                 }\r
359                 break;\r
360 \r
361             case 12:\r
362                 {\r
363                     std::cout <<  "GetRegisteredTopicList" << std::endl;\r
364                     auto nsTopics = NSProviderService::getInstance()->getRegisteredTopicList();\r
365                     for (auto it : nsTopics->getTopicsList())\r
366                     {\r
367 \r
368                         std::cout << it->getTopicName() << std::endl;\r
369                         std::cout << (int) it->getState() << std::endl;\r
370                     }\r
371                     delete nsTopics;\r
372                 }\r
373                 break;\r
374 #ifdef WITH_CLOUD\r
375             case 13:\r
376                 {\r
377                     std::cout << "Enable NS Provider RemoteService" << std::endl;\r
378                     std::cout << "Input the Server Address :";\r
379                     std::cin >> REMOTE_SERVER_ADDRESS;\r
380                     NSProviderService::getInstance()->enableRemoteService(REMOTE_SERVER_ADDRESS);\r
381                     break;\r
382                 }\r
383             case 14:\r
384                 {\r
385                     std::cout << "Disable NS Provider RemoteService" << std::endl;\r
386                     std::cout << "Input the Server Address :";\r
387                     NSProviderService::getInstance()->disableRemoteService(REMOTE_SERVER_ADDRESS);\r
388                     break;\r
389                 }\r
390 #endif\r
391             case 15:\r
392                 std::cout << "Stop the Notification Provider" << std::endl;\r
393                 NSProviderService::getInstance()->stop();\r
394                 break;\r
395             case 16:\r
396                 std::cout << "Exit()" << std::endl;\r
397                 NSProviderService::getInstance()->stop();\r
398                 isExit = true;\r
399                 break;\r
400             default:\r
401                 std::cout << "Under Construction" << std::endl;\r
402                 std::cin.clear();\r
403                 std::cin.ignore(numeric_limits<streamsize>::max(), '\n');\r
404                 break;\r
405         }\r
406 \r
407         std::cout << std::endl;\r
408     }\r
409 \r
410     return 0;\r
411 }\r