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,
\r
217 resource->connectivityType(), &receivedDeviceInfo);
\r
220 if (ret == OC_STACK_OK)
\r
222 std::cout << "Getting device information is done." << std::endl;
\r
226 std::cout << "Getting device information failed." << std::endl;
\r
229 if (resourceURI == "/a/media")
\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
239 // Resource is invalid
\r
240 std::cout << "Resource is invalid" << std::endl;
\r
244 catch(std::exception& e)
\r
246 std::cerr << "Exception in foundResource: "<< e.what() << std::endl;
\r
250 // Local function to get representation of media resource
\r
251 void WinUIClientApp::GetMediaRepresentation()
\r
255 std::cout << "Getting Media Representation..."<<std::endl;
\r
256 // Invoke resource's get API with the callback parameter
\r
258 QueryParamsMap test;
\r
259 curResource->get(test, std::bind(&WinUIClientApp::onGet, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
\r
264 std::cout << "No Current Resource to GetMediaRepresentation..."<<std::endl;
\r
268 // Callback handler on GET request
\r
269 void WinUIClientApp::onGet(const HeaderOptions& /*headerOptions*/, const OCRepresentation& rep, const int eCode)
\r
273 if (OC_STACK_OK == eCode)
\r
275 std::cout << "GET request was successful" << std::endl;
\r
276 std::cout << "Resource URI: " << rep.getUri() << std::endl;
\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
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
286 g_CurSliderVal = mymedia.m_volume;
\r
287 SendMessage(hwndVolumeSlider, TBM_SETPOS, TRUE, g_CurSliderVal);
\r
288 LabelPrintf(hwndVolumeExpectedLabel,"Volume: %i", g_CurSliderVal);
\r
293 std::cout << "onGET Response error: " << eCode << std::endl;
\r
297 catch(std::exception& e)
\r
299 std::cout << "Exception: " << e.what() << " in onGet" << std::endl;
\r
303 // Local function to put a different state for this resource
\r
304 void WinUIClientApp::PutMediaRepresentation()
\r
308 OCRepresentation rep;
\r
310 std::cout << "Putting media representation..."<<std::endl;
\r
312 rep.setValue("state", mymedia.m_state);
\r
313 rep.setValue("volume", mymedia.m_volume);
\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
320 // callback handler on PUT request
\r
321 void WinUIClientApp::onPut(const HeaderOptions& /*headerOptions*/, const OCRepresentation& rep, const int eCode)
\r
325 if (OC_STACK_OK == eCode || OC_STACK_RESOURCE_CHANGED == eCode)
\r
327 std::cout << "PUT request was successful" << std::endl;
\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
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
340 std::cout << "onPut Response error: " << eCode << std::endl;
\r
344 catch(std::exception& e)
\r
346 std::cout << "Exception: " << e.what() << " in onPut" << std::endl;
\r
350 // Local function to put a different state for this resource
\r
351 void WinUIClientApp::PostMediaRepresentation()
\r
355 OCRepresentation rep;
\r
357 std::cout << "Posting media representation..."<<std::endl;
\r
359 rep.setValue("state", mymedia.m_state);
\r
360 rep.setValue("volume", mymedia.m_volume);
\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
367 void WinUIClientApp::onPost(const HeaderOptions& /*headerOptions*/,
\r
368 const OCRepresentation& rep, const int eCode)
\r
372 if (OC_STACK_OK == eCode || (OC_STACK_RESOURCE_CREATED == eCode
\r
373 || OC_STACK_RESOURCE_CHANGED == eCode))
\r
375 std::cout << "POST request was successful" << std::endl;
\r
377 if (rep.hasAttribute("createduri"))
\r
379 std::cout << "\tUri of the created resource: "
\r
380 << rep.getValue<std::string>("createduri") << std::endl;
\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
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
396 std::cout << "onPost Response error: " << eCode << std::endl;
\r
400 catch (std::exception& e)
\r
402 std::cout << "Exception: " << e.what() << " in onPost" << std::endl;
\r
406 void WinUIClientApp::onPost2(const HeaderOptions& /*headerOptions*/,
\r
407 const OCRepresentation& rep, const int eCode)
\r
411 if (OC_STACK_OK == eCode || OC_STACK_RESOURCE_CREATED == eCode)
\r
413 std::cout << "POST request was successful" << std::endl;
\r
415 if (rep.hasAttribute("createduri"))
\r
417 std::cout << "\tUri of the created resource: "
\r
418 << rep.getValue<std::string>("createduri") << std::endl;
\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
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
434 std::cout << "onPost2 Response error: " << eCode << std::endl;
\r
438 catch(std::exception& e)
\r
440 std::cout << "Exception: " << e.what() << " in onPost2" << std::endl;
\r
445 void WinUIClientApp::onObserve(const HeaderOptions /*headerOptions*/, const OCRepresentation& rep,
\r
446 const int& eCode, const int& sequenceNumber)
\r
450 if (OC_STACK_OK == eCode && sequenceNumber <= MAX_SEQUENCE_NUMBER)
\r
452 if (sequenceNumber == OC_OBSERVE_REGISTER)
\r
454 std::cout << "Observe registration action is successful" << std::endl;
\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
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
467 g_CurSliderVal = mymedia.m_volume;
\r
468 SendMessage(hwndVolumeSlider, TBM_SETPOS, TRUE, g_CurSliderVal);
\r
469 LabelPrintf(hwndVolumeExpectedLabel,"Volume: %i", g_CurSliderVal);
\r
473 if (OC_STACK_OK == eCode)
\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
481 std::cout << "onObserve Response error: " << eCode << std::endl;
\r
486 catch (std::exception& e)
\r
488 std::cout << "Exception: " << e.what() << " in onObserve" << std::endl;
\r
493 void WinUIClientApp::BeginObserving()
\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
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
503 void WinUIClientApp::CancelObserving()
\r
505 std::cout<<"Cancelling Observe..."<<std::endl;
\r
506 OCStackResult result = curResource->cancelObserve();
\r
509 std::shared_ptr<OCResource> WinUIClientApp::GetResource()
\r
511 return curResource;
\r
514 int WinUIClientApp::observe_count()
\r