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.
380 lines
10 KiB
380 lines
10 KiB
/******************************************************************************
|
|
|
|
Copyright (c) 1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
Utility.cpp
|
|
|
|
Abstract:
|
|
This file contains the implementation of the class exposed as the "window.external" object.
|
|
|
|
Revision History:
|
|
Ghim-Sim Chua (gschua) 07/23/99
|
|
created
|
|
Davide Massarenti (dmassare) 07/25/99
|
|
modified
|
|
|
|
Kalyani Narlanka (KalyaniN) 03/15/01
|
|
Moved Incident and Encryption Objects from HelpService to HelpCtr to improve Perf.
|
|
|
|
******************************************************************************/
|
|
|
|
#include "stdafx.h"
|
|
|
|
#include "rdshost_i.c"
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
HRESULT CPCHUtility::FinalConstruct()
|
|
{
|
|
__HCP_FUNC_ENTRY( "CPCHUtility::FinalConstruct" );
|
|
|
|
HRESULT hr;
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &m_UserSettings ));
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
HRESULT CPCHUtility::InitUserSettings( /*[in]*/ Taxonomy::Settings& ts )
|
|
{
|
|
return m_UserSettings ? m_UserSettings->InitUserSettings( ts ) : E_FAIL;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
STDMETHODIMP CPCHUtility::get_UserSettings( /*[out, retval]*/ IPCHUserSettings* *pVal )
|
|
{
|
|
__HCP_BEGIN_PROPERTY_GET("CPCHUtility::get_UserSettings",hr,pVal);
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, m_UserSettings.QueryInterface( pVal ));
|
|
|
|
|
|
__HCP_END_PROPERTY(hr);
|
|
}
|
|
|
|
STDMETHODIMP CPCHUtility::get_Channels( /*[out, retval]*/ ISAFReg* *pVal )
|
|
{
|
|
__HCP_BEGIN_PROPERTY_GET("CPCHUtility::get_Channels",hr,pVal);
|
|
|
|
CComPtr<CSAFRegDummy> obj;
|
|
Taxonomy::Settings ts;
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, InitUserSettings( ts ));
|
|
|
|
|
|
//
|
|
// Get the channels registry, but make a read-only copy.
|
|
//
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, CSAFReg::s_GLOBAL->CreateReadOnlyCopy( ts, &obj ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, obj.QueryInterface( pVal ));
|
|
|
|
|
|
__HCP_END_PROPERTY(hr);
|
|
}
|
|
|
|
STDMETHODIMP CPCHUtility::get_Security( /*[out, retval]*/ IPCHSecurity* *pVal )
|
|
{
|
|
__HCP_BEGIN_PROPERTY_GET("CPCHUtility::get_Security",hr,pVal);
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, CPCHSecurity::s_GLOBAL->QueryInterface( IID_IPCHSecurity, (void**)pVal ));
|
|
|
|
|
|
__HCP_END_PROPERTY(hr);
|
|
}
|
|
|
|
STDMETHODIMP CPCHUtility::get_Database( /*[out, retval]*/ IPCHTaxonomyDatabase* *pVal )
|
|
{
|
|
__HCP_FUNC_ENTRY( "CPCHUtility::get_Database" );
|
|
|
|
HRESULT hr;
|
|
CComPtr<CPCHTaxonomyDatabase> pObj;
|
|
|
|
__MPC_PARAMCHECK_BEGIN(hr)
|
|
__MPC_PARAMCHECK_POINTER_AND_SET(pVal,NULL);
|
|
__MPC_PARAMCHECK_END();
|
|
|
|
|
|
//
|
|
// Create a new collection and fill it from the database.
|
|
//
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &pObj ));
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, InitUserSettings( pObj->GetTS() ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pObj.QueryInterface( pVal ));
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
STDMETHODIMP CPCHUtility::FormatError( /*[in]*/ VARIANT vError, /*[out, retval]*/ BSTR *pVal )
|
|
{
|
|
__HCP_FUNC_ENTRY( "CPCHUtility::CreateObject_DataCollection" );
|
|
|
|
HRESULT hr;
|
|
HRESULT hrIn;
|
|
LPWSTR lpMsgBuf = NULL;
|
|
|
|
__MPC_PARAMCHECK_BEGIN(hr)
|
|
__MPC_PARAMCHECK_POINTER_AND_SET(pVal,NULL);
|
|
__MPC_PARAMCHECK_END();
|
|
|
|
|
|
if(vError.vt == VT_ERROR)
|
|
{
|
|
hrIn = vError.scode;
|
|
}
|
|
else if(vError.vt == VT_I4)
|
|
{
|
|
hrIn = vError.lVal;
|
|
}
|
|
else
|
|
{
|
|
CComVariant v;
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, v.ChangeType( VT_I4, &vError ));
|
|
|
|
hrIn = v.lVal;
|
|
}
|
|
|
|
if(HRESULT_FACILITY(hrIn) == FACILITY_WIN32)
|
|
{
|
|
if(::FormatMessageW( FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
|
FORMAT_MESSAGE_FROM_SYSTEM |
|
|
FORMAT_MESSAGE_IGNORE_INSERTS,
|
|
NULL,
|
|
hrIn,
|
|
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
|
|
(LPWSTR)&lpMsgBuf,
|
|
0,
|
|
NULL ))
|
|
{
|
|
__MPC_EXIT_IF_ALLOC_FAILS(hr,*pVal,::SysAllocString( lpMsgBuf ));
|
|
|
|
__MPC_SET_ERROR_AND_EXIT(hr, S_OK);
|
|
}
|
|
}
|
|
|
|
//
|
|
// Unknown error....
|
|
//
|
|
{
|
|
WCHAR rgFmt[128];
|
|
WCHAR rgBuf[512];
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::LocalizeString( IDS_HELPSVC_UNKNOWNERROR, rgFmt, MAXSTRLEN(rgFmt), /*fMUI*/true ));
|
|
|
|
_snwprintf( rgBuf, MAXSTRLEN(rgBuf), rgFmt, hrIn );
|
|
|
|
__MPC_EXIT_IF_ALLOC_FAILS(hr,*pVal,::SysAllocString( rgBuf ));
|
|
}
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
if(lpMsgBuf) ::LocalFree( lpMsgBuf );
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
|
|
STDMETHODIMP CPCHUtility::CreateObject_SearchEngineMgr( /*[out , retval]*/ IPCHSEManager* *ppSE )
|
|
{
|
|
__HCP_FUNC_ENTRY( "CPCHUtility::CreateObject_SearchEngineMgr" );
|
|
|
|
HRESULT hr;
|
|
SearchEngine::Manager_Object* semgr = NULL;
|
|
Taxonomy::Settings ts;
|
|
|
|
|
|
//
|
|
// Create a new data collection.
|
|
//
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, semgr->CreateInstance( &semgr )); semgr->AddRef();
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, InitUserSettings ( ts ));
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, semgr->InitializeFromDatabase( ts ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, semgr->QueryInterface( IID_IPCHSEManager, (void**)ppSE ));
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
MPC::Release( semgr );
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
STDMETHODIMP CPCHUtility::CreateObject_DataCollection( /*[out, retval]*/ ISAFDataCollection* *ppDC )
|
|
{
|
|
__HCP_FUNC_ENTRY( "CPCHUtility::CreateObject_DataCollection" );
|
|
|
|
HRESULT hr;
|
|
CComPtr<CSAFDataCollection> pchdc;
|
|
|
|
|
|
//
|
|
// Create a new data collection.
|
|
//
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &pchdc ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pchdc.QueryInterface( ppDC ));
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
STDMETHODIMP CPCHUtility::CreateObject_Cabinet( /*[out , retval]*/ ISAFCabinet* *ppCB )
|
|
{
|
|
__HCP_FUNC_ENTRY( "CPCHUtility::CreateObject_Cabinet" );
|
|
|
|
HRESULT hr;
|
|
CComPtr<CSAFCabinet> cabinet;
|
|
|
|
|
|
//
|
|
// Create a new data collection.
|
|
//
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &cabinet ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, cabinet.QueryInterface( ppCB ));
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
STDMETHODIMP CPCHUtility::CreateObject_Encryption( /*[out, retval]*/ ISAFEncrypt* *ppEn )
|
|
{
|
|
__HCP_BEGIN_PROPERTY_GET("CPCHUtility::CreateObject_Encryption",hr,ppEn);
|
|
|
|
CComPtr<CSAFEncrypt> pEn;
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &pEn ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, pEn.QueryInterface( ppEn ));
|
|
|
|
__HCP_END_PROPERTY(hr);
|
|
}
|
|
|
|
STDMETHODIMP CPCHUtility::CreateObject_Channel( /*[in] */ BSTR bstrVendorID ,
|
|
/*[in] */ BSTR bstrProductID ,
|
|
/*[out, retval]*/ ISAFChannel* *ppCh )
|
|
{
|
|
__HCP_FUNC_ENTRY( "CPCHUtility::CreateObject_Channel" );
|
|
|
|
HRESULT hr;
|
|
CSAFChannel_Object* safchan = NULL;
|
|
Taxonomy::Settings ts;
|
|
CSAFChannelRecord cr;
|
|
bool fFound;
|
|
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, InitUserSettings( ts ));
|
|
|
|
cr.m_ths = ts;
|
|
cr.m_bstrVendorID = bstrVendorID;
|
|
cr.m_bstrProductID = bstrProductID;
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, CSAFReg::s_GLOBAL->Synchronize( cr, fFound ));
|
|
if(!fFound)
|
|
{
|
|
__MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_FILE_NOT_FOUND);
|
|
}
|
|
|
|
//
|
|
// Locate a channel.
|
|
//
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, safchan->CreateInstance( &safchan )); safchan->AddRef();
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, safchan->Init( cr ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, safchan->QueryInterface( IID_ISAFChannel, (void**)ppCh ));
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
MPC::Release( safchan );
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
|
|
STDMETHODIMP CPCHUtility::CreateObject_RemoteDesktopConnection( /*[out, retval]*/ ISAFRemoteDesktopConnection* *ppRDC )
|
|
{
|
|
__HCP_FUNC_ENTRY( "CPCHUtility::CreateObject_RemoteDesktopConnection" );
|
|
|
|
HRESULT hr;
|
|
CComPtr<CSAFRemoteDesktopConnection> rdc;
|
|
|
|
//
|
|
// Create a new RemoteDesktopConnection Object..
|
|
//
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &rdc ));
|
|
|
|
__MPC_EXIT_IF_METHOD_FAILS(hr, rdc.QueryInterface( ppRDC ));
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
__HCP_FUNC_CLEANUP;
|
|
|
|
__HCP_FUNC_EXIT(hr);
|
|
}
|
|
|
|
STDMETHODIMP CPCHUtility::CreateObject_RemoteDesktopSession( /*[in] */ REMOTE_DESKTOP_SHARING_CLASS sharingClass ,
|
|
/*[in] */ long lTimeout ,
|
|
/*[in] */ BSTR bstrConnectionParms ,
|
|
/*[in] */ BSTR bstrUserHelpBlob ,
|
|
/*[out, retval]*/ ISAFRemoteDesktopSession* *ppRCS )
|
|
{
|
|
return E_NOTIMPL; // Implementation moved to the PCHSVC broker...
|
|
}
|
|
|
|
STDMETHODIMP CPCHUtility::ConnectToExpert(/* [in] */ BSTR bstrExpertConnectParm,
|
|
/* [in] */ LONG lTimeout,
|
|
/* [retval][out] */ LONG *lSafErrorCode)
|
|
|
|
{
|
|
return E_NOTIMPL; // Implementation moved to the PCHSVC broker...
|
|
|
|
}
|
|
|
|
STDMETHODIMP CPCHUtility::SwitchDesktopMode(/* [in]*/ int nMode,
|
|
/* [in]*/ int nRAType)
|
|
|
|
{
|
|
return E_NOTIMPL; // Implementation moved to the PCHSVC broker...
|
|
|
|
}
|