Updated Topic resource changes for C++ wrapper
[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 "NSCommon.h"\r
24 #include "NSProviderService.h"\r
25 #include "NSUtils.h"\r
26 #include "NSTopicsList.h"\r
27 #include "logger.h"\r
28 #include "octypes.h"\r
29 #include "pthread.h"\r
30 #include "oic_string.h"\r
31 #include "oic_malloc.h"\r
32 #include "ocstack.h"\r
33 \r
34 #define TAG "NotiProviderWrapperExample"\r
35 using namespace std;\r
36 using namespace OIC::Service;\r
37 std::string mainConsumer;\r
38 \r
39 extern char *strdup(const char *s);\r
40 \r
41 bool isExit = false;\r
42 \r
43 int id = 0;\r
44 std::string REMOTE_SERVER_ADDRESS;\r
45 \r
46 void *OCProcessThread(void *ptr)\r
47 {\r
48     (void) ptr;\r
49     while (!isExit)\r
50     {\r
51         if (OCProcess() != OC_STACK_OK)\r
52         {\r
53             std::cout << "OCStack process error" << std::endl;\r
54             return NULL;\r
55         }\r
56     }\r
57 \r
58     return NULL;\r
59 }\r
60 \r
61 void subscribeRequestCallback(OIC::Service::NSConsumer *consumer)\r
62 {\r
63     std::cout << "consumer requested to subscribe" << std::endl;\r
64 \r
65     std::cout << "Consumer Device ID: " << consumer->getConsumerId() << std::endl;\r
66     if (mainConsumer.empty())\r
67         mainConsumer = consumer->getConsumerId();\r
68     consumer->acceptSubscription(consumer, true);\r
69 }\r
70 \r
71 void syncCallback(OIC::Service::NSSyncInfo *sync)\r
72 {\r
73     std::cout << "synnc requested" << std::endl;\r
74 \r
75     std::cout << "Sync State: " << (int) sync->getState() << std::endl;\r
76 }\r
77 \r
78 int main()\r
79 {\r
80     int num;\r
81     pthread_t processThread;\r
82 \r
83     std::cout << "start Iotivity" << std::endl;\r
84 \r
85 \r
86     if (OCInit(NULL, 0, OC_CLIENT_SERVER) != OC_STACK_OK)\r
87     {\r
88         std::cout << "OCStack init error" << std::endl;\r
89         return 0;\r
90     }\r
91 \r
92     pthread_create(&processThread, NULL, OCProcessThread, NULL);\r
93 \r
94     while (!isExit)\r
95     {\r
96         std::cout << "1. Start the Notification Provider(Accepter: Provider)" << std::endl;\r
97         std::cout << "2. Start the Notification Provider(Accepter: Consumer)" << std::endl;\r
98         std::cout << "3. SendMessage " << std::endl;\r
99         std::cout << "4. SendSyncInfo" << std::endl;\r
100 \r
101         std::cout << "5. AddTopic" << std::endl;\r
102         std::cout << "6. DeleteTopic" << std::endl;\r
103         std::cout << "7. SelectTopic" << std::endl;\r
104         std::cout << "8. UnselectTopic" << std::endl;\r
105         std::cout << "9. GetConsumerTopics" << std::endl;\r
106         std::cout << "10. GetTopics" << std::endl;\r
107 #ifdef WITH_CLOUD\r
108         std::cout << "11. Enable NS Provider RemoteService" << std::endl;\r
109         std::cout << "12. Disable NS Provider RemoteService" << std::endl;\r
110 #endif\r
111         std::cout << "13. Stop the Notification Provider" << std::endl;\r
112         std::cout << "0. Exit()" << std::endl;\r
113 \r
114         std::cout << "input : ";\r
115 \r
116         std::cin >> num;\r
117 \r
118         switch (num)\r
119         {\r
120             case 1:\r
121                 {\r
122                     std::cout << "Start (Accepter: Provider)" << std::endl;\r
123                     NSProviderService::ProviderConfig cfg;\r
124                     cfg.m_subscribeRequestCb = subscribeRequestCallback;\r
125                     cfg.m_syncInfoCb = syncCallback;\r
126                     cfg.policy = true;\r
127 \r
128                     NSProviderService::getInstance()->Start(cfg);\r
129                     break;\r
130                 }\r
131             case 2:\r
132                 {\r
133                     std::cout << "Start (Accepter: Consumer)" << std::endl;\r
134                     NSProviderService::ProviderConfig cfg;\r
135                     cfg.m_subscribeRequestCb = subscribeRequestCallback;\r
136                     cfg.m_syncInfoCb = syncCallback;\r
137                     cfg.policy = false;\r
138 \r
139                     NSProviderService::getInstance()->Start(cfg);\r
140                     break;\r
141                 }\r
142             case 3:\r
143                 {\r
144                     std::cout << "SendMessage" << std::endl;\r
145 \r
146                     std::string title;\r
147                     std::string body;\r
148                     std::string topic;\r
149 \r
150                     std::cout << "id : " << ++id << std::endl;\r
151                     std::cout << "title : ";\r
152 \r
153                     std::cin >> title;\r
154 \r
155                     std::cout << "body : ";\r
156                     std::cin >> body;\r
157 \r
158                     std::cout << "topic : ";\r
159                     std::cin >> topic;\r
160 \r
161                     std::cout << "app - mTitle : " << title << std::endl;\r
162                     std::cout << "app - mContentText : " << body << std::endl;\r
163                     std::cout << "app - mTopic : " << topic << std::endl;\r
164 \r
165                     OIC::Service::NSMessage *msg = NSProviderService::getInstance()->CreateMessage();\r
166 \r
167                     msg->setType(OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_INFO);\r
168                     msg->setTitle(title.c_str());\r
169                     msg->setContentText(body.c_str());\r
170                     msg->setSourceName("OCF");\r
171 \r
172                     NSProviderService::getInstance()->SendMessage(msg);\r
173 \r
174                     break;\r
175                 }\r
176             case 4:\r
177                 {\r
178                     std::cout <<  "SendSyncInfo" << std::endl;\r
179                     NSProviderService::getInstance()->SendSyncInfo(1,\r
180                             OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ);\r
181                     break;\r
182                 }\r
183 \r
184             case 5:\r
185                 std::cout <<  "AddTopic" << std::endl;\r
186                 NSProviderService::getInstance()->AddTopic("OCF_TOPIC1");\r
187                 NSProviderService::getInstance()->AddTopic("OCF_TOPIC2");\r
188                 NSProviderService::getInstance()->AddTopic("OCF_TOPIC3");\r
189                 NSProviderService::getInstance()->AddTopic("OCF_TOPIC4");\r
190                 break;\r
191 \r
192             case 6:\r
193                 std::cout <<  "DeleteTopic" << std::endl;\r
194                 NSProviderService::getInstance()->DeleteTopic("OCF_TOPIC2");\r
195                 break;\r
196 \r
197             case 7:\r
198                 {\r
199                     std::cout <<  "SelectTopic" << std::endl;\r
200                     OIC::Service::NSConsumer *consumer = NSProviderService::getInstance()->getConsumer(mainConsumer);\r
201                     if (consumer != nullptr)\r
202                     {\r
203                         consumer->selectTopic("OCF_TOPIC1");\r
204                         consumer->selectTopic("OCF_TOPIC2");\r
205                         consumer->selectTopic("OCF_TOPIC3");\r
206                         consumer->selectTopic("OCF_TOPIC4");\r
207                         std::cout <<  "SelectTopic completed" << std::endl;\r
208                     }\r
209                     break;\r
210                 }\r
211             case 8:\r
212                 {\r
213                     std::cout <<  "UnSelectTopic" << std::endl;\r
214                     OIC::Service::NSConsumer *consumer = NSProviderService::getInstance()->getConsumer(mainConsumer);\r
215                     if (consumer != nullptr)\r
216                     {\r
217                         consumer->unselectTopic("OCF_TOPIC1");\r
218                         std::cout <<  "UnSelectTopic completed" << std::endl;\r
219                     }\r
220                     break;\r
221                 }\r
222                 break;\r
223 \r
224             case 9:\r
225                 {\r
226                     std::cout <<  "GetConsumerTopics" << std::endl;\r
227                     OIC::Service::NSConsumer *consumer = NSProviderService::getInstance()->getConsumer(mainConsumer);\r
228                     if (consumer != nullptr)\r
229                     {\r
230                         auto nsTopics = consumer->getConsumerTopics();\r
231                         if (nsTopics != nullptr)\r
232                         {\r
233                             for (auto it : nsTopics->getTopicsList())\r
234                             {\r
235 \r
236                                 std::cout << it->getTopicName() << std::endl;\r
237                                 std::cout << (int) it->getState() << std::endl;\r
238                             }\r
239                             delete nsTopics;\r
240                         }\r
241                         std::cout <<  "GetConsumerTopics completed" << std::endl;\r
242                     }\r
243                 }\r
244                 break;\r
245 \r
246             case 10:\r
247                 {\r
248                     std::cout <<  "GetTopics" << std::endl;\r
249                     auto nsTopics = NSProviderService::getInstance()->GetTopics();\r
250                     for (auto it : nsTopics->getTopicsList())\r
251                     {\r
252 \r
253                         std::cout << it->getTopicName() << std::endl;\r
254                         std::cout << (int) it->getState() << std::endl;\r
255                     }\r
256                     delete nsTopics;\r
257                 }\r
258                 break;\r
259 #ifdef WITH_CLOUD\r
260             case 11:\r
261                 {\r
262                     std::cout << "11. Enable NS Provider RemoteService" << std::endl;\r
263                     std::cout << "Input the Server Address :";\r
264                     std::cin >> REMOTE_SERVER_ADDRESS;\r
265                     NSProviderService::getInstance()->EnableRemoteService(REMOTE_SERVER_ADDRESS);\r
266                     break;\r
267                 }\r
268             case 12:\r
269                 {\r
270                     std::cout << "12. Disable NS Provider RemoteService" << std::endl;\r
271                     std::cout << "Input the Server Address :";\r
272                     NSProviderService::getInstance()->DisableRemoteService(REMOTE_SERVER_ADDRESS);\r
273                     break;\r
274                 }\r
275 #endif\r
276             case 13:\r
277                 NSProviderService::getInstance()->Stop();\r
278                 break;\r
279             case 0:\r
280                 NSProviderService::getInstance()->Stop();\r
281                 isExit = true;\r
282                 break;\r
283             default:\r
284                 std::cout << "Under Construction" << std::endl;\r
285                 break;\r
286         }\r
287 \r
288         std::cout << std::endl;\r
289     }\r
290 \r
291     return 0;\r
292 }\r