1 /* ****************************************************************
\r
3 * Copyright 2016 Intel Corporation All Rights Reserved.
\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
9 * http://www.apache.org/licenses/LICENSE-2.0
\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
17 ******************************************************************/
\r
20 #include "winuiclient.h"
\r
21 #include <Windows.h>
\r
22 #include <Commctrl.h>
\r
23 #include <functional>
\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
30 WinUIClientApp::WinUIClientApp(OCPersistentStorage ps)
\r
31 : persistentStorage(ps),
\r
32 OBSERVE_TYPE_TO_USE(ObserveType::Observe)
\r
37 WinUIClientApp::~WinUIClientApp()
\r
42 void WinUIClientApp::Initialize()
\r
44 // Create PlatformConfig object
\r
45 PlatformConfig cfg {
\r
46 OC::ServiceType::InProc,
\r
50 OC::QualityOfService::LowQos,
\r
54 OCPlatform::Configure(cfg);
\r
57 void WinUIClientApp::Run()
\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
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
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
79 }catch(OCException& e)
\r
81 std::cerr << "Exception in main: "<<e.what();
\r
85 void receivedPlatformInfo(const OCRepresentation& rep)
\r
87 std::cout << "\nPlatform Information received ---->\n";
\r
89 std::string values[] =
\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
104 for (unsigned int i = 0; i < sizeof(values) / sizeof(values[0]) ; i += 2)
\r
106 if(rep.getValue(values[i], value))
\r
108 std::cout << values[i + 1] << " : "<< value << std::endl;
\r
113 void receivedDeviceInfo(const OCRepresentation& rep)
\r
115 std::cout << "\nDevice Information received ---->\n";
\r
117 std::string values[] =
\r
119 "di", "Device ID ",
\r
120 "n", "Device name ",
\r
121 "lcv", "Spec version url ",
\r
122 "dmv", "Data Model Model ",
\r
125 for (unsigned int i = 0; i < sizeof(values) / sizeof(values[0]); i += 2)
\r
127 if (rep.getValue(values[i], value))
\r
129 std::cout << values[i + 1] << " : " << value << std::endl;
\r
134 void WinUIClientApp::FindResources()
\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
143 // Callback to found resources
\r
144 void WinUIClientApp::foundResource(std::shared_ptr<OCResource> resource)
\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
154 std::lock_guard<std::mutex> lock(curResourceLock);
\r
155 if (discoveredResources.find(resource->uniqueIdentifier()) == discoveredResources.end())
\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
163 std::cout<<"Found resource "<< resource->uniqueIdentifier() << " again!"<<std::endl;
\r
168 std::cout << "Found another resource, ignoring"<<std::endl;
\r
173 // Do some operations with resource object.
\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
181 // Get the resource host address
\r
182 hostAddress = resource->host();
\r
183 std::cout << "\tHost address of the resource: " << hostAddress << std::endl;
\r
185 // Get the resource types
\r
186 std::cout << "\tList of resource types: " << std::endl;
\r
187 for(auto &resourceTypes : resource->getResourceTypes())
\r
189 std::cout << "\t\t" << resourceTypes << std::endl;
\r
192 // Get the resource interfaces
\r
193 std::cout << "\tList of resource interfaces: " << std::endl;
\r
194 for(auto &resourceInterfaces : resource->getResourceInterfaces())
\r
196 std::cout << "\t\t" << resourceInterfaces << std::endl;
\r
200 std::cout << "Querying for platform information... " << std::endl;
\r
202 ret = OCPlatform::getPlatformInfo("", platformDiscoveryURI, CT_ADAPTER_IP,
\r
203 &receivedPlatformInfo);
\r
205 if (ret == OC_STACK_OK)
\r
207 std::cout << "Get platform information is done." << std::endl;
\r
211 std::cout << "Get platform information failed." << std::endl;
\r
214 std::cout << "Querying for device information... " << std::endl;
\r
216 ret = OCPlatform::getDeviceInfo(resource->host(), deviceDiscoveryURI, CT_ADAPTER_IP,
\r
217 &receivedDeviceInfo);
\r
219 if (ret == OC_STACK_OK)
\r
221 std::cout << "Getting device information is done." << std::endl;
\r
225 std::cout << "Getting device information failed." << std::endl;
\r
228 if (resourceURI == "/a/media")
\r
230 curResource = resource;
\r
231 // Call a local function which will internally invoke get API on the resource pointer
\r
232 this->GetMediaRepresentation();
\r
233 this->BeginObserving();
\r
238 // Resource is invalid
\r
239 std::cout << "Resource is invalid" << std::endl;
\r
243 catch(std::exception& e)
\r
245 std::cerr << "Exception in foundResource: "<< e.what() << std::endl;
\r
249 // Local function to get representation of media resource
\r
250 void WinUIClientApp::GetMediaRepresentation()
\r
254 std::cout << "Getting Media Representation..."<<std::endl;
\r
255 // Invoke resource's get API with the callback parameter
\r
257 QueryParamsMap test;
\r
258 curResource->get(test, std::bind(&WinUIClientApp::onGet, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
\r
263 std::cout << "No Current Resource to GetMediaRepresentation..."<<std::endl;
\r
267 // Callback handler on GET request
\r
268 void WinUIClientApp::onGet(const HeaderOptions& /*headerOptions*/, const OCRepresentation& rep, const int eCode)
\r
272 if (OC_STACK_OK == eCode)
\r
274 std::cout << "GET request was successful" << std::endl;
\r
275 std::cout << "Resource URI: " << rep.getUri() << std::endl;
\r
277 rep.getValue("state", mymedia.m_state);
\r
278 rep.getValue("volume", mymedia.m_volume);
\r
279 rep.getValue("name", mymedia.m_name);
\r
281 std::cout << "\tstate: " << mymedia.m_state << std::endl;
\r
282 std::cout << "\tvolume: " << mymedia.m_volume << std::endl;
\r
283 std::cout << "\tname: " << mymedia.m_name << std::endl;
\r
285 g_CurSliderVal = mymedia.m_volume;
\r
286 SendMessage(hwndVolumeSlider, TBM_SETPOS, TRUE, g_CurSliderVal);
\r
287 LabelPrintf(hwndVolumeExpectedLabel,"Volume: %i", g_CurSliderVal);
\r
292 std::cout << "onGET Response error: " << eCode << std::endl;
\r
296 catch(std::exception& e)
\r
298 std::cout << "Exception: " << e.what() << " in onGet" << std::endl;
\r
302 // Local function to put a different state for this resource
\r
303 void WinUIClientApp::PutMediaRepresentation()
\r
307 OCRepresentation rep;
\r
309 std::cout << "Putting media representation..."<<std::endl;
\r
311 rep.setValue("state", mymedia.m_state);
\r
312 rep.setValue("volume", mymedia.m_volume);
\r
314 // Invoke resource's put API with rep, query map and the callback parameter
\r
315 curResource->put(rep, QueryParamsMap(), std::bind(&WinUIClientApp::onPut, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
\r
319 // callback handler on PUT request
\r
320 void WinUIClientApp::onPut(const HeaderOptions& /*headerOptions*/, const OCRepresentation& rep, const int eCode)
\r
324 if (OC_STACK_OK == eCode || OC_STACK_RESOURCE_CHANGED == eCode)
\r
326 std::cout << "PUT request was successful" << std::endl;
\r
328 rep.getValue("state", mymedia.m_state);
\r
329 rep.getValue("volume", mymedia.m_volume);
\r
330 rep.getValue("name", mymedia.m_name);
\r
332 std::cout << "\tstate: " << mymedia.m_state << std::endl;
\r
333 std::cout << "\tvolume: " << mymedia.m_volume << std::endl;
\r
334 std::cout << "\tname: " << mymedia.m_name << std::endl;
\r
339 std::cout << "onPut Response error: " << eCode << std::endl;
\r
343 catch(std::exception& e)
\r
345 std::cout << "Exception: " << e.what() << " in onPut" << std::endl;
\r
349 // Local function to put a different state for this resource
\r
350 void WinUIClientApp::PostMediaRepresentation()
\r
354 OCRepresentation rep;
\r
356 std::cout << "Posting media representation..."<<std::endl;
\r
358 rep.setValue("state", mymedia.m_state);
\r
359 rep.setValue("volume", mymedia.m_volume);
\r
361 // Invoke resource's post API with rep, query map and the callback parameter
\r
362 curResource->post(rep, QueryParamsMap(), std::bind(&WinUIClientApp::onPost, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
\r
366 void WinUIClientApp::onPost(const HeaderOptions& /*headerOptions*/,
\r
367 const OCRepresentation& rep, const int eCode)
\r
371 if (OC_STACK_OK == eCode || (OC_STACK_RESOURCE_CREATED == eCode
\r
372 || OC_STACK_RESOURCE_CHANGED == eCode))
\r
374 std::cout << "POST request was successful" << std::endl;
\r
376 if (rep.hasAttribute("createduri"))
\r
378 std::cout << "\tUri of the created resource: "
\r
379 << rep.getValue<std::string>("createduri") << std::endl;
\r
383 rep.getValue("state", mymedia.m_state);
\r
384 rep.getValue("volume", mymedia.m_volume);
\r
385 rep.getValue("name", mymedia.m_name);
\r
387 std::cout << "\tstate: " << mymedia.m_state << std::endl;
\r
388 std::cout << "\tvolume: " << mymedia.m_volume << std::endl;
\r
389 std::cout << "\tname: " << mymedia.m_name << std::endl;
\r
395 std::cout << "onPost Response error: " << eCode << std::endl;
\r
399 catch (std::exception& e)
\r
401 std::cout << "Exception: " << e.what() << " in onPost" << std::endl;
\r
405 void WinUIClientApp::onPost2(const HeaderOptions& /*headerOptions*/,
\r
406 const OCRepresentation& rep, const int eCode)
\r
410 if (OC_STACK_OK == eCode || OC_STACK_RESOURCE_CREATED == eCode)
\r
412 std::cout << "POST request was successful" << std::endl;
\r
414 if (rep.hasAttribute("createduri"))
\r
416 std::cout << "\tUri of the created resource: "
\r
417 << rep.getValue<std::string>("createduri") << std::endl;
\r
421 rep.getValue("state", mymedia.m_state);
\r
422 rep.getValue("volume", mymedia.m_volume);
\r
423 rep.getValue("name", mymedia.m_name);
\r
425 std::cout << "\tstate: " << mymedia.m_state << std::endl;
\r
426 std::cout << "\tvolume: " << mymedia.m_volume << std::endl;
\r
427 std::cout << "\tname: " << mymedia.m_name << std::endl;
\r
433 std::cout << "onPost2 Response error: " << eCode << std::endl;
\r
437 catch(std::exception& e)
\r
439 std::cout << "Exception: " << e.what() << " in onPost2" << std::endl;
\r
444 void WinUIClientApp::onObserve(const HeaderOptions /*headerOptions*/, const OCRepresentation& rep,
\r
445 const int& eCode, const int& sequenceNumber)
\r
449 if (OC_STACK_OK == eCode && sequenceNumber <= MAX_SEQUENCE_NUMBER)
\r
451 if (sequenceNumber == OC_OBSERVE_REGISTER)
\r
453 std::cout << "Observe registration action is successful" << std::endl;
\r
456 std::cout << "OBSERVE RESULT:"<<std::endl;
\r
457 std::cout << "\tSequenceNumber: "<< sequenceNumber << std::endl;
\r
458 rep.getValue("state", mymedia.m_state);
\r
459 rep.getValue("volume", mymedia.m_volume);
\r
460 rep.getValue("name", mymedia.m_name);
\r
462 std::cout << "\tstate: " << mymedia.m_state << std::endl;
\r
463 std::cout << "\tvolume: " << mymedia.m_volume << std::endl;
\r
464 std::cout << "\tname: " << mymedia.m_name << std::endl;
\r
466 g_CurSliderVal = mymedia.m_volume;
\r
467 SendMessage(hwndVolumeSlider, TBM_SETPOS, TRUE, g_CurSliderVal);
\r
468 LabelPrintf(hwndVolumeExpectedLabel,"Volume: %i", g_CurSliderVal);
\r
472 if (OC_STACK_OK == eCode)
\r
474 std::cout << "No observe option header is returned in the response." << std::endl;
\r
475 std::cout << "For a registration request, it means the registration failed"
\r
480 std::cout << "onObserve Response error: " << eCode << std::endl;
\r
485 catch (std::exception& e)
\r
487 std::cout << "Exception: " << e.what() << " in onObserve" << std::endl;
\r
492 void WinUIClientApp::BeginObserving()
\r
494 if (OBSERVE_TYPE_TO_USE == ObserveType::Observe)
\r
495 std::cout << std::endl << "Observe is used." << std::endl << std::endl;
\r
496 else if (OBSERVE_TYPE_TO_USE == ObserveType::ObserveAll)
\r
497 std::cout << std::endl << "ObserveAll is used." << std::endl << std::endl;
\r
499 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
502 void WinUIClientApp::CancelObserving()
\r
504 std::cout<<"Cancelling Observe..."<<std::endl;
\r
505 OCStackResult result = curResource->cancelObserve();
\r
508 std::shared_ptr<OCResource> WinUIClientApp::GetResource()
\r
510 return curResource;
\r
513 int WinUIClientApp::observe_count()
\r