//+--------------------------------------------------------------------------- // // 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(szUDN), const_cast(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(); }