windows-nt/Source/XPSP1/NT/admin/pchealth/helpctr/shell/proxies/service.cpp
2020-09-26 16:20:57 +08:00

213 lines
5.3 KiB
C++

/******************************************************************************
Copyright (c) 2000 Microsoft Corporation
Module Name:
Service.cpp
Abstract:
This file contains the implementation of the client-side proxy for IPCHService.
Revision History:
Davide Massarenti (Dmassare) 07/17/2000
created
******************************************************************************/
#include "stdafx.h"
/////////////////////////////////////////////////////////////////////////////
CPCHProxy_IPCHService::CPCHProxy_IPCHService()
{
// CPCHSecurityHandle m_SecurityHandle;
m_parent = NULL; // CPCHHelpCenterExternal* m_parent;
//
// MPC::CComSafeAutoCriticalSection m_DirectLock;
// MPC::CComPtrThreadNeutral<IPCHService> m_Direct_Service;
m_fContentStoreTested = false; // bool m_fContentStoreTested;
//
m_Utility = NULL; // CPCHProxy_IPCHUtility* m_Utility;
}
CPCHProxy_IPCHService::~CPCHProxy_IPCHService()
{
Passivate();
}
////////////////////
HRESULT CPCHProxy_IPCHService::ConnectToParent( /*[in]*/ CPCHHelpCenterExternal* parent )
{
__HCP_FUNC_ENTRY( "CPCHProxy_IPCHService::ConnectToParent" );
HRESULT hr;
__MPC_PARAMCHECK_BEGIN(hr)
__MPC_PARAMCHECK_NOTNULL(parent);
__MPC_PARAMCHECK_END();
m_parent = parent;
m_SecurityHandle.Initialize( parent, (IPCHService*)this );
//
// If the service is already running, it will respond to CLSID_PCHServiceReal, so let's try to connect through it, but ignore failure.
//
{
CComPtr<IClassFactory> fact;
CComQIPtr<IPCHService> svc;
(void)::CoGetClassObject( CLSID_PCHService, CLSCTX_ALL, NULL, IID_IClassFactory, (void**)&fact );
if((svc = fact))
{
CComPtr<IPCHService> svcReal;
__MPC_EXIT_IF_METHOD_FAILS(hr, EnsureDirectConnection( svcReal, false ));
}
}
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}
void CPCHProxy_IPCHService::Passivate()
{
MPC::SmartLock<_ThreadModel> lock( this );
if(m_Utility)
{
m_Utility->Passivate();
MPC::Release2<IPCHUtility>( m_Utility );
}
m_Direct_Service.Release();
m_SecurityHandle.Passivate();
m_parent = NULL;
}
HRESULT CPCHProxy_IPCHService::EnsureDirectConnection( /*[out]*/ CComPtr<IPCHService>& svc, /*[in]*/ bool fRefresh )
{
__HCP_FUNC_ENTRY( "CPCHProxy_IPCHService::EnsureDirectConnection" );
HRESULT hr;
ProxySmartLock lock( &m_DirectLock );
if(fRefresh) m_Direct_Service.Release();
svc.Release(); __MPC_EXIT_IF_METHOD_FAILS(hr, m_Direct_Service.Access( &svc ));
if(!svc)
{
DEBUG_AppendPerf( DEBUG_PERF_PROXIES, "CPCHProxy_IPCHService::EnsureDirectConnection - IN" );
if(FAILED(hr = ::CoCreateInstance( CLSID_PCHService, NULL, CLSCTX_ALL, IID_IPCHService, (void**)&svc )))
{
MPC::RegKey rk;
rk.SetRoot ( HKEY_CLASSES_ROOT, KEY_ALL_ACCESS );
rk.Attach ( L"CLSID\\{00020420-0000-0000-C000-000000000046}\\InprocServer32" );
rk.del_Value( L"InprocServer32" );
__MPC_EXIT_IF_METHOD_FAILS(hr, ::CoCreateInstance( CLSID_PCHService, NULL, CLSCTX_ALL, IID_IPCHService, (void**)&svc ));
}
m_Direct_Service = svc;
DEBUG_AppendPerf( DEBUG_PERF_PROXIES, "CPCHProxy_IPCHService::EnsureDirectConnection - OUT" );
if(!svc)
{
__MPC_SET_ERROR_AND_EXIT(hr, E_HANDLE);
}
}
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}
HRESULT CPCHProxy_IPCHService::EnsureContentStore()
{
__HCP_FUNC_ENTRY( "CPCHProxy_IPCHService::EnsureContentStore" );
HRESULT hr;
ProxySmartLock lock( &m_DirectLock );
if(m_fContentStoreTested == false)
{
CComPtr<IPCHService> svc;
VARIANT_BOOL fTrusted;
lock = NULL;
__MPC_EXIT_IF_METHOD_FAILS(hr, EnsureDirectConnection( svc ));
lock = &m_DirectLock;
__MPC_EXIT_IF_METHOD_FAILS(hr, svc->IsTrusted( CComBSTR( L"hcp://system" ), &fTrusted ));
m_fContentStoreTested = true;
}
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}
HRESULT CPCHProxy_IPCHService::GetUtility( /*[out]*/ CPCHProxy_IPCHUtility* *pVal )
{
__HCP_FUNC_ENTRY( "CPCHProxy_IPCHService::GetUtility" );
HRESULT hr;
MPC::SmartLock<_ThreadModel> lock( this );
if(m_Utility == NULL)
{
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &m_Utility ));
__MPC_EXIT_IF_METHOD_FAILS(hr, m_Utility->ConnectToParent( this, m_SecurityHandle ));
}
hr = S_OK;
__HCP_FUNC_CLEANUP;
if(FAILED(hr)) MPC::Release2<IPCHUtility>( m_Utility );
(void)MPC::CopyTo2<IPCHUtility>( m_Utility, pVal );
__HCP_FUNC_EXIT(hr);
}
////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CPCHProxy_IPCHService::CreateScriptWrapper( /*[in]*/ REFCLSID rclsid ,
/*[in]*/ BSTR bstrCode ,
/*[in]*/ BSTR bstrURL ,
/*[out]*/ IUnknown* *ppObj )
{
__HCP_BEGIN_PROPERTY_GET("CPCHProxy_IPCHService::CreateScriptWrapper",hr,ppObj);
CComPtr<IPCHService> svc;
__MPC_EXIT_IF_METHOD_FAILS(hr, EnsureDirectConnection( svc ));
__MPC_EXIT_IF_METHOD_FAILS(hr, svc->CreateScriptWrapper( rclsid, bstrCode, bstrURL, ppObj ));
__HCP_END_PROPERTY(hr);
}