Leaked source code of windows server 2003
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

/******************************************************************************
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...
}