mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
266 lines
8.7 KiB
266 lines
8.7 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 2000.
|
|
//
|
|
// File: P H Y S I C A L D E V I C E I N F O . C P P
|
|
//
|
|
// Contents: Manages an UPnP device assembly
|
|
//
|
|
// Notes:
|
|
//
|
|
// Author: mbend 12 Sep 2000
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
|
|
#include "pch.h"
|
|
#pragma hdrstop
|
|
|
|
#include "uhbase.h"
|
|
#include "PhysicalDeviceInfo.h"
|
|
#include "uhutil.h"
|
|
|
|
CPhysicalDeviceInfo::CPhysicalDeviceInfo()
|
|
{
|
|
m_bRunning = FALSE;
|
|
}
|
|
|
|
CPhysicalDeviceInfo::~CPhysicalDeviceInfo()
|
|
{
|
|
Clear();
|
|
}
|
|
|
|
HRESULT CPhysicalDeviceInfo::HrInitialize(
|
|
const wchar_t * szProgIdDeviceControlClass,
|
|
const wchar_t * szInitString,
|
|
const wchar_t * szContainerId,
|
|
long nUDNs,
|
|
wchar_t * arszUDNs[])
|
|
{
|
|
CHECK_POINTER(szProgIdDeviceControlClass);
|
|
CHECK_POINTER(szInitString);
|
|
CHECK_POINTER(szContainerId);
|
|
TraceTag(ttidRegistrar, "CPhysicalDeviceInfo::HrInitialize(ProgId=%S)", szProgIdDeviceControlClass);
|
|
HRESULT hr = S_OK;
|
|
|
|
hr = m_strProgIdDeviceControl.HrAssign(szProgIdDeviceControlClass);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
hr = m_strInitString.HrAssign(szInitString);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
hr = m_strContainerId.HrAssign(szContainerId);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
for(long n = 0; n < nUDNs && SUCCEEDED(hr); ++n)
|
|
{
|
|
CDeviceInfo deviceInfo;
|
|
CUString strUDN;
|
|
hr = strUDN.HrAssign(arszUDNs[n]);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
hr = m_deviceTable.HrInsertTransfer(strUDN, deviceInfo);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
TraceHr(ttidRegistrar, FAL, hr, FALSE, "CPhysicalDeviceInfo::HrInitialize");
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CPhysicalDeviceInfo::HrInitializeRunning(
|
|
const PhysicalDeviceIdentifier & pdi,
|
|
IUnknown * pUnkDeviceControl,
|
|
const wchar_t * szInitString,
|
|
long nUDNs,
|
|
wchar_t * arszUDNs[])
|
|
{
|
|
CHECK_POINTER(pUnkDeviceControl);
|
|
CHECK_POINTER(szInitString);
|
|
TraceTag(ttidRegistrar, "CPhysicalDeviceInfo::HrInitializeRunning");
|
|
HRESULT hr = S_OK;
|
|
|
|
m_bRunning = TRUE;
|
|
|
|
hr = m_strInitString.HrAssign(szInitString);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
HrEnableStaticCloaking(pUnkDeviceControl);
|
|
hr = m_pDeviceControl.HrAttach(pUnkDeviceControl);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
hr = m_pDeviceControl.HrEnableStaticCloaking();
|
|
}
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
CUString strPdi;
|
|
hr = HrPhysicalDeviceIdentifierToString(pdi, strPdi);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
// Convert to BSTRs
|
|
BSTR bstrPdi = NULL;
|
|
hr = strPdi.HrGetBSTR(&bstrPdi);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
BSTR bstrInitString = NULL;
|
|
hr = m_strInitString.HrGetBSTR(&bstrInitString);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
// Get description text
|
|
BSTR bstrDescriptionDocument = NULL;
|
|
IUPnPRegistrarPrivatePtr pPriv;
|
|
hr = pPriv.HrCreateInstanceInproc(CLSID_UPnPRegistrar);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
hr = pPriv->GetDescriptionText(pdi, &bstrDescriptionDocument);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
hr = m_pDeviceControl->Initialize(
|
|
bstrDescriptionDocument, bstrPdi, bstrInitString);
|
|
SysFreeString(bstrDescriptionDocument);
|
|
TraceHr(ttidRegistrar, FAL, hr, FALSE, "CPhysicalDeviceInfo::HrInitializeRunning - IUPnPDeviceControl::Initialize failed!");
|
|
}
|
|
}
|
|
SysFreeString(bstrInitString);
|
|
}
|
|
SysFreeString(bstrPdi);
|
|
}
|
|
}
|
|
for(long n = 0; n < nUDNs && SUCCEEDED(hr); ++n)
|
|
{
|
|
CDeviceInfo deviceInfo;
|
|
CUString strUDN;
|
|
hr = strUDN.HrAssign(arszUDNs[n]);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
hr = m_deviceTable.HrInsertTransfer(strUDN, deviceInfo);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if(FAILED(hr) && m_pDeviceControl.GetRawPointer())
|
|
{
|
|
m_pDeviceControl.Release();
|
|
HrDereferenceContainer(m_strContainerId);
|
|
}
|
|
|
|
TraceHr(ttidRegistrar, FAL, hr, FALSE, "CPhysicalDeviceInfo::HrInitializeRunning");
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CPhysicalDeviceInfo::HrGetService(
|
|
const PhysicalDeviceIdentifier & pdi,
|
|
const wchar_t * szUDN,
|
|
const wchar_t * szServiceId,
|
|
CServiceInfo ** ppServiceInfo)
|
|
{
|
|
CHECK_POINTER(szUDN);
|
|
CHECK_POINTER(szServiceId);
|
|
CHECK_POINTER(ppServiceInfo);
|
|
TraceTag(ttidRegistrar, "CPhysicalDeviceInfo::HrGetService(UDN=%S, ServiceId=%S)", szUDN, szServiceId);
|
|
HRESULT hr = S_OK;
|
|
|
|
// See if our device control object is running, create it if not
|
|
if(!m_pDeviceControl)
|
|
{
|
|
// Create the device control object
|
|
hr = HrCreateAndReferenceContainedObjectByProgId(m_strContainerId, m_strProgIdDeviceControl, SMART_QI(m_pDeviceControl));
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
CUString strPdi;
|
|
hr = HrPhysicalDeviceIdentifierToString(pdi, strPdi);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
// Convert to BSTRs
|
|
BSTR bstrPdi = NULL;
|
|
hr = strPdi.HrGetBSTR(&bstrPdi);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
BSTR bstrInitString = NULL;
|
|
hr = m_strInitString.HrGetBSTR(&bstrInitString);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
// Get description text
|
|
BSTR bstrDescriptionDocument = NULL;
|
|
IUPnPRegistrarPrivatePtr pPriv;
|
|
hr = pPriv.HrCreateInstanceInproc(CLSID_UPnPRegistrar);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
hr = pPriv->GetDescriptionText(pdi, &bstrDescriptionDocument);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
hr = m_pDeviceControl->Initialize(
|
|
bstrDescriptionDocument, bstrPdi, bstrInitString);
|
|
SysFreeString(bstrDescriptionDocument);
|
|
}
|
|
}
|
|
SysFreeString(bstrInitString);
|
|
}
|
|
SysFreeString(bstrPdi);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// Now fetch service from device object
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
CUString strUDN;
|
|
hr = strUDN.HrAssign(szUDN);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
CDeviceInfo * pDeviceInfo = m_deviceTable.Lookup(strUDN);
|
|
if(pDeviceInfo)
|
|
{
|
|
hr = pDeviceInfo->HrGetService(pdi, szUDN, szServiceId, m_strContainerId, m_pDeviceControl, ppServiceInfo, m_bRunning);
|
|
}
|
|
else
|
|
{
|
|
hr = E_INVALIDARG;
|
|
TraceTag(ttidRegistrar, "CPhysicalDeviceInfo::HrGetService - Unable to find UDN(%S)",
|
|
static_cast<const wchar_t *>(strUDN));
|
|
}
|
|
}
|
|
}
|
|
if(FAILED(hr) && m_pDeviceControl.GetRawPointer())
|
|
{
|
|
m_pDeviceControl.Release();
|
|
HrDereferenceContainer(m_strContainerId);
|
|
}
|
|
|
|
TraceHr(ttidRegistrar, FAL, hr, FALSE, "CPhysicalDeviceInfo::HrGetService");
|
|
return hr;
|
|
}
|
|
|
|
void CPhysicalDeviceInfo::Transfer(CPhysicalDeviceInfo & ref)
|
|
{
|
|
// If we have a device object and a container id then deref container
|
|
if(m_pDeviceControl.GetRawPointer() && m_strContainerId.GetLength())
|
|
{
|
|
HrDereferenceContainer(m_strContainerId);
|
|
}
|
|
|
|
m_deviceTable.Swap(ref.m_deviceTable);
|
|
m_strProgIdDeviceControl.Transfer(ref.m_strProgIdDeviceControl);
|
|
m_strInitString.Transfer(ref.m_strInitString);
|
|
m_strContainerId.Transfer(ref.m_strContainerId);
|
|
m_pDeviceControl.Swap(ref.m_pDeviceControl);
|
|
}
|
|
|
|
void CPhysicalDeviceInfo::Clear()
|
|
{
|
|
// If we have a device object and a container id then deref container
|
|
if(m_pDeviceControl.GetRawPointer() && m_strContainerId.GetLength())
|
|
{
|
|
HrDereferenceContainer(m_strContainerId);
|
|
}
|
|
|
|
m_deviceTable.Clear();
|
|
m_strProgIdDeviceControl.Clear();
|
|
m_strInitString.Clear();
|
|
m_strContainerId.Clear();
|
|
m_pDeviceControl.Release();
|
|
}
|
|
|