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