192 lines
5.6 KiB
C++
192 lines
5.6 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 2000.
|
|
//
|
|
// File: S E R V I C E I N F O . C P P
|
|
//
|
|
// Contents: Registrar representation on a service
|
|
//
|
|
// Notes:
|
|
//
|
|
// Author: mbend 12 Sep 2000
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include "pch.h"
|
|
#pragma hdrstop
|
|
|
|
#include "uhbase.h"
|
|
#include "ServiceInfo.h"
|
|
#include "uhutil.h"
|
|
|
|
CServiceInfo::CServiceInfo()
|
|
{
|
|
}
|
|
|
|
CServiceInfo::~CServiceInfo()
|
|
{
|
|
Clear();
|
|
}
|
|
|
|
HRESULT CServiceInfo::HrInitialize(
|
|
const PhysicalDeviceIdentifier & pdi,
|
|
const wchar_t * szUDN,
|
|
const wchar_t * szServiceId,
|
|
const wchar_t * szContainerId,
|
|
IUPnPDeviceControlPtr & pDeviceControl,
|
|
BOOL bRunning)
|
|
{
|
|
CHECK_POINTER(szUDN);
|
|
CHECK_POINTER(szServiceId);
|
|
CHECK_POINTER(pDeviceControl.GetRawPointer());
|
|
TraceTag(ttidRegistrar, "CServiceInfo::HrInitialize(UDN=%S, ServiceId=%S)", szUDN, szServiceId);
|
|
HRESULT hr = S_OK;
|
|
|
|
if(szContainerId)
|
|
{
|
|
hr = m_strContainerId.HrAssign(szContainerId);
|
|
}
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
BSTR bstrUDN = NULL;
|
|
BSTR bstrServiceId = NULL;
|
|
bstrUDN = SysAllocString(szUDN);
|
|
bstrServiceId = SysAllocString(szServiceId);
|
|
if(bstrUDN && bstrServiceId)
|
|
{
|
|
hr = pDeviceControl->GetServiceObject(bstrUDN, bstrServiceId, m_pDispService.AddressOf());
|
|
}
|
|
else
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
if(bstrUDN)
|
|
{
|
|
SysFreeString(bstrUDN);
|
|
}
|
|
if(bstrServiceId)
|
|
{
|
|
SysFreeString(bstrServiceId);
|
|
}
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
if(bRunning)
|
|
{
|
|
hr = m_pDispService.HrCopyProxyIdentity(pDeviceControl.GetRawPointer());
|
|
}
|
|
}
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
hr = m_pEventingManager.HrCreateInstanceInproc(CLSID_UPnPEventingManager);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
hr = m_pAutomationProxy.HrCreateInstanceInproc(CLSID_UPnPAutomationProxy);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
IUPnPRegistrarPrivatePtr pPriv;
|
|
hr = pPriv.HrCreateInstanceInproc(CLSID_UPnPRegistrar);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
// Get the service description text
|
|
wchar_t * szServiceText = NULL;
|
|
wchar_t * szServiceType = NULL;
|
|
hr = pPriv->GetSCPDText(pdi, szUDN, szServiceId, &szServiceText, &szServiceType);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
// Initialize the automation proxy
|
|
hr = m_pAutomationProxy->Initialize(m_pDispService, szServiceText, szServiceType, bRunning);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
// Intialize eventing manager
|
|
hr = m_pEventingManager->Initialize(
|
|
const_cast<wchar_t*>(szUDN),
|
|
const_cast<wchar_t*>(szServiceId),
|
|
m_pAutomationProxy, m_pDispService, bRunning);
|
|
if (E_NOINTERFACE == hr)
|
|
{
|
|
TraceTag(ttidRegistrar, "Eventing manager "
|
|
"interface not supported on this "
|
|
"service!");
|
|
|
|
// Don't want to reference it anymore
|
|
m_pEventingManager.Release();
|
|
hr = S_OK;
|
|
}
|
|
}
|
|
CoTaskMemFree(szServiceText);
|
|
CoTaskMemFree(szServiceType);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
TraceHr(ttidRegistrar, FAL, hr, FALSE, "CServiceInfo::HrInitialize");
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CServiceInfo::HrGetEventingManager(IUPnPEventingManager ** ppEventingManager)
|
|
{
|
|
CHECK_POINTER(ppEventingManager);
|
|
TraceTag(ttidRegistrar, "CServiceInfo::HrGetEventingManager");
|
|
HRESULT hr = S_OK;
|
|
|
|
if(m_pEventingManager)
|
|
{
|
|
*ppEventingManager = m_pEventingManager.GetPointer();
|
|
}
|
|
else
|
|
{
|
|
*ppEventingManager = NULL;
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
|
|
TraceHr(ttidRegistrar, FAL, hr, FALSE, "CServiceInfo::HrGetEventingManager");
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CServiceInfo::HrGetAutomationProxy(IUPnPAutomationProxy ** ppAutomationProxy)
|
|
{
|
|
CHECK_POINTER(ppAutomationProxy);
|
|
TraceTag(ttidRegistrar, "CServiceInfo::HrGetAutomationProxy");
|
|
HRESULT hr = S_OK;
|
|
|
|
if(m_pAutomationProxy)
|
|
{
|
|
*ppAutomationProxy = m_pAutomationProxy.GetPointer();
|
|
}
|
|
else
|
|
{
|
|
*ppAutomationProxy = NULL;
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
|
|
TraceHr(ttidRegistrar, FAL, hr, FALSE, "CServiceInfo::HrGetAutomationProxy");
|
|
return hr;
|
|
}
|
|
|
|
void CServiceInfo::Transfer(CServiceInfo & ref)
|
|
{
|
|
m_strContainerId.Transfer(ref.m_strContainerId);
|
|
m_pDispService.Swap(ref.m_pDispService);
|
|
m_pEventingManager.Swap(ref.m_pEventingManager);
|
|
m_pAutomationProxy.Swap(ref.m_pAutomationProxy);
|
|
}
|
|
|
|
void CServiceInfo::Clear()
|
|
{
|
|
m_strContainerId.Clear();
|
|
m_pDispService.Release();
|
|
|
|
if (m_pEventingManager)
|
|
{
|
|
m_pEventingManager->Shutdown();
|
|
}
|
|
|
|
m_pEventingManager.Release();
|
|
m_pAutomationProxy.Release();
|
|
}
|
|
|