1. Added sendMessage without Topics in sample application
[platform/upstream/iotivity.git] / service / notification / cpp-wrapper / examples / linux / notificationserviceconsumer.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 \r
23 #include <unistd.h>\r
24 #include "NSConsumerService.h"\r
25 #include "NSMessage.h"\r
26 #include "NSProvider.h"\r
27 #include "NSTopicsList.h"\r
28 #include "ocstack.h"\r
29 \r
30 #define TAG "NotiConsumerWrapperExample"\r
31 using namespace std;\r
32 using namespace OIC::Service;\r
33 \r
34 bool isExit = false;\r
35 std::string REMOTE_SERVER_ADDRESS;\r
36 std::string mainProvider;\r
37 \r
38 void onNotificationPostedCb(OIC::Service::NSMessage *notification)\r
39 {\r
40     std::cout << "id : " << notification->getMessageId() << std::endl;\r
41     std::cout << "title : " << notification->getTitle() << std::endl;\r
42     std::cout << "content : " <<  notification->getContentText() << std::endl;\r
43     std::cout << "source : " <<  notification->getSourceName() << std::endl;\r
44     std::cout << "topic : " <<  notification->getTopic() << std::endl;\r
45 \r
46     auto provider = NSConsumerService::getInstance()->getProvider(notification->getProviderId());\r
47     if (provider != nullptr)\r
48         provider->sendSyncInfo(notification->getMessageId(),\r
49                                OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ);\r
50 }\r
51 \r
52 void onNotificationSyncCb(OIC::Service::NSSyncInfo *sync)\r
53 {\r
54     std::cout << "Sync ID : " <<  sync->getMessageId() << std::endl;\r
55     std::cout << "Sync STATE : " << (int) sync->getState() << std::endl;\r
56 }\r
57 \r
58 void onProviderStateChangedCb(OIC::Service::NSProviderState state)\r
59 {\r
60     std::cout << "onProviderStateChangedCb" << std::endl;\r
61     if (state == OIC::Service::NSProviderState::ALLOW)\r
62     {\r
63         std::cout << "Provider Subscription Accepted" << std::endl;\r
64     }\r
65     else if (state == OIC::Service::NSProviderState::DENY)\r
66     {\r
67         std::cout << "Provider Subscription Denied" << std::endl;\r
68     }\r
69     else if (state == OIC::Service::NSProviderState::TOPIC)\r
70     {\r
71         OIC::Service::NSProvider *provider = NSConsumerService::getInstance()->getProvider(mainProvider);\r
72         if (provider != nullptr)\r
73         {\r
74             auto topicList = provider->getTopicList();\r
75             if (topicList != nullptr)\r
76                 for (auto it : topicList->getTopicsList())\r
77                 {\r
78                     std::cout << "Topic Name: " << it->getTopicName() << std::endl;\r
79                     std::cout << "Topic state: " << (int) it->getState() << std::endl;\r
80                 }\r
81         }\r
82     }\r
83     else if (state == OIC::Service::NSProviderState::STOPPED)\r
84     {\r
85         std::cout << "Provider Stopped" << std::endl;\r
86     }\r
87 }\r
88 \r
89 void onDiscoverNotificationCb(OIC::Service::NSProvider *provider)\r
90 {\r
91     std::cout << "notification resource discovered" << std::endl;\r
92     std::cout << "SetListeners for callbacks" << std::endl;\r
93     provider->setListener(onProviderStateChangedCb, onNotificationPostedCb, onNotificationSyncCb);\r
94     if (!provider->isSubscribed())\r
95     {\r
96         std::cout << "startSubscribing" << std::endl;\r
97         provider->subscribe();\r
98     }\r
99     if (mainProvider.empty())\r
100         mainProvider = provider->getProviderId();\r
101 }\r
102 \r
103 void *OCProcessThread(void *ptr)\r
104 {\r
105     (void) ptr;\r
106 \r
107     while (!isExit)\r
108     {\r
109         usleep(2000);\r
110         if (OCProcess() != OC_STACK_OK)\r
111         {\r
112             OCStop();\r
113             break;\r
114         }\r
115     }\r
116 \r
117     return NULL;\r
118 }\r
119 \r
120 int main(void)\r
121 {\r
122     pthread_t OCThread;\r
123 \r
124     std::cout << "start Iotivity" << std::endl;\r
125     if (OCInit1(OC_CLIENT, OC_DEFAULT_FLAGS, OC_DEFAULT_FLAGS) != OC_STACK_OK)\r
126     {\r
127         std::cout << "OCInit fail" << std::endl;\r
128         return 0;\r
129     }\r
130 \r
131     pthread_create(&OCThread, NULL, OCProcessThread, NULL);\r
132 \r
133     std::cout << "Start notification consumer service" << std::endl;\r
134     while (!isExit)\r
135     {\r
136         int num;\r
137 \r
138         std::cout << "1. Start Consumer" << std::endl;\r
139         std::cout << "2. Stop Consumer" << std::endl;\r
140         std::cout << "3. GetTopicList" << std::endl;\r
141         std::cout << "4. UpdateTopicList" << std::endl;\r
142 #ifdef WITH_CLOUD\r
143         std::cout << "5. Enable  NS Consumer RemoteService" << std::endl;\r
144 #endif\r
145         std::cout << "6. Exit" << std::endl;\r
146 \r
147         std::cout << "Input: " << std::endl;\r
148         std::cin >> num;\r
149         switch (num)\r
150         {\r
151             case 1:\r
152                 std::cout << "1. Start the Notification Consumer" << std::endl;\r
153                 NSConsumerService::getInstance()->start(onDiscoverNotificationCb);\r
154                 break;\r
155             case 2:\r
156                 std::cout << "2. Stop the Notification Consumer" << std::endl;\r
157                 NSConsumerService::getInstance()->stop();\r
158                 break;\r
159             case 3:\r
160                 {\r
161                     std::cout <<  "GetTopicList" << std::endl;\r
162                     OIC::Service::NSProvider *provider = NSConsumerService::getInstance()->getProvider(mainProvider);\r
163                     if (provider != nullptr)\r
164                     {\r
165                         auto topicList = provider->getTopicList();\r
166                         if (topicList != nullptr)\r
167                             for (auto it : topicList->getTopicsList())\r
168                             {\r
169                                 std::cout << "Topic Name: " << it->getTopicName() << std::endl;\r
170                                 std::cout << "Topic state: " << (int) it->getState() << std::endl;\r
171                             }\r
172                     }\r
173                 }\r
174                 break;\r
175             case 4:\r
176                 {\r
177                     std::cout <<  "UpdateTopicList" << std::endl;\r
178                     OIC::Service::NSProvider *provider = NSConsumerService::getInstance()->getProvider(mainProvider);\r
179                     if (provider != nullptr)\r
180                     {\r
181                         NSTopicsList *topicList = new NSTopicsList();\r
182                         topicList->addTopic("OCF_TOPIC1", NSTopic::NSTopicState::SUBSCRIBED);\r
183                         topicList->addTopic("OCF_TOPIC2", NSTopic::NSTopicState::SUBSCRIBED);\r
184                         topicList->addTopic("OCF_TOPIC3", NSTopic::NSTopicState::UNSUBSCRIBED);\r
185 \r
186                         provider->updateTopicList(topicList);\r
187                     }\r
188                 }\r
189                 break;\r
190 #ifdef WITH_CLOUD\r
191             case 5:\r
192                 {\r
193                     std::cout << "5. Enable NS Consumer RemoteService" << std::endl;\r
194                     std::cout << "Input the Server Address :";\r
195                     std::cin >> REMOTE_SERVER_ADDRESS;\r
196                     NSConsumerService::getInstance()->enableRemoteService(REMOTE_SERVER_ADDRESS);\r
197                     break;\r
198                 }\r
199 #endif\r
200             case 6:\r
201                 std::cout << "6. Exit" << std::endl;\r
202                 isExit = true;\r
203                 break;\r
204             default:\r
205                 break;\r
206         }\r
207     }\r
208 \r
209     return 0;\r
210 }\r