1. Modified the Accepted Providers Consumers list to return references
[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     provider->SendSyncInfo(notification->getMessageId(), OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ);\r
48 }\r
49 \r
50 void onNotificationSyncCb(OIC::Service::NSSyncInfo *sync)\r
51 {\r
52     std::cout << "Sync ID : " <<  sync->getMessageId() << std::endl;\r
53     std::cout << "Sync STATE : " << (int) sync->getState() << std::endl;\r
54 }\r
55 \r
56 void onDiscoverNotificationCb(OIC::Service::NSProvider *provider)\r
57 {\r
58     std::cout << "notification resource discovered" << std::endl;\r
59     provider->subscribe();\r
60     std::cout << "startSubscribing" << std::endl;\r
61 }\r
62 \r
63 void onProviderChangedCb(OIC::Service::NSProvider *provider, OIC::Service::NSResponse response)\r
64 {\r
65     std::cout << "Subscription accepted" << std::endl;\r
66     std::cout << "subscribed provider Id : " << provider->getProviderId() << std::endl;\r
67     if (response == OIC::Service::NSResponse::ALLOW)\r
68     {\r
69         provider->setListener(onNotificationPostedCb, onNotificationSyncCb);\r
70         if (mainProvider.empty())\r
71             mainProvider = provider->getProviderId();\r
72     }\r
73     else if (response == OIC::Service::NSResponse::TOPIC)\r
74     {\r
75         std::cout << "Provider Topic Updated" << std::endl;\r
76         for (auto it : provider->getTopicList()->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 \r
84 void *OCProcessThread(void *ptr)\r
85 {\r
86     (void) ptr;\r
87 \r
88     while (!isExit)\r
89     {\r
90         usleep(2000);\r
91         if (OCProcess() != OC_STACK_OK)\r
92         {\r
93             OCStop();\r
94             break;\r
95         }\r
96     }\r
97 \r
98     return NULL;\r
99 }\r
100 \r
101 int main(void)\r
102 {\r
103     pthread_t OCThread;\r
104 \r
105     std::cout << "start Iotivity" << std::endl;\r
106     if (OCInit1(OC_CLIENT, OC_DEFAULT_FLAGS, OC_DEFAULT_FLAGS) != OC_STACK_OK)\r
107     {\r
108         std::cout << "OCInit fail" << std::endl;\r
109         return 0;\r
110     }\r
111 \r
112     NSConsumerService::ConsumerConfig cfg;\r
113     cfg.m_discoverCb = onDiscoverNotificationCb;\r
114     cfg.m_changedCb = onProviderChangedCb;\r
115 \r
116     pthread_create(&OCThread, NULL, OCProcessThread, NULL);\r
117 \r
118     std::cout << "Start notification consumer service" << std::endl;\r
119     while (!isExit)\r
120     {\r
121         int num;\r
122 \r
123         std::cout << "1. Start Consumer" << std::endl;\r
124         std::cout << "2. Stop Consumer" << std::endl;\r
125         std::cout << "3. getInterestTopics" << std::endl;\r
126         std::cout << "4. selectInterestTopics" << std::endl;\r
127 #ifdef WITH_CLOUD\r
128         std::cout << "5. Enable  NS Consumer RemoteService" << std::endl;\r
129 #endif\r
130         std::cout << "6. Exit" << std::endl;\r
131 \r
132         std::cout << "Input: " << std::endl;\r
133         std::cin >> num;\r
134         switch (num)\r
135         {\r
136             case 1:\r
137                 std::cout << "1. Start the Notification Consumer" << std::endl;\r
138                 NSConsumerService::getInstance()->Start(cfg);\r
139                 break;\r
140             case 2:\r
141                 std::cout << "2. Stop the Notification Consumer" << std::endl;\r
142                 NSConsumerService::getInstance()->Stop();\r
143                 break;\r
144             case 3:\r
145                 {\r
146                     std::cout <<  "getInterestTopics" << std::endl;\r
147                     OIC::Service::NSProvider *provider = NSConsumerService::getInstance()->getProvider(mainProvider);\r
148                     if (provider != nullptr)\r
149                     {\r
150                         auto topicList = provider->getTopicList();\r
151                         if (topicList != nullptr)\r
152                             for (auto it : topicList->getTopicsList())\r
153                             {\r
154                                 std::cout << "Topic Name: " << it->getTopicName() << std::endl;\r
155                                 std::cout << "Topic state: " << (int) it->getState() << std::endl;\r
156                             }\r
157                     }\r
158                 }\r
159                 break;\r
160             case 4:\r
161                 {\r
162                     std::cout <<  "selectInterestTopics" << std::endl;\r
163                     OIC::Service::NSProvider *provider = NSConsumerService::getInstance()->getProvider(mainProvider);\r
164                     if (provider != nullptr)\r
165                     {\r
166                         NSTopicsList *topicList = new NSTopicsList();\r
167                         topicList->addTopic("OCF_TOPIC1", NSTopic::NSTopicState::UNSUBSCRIBED);\r
168                         topicList->addTopic("OCF_TOPIC2", NSTopic::NSTopicState::UNSUBSCRIBED);\r
169                         topicList->addTopic("OCF_TOPIC3", NSTopic::NSTopicState::UNSUBSCRIBED);\r
170 \r
171                         provider->selectInterestTopics(topicList);\r
172                     }\r
173                 }\r
174                 break;\r
175 #ifdef WITH_CLOUD\r
176             case 5:\r
177                 {\r
178                     std::cout << "5. Enable NS Consumer RemoteService" << std::endl;\r
179                     std::cout << "Input the Server Address :";\r
180                     std::cin >> REMOTE_SERVER_ADDRESS;\r
181                     NSConsumerService::getInstance()->EnableRemoteService(REMOTE_SERVER_ADDRESS);\r
182                     break;\r
183                 }\r
184 #endif\r
185             case 6:\r
186                 std::cout << "6. Exit" << std::endl;\r
187                 isExit = true;\r
188                 break;\r
189             default:\r
190                 break;\r
191         }\r
192     }\r
193 \r
194     return 0;\r
195 }\r