2025-11-28 00:35:46 +09:00

251 lines
7.5 KiB
C++

////////////////////////////////////////////////////////////////////////////////
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (c) Microsoft Corporation. All rights reserved.
////////////////////////////////////////////////////////////////////////////////
// Public Headers
#include <windows.h>
#include <wsdapi.h>
#include <stdio.h>
#include <strsafe.h>
// Sample Headers
#include "SimpleThermostat_WSD.h"
#include "SimpleThermostat_WSDProxy.h"
#include "CWSDSimpleThermostatProxy.h"
//------------------------------------------------------------------------------
// CreateCWSDSimpleThermostatProxy
// This is essentially the factory method for the CWSDSimpleThermostatProxy
// class. It takes a property store that's expected to have come from
// an FD Function Instance.
//------------------------------------------------------------------------------
HRESULT CreateCWSDSimpleThermostatProxy(
IPropertyStore* pPropertyStore,
ISimpleThermostat** ppSimpleThermostat
)
{
HRESULT hr = S_OK;
PROPVARIANT pv = {0};
WCHAR szProxyAddress[MAX_PATH] = {0};
UUID uuid = {0};
CSimpleThermostat_WSDProxy* pCSimpleThermostat_WSDProxy = NULL;
CWSDSimpleThermostatProxy* pCWSDSimpleThermostatProxy = NULL;
if( NULL == pPropertyStore ||
NULL == ppSimpleThermostat )
{
return E_INVALIDARG;
}
wprintf( L"GetValue of PKEY_PNPX_GlobalIdentity (device host id)..." );
hr = pPropertyStore->GetValue( PKEY_PNPX_GlobalIdentity, &pv );
wprintf( L"0x%x\n", hr );
if( S_OK == hr )
{
wprintf( L"Device Host ID: %s\n", pv.pwszVal );
}
//
// Create a unique proxy ID to use when connecting to the thermostat device
//
if( S_OK == hr )
{
hr = UuidCreate( &uuid );
if( S_OK == hr )
{
hr = StringCbPrintfW(
szProxyAddress, sizeof(szProxyAddress),
L"urn:uuid:%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
uuid.Data1, uuid.Data2, uuid.Data3,
uuid.Data4[0], uuid.Data4[1], uuid.Data4[2], uuid.Data4[3],
uuid.Data4[4], uuid.Data4[5], uuid.Data4[6], uuid.Data4[7]);
}
}
//
// Create the proxy object that implements ISimpleThermostat_WSD.
// The object being created here is what CWSDSimpleThermostatProxy
// wraps to expose the real ISimpleThermostat interface.
// This function being called here was generated by WSD Code Gen.
//
if( S_OK == hr )
{
wprintf( L"Calling CreateCSimpleThermostat_WSDProxy..." );
hr = CreateCSimpleThermostat_WSDProxy(
pv.pwszVal,
szProxyAddress,
&pCSimpleThermostat_WSDProxy,
NULL
);
wprintf( L"0x%x\n", hr );
}
//
// Now create the CWSDSimpleThermostatProxy object and hand it
// the CSimpleThermostat_WSDProxy object.
//
if( S_OK == hr )
{
wprintf( L"Creating the CWSDSimpleThermostatProxy object..." );
pCWSDSimpleThermostatProxy = new CWSDSimpleThermostatProxy(
pCSimpleThermostat_WSDProxy
);
if( NULL == pCWSDSimpleThermostatProxy )
{
hr = E_OUTOFMEMORY;
}
wprintf( L"0x%x\n", hr );
}
if( S_OK == hr )
{
*ppSimpleThermostat = static_cast<ISimpleThermostat*>(pCWSDSimpleThermostatProxy);
}
//
// Cleanup
//
PropVariantClear( &pv );
if( NULL != pCSimpleThermostat_WSDProxy )
{
pCSimpleThermostat_WSDProxy->Release();
pCSimpleThermostat_WSDProxy = NULL;
}
return hr;
}// CreateCWSDSimpleThermostatProxy
//------------------------------------------------------------------------------
// CWSDSimpleThermostatProxy::CWSDSimpleThermostatProxy (Constructor)
//------------------------------------------------------------------------------
CWSDSimpleThermostatProxy::CWSDSimpleThermostatProxy(
ISimpleThermostat_WSD* pSimpleThermostat_WSD
):
m_cRef(1)
{
pSimpleThermostat_WSD->AddRef();
m_pSimpleThermostat_WSD = pSimpleThermostat_WSD;
}
//------------------------------------------------------------------------------
// CWSDSimpleThermostatProxy::~CWSDSimpleThermostatProxy (Destructor)
//------------------------------------------------------------------------------
CWSDSimpleThermostatProxy::~CWSDSimpleThermostatProxy()
{
if( NULL != m_pSimpleThermostat_WSD )
{
m_pSimpleThermostat_WSD->Release();
m_pSimpleThermostat_WSD = NULL;
}
}
//
// ISimpleThermostat
//
//------------------------------------------------------------------------------
// CWSDSimpleThermostatProxy::GetCurrentTemp
//------------------------------------------------------------------------------
HRESULT CWSDSimpleThermostatProxy::GetCurrentTemp(
LONG* plTemp
)
{
return m_pSimpleThermostat_WSD->GetCurrentTemp( plTemp );
}// CWSDSimpleThermostatProxy::GetCurrentTemp
//------------------------------------------------------------------------------
// CWSDSimpleThermostatProxy::GetDesiredTemp
//------------------------------------------------------------------------------
HRESULT CWSDSimpleThermostatProxy::GetDesiredTemp(
LONG* plTemp
)
{
return m_pSimpleThermostat_WSD->GetDesiredTemp( plTemp );
}// CWSDSimpleThermostatProxy::GetDesiredTemp
//------------------------------------------------------------------------------
// CWSDSimpleThermostatProxy::SetDesiredTemp
//------------------------------------------------------------------------------
HRESULT CWSDSimpleThermostatProxy::SetDesiredTemp(
LONG lTemp
)
{
return m_pSimpleThermostat_WSD->SetDesiredTemp( lTemp );
}// CWSDSimpleThermostatProxy::SetDesiredTemp
//
// IUnknown
//
//------------------------------------------------------------------------------
// CWSDSimpleThermostatProxy::QueryInterface
//------------------------------------------------------------------------------
HRESULT CWSDSimpleThermostatProxy::QueryInterface(
REFIID riid,
void** ppvObject
)
{
HRESULT hr = S_OK;
if( NULL == ppvObject )
{
return E_INVALIDARG;
}
*ppvObject = NULL;
if( __uuidof(ISimpleThermostat) == riid )
{
*ppvObject = static_cast<ISimpleThermostat*>(this);
AddRef();
}
else if( __uuidof(IUnknown) == riid )
{
*ppvObject = static_cast<IUnknown*>(this);
AddRef();
}
else
{
hr = E_NOINTERFACE;
}
return hr;
}// CWSDSimpleThermostatProxy::QueryInterface
//------------------------------------------------------------------------------
// CWSDSimpleThermostatProxy::AddRef
//------------------------------------------------------------------------------
ULONG CWSDSimpleThermostatProxy::AddRef()
{
return InterlockedIncrement( &m_cRef );
}// CWSDSimpleThermostatProxy::AddRef
//------------------------------------------------------------------------------
// CWSDSimpleThermostatProxy::Release
//------------------------------------------------------------------------------
ULONG CWSDSimpleThermostatProxy::Release()
{
LONG lRef = InterlockedDecrement( &m_cRef );
if( 0 == lRef )
{
delete this;
}
return lRef;
}// CWSDSimpleThermostatProxy::Release