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.
181 lines
4.2 KiB
181 lines
4.2 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 2000.
|
|
//
|
|
// File: P R O V I D E R . C P P
|
|
//
|
|
// Contents: Registrar abstraction for a provider.
|
|
//
|
|
// Notes:
|
|
//
|
|
// Author: mbend 14 Sep 2000
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include "pch.h"
|
|
#pragma hdrstop
|
|
|
|
#include "uhbase.h"
|
|
#include "Provider.h"
|
|
#include "uhutil.h"
|
|
#include "uhthread.h"
|
|
|
|
class CProviderAsync : public CWorkItem
|
|
{
|
|
public:
|
|
HRESULT HrInitStart(IUPnPDeviceProviderPtr pProvider, const wchar_t * szInitString);
|
|
HRESULT HrInitStop(IUPnPDeviceProviderPtr pProvider);
|
|
DWORD DwRun();
|
|
private:
|
|
IUPnPDeviceProviderPtr m_pProvider;
|
|
BOOL m_bStart;
|
|
CUString m_strInitString;
|
|
};
|
|
|
|
HRESULT CProviderAsync::HrInitStart(IUPnPDeviceProviderPtr pProvider, const wchar_t * szInitString)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
m_pProvider = pProvider;
|
|
m_bStart = TRUE;
|
|
|
|
hr = m_strInitString.HrAssign(szInitString);
|
|
|
|
TraceHr(ttidRegistrar, FAL, hr, FALSE, "CProviderAsync::HrInitStart");
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CProviderAsync::HrInitStop(IUPnPDeviceProviderPtr pProvider)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
m_pProvider = pProvider;
|
|
m_bStart = FALSE;
|
|
|
|
TraceHr(ttidRegistrar, FAL, hr, FALSE, "CProviderAsync::HrInitStop");
|
|
return hr;
|
|
}
|
|
|
|
DWORD CProviderAsync::DwRun()
|
|
{
|
|
TraceTag(ttidRegistrar, "CProviderAsync::DwRun(%x) - starting worker thread", this);
|
|
HRESULT hr = S_OK;
|
|
|
|
hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
|
|
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
if(m_bStart)
|
|
{
|
|
BSTR bstrInitString = NULL;
|
|
hr = m_strInitString.HrGetBSTR(&bstrInitString);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
hr = m_pProvider->Start(bstrInitString);
|
|
SysFreeString(bstrInitString);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = m_pProvider->Stop();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
TraceTag(ttidError, "CProviderAsync::DwRun - CoInitializeEx failed!");
|
|
}
|
|
m_pProvider.Release();
|
|
|
|
CoUninitialize();
|
|
TraceHr(ttidRegistrar, FAL, hr, FALSE, "CProviderAsync::DwRun(%x)", this);
|
|
return hr;
|
|
}
|
|
|
|
|
|
CProvider::CProvider()
|
|
{
|
|
}
|
|
|
|
CProvider::~CProvider()
|
|
{
|
|
Clear();
|
|
}
|
|
|
|
HRESULT CProvider::HrInitialize(
|
|
const wchar_t * szProgIDProviderClass,
|
|
const wchar_t * szInitString,
|
|
const wchar_t * szContainerId)
|
|
{
|
|
CHECK_POINTER(szProgIDProviderClass);
|
|
CHECK_POINTER(szInitString);
|
|
CHECK_POINTER(szContainerId);
|
|
TraceTag(ttidRegistrar, "CProvider::HrInitialize(ProgId=%S)", szProgIDProviderClass);
|
|
HRESULT hr = S_OK;
|
|
|
|
hr = m_strContainerId.HrAssign(szContainerId);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
hr = HrCreateAndReferenceContainedObjectByProgId(
|
|
szContainerId, szProgIDProviderClass, SMART_QI(m_pDeviceProvider));
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
CProviderAsync * pAsync = new CProviderAsync;
|
|
if(pAsync)
|
|
{
|
|
hr = pAsync->HrInitStart(m_pDeviceProvider, szInitString);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
hr = pAsync->HrStart(TRUE);
|
|
}
|
|
if(FAILED(hr))
|
|
{
|
|
delete pAsync;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
HrDereferenceContainer(szContainerId);
|
|
}
|
|
}
|
|
}
|
|
|
|
TraceHr(ttidRegistrar, FAL, hr, FALSE, "CProvider::HrInitialize");
|
|
return hr;
|
|
}
|
|
|
|
void CProvider::Transfer(CProvider & ref)
|
|
{
|
|
m_strContainerId.Transfer(ref.m_strContainerId);
|
|
m_pDeviceProvider.Swap(ref.m_pDeviceProvider);
|
|
}
|
|
|
|
void CProvider::Clear()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
HrDereferenceContainer(m_strContainerId);
|
|
m_strContainerId.Clear();
|
|
if(m_pDeviceProvider)
|
|
{
|
|
CProviderAsync * pAsync = new CProviderAsync;
|
|
if(pAsync)
|
|
{
|
|
hr = pAsync->HrInitStop(m_pDeviceProvider);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
hr = pAsync->HrStart(TRUE);
|
|
}
|
|
if(FAILED(hr))
|
|
{
|
|
delete pAsync;
|
|
}
|
|
}
|
|
}
|
|
m_pDeviceProvider.Release();
|
|
}
|
|
|