Modified connectivityType on calling getDeviceInfo API at CPP Sample
[platform/upstream/iotivity.git] / resource / examples / winuiclient.cpp
1 /* ****************************************************************\r
2  *\r
3  * Copyright 2016 Intel Corporation All Rights Reserved.\r
4  *\r
5  * Licensed under the Apache License, Version 2.0 (the "License");\r
6  * you may not use this file except in compliance with the License.\r
7  * You may obtain a copy of the License at\r
8  *\r
9  *      http://www.apache.org/licenses/LICENSE-2.0\r
10  *\r
11  * Unless required by applicable law or agreed to in writing, software\r
12  * distributed under the License is distributed on an "AS IS" BASIS,\r
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
14  * See the License for the specific language governing permissions and\r
15  * limitations under the License.\r
16  *\r
17  ******************************************************************/\r
18 \r
19 #include <string>\r
20 #include "winuiclient.h"\r
21 #include <Windows.h>\r
22 #include <Commctrl.h>\r
23 #include <functional>\r
24 \r
25 extern int g_CurSliderVal;\r
26 extern HWND hwndVolumeSlider, hwndVolumeExpectedLabel;\r
27 using namespace WinUIClient;\r
28 void LabelPrintf (HWND hwndEdit, TCHAR * szFormat, ...);\r
29 \r
30 WinUIClientApp::WinUIClientApp(OCPersistentStorage ps)\r
31     : persistentStorage(ps),\r
32       OBSERVE_TYPE_TO_USE(ObserveType::Observe)\r
33 {\r
34 \r
35 }\r
36 \r
37 WinUIClientApp::~WinUIClientApp()\r
38 {\r
39 \r
40 }\r
41 \r
42 void WinUIClientApp::Initialize()\r
43 {\r
44     // Create PlatformConfig object\r
45     PlatformConfig cfg {\r
46         OC::ServiceType::InProc,\r
47         OC::ModeType::Both,\r
48         "0.0.0.0",\r
49         0,\r
50         OC::QualityOfService::LowQos,\r
51         &persistentStorage\r
52     };\r
53 \r
54     OCPlatform::Configure(cfg);\r
55 }\r
56 \r
57 void WinUIClientApp::Run()\r
58 {\r
59     try\r
60     {\r
61         // makes it so that all boolean values are printed as 'true/false' in this stream\r
62         std::cout.setf(std::ios::boolalpha);\r
63         // Find all resources\r
64         std::ostringstream requestURI;// << "?rt=core.media";\r
65         std::string s = OC_RSRVD_WELL_KNOWN_URI;\r
66         requestURI << s;\r
67 \r
68         OCPlatform::findResource("", requestURI.str(),\r
69                 CT_DEFAULT, std::bind(&WinUIClientApp::foundResource, this, std::placeholders::_1));\r
70         std::cout<< "Finding Resource... " <<std::endl;\r
71 \r
72         // Find resource is done twice so that we discover the original resources a second time.\r
73         // These resources will have the same uniqueidentifier (yet be different objects), so that\r
74         // we can verify/show the duplicate-checking code in foundResource(above);\r
75         OCPlatform::findResource("", requestURI.str(),\r
76                 CT_DEFAULT, std::bind(&WinUIClientApp::foundResource, this, std::placeholders::_1));\r
77         std::cout<< "Finding Resource for second time..." << std::endl;\r
78 \r
79     }catch(OCException& e)\r
80     {\r
81         std::cerr << "Exception in main: "<<e.what();\r
82     }\r
83 }\r
84 \r
85 void receivedPlatformInfo(const OCRepresentation& rep)\r
86 {\r
87     std::cout << "\nPlatform Information received ---->\n";\r
88     std::string value;\r
89     std::string values[] =\r
90     {\r
91         "pi",   "Platform ID                    ",\r
92         "mnmn", "Manufacturer name              ",\r
93         "mnml", "Manufacturer url               ",\r
94         "mnmo", "Manufacturer Model No          ",\r
95         "mndt", "Manufactured Date              ",\r
96         "mnpv", "Manufacturer Platform Version  ",\r
97         "mnos", "Manufacturer OS version        ",\r
98         "mnhw", "Manufacturer hardware version  ",\r
99         "mnfv", "Manufacturer firmware version  ",\r
100         "mnsl", "Manufacturer support url       ",\r
101         "st",   "Manufacturer system time       "\r
102     };\r
103 \r
104     for (unsigned int i = 0; i < sizeof(values) / sizeof(values[0]) ; i += 2)\r
105     {\r
106         if(rep.getValue(values[i], value))\r
107         {\r
108             std::cout << values[i + 1] << " : "<< value << std::endl;\r
109         }\r
110     }\r
111 }\r
112 \r
113 void receivedDeviceInfo(const OCRepresentation& rep)\r
114 {\r
115     std::cout << "\nDevice Information received ---->\n";\r
116     std::string value;\r
117     std::string values[] =\r
118     {\r
119         "di",  "Device ID        ",\r
120         "n",   "Device name      ",\r
121         "lcv", "Spec version url ",\r
122         "dmv", "Data Model Model ",\r
123     };\r
124 \r
125     for (unsigned int i = 0; i < sizeof(values) / sizeof(values[0]); i += 2)\r
126     {\r
127         if (rep.getValue(values[i], value))\r
128         {\r
129             std::cout << values[i + 1] << " : " << value << std::endl;\r
130         }\r
131     }\r
132 }\r
133 \r
134 void WinUIClientApp::FindResources()\r
135 {\r
136     std::ostringstream requestURI;\r
137     requestURI << OC_RSRVD_WELL_KNOWN_URI;// << "?rt=core.media";\r
138     OCPlatform::findResource("", requestURI.str(),\r
139                             CT_DEFAULT, std::bind(&WinUIClientApp::foundResource, this, std::placeholders::_1));\r
140 }\r
141 \r
142 \r
143 // Callback to found resources\r
144 void WinUIClientApp::foundResource(std::shared_ptr<OCResource> resource)\r
145 {\r
146     std::cout << "In foundResource\n";\r
147     std::string resourceURI;\r
148     std::string hostAddress;\r
149     std::string platformDiscoveryURI = "/oic/p";\r
150     std::string deviceDiscoveryURI   = "/oic/d";\r
151     try\r
152     {\r
153         {\r
154             std::lock_guard<std::mutex> lock(curResourceLock);\r
155             if (discoveredResources.find(resource->uniqueIdentifier()) == discoveredResources.end())\r
156             {\r
157                 std::cout << "Found resource " << resource->uniqueIdentifier() <<\r
158                     " for the first time on server with ID: "<< resource->sid()<<std::endl;\r
159                 discoveredResources[resource->uniqueIdentifier()] = resource;\r
160             }\r
161             else\r
162             {\r
163                 std::cout<<"Found resource "<< resource->uniqueIdentifier() << " again!"<<std::endl;\r
164             }\r
165 \r
166             if (curResource)\r
167             {\r
168                 std::cout << "Found another resource, ignoring"<<std::endl;\r
169                 return;\r
170             }\r
171         }\r
172 \r
173         // Do some operations with resource object.\r
174         if (resource)\r
175         {\r
176             std::cout<<"DISCOVERED Resource:"<<std::endl;\r
177             // Get the resource URI\r
178             resourceURI = resource->uri();\r
179             std::cout << "\tURI of the resource: " << resourceURI << std::endl;\r
180 \r
181             // Get the resource host address\r
182             hostAddress = resource->host();\r
183             std::cout << "\tHost address of the resource: " << hostAddress << std::endl;\r
184 \r
185             // Get the resource types\r
186             std::cout << "\tList of resource types: " << std::endl;\r
187             for(auto &resourceTypes : resource->getResourceTypes())\r
188             {\r
189                 std::cout << "\t\t" << resourceTypes << std::endl;\r
190             }\r
191 \r
192             // Get the resource interfaces\r
193             std::cout << "\tList of resource interfaces: " << std::endl;\r
194             for(auto &resourceInterfaces : resource->getResourceInterfaces())\r
195             {\r
196                 std::cout << "\t\t" << resourceInterfaces << std::endl;\r
197             }\r
198 \r
199             OCStackResult ret;\r
200             std::cout << "Querying for platform information... " << std::endl;\r
201 \r
202             ret = OCPlatform::getPlatformInfo("", platformDiscoveryURI, CT_ADAPTER_IP,\r
203                     &receivedPlatformInfo);\r
204 \r
205             if (ret == OC_STACK_OK)\r
206             {\r
207                 std::cout << "Get platform information is done." << std::endl;\r
208             }\r
209             else\r
210             {\r
211                 std::cout << "Get platform information failed." << std::endl;\r
212             }\r
213 \r
214             std::cout << "Querying for device information... " << std::endl;\r
215 \r
216             ret = OCPlatform::getDeviceInfo(resource->host(), deviceDiscoveryURI,\r
217                                        resource->connectivityType(), &receivedDeviceInfo);\r
218 \r
219 \r
220             if (ret == OC_STACK_OK)\r
221             {\r
222                 std::cout << "Getting device information is done." << std::endl;\r
223             }\r
224             else\r
225             {\r
226                 std::cout << "Getting device information failed." << std::endl;\r
227             }\r
228 \r
229             if (resourceURI == "/a/media")\r
230             {\r
231                 curResource = resource;\r
232                 // Call a local function which will internally invoke get API on the resource pointer\r
233                 this->GetMediaRepresentation();\r
234                 this->BeginObserving();\r
235             }\r
236         }\r
237         else\r
238         {\r
239             // Resource is invalid\r
240             std::cout << "Resource is invalid" << std::endl;\r
241         }\r
242 \r
243     }\r
244     catch(std::exception& e)\r
245     {\r
246         std::cerr << "Exception in foundResource: "<< e.what() << std::endl;\r
247     }\r
248 }\r
249 \r
250 // Local function to get representation of media resource\r
251 void WinUIClientApp::GetMediaRepresentation()\r
252 {\r
253     if (curResource)\r
254     {\r
255         std::cout << "Getting Media Representation..."<<std::endl;\r
256         // Invoke resource's get API with the callback parameter\r
257 \r
258         QueryParamsMap test;\r
259         curResource->get(test, std::bind(&WinUIClientApp::onGet, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));\r
260 \r
261     }\r
262     else\r
263     {\r
264         std::cout << "No Current Resource to GetMediaRepresentation..."<<std::endl;\r
265     }\r
266 }\r
267 \r
268 // Callback handler on GET request\r
269 void WinUIClientApp::onGet(const HeaderOptions& /*headerOptions*/, const OCRepresentation& rep, const int eCode)\r
270 {\r
271     try\r
272     {\r
273         if (OC_STACK_OK == eCode)\r
274         {\r
275             std::cout << "GET request was successful" << std::endl;\r
276             std::cout << "Resource URI: " << rep.getUri() << std::endl;\r
277 \r
278             rep.getValue("state", mymedia.m_state);\r
279             rep.getValue("volume", mymedia.m_volume);\r
280             rep.getValue("name", mymedia.m_name);\r
281 \r
282             std::cout << "\tstate: " << mymedia.m_state << std::endl;\r
283             std::cout << "\tvolume: " << mymedia.m_volume << std::endl;\r
284             std::cout << "\tname: " << mymedia.m_name << std::endl;\r
285 \r
286             g_CurSliderVal = mymedia.m_volume;\r
287             SendMessage(hwndVolumeSlider, TBM_SETPOS, TRUE, g_CurSliderVal);\r
288             LabelPrintf(hwndVolumeExpectedLabel,"Volume: %i", g_CurSliderVal);\r
289 \r
290         }\r
291         else\r
292         {\r
293             std::cout << "onGET Response error: " << eCode << std::endl;\r
294             std::exit(-1);\r
295         }\r
296     }\r
297     catch(std::exception& e)\r
298     {\r
299         std::cout << "Exception: " << e.what() << " in onGet" << std::endl;\r
300     }\r
301 }\r
302 \r
303 // Local function to put a different state for this resource\r
304 void WinUIClientApp::PutMediaRepresentation()\r
305 {\r
306     if (curResource)\r
307     {\r
308         OCRepresentation rep;\r
309 \r
310         std::cout << "Putting media representation..."<<std::endl;\r
311 \r
312         rep.setValue("state", mymedia.m_state);\r
313         rep.setValue("volume", mymedia.m_volume);\r
314 \r
315         // Invoke resource's put API with rep, query map and the callback parameter\r
316         curResource->put(rep, QueryParamsMap(), std::bind(&WinUIClientApp::onPut, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));\r
317     }\r
318 }\r
319 \r
320 // callback handler on PUT request\r
321 void WinUIClientApp::onPut(const HeaderOptions& /*headerOptions*/, const OCRepresentation& rep, const int eCode)\r
322 {\r
323     try\r
324     {\r
325         if (OC_STACK_OK == eCode || OC_STACK_RESOURCE_CHANGED == eCode)\r
326         {\r
327             std::cout << "PUT request was successful" << std::endl;\r
328 \r
329             rep.getValue("state", mymedia.m_state);\r
330             rep.getValue("volume", mymedia.m_volume);\r
331             rep.getValue("name", mymedia.m_name);\r
332 \r
333             std::cout << "\tstate: " << mymedia.m_state << std::endl;\r
334             std::cout << "\tvolume: " << mymedia.m_volume << std::endl;\r
335             std::cout << "\tname: " << mymedia.m_name << std::endl;\r
336 \r
337         }\r
338         else\r
339         {\r
340             std::cout << "onPut Response error: " << eCode << std::endl;\r
341             std::exit(-1);\r
342         }\r
343     }\r
344     catch(std::exception& e)\r
345     {\r
346         std::cout << "Exception: " << e.what() << " in onPut" << std::endl;\r
347     }\r
348 }\r
349 \r
350 // Local function to put a different state for this resource\r
351 void WinUIClientApp::PostMediaRepresentation()\r
352 {\r
353     if (curResource)\r
354     {\r
355         OCRepresentation rep;\r
356 \r
357         std::cout << "Posting media representation..."<<std::endl;\r
358 \r
359         rep.setValue("state", mymedia.m_state);\r
360         rep.setValue("volume", mymedia.m_volume);\r
361 \r
362         // Invoke resource's post API with rep, query map and the callback parameter\r
363         curResource->post(rep, QueryParamsMap(), std::bind(&WinUIClientApp::onPost, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));\r
364     }\r
365 }\r
366 \r
367 void WinUIClientApp::onPost(const HeaderOptions& /*headerOptions*/,\r
368         const OCRepresentation& rep, const int eCode)\r
369 {\r
370     try\r
371     {\r
372         if (OC_STACK_OK == eCode || (OC_STACK_RESOURCE_CREATED == eCode\r
373                 || OC_STACK_RESOURCE_CHANGED == eCode))\r
374         {\r
375             std::cout << "POST request was successful" << std::endl;\r
376 \r
377             if (rep.hasAttribute("createduri"))\r
378             {\r
379                 std::cout << "\tUri of the created resource: "\r
380                     << rep.getValue<std::string>("createduri") << std::endl;\r
381             }\r
382             else\r
383             {\r
384                 rep.getValue("state", mymedia.m_state);\r
385                 rep.getValue("volume", mymedia.m_volume);\r
386                 rep.getValue("name", mymedia.m_name);\r
387 \r
388                 std::cout << "\tstate: " << mymedia.m_state << std::endl;\r
389                 std::cout << "\tvolume: " << mymedia.m_volume << std::endl;\r
390                 std::cout << "\tname: " << mymedia.m_name << std::endl;\r
391             }\r
392 \r
393         }\r
394         else\r
395         {\r
396             std::cout << "onPost Response error: " << eCode << std::endl;\r
397             std::exit(-1);\r
398         }\r
399     }\r
400     catch (std::exception& e)\r
401     {\r
402         std::cout << "Exception: " << e.what() << " in onPost" << std::endl;\r
403     }\r
404 }\r
405 \r
406 void WinUIClientApp::onPost2(const HeaderOptions& /*headerOptions*/,\r
407         const OCRepresentation& rep, const int eCode)\r
408 {\r
409     try\r
410     {\r
411         if (OC_STACK_OK == eCode || OC_STACK_RESOURCE_CREATED == eCode)\r
412         {\r
413             std::cout << "POST request was successful" << std::endl;\r
414 \r
415             if (rep.hasAttribute("createduri"))\r
416             {\r
417                 std::cout << "\tUri of the created resource: "\r
418                     << rep.getValue<std::string>("createduri") << std::endl;\r
419             }\r
420             else\r
421             {\r
422                 rep.getValue("state", mymedia.m_state);\r
423                 rep.getValue("volume", mymedia.m_volume);\r
424                 rep.getValue("name", mymedia.m_name);\r
425 \r
426                 std::cout << "\tstate: " << mymedia.m_state << std::endl;\r
427                 std::cout << "\tvolume: " << mymedia.m_volume << std::endl;\r
428                 std::cout << "\tname: " << mymedia.m_name << std::endl;\r
429             }\r
430 \r
431         }\r
432         else\r
433         {\r
434             std::cout << "onPost2 Response error: " << eCode << std::endl;\r
435             std::exit(-1);\r
436         }\r
437     }\r
438     catch(std::exception& e)\r
439     {\r
440         std::cout << "Exception: " << e.what() << " in onPost2" << std::endl;\r
441     }\r
442 \r
443 }\r
444 \r
445 void WinUIClientApp::onObserve(const HeaderOptions /*headerOptions*/, const OCRepresentation& rep,\r
446                     const int& eCode, const int& sequenceNumber)\r
447 {\r
448     try\r
449     {\r
450         if (OC_STACK_OK == eCode && sequenceNumber <= MAX_SEQUENCE_NUMBER)\r
451         {\r
452             if (sequenceNumber == OC_OBSERVE_REGISTER)\r
453             {\r
454                 std::cout << "Observe registration action is successful" << std::endl;\r
455             }\r
456 \r
457             std::cout << "OBSERVE RESULT:"<<std::endl;\r
458             std::cout << "\tSequenceNumber: "<< sequenceNumber << std::endl;\r
459             rep.getValue("state", mymedia.m_state);\r
460             rep.getValue("volume", mymedia.m_volume);\r
461             rep.getValue("name", mymedia.m_name);\r
462 \r
463             std::cout << "\tstate: " << mymedia.m_state << std::endl;\r
464             std::cout << "\tvolume: " << mymedia.m_volume << std::endl;\r
465             std::cout << "\tname: " << mymedia.m_name << std::endl;\r
466 \r
467             g_CurSliderVal = mymedia.m_volume;\r
468             SendMessage(hwndVolumeSlider, TBM_SETPOS, TRUE, g_CurSliderVal);\r
469             LabelPrintf(hwndVolumeExpectedLabel,"Volume: %i", g_CurSliderVal);\r
470         }\r
471         else\r
472         {\r
473             if (OC_STACK_OK == eCode)\r
474             {\r
475                 std::cout << "No observe option header is returned in the response." << std::endl;\r
476                 std::cout << "For a registration request, it means the registration failed"\r
477                         << std::endl;\r
478             }\r
479             else\r
480             {\r
481                 std::cout << "onObserve Response error: " << eCode << std::endl;\r
482                 std::exit(-1);\r
483             }\r
484         }\r
485     }\r
486     catch (std::exception& e)\r
487     {\r
488         std::cout << "Exception: " << e.what() << " in onObserve" << std::endl;\r
489     }\r
490 \r
491 }\r
492 \r
493 void WinUIClientApp::BeginObserving()\r
494 {\r
495     if (OBSERVE_TYPE_TO_USE == ObserveType::Observe)\r
496         std::cout << std::endl << "Observe is used." << std::endl << std::endl;\r
497     else if (OBSERVE_TYPE_TO_USE == ObserveType::ObserveAll)\r
498         std::cout << std::endl << "ObserveAll is used." << std::endl << std::endl;\r
499 \r
500     curResource->observe(OBSERVE_TYPE_TO_USE, QueryParamsMap(), std::bind(&WinUIClientApp::onObserve, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4));\r
501 }\r
502 \r
503 void WinUIClientApp::CancelObserving()\r
504 {\r
505     std::cout<<"Cancelling Observe..."<<std::endl;\r
506     OCStackResult result = curResource->cancelObserve();\r
507 }\r
508 \r
509 std::shared_ptr<OCResource> WinUIClientApp::GetResource()\r
510 {\r
511     return curResource;\r
512 }\r
513 \r
514 int WinUIClientApp::observe_count()\r
515 {\r
516     static int oc = 0;\r
517     return ++oc;\r
518 }\r
519 \r