Add logic about checking the NULL and modify warning code.
[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::string mainConsumer;\r
39 uint64_t mainMessageId;\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     if (mainConsumer.empty())\r
69     {\r
70         mainConsumer = consumer->getConsumerId();\r
71     }\r
72     consumer->acceptSubscription(true);\r
73 }\r
74 \r
75 void syncCallback(OIC::Service::NSSyncInfo *sync)\r
76 {\r
77     std::cout << "synnc requested" << std::endl;\r
78 \r
79     std::cout << "Sync State: " << (int) sync->getState() << std::endl;\r
80 }\r
81 \r
82 int main()\r
83 {\r
84     int num = 0;\r
85     pthread_t processThread = 0;\r
86 \r
87     std::cout << "start Iotivity" << std::endl;\r
88 \r
89 \r
90     if (OCInit(NULL, 0, OC_CLIENT_SERVER) != OC_STACK_OK)\r
91     {\r
92         std::cout << "OCStack init error" << std::endl;\r
93         return 0;\r
94     }\r
95 \r
96     pthread_create(&processThread, NULL, OCProcessThread, NULL);\r
97 \r
98     while (!isExit)\r
99     {\r
100         std::cout << "1. Start the Notification Provider(Accepter: Provider)" << std::endl;\r
101         std::cout << "2. Start the Notification Provider(Accepter: Consumer)" << std::endl;\r
102         std::cout << "3. SendMessage " << std::endl;\r
103         std::cout << "4. SendSyncInfo" << std::endl;\r
104 \r
105         std::cout << "5. RegisterTopic" << std::endl;\r
106         std::cout << "6. UnregisterTopic" << std::endl;\r
107         std::cout << "7. SetTopic" << std::endl;\r
108         std::cout << "8. UnsetTopic" << std::endl;\r
109         std::cout << "9. GetConsumerTopicList" << std::endl;\r
110         std::cout << "10. GetRegisteredTopicList" << std::endl;\r
111 #ifdef WITH_CLOUD\r
112         std::cout << "11. Enable NS Provider RemoteService" << std::endl;\r
113         std::cout << "12. Disable NS Provider RemoteService" << std::endl;\r
114 #endif\r
115         std::cout << "13. Stop the Notification Provider" << std::endl;\r
116         std::cout << "0. Exit()" << std::endl;\r
117 \r
118         std::cout << "input : ";\r
119 \r
120         std::cin >> num;\r
121 \r
122         switch (num)\r
123         {\r
124             case 1:\r
125                 {\r
126                     std::cout << "Start (Accepter: Provider)" << std::endl;\r
127                     NSProviderService::ProviderConfig cfg;\r
128                     cfg.m_subscribeRequestCb = subscribeRequestCallback;\r
129                     cfg.m_syncInfoCb = syncCallback;\r
130                     cfg.subControllability = true;\r
131 \r
132                     NSProviderService::getInstance()->start(cfg);\r
133                     break;\r
134                 }\r
135             case 2:\r
136                 {\r
137                     std::cout << "Start (Accepter: Consumer)" << std::endl;\r
138                     NSProviderService::ProviderConfig cfg;\r
139                     cfg.m_subscribeRequestCb = subscribeRequestCallback;\r
140                     cfg.m_syncInfoCb = syncCallback;\r
141                     cfg.subControllability = false;\r
142 \r
143                     NSProviderService::getInstance()->start(cfg);\r
144                     break;\r
145                 }\r
146             case 3:\r
147                 {\r
148                     std::cout << "SendMessage" << std::endl;\r
149 \r
150                     std::string dummy;\r
151                     std::string title;\r
152                     std::string body;\r
153                     std::string topic;\r
154 \r
155                     std::cout << "id : " << ++id << std::endl;\r
156                     std::cout << "title : ";\r
157 \r
158                     std::getline(std::cin, dummy);\r
159                     std::getline(std::cin, title);\r
160 \r
161                     std::cout << "body : ";\r
162                     std::getline(std::cin, body);\r
163 \r
164                     std::cout << "topic : ";\r
165                     std::getline(std::cin, topic);\r
166 \r
167                     std::cout << "app - mTitle : " << title << std::endl;\r
168                     std::cout << "app - mContentText : " << body << std::endl;\r
169                     std::cout << "app - mTopic : " << topic << std::endl;\r
170 \r
171                     OIC::Service::NSMessage *msg = NSProviderService::getInstance()->createMessage();\r
172 \r
173                     msg->setType(OIC::Service::NSMessage::NSMessageType::NS_MESSAGE_INFO);\r
174                     msg->setTitle(title.c_str());\r
175                     msg->setContentText(body.c_str());\r
176                     msg->setSourceName("OCF");\r
177                     msg->setTopic(topic);\r
178                     mainMessageId = msg->getMessageId();\r
179                     std::cout << "ProviderID for Message : " << msg->getProviderId() << std::endl;\r
180 \r
181                     NSProviderService::getInstance()->sendMessage(msg);\r
182 \r
183                     break;\r
184                 }\r
185             case 4:\r
186                 {\r
187                     std::cout <<  "SendSyncInfo" << std::endl;\r
188                     NSProviderService::getInstance()->sendSyncInfo(mainMessageId,\r
189                             OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ);\r
190                     break;\r
191                 }\r
192 \r
193             case 5:\r
194                 std::cout <<  "RegisterTopic" << std::endl;\r
195                 NSProviderService::getInstance()->registerTopic("OCF_TOPIC1");\r
196                 NSProviderService::getInstance()->registerTopic("OCF_TOPIC2");\r
197                 NSProviderService::getInstance()->registerTopic("OCF_TOPIC3");\r
198                 NSProviderService::getInstance()->registerTopic("OCF_TOPIC4");\r
199                 break;\r
200 \r
201             case 6:\r
202                 std::cout <<  "UnregisterTopic" << std::endl;\r
203                 NSProviderService::getInstance()->unregisterTopic("OCF_TOPIC2");\r
204                 break;\r
205 \r
206             case 7:\r
207                 {\r
208                     std::cout <<  "SetTopic" << std::endl;\r
209                     OIC::Service::NSConsumer *consumer = NSProviderService::getInstance()->getConsumer(mainConsumer);\r
210                     if (consumer != nullptr)\r
211                     {\r
212                         consumer->setTopic("OCF_TOPIC1");\r
213                         consumer->setTopic("OCF_TOPIC2");\r
214                         consumer->setTopic("OCF_TOPIC3");\r
215                         std::cout <<  "SelectTopic completed" << std::endl;\r
216                     }\r
217                     break;\r
218                 }\r
219             case 8:\r
220                 {\r
221                     std::cout <<  "UnsetTopic" << std::endl;\r
222                     OIC::Service::NSConsumer *consumer = NSProviderService::getInstance()->getConsumer(mainConsumer);\r
223                     if (consumer != nullptr)\r
224                     {\r
225                         consumer->unsetTopic("OCF_TOPIC1");\r
226                         std::cout <<  "UnSelectTopic completed" << std::endl;\r
227                     }\r
228                     break;\r
229                 }\r
230                 break;\r
231 \r
232             case 9:\r
233                 {\r
234                     std::cout <<  "GetConsumerTopicList" << std::endl;\r
235                     OIC::Service::NSConsumer *consumer = NSProviderService::getInstance()->getConsumer(mainConsumer);\r
236                     if (consumer != nullptr)\r
237                     {\r
238                         auto nsTopics = consumer->getConsumerTopicList();\r
239                         if (nsTopics != nullptr)\r
240                         {\r
241                             for (auto it : nsTopics->getTopicsList())\r
242                             {\r
243 \r
244                                 std::cout << it->getTopicName() << std::endl;\r
245                                 std::cout << (int) it->getState() << std::endl;\r
246                             }\r
247                             delete nsTopics;\r
248                         }\r
249                         std::cout <<  "GetConsumerTopicList completed" << std::endl;\r
250                     }\r
251                 }\r
252                 break;\r
253 \r
254             case 10:\r
255                 {\r
256                     std::cout <<  "GetRegisteredTopicList" << std::endl;\r
257                     auto nsTopics = NSProviderService::getInstance()->getRegisteredTopicList();\r
258                     for (auto it : nsTopics->getTopicsList())\r
259                     {\r
260 \r
261                         std::cout << it->getTopicName() << std::endl;\r
262                         std::cout << (int) it->getState() << std::endl;\r
263                     }\r
264                     delete nsTopics;\r
265                 }\r
266                 break;\r
267 #ifdef WITH_CLOUD\r
268             case 11:\r
269                 {\r
270                     std::cout << "11. Enable NS Provider RemoteService" << std::endl;\r
271                     std::cout << "Input the Server Address :";\r
272                     std::cin >> REMOTE_SERVER_ADDRESS;\r
273                     NSProviderService::getInstance()->enableRemoteService(REMOTE_SERVER_ADDRESS);\r
274                     break;\r
275                 }\r
276             case 12:\r
277                 {\r
278                     std::cout << "12. Disable NS Provider RemoteService" << std::endl;\r
279                     std::cout << "Input the Server Address :";\r
280                     NSProviderService::getInstance()->disableRemoteService(REMOTE_SERVER_ADDRESS);\r
281                     break;\r
282                 }\r
283 #endif\r
284             case 13:\r
285                 NSProviderService::getInstance()->stop();\r
286                 break;\r
287             case 0:\r
288                 NSProviderService::getInstance()->stop();\r
289                 isExit = true;\r
290                 break;\r
291             default:\r
292                 std::cout << "Under Construction" << std::endl;\r
293                 break;\r
294         }\r
295 \r
296         std::cout << std::endl;\r
297     }\r
298 \r
299     return 0;\r
300 }\r