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