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.
1709 lines
39 KiB
1709 lines
39 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1997-1998
|
|
//
|
|
// File: MacAdmin.cxx
|
|
//
|
|
// Contents: Index Server Administration Interface methods
|
|
//
|
|
// Classes: CMachineAdm
|
|
//
|
|
// History: 12-10-97 mohamedn created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include "pch.cxx"
|
|
#pragma hdrstop
|
|
|
|
#include "stdafx.h"
|
|
#include <mshtml.h>
|
|
|
|
DECLARE_INFOLEVEL( odm );
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMachineAdm::InterfaceSupportsErrorInfo, public
|
|
//
|
|
// Arguments: [riid] -- interface iid
|
|
//
|
|
// Returns: S_OK if interface supports IErrorInfo
|
|
//
|
|
// History: 12-10-97 mohamedn created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CMachineAdm::InterfaceSupportsErrorInfo(REFIID riid)
|
|
{
|
|
return ( riid == IID_IAdminIndexServer );
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMachineAdm::SetErrorInfo, public
|
|
//
|
|
// Synopsis: Creates & sets the error object
|
|
//
|
|
// Arguments: [hRes] -- HRESULT error code to set
|
|
// [ pwszDesc] -- error description
|
|
//
|
|
// Returns: S_OK upon success, other values upon failure
|
|
//
|
|
// History: 12-10-97 mohamedn created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
void CMachineAdm::SetErrorInfo( HRESULT hRes )
|
|
{
|
|
CiodmError err(hRes);
|
|
|
|
AtlSetErrorInfo(CLSID_AdminIndexServer, err.GetErrorMessage() , 0 , 0, IID_IAdminIndexServer, hRes, 0 );
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMachineAdm::CMachineAdm, public
|
|
//
|
|
// Synopsis: Constructor
|
|
//
|
|
// History: 12-10-97 mohamedn created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
CMachineAdm::CMachineAdm()
|
|
:_eCurrentState(CIODM_NOT_INITIALIZED),
|
|
_cMinRefCountToDestroy(1),
|
|
_cEnumIndex(0)
|
|
{
|
|
wcscpy(_wcsMachineName,L"."); // default to local machine
|
|
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMachineAdm::InternalAddRef, public
|
|
//
|
|
// Synopsis: overrides CComObjectRootEx<Base>::InternalAddRef, for debugging only.
|
|
//
|
|
// Arguments: none
|
|
//
|
|
// History: 12-10-97 mohamedn created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
ULONG CMachineAdm::InternalAddRef()
|
|
{
|
|
unsigned cRef = CComObjectRootEx<CComMultiThreadModel>::InternalAddRef();
|
|
|
|
odmDebugOut(( DEB_TRACE,"CMachineAdm AddRef returned: %d\n", cRef ));
|
|
|
|
odmDebugOut(( DEB_TRACE,"=========================== CMachineAdm object count: %d\n",
|
|
_cMinRefCountToDestroy ));
|
|
|
|
return cRef;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMachineAdm::InternalRelease, public
|
|
//
|
|
// Synopsis: overrides CComObjectRootEx<Base>::InternalRelease, for debugging only.
|
|
//
|
|
// Arguments: none
|
|
//
|
|
// History: 12-10-97 mohamedn created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
ULONG CMachineAdm::InternalRelease()
|
|
{
|
|
CLock lock(_mtx);
|
|
|
|
//
|
|
// Delete contained objects if we're being destoryed.
|
|
// m_dwRef is an internal ATL public refcount member.
|
|
//
|
|
|
|
if ( _eCurrentState != CIODM_DESTROY && m_dwRef == _cMinRefCountToDestroy )
|
|
{
|
|
_eCurrentState = CIODM_DESTROY;
|
|
|
|
_aICatAdmin.Free();
|
|
}
|
|
|
|
unsigned cRef = CComObjectRootEx<CComMultiThreadModel>::InternalRelease();
|
|
|
|
odmDebugOut(( DEB_TRACE,"CMachineAdm Release returned: %d\n", cRef ));
|
|
|
|
odmDebugOut(( DEB_TRACE,"=========================== CMachineAdm object count: %d\n",
|
|
_cMinRefCountToDestroy ));
|
|
|
|
return cRef;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMachineAdm::Initialize, public
|
|
//
|
|
// Synopsis: Initializes CMachineAdm object, creates CMachineAdmin object,
|
|
// populates catalogs lists.
|
|
//
|
|
// Arguments: none.
|
|
//
|
|
// History: 12-10-97 mohamedn created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
void CMachineAdm::Initialize()
|
|
{
|
|
//
|
|
// create CMachineAdmin object
|
|
//
|
|
|
|
if ( IsCurrentObjectValid() )
|
|
{
|
|
return;
|
|
}
|
|
|
|
TRY
|
|
{
|
|
_xMachineAdmin.Set (new CMachineAdmin( _wcsMachineName ) );
|
|
|
|
XPtr<CCatalogEnum> xCatEnum( _xMachineAdmin->QueryCatalogEnum() );
|
|
|
|
Win4Assert( 0 == _aICatAdmin.Count() );
|
|
|
|
while ( xCatEnum->Next() )
|
|
{
|
|
XPtr<CCatalogAdmin> xCatAdmin(xCatEnum->QueryCatalogAdmin());
|
|
|
|
XInterface<CatAdmObject> xICatAdm;
|
|
|
|
GetCatalogAutomationObject( xCatAdmin, xICatAdm );
|
|
|
|
_aICatAdmin.Add( xICatAdm.GetPointer(), _aICatAdmin.Count() );
|
|
|
|
xICatAdm.Acquire();
|
|
}
|
|
|
|
_eCurrentState = CIODM_INITIALIZED;
|
|
}
|
|
CATCH ( CException, e )
|
|
{
|
|
_xMachineAdmin.Free();
|
|
|
|
_cEnumIndex = 0;
|
|
|
|
wcscpy(_wcsMachineName,L".");
|
|
|
|
_aICatAdmin.Free();
|
|
|
|
_eCurrentState = CIODM_NOT_INITIALIZED;
|
|
|
|
RETHROW();
|
|
}
|
|
END_CATCH
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMachineAdm::GetCatalogAutomationObject, public
|
|
//
|
|
// Synopsis: Wraps a CCatalogAdmin pointer in an IDispatch interface.
|
|
//
|
|
// Arguments: [xCatAdmin] -- Catalog admin object
|
|
// [xICatAdm] -- XInterface to contain created CatAdmObject
|
|
//
|
|
// Returns: none, throws upon error.
|
|
//
|
|
// History: 12-10-97 mohamedn created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
void CMachineAdm::GetCatalogAutomationObject( XPtr<CCatalogAdmin> & xCatAdmin,
|
|
XInterface<CatAdmObject> & xICatAdm )
|
|
{
|
|
Win4Assert( !xCatAdmin.IsNull() );
|
|
|
|
SCODE sc = CatAdmObject::CreateInstance( xICatAdm.GetPPointer() );
|
|
|
|
if ( FAILED(sc) )
|
|
{
|
|
odmDebugOut(( DEB_ERROR, "CatAdmObject::CreateInstance() Failed: %x\n", sc ));
|
|
|
|
THROW(CException(sc));
|
|
}
|
|
else
|
|
{
|
|
Win4Assert( !xICatAdm.IsNull() );
|
|
|
|
xICatAdm->SetParent( (CComObject<CMachineAdm> *)this );
|
|
|
|
xICatAdm->AddRef();
|
|
|
|
IncObjectCount(); // inc. internal object count
|
|
}
|
|
|
|
//
|
|
// Initialize the new object
|
|
//
|
|
|
|
xICatAdm->Initialize( xCatAdmin );
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMachineAdm::GetIDisp, public
|
|
//
|
|
// Synopsis: QI for IDispatch on CCatAdm object given by the passed in index.
|
|
//
|
|
// Arguments: [cPosition] -- index of CCatAdm object
|
|
//
|
|
// Returns: [IDispatch *] -- pointer to IDispatch on CCatAdm, throws upon failure.
|
|
//
|
|
// History: 12-10-97 mohamedn created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
IDispatch * CMachineAdm::GetIDisp( unsigned i )
|
|
{
|
|
IDispatch * pTmpIDisp = 0;
|
|
|
|
SCODE sc = _aICatAdmin[i]->QueryInterface(IID_IDispatch, (void **) &pTmpIDisp);
|
|
|
|
if ( FAILED(sc) )
|
|
{
|
|
odmDebugOut(( DEB_ERROR, "QueryInterface() Failed: %x\n", sc ));
|
|
|
|
THROW(CException(sc));
|
|
}
|
|
|
|
Win4Assert( pTmpIDisp );
|
|
|
|
return pTmpIDisp;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMachineAdm::get_MachineName, public
|
|
//
|
|
// Synopsis: Gets MachineName property
|
|
//
|
|
// Arguments: [pVal] pointer to bstr buffer return value
|
|
//
|
|
// Returns: S_OK on success, other values on failure.
|
|
//
|
|
// History: 12-10-97 mohamedn created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CMachineAdm::get_MachineName(BSTR * pVal)
|
|
{
|
|
SCODE sc = S_OK;
|
|
|
|
CLock lock(_mtx);
|
|
|
|
TRANSLATE_EXCEPTIONS;
|
|
|
|
TRY
|
|
{
|
|
SafeForScripting();
|
|
|
|
Initialize();
|
|
|
|
*pVal = SysAllocString(_wcsMachineName);
|
|
|
|
if ( 0 == *pVal )
|
|
{
|
|
sc = E_OUTOFMEMORY;
|
|
}
|
|
}
|
|
CATCH ( CException,e )
|
|
{
|
|
sc = e.GetErrorCode();
|
|
}
|
|
END_CATCH
|
|
|
|
UNTRANSLATE_EXCEPTIONS;
|
|
|
|
if ( FAILED(sc) )
|
|
{
|
|
odmDebugOut(( DEB_ERROR, "CMachineAdm::get_MachineName exception: %x\n",sc ));
|
|
|
|
SetErrorInfo( sc );
|
|
}
|
|
|
|
return sc;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMachineAdm::put_MachineName, public
|
|
//
|
|
// Synopsis: Gets MachineName property
|
|
//
|
|
// Arguments: [newVal] -- machine name to set.
|
|
//
|
|
// Returns: S_OK on success, other values on failure.
|
|
//
|
|
// History: 12-10-97 mohamedn created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CMachineAdm::put_MachineName(BSTR newVal)
|
|
{
|
|
SCODE sc = S_OK;
|
|
|
|
CLock lock(_mtx);
|
|
|
|
TRANSLATE_EXCEPTIONS;
|
|
|
|
TRY
|
|
{
|
|
|
|
SafeForScripting();
|
|
|
|
ValidateInputParam(newVal);
|
|
|
|
if ( IsCurrentObjectValid() )
|
|
{
|
|
odmDebugOut(( DEB_ERROR,"CMachineAdm(%ws) already initialized", newVal));
|
|
|
|
sc = HRESULT_FROM_WIN32(ERROR_ALREADY_INITIALIZED);
|
|
}
|
|
else if ( SysStringLen( newVal ) >= MAX_PATH )
|
|
{
|
|
odmDebugOut(( DEB_ERROR,"CMachineAdm(%ws): Path too long", newVal));
|
|
|
|
sc = E_INVALIDARG;
|
|
}
|
|
else
|
|
{
|
|
Win4Assert( L'.' == _wcsMachineName[0] && L'' == _wcsMachineName[1] );
|
|
|
|
if ( newVal[0] == L'' )
|
|
{
|
|
wcscpy( _wcsMachineName, L"." );
|
|
}
|
|
else
|
|
{
|
|
wcscpy( _wcsMachineName, newVal );
|
|
}
|
|
|
|
Initialize();
|
|
}
|
|
}
|
|
CATCH ( CException,e )
|
|
{
|
|
sc = e.GetErrorCode();
|
|
}
|
|
END_CATCH
|
|
|
|
UNTRANSLATE_EXCEPTIONS;
|
|
|
|
if ( FAILED(sc) )
|
|
{
|
|
odmDebugOut(( DEB_ERROR,"put_MachineName Failed: %x\n", sc));
|
|
|
|
SetErrorInfo( sc );
|
|
}
|
|
|
|
return sc;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMachineAdm::AddCatalog, public
|
|
//
|
|
// Synopsis: Adds a catalog.
|
|
//
|
|
// Arguments: [bstrCatName] - in param, catalog name
|
|
// [bstrCatLocation] - in param, catalog location
|
|
// [pIDisp] - out param, IDisp interface to the new catalog
|
|
//
|
|
// Returns: S_OK upon success, other values upon failure.
|
|
//
|
|
// History: 12-10-97 mohamedn created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CMachineAdm::AddCatalog(BSTR bstrCatName, BSTR bstrCatLocation, IDispatch * * pIDisp)
|
|
{
|
|
|
|
SCODE sc = S_OK;
|
|
|
|
CLock lock(_mtx);
|
|
|
|
TRANSLATE_EXCEPTIONS;
|
|
|
|
TRY
|
|
{
|
|
|
|
SafeForScripting();
|
|
|
|
ValidateInputParam(bstrCatName);
|
|
|
|
ValidateInputParam(bstrCatLocation);
|
|
|
|
Initialize();
|
|
|
|
if ( CatalogExists( bstrCatName, bstrCatLocation ) )
|
|
{
|
|
sc = HRESULT_FROM_WIN32( ERROR_ALREADY_EXISTS );
|
|
}
|
|
else
|
|
{
|
|
_xMachineAdmin->AddCatalog( bstrCatName, bstrCatLocation );
|
|
|
|
XPtr<CCatalogAdmin> xCatAdmin( _xMachineAdmin->QueryCatalogAdmin( bstrCatName ) );
|
|
|
|
unsigned cPosition = _aICatAdmin.Count();
|
|
|
|
XInterface<CatAdmObject> xICatAdm;
|
|
|
|
GetCatalogAutomationObject( xCatAdmin, xICatAdm );
|
|
|
|
_aICatAdmin.Add( xICatAdm.GetPointer(), cPosition );
|
|
|
|
xICatAdm.Acquire();
|
|
|
|
*pIDisp = GetIDisp(cPosition);
|
|
}
|
|
}
|
|
CATCH( CException, e )
|
|
{
|
|
sc = e.GetErrorCode();
|
|
}
|
|
END_CATCH
|
|
|
|
UNTRANSLATE_EXCEPTIONS;
|
|
|
|
if ( FAILED (sc) )
|
|
{
|
|
odmDebugOut(( DEB_ERROR, "AddCatalog Failed: %x\n", sc ));
|
|
|
|
SetErrorInfo( sc );
|
|
}
|
|
|
|
return sc;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// member: CMachineAdm::CatalogExists, public
|
|
//
|
|
// Synopsis: determines if a catalog name or location is used up.
|
|
//
|
|
// Arguments: [pCatName] -- Catalog name
|
|
// [pCatLocation] -- Catalog location.
|
|
//
|
|
// Returns: TRUE if catalog already exists, false otherwise.
|
|
//
|
|
// History: 12-10-97 mohamedn created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
BOOL CMachineAdm::CatalogExists( WCHAR const * pCatName, WCHAR const * pCatLocation )
|
|
{
|
|
|
|
Win4Assert( pCatName );
|
|
Win4Assert( pCatLocation);
|
|
|
|
unsigned cMaxCatalogs = _aICatAdmin.Count();
|
|
|
|
for ( DWORD i = 0; i < cMaxCatalogs; i++ )
|
|
{
|
|
Win4Assert( _aICatAdmin[i] );
|
|
|
|
CCatalogAdmin * pCatalogAdmin = _aICatAdmin[i]->GetCatalogAdmin();
|
|
|
|
Win4Assert( pCatalogAdmin );
|
|
|
|
if ( !_wcsicmp( pCatName, pCatalogAdmin->GetName() ) ||
|
|
!_wcsicmp( pCatLocation, pCatalogAdmin->GetLocation() ) )
|
|
{
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMachineAdm::RemoveCatalog, public
|
|
//
|
|
// Synopsis: deletes a catalog, and optionally the corresponding directory
|
|
//
|
|
// Arguments: [bstrCatName] - Catalog Name
|
|
// [fDelDirectory] - TRUE --> delete catalog directory.
|
|
//
|
|
// Returns: S_OK upon success, other values upon failure.
|
|
//
|
|
// History: 12-10-97 mohamedn created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CMachineAdm::RemoveCatalog(BSTR bstrCatName, VARIANT_BOOL fDelDirectory)
|
|
{
|
|
SCODE sc = S_OK;
|
|
|
|
CLock lock(_mtx);
|
|
|
|
TRANSLATE_EXCEPTIONS;
|
|
|
|
TRY
|
|
{
|
|
SafeForScripting();
|
|
|
|
ValidateInputParam(bstrCatName);
|
|
|
|
Initialize();
|
|
|
|
if (_xMachineAdmin->IsCIStarted())
|
|
sc = CI_E_INVALID_STATE;
|
|
else
|
|
{
|
|
unsigned cMax = _aICatAdmin.Count();
|
|
|
|
for ( DWORD i = 0; i < cMax ; i++ )
|
|
{
|
|
Win4Assert( _aICatAdmin[i] );
|
|
|
|
CCatalogAdmin * pCatalogAdmin = _aICatAdmin[i]->GetCatalogAdmin();
|
|
|
|
Win4Assert( pCatalogAdmin );
|
|
|
|
if ( !_wcsicmp( bstrCatName, pCatalogAdmin->GetName() ) )
|
|
{
|
|
//
|
|
// Remove from CI
|
|
//
|
|
|
|
_xMachineAdmin->RemoveCatalog( bstrCatName, fDelDirectory );
|
|
|
|
//
|
|
// Remove catalog from local list, set catalog object to invalid,
|
|
// and release removed catalog
|
|
//
|
|
|
|
CatAdmObject * pICatAdm = _aICatAdmin.AcquireAndShrink(i);
|
|
|
|
pICatAdm->SetInvalid();
|
|
|
|
pICatAdm->Release();
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( i == cMax )
|
|
{
|
|
odmDebugOut(( DEB_ERROR, "RemoveCatalog Failed, Catalog(%ws) not found\n", bstrCatName ));
|
|
|
|
sc = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
|
|
}
|
|
}
|
|
}
|
|
CATCH( CException, e )
|
|
{
|
|
sc = e.GetErrorCode();
|
|
}
|
|
END_CATCH
|
|
|
|
UNTRANSLATE_EXCEPTIONS;
|
|
|
|
if ( FAILED (sc) )
|
|
{
|
|
odmDebugOut(( DEB_ERROR, "RemoveCatalog Failed: %x\n", sc ));
|
|
|
|
SetErrorInfo( sc );
|
|
}
|
|
|
|
return sc;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMachineAdm::GetCatalogByName, public
|
|
//
|
|
// Arguments: [bstrCatalogName] -- Catalog name to search for.
|
|
// [pIDisp] -- IDisp interface to the found catalog
|
|
//
|
|
// Returns: S_OK upon success, other values upon failure.
|
|
//
|
|
// History: 12-10-97 mohamedn created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CMachineAdm::GetCatalogByName(BSTR bstrCatalogName, IDispatch * * pIDisp)
|
|
{
|
|
|
|
SCODE sc = S_OK;
|
|
|
|
CLock lock(_mtx);
|
|
|
|
TRANSLATE_EXCEPTIONS;
|
|
|
|
TRY
|
|
{
|
|
SafeForScripting();
|
|
|
|
ValidateInputParam(bstrCatalogName);
|
|
|
|
Initialize();
|
|
|
|
unsigned cMaxCatalogs = _aICatAdmin.Count();
|
|
|
|
for ( DWORD i = 0; i < cMaxCatalogs; i++ )
|
|
{
|
|
Win4Assert( _aICatAdmin[i] );
|
|
|
|
CCatalogAdmin * pCatalogAdmin = _aICatAdmin[i]->GetCatalogAdmin();
|
|
|
|
Win4Assert( pCatalogAdmin );
|
|
|
|
if ( !_wcsicmp( bstrCatalogName, pCatalogAdmin->GetName() ) )
|
|
{
|
|
*pIDisp = GetIDisp(i);
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( i == cMaxCatalogs )
|
|
{
|
|
odmDebugOut(( DEB_ERROR, "Catalog(%ws) not found\n", bstrCatalogName ));
|
|
|
|
sc = HRESULT_FROM_WIN32( ERROR_NOT_FOUND );
|
|
}
|
|
}
|
|
CATCH ( CException,e )
|
|
{
|
|
sc = e.GetErrorCode();
|
|
}
|
|
END_CATCH
|
|
|
|
UNTRANSLATE_EXCEPTIONS;
|
|
|
|
if ( FAILED(sc) )
|
|
{
|
|
odmDebugOut(( DEB_ERROR, "GetCatalogByName Failed: %x\n", sc ));
|
|
|
|
SetErrorInfo( sc );
|
|
}
|
|
|
|
return sc;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMachineAdm::FindFirstCatalog, public
|
|
//
|
|
// Synopsis: Catalog enumerator. Resets scan to start of list.
|
|
//
|
|
// Arguments: [pfFound] -- out param, True --> Found at least one catalog
|
|
//
|
|
// Returns: SO_OK upon success, other values upon faillure
|
|
//
|
|
// History: 12-10-97 mohamedn created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CMachineAdm::FindFirstCatalog(VARIANT_BOOL * pfFound)
|
|
{
|
|
SCODE sc = S_OK;
|
|
|
|
CLock lock(_mtx);
|
|
|
|
TRANSLATE_EXCEPTIONS;
|
|
|
|
TRY
|
|
{
|
|
SafeForScripting();
|
|
|
|
Initialize();
|
|
|
|
_cEnumIndex = 0;
|
|
|
|
if ( _aICatAdmin.Count() > 0 )
|
|
{
|
|
Win4Assert( _aICatAdmin[_cEnumIndex] );
|
|
|
|
*pfFound = VARIANT_TRUE;
|
|
}
|
|
else
|
|
{
|
|
*pfFound = VARIANT_FALSE;
|
|
}
|
|
}
|
|
CATCH( CException, e )
|
|
{
|
|
sc = e.GetErrorCode();
|
|
}
|
|
END_CATCH
|
|
|
|
UNTRANSLATE_EXCEPTIONS;
|
|
|
|
if ( FAILED(sc) )
|
|
{
|
|
odmDebugOut(( DEB_ERROR, "FindFirstCatalog Failed: %x\n", sc ));
|
|
|
|
SetErrorInfo( sc );
|
|
}
|
|
|
|
return sc;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMachineAdm::FindNextCatalog, public
|
|
//
|
|
// Synopsis: Catalog enumerator. Scans for next catalog in the list
|
|
//
|
|
// Arguments: [pfFound] -- out param, True --> Found next catalog
|
|
//
|
|
// Returns: SO_OK upon success, other values upon faillure
|
|
//
|
|
// History: 12-10-97 mohamedn created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CMachineAdm::FindNextCatalog(VARIANT_BOOL * pfFound)
|
|
{
|
|
SCODE sc = S_OK;
|
|
|
|
CLock lock(_mtx);
|
|
|
|
TRANSLATE_EXCEPTIONS;
|
|
|
|
TRY
|
|
{
|
|
SafeForScripting();
|
|
|
|
if ( !IsCurrentObjectValid() )
|
|
{
|
|
odmDebugOut(( DEB_ERROR,"CMachineAdm not initialized" ));
|
|
|
|
sc = HRESULT_FROM_WIN32(ERROR_INVALID_STATE);
|
|
}
|
|
else
|
|
{
|
|
|
|
_cEnumIndex++;
|
|
|
|
if ( _cEnumIndex < _aICatAdmin.Count() )
|
|
{
|
|
Win4Assert( _aICatAdmin[_cEnumIndex] );
|
|
|
|
*pfFound = VARIANT_TRUE;
|
|
}
|
|
else
|
|
{
|
|
*pfFound = VARIANT_FALSE;
|
|
}
|
|
}
|
|
}
|
|
CATCH( CException, e )
|
|
{
|
|
sc = e.GetErrorCode();
|
|
|
|
}
|
|
END_CATCH
|
|
|
|
UNTRANSLATE_EXCEPTIONS;
|
|
|
|
if ( FAILED(sc) )
|
|
{
|
|
odmDebugOut(( DEB_ERROR, "FindNextCatalog Failed: %x\n", sc ));
|
|
|
|
SetErrorInfo( sc );
|
|
}
|
|
|
|
return sc;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMachineAdm::GetCatalog, public
|
|
//
|
|
// Synopsis: Catalog enumerator. Returns IDispatch to current catalog
|
|
//
|
|
// Arguments: [pIDisp] -- out param, IDispatch to current catalog
|
|
//
|
|
// Returns: SO_OK upon success, other values upon faillure
|
|
//
|
|
// History: 12-10-97 mohamedn created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CMachineAdm::GetCatalog(IDispatch * * pIDisp)
|
|
{
|
|
SCODE sc = S_OK;
|
|
|
|
CLock lock(_mtx);
|
|
|
|
TRANSLATE_EXCEPTIONS;
|
|
|
|
TRY
|
|
{
|
|
SafeForScripting();
|
|
|
|
if ( !IsCurrentObjectValid() )
|
|
{
|
|
odmDebugOut(( DEB_ERROR,"CMachineAdm not initialized" ));
|
|
|
|
sc = HRESULT_FROM_WIN32(ERROR_INVALID_STATE);
|
|
}
|
|
else
|
|
{
|
|
|
|
if ( _cEnumIndex >= _aICatAdmin.Count() )
|
|
{
|
|
odmDebugOut(( DEB_ERROR, "No More Catalogs, Index: %d\n", _cEnumIndex ));
|
|
|
|
sc = HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS);
|
|
}
|
|
else
|
|
{
|
|
|
|
Win4Assert( _aICatAdmin[_cEnumIndex] );
|
|
|
|
*pIDisp = GetIDisp(_cEnumIndex);
|
|
}
|
|
}
|
|
}
|
|
CATCH( CException, e )
|
|
{
|
|
sc = e.GetErrorCode();
|
|
}
|
|
END_CATCH
|
|
|
|
UNTRANSLATE_EXCEPTIONS;
|
|
|
|
if ( FAILED(sc) )
|
|
{
|
|
odmDebugOut(( DEB_ERROR, "GetCatalog Failed: %x\n", sc ));
|
|
|
|
SetErrorInfo( sc );
|
|
}
|
|
|
|
return sc;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMachineAdm::Start, public
|
|
//
|
|
// Synopsis: Starts cisvc service
|
|
//
|
|
// Returns: S_OK upon success, othervalues upon failure
|
|
//
|
|
// History: 12-10-97 mohamedn created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CMachineAdm::Start()
|
|
{
|
|
SCODE sc = S_OK;
|
|
|
|
CLock lock(_mtx);
|
|
|
|
TRANSLATE_EXCEPTIONS;
|
|
|
|
TRY
|
|
{
|
|
SafeForScripting();
|
|
|
|
Initialize();
|
|
|
|
_xMachineAdmin->StartCI();
|
|
|
|
}
|
|
CATCH( CException, e )
|
|
{
|
|
sc = e.GetErrorCode();
|
|
}
|
|
END_CATCH
|
|
|
|
UNTRANSLATE_EXCEPTIONS;
|
|
|
|
if ( FAILED(sc) )
|
|
{
|
|
odmDebugOut(( DEB_ERROR, "Start cisvc Failed: %x\n", sc ));
|
|
|
|
SetErrorInfo( sc );
|
|
}
|
|
|
|
return sc;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMachineAdm::Stop, public
|
|
//
|
|
// Synopsis: Stops cisvc service
|
|
//
|
|
// Returns: S_OK upon success, othervalues upon failure
|
|
//
|
|
// History: 12-10-97 mohamedn created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CMachineAdm::Stop()
|
|
{
|
|
SCODE sc = S_OK;
|
|
|
|
CLock lock(_mtx);
|
|
|
|
TRANSLATE_EXCEPTIONS;
|
|
|
|
TRY
|
|
{
|
|
SafeForScripting();
|
|
|
|
Initialize();
|
|
|
|
_xMachineAdmin->StopCI();
|
|
|
|
}
|
|
CATCH( CException, e )
|
|
{
|
|
sc = e.GetErrorCode();
|
|
}
|
|
END_CATCH
|
|
|
|
UNTRANSLATE_EXCEPTIONS;
|
|
|
|
if ( FAILED(sc) )
|
|
{
|
|
odmDebugOut(( DEB_ERROR, "Stop cisvc Failed: %x\n", sc ));
|
|
|
|
SetErrorInfo( sc );
|
|
}
|
|
|
|
return sc;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMachineAdm::IsRunning, public
|
|
//
|
|
// Synopsis: is cisvc running
|
|
//
|
|
// Returns: True if cisvc is running, False otherwise.
|
|
//
|
|
// History: 12-10-97 mohamedn created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CMachineAdm::IsRunning( VARIANT_BOOL *pfIsRunning )
|
|
{
|
|
SCODE sc = S_OK;
|
|
|
|
CLock lock(_mtx);
|
|
|
|
TRANSLATE_EXCEPTIONS;
|
|
|
|
TRY
|
|
{
|
|
SafeForScripting();
|
|
|
|
Initialize();
|
|
|
|
*pfIsRunning = _xMachineAdmin->IsCIStarted() ? VARIANT_TRUE : VARIANT_FALSE;
|
|
}
|
|
CATCH( CException, e )
|
|
{
|
|
sc = e.GetErrorCode();
|
|
}
|
|
END_CATCH
|
|
|
|
UNTRANSLATE_EXCEPTIONS;
|
|
|
|
if ( FAILED(sc) )
|
|
{
|
|
odmDebugOut(( DEB_ERROR, "Failed to see if cisvc is running: %x\n", sc ));
|
|
|
|
SetErrorInfo( sc );
|
|
}
|
|
|
|
return sc;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMachineAdm::IsPaused, public
|
|
//
|
|
// Synopsis: is cisvc paused
|
|
//
|
|
// Returns: True if cisvc is paused, False otherwise.
|
|
//
|
|
// History: 08-11-98 kitmanh created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CMachineAdm::IsPaused( VARIANT_BOOL *pfIsPaused )
|
|
{
|
|
SCODE sc = S_OK;
|
|
|
|
CLock lock(_mtx);
|
|
|
|
TRANSLATE_EXCEPTIONS;
|
|
|
|
TRY
|
|
{
|
|
SafeForScripting();
|
|
|
|
Initialize();
|
|
|
|
*pfIsPaused = _xMachineAdmin->IsCIPaused() ? VARIANT_TRUE : VARIANT_FALSE;
|
|
}
|
|
CATCH( CException, e )
|
|
{
|
|
sc = e.GetErrorCode();
|
|
}
|
|
END_CATCH
|
|
|
|
UNTRANSLATE_EXCEPTIONS;
|
|
|
|
if ( FAILED(sc) )
|
|
{
|
|
odmDebugOut(( DEB_ERROR, "Failed to see if cisvc is paused: %x\n", sc ));
|
|
|
|
SetErrorInfo( sc );
|
|
}
|
|
|
|
return sc;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMachineAdm::EnableCI, public
|
|
//
|
|
// Synopsis: Sets cisvc to auto-start (enabled) or manual start (disabled)
|
|
//
|
|
// Arguments: [fAutoStart] - True -> set to auto start, False -> set to demand start
|
|
//
|
|
// Returns: S_OK upon success, failure error if failed to set service setting.
|
|
//
|
|
// History: 12-10-97 mohamedn created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CMachineAdm::EnableCI( VARIANT_BOOL fAutoStart )
|
|
{
|
|
SCODE sc = S_OK;
|
|
|
|
CLock lock(_mtx);
|
|
|
|
TRANSLATE_EXCEPTIONS;
|
|
|
|
TRY
|
|
{
|
|
SafeForScripting();
|
|
|
|
Initialize();
|
|
|
|
sc = fAutoStart ? _xMachineAdmin->EnableCI() : _xMachineAdmin->DisableCI();
|
|
|
|
}
|
|
CATCH( CException, e )
|
|
{
|
|
sc = e.GetErrorCode();
|
|
}
|
|
END_CATCH
|
|
|
|
UNTRANSLATE_EXCEPTIONS;
|
|
|
|
if ( FAILED(sc) )
|
|
{
|
|
odmDebugOut(( DEB_ERROR, "Failed enable/disable cisvc settings: %x\n", sc ));
|
|
|
|
SetErrorInfo( sc );
|
|
}
|
|
|
|
return sc;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMachineAdm::SetLongProperty, public
|
|
//
|
|
// Synopsis: Sets CI registry params
|
|
//
|
|
// Arguments: [bstrPropName] -- property name
|
|
// [lPropVal] -- property value
|
|
//
|
|
// Returns: S_OK upon success, othervalues upon failure
|
|
//
|
|
// Notes: Property value is an unsigned value, though it is being
|
|
// passed in as a signed LONG for compatiblity with automation
|
|
// clients (VB5, VB6 don't support unsigned long).
|
|
//
|
|
// History: 12-10-97 mohamedn created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CMachineAdm::SetLongProperty(BSTR bstrPropName, LONG lPropVal )
|
|
{
|
|
SCODE sc = S_OK;
|
|
|
|
CLock lock(_mtx);
|
|
|
|
TRANSLATE_EXCEPTIONS;
|
|
|
|
TRY
|
|
{
|
|
SafeForScripting();
|
|
|
|
ValidateInputParam( bstrPropName );
|
|
|
|
Initialize();
|
|
|
|
_xMachineAdmin->SetDWORDParam( bstrPropName, lPropVal );
|
|
|
|
}
|
|
CATCH( CException, e )
|
|
{
|
|
sc = e.GetErrorCode();
|
|
}
|
|
END_CATCH
|
|
|
|
UNTRANSLATE_EXCEPTIONS;
|
|
|
|
if ( FAILED(sc) )
|
|
{
|
|
odmDebugOut(( DEB_ERROR, "SetLongParam Failed: %x\n", sc ));
|
|
|
|
SetErrorInfo( sc );
|
|
}
|
|
|
|
return sc;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMachineAdm::GetLongProperty, public
|
|
//
|
|
// Synopsis: Gets CI registry params
|
|
//
|
|
// Arguments: [bstrPropName] -- property name
|
|
// [plPropVal] -- returned property value
|
|
//
|
|
// Returns: S_OK upon success, othervalues upon failure
|
|
//
|
|
// Notes: Property value is an unsigned value, though it is being
|
|
// passed in as a signed LONG for compatiblity with automation
|
|
// clients (VB5, VB6 don't support unsigned long).
|
|
//
|
|
// History: 12-10-97 mohamedn created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CMachineAdm::GetLongProperty(BSTR bstrPropName, LONG * plPropVal )
|
|
{
|
|
|
|
SCODE sc = S_OK;
|
|
|
|
CLock lock(_mtx);
|
|
|
|
TRANSLATE_EXCEPTIONS;
|
|
|
|
TRY
|
|
{
|
|
SafeForScripting();
|
|
|
|
ValidateInputParam( bstrPropName );
|
|
|
|
Initialize();
|
|
|
|
unsigned long uVar = 0;
|
|
|
|
if ( !_xMachineAdmin->GetDWORDParam( bstrPropName, uVar ) )
|
|
{
|
|
sc = E_FAIL;
|
|
}
|
|
else
|
|
{
|
|
*plPropVal = uVar;
|
|
}
|
|
}
|
|
CATCH( CException, e )
|
|
{
|
|
sc = e.GetErrorCode();
|
|
}
|
|
END_CATCH
|
|
|
|
UNTRANSLATE_EXCEPTIONS;
|
|
|
|
if ( FAILED(sc) )
|
|
{
|
|
odmDebugOut(( DEB_ERROR, "GetLONGParam Failed: %x\n", sc ));
|
|
|
|
SetErrorInfo( sc );
|
|
}
|
|
|
|
return sc;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMachineAdm::SetSZProperty, public
|
|
//
|
|
// Synopsis: Sets CI registry params
|
|
//
|
|
// Arguments: [bstrPropName] -- property name
|
|
// [bstrVal] -- property value
|
|
//
|
|
// Returns: S_OK upon success, othervalues upon failure
|
|
//
|
|
// History: 4-6-97 mohamedn created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CMachineAdm::SetSZProperty(BSTR bstrPropName, BSTR bstrVal)
|
|
{
|
|
SCODE sc = S_OK;
|
|
|
|
CLock lock(_mtx);
|
|
|
|
TRANSLATE_EXCEPTIONS;
|
|
|
|
TRY
|
|
{
|
|
SafeForScripting();
|
|
|
|
ValidateInputParam( bstrPropName );
|
|
ValidateInputParam( bstrVal );
|
|
|
|
Initialize();
|
|
|
|
unsigned cLen = SysStringLen( bstrVal );
|
|
unsigned cbLen = sizeof WCHAR * (cLen + 1);
|
|
|
|
_xMachineAdmin->SetSZParam( bstrPropName, bstrVal, cbLen );
|
|
|
|
}
|
|
CATCH( CException, e )
|
|
{
|
|
sc = e.GetErrorCode();
|
|
}
|
|
END_CATCH
|
|
|
|
UNTRANSLATE_EXCEPTIONS;
|
|
|
|
if ( FAILED(sc) )
|
|
{
|
|
odmDebugOut(( DEB_ERROR, "SetSZParam Failed: %x\n", sc ));
|
|
|
|
SetErrorInfo( sc );
|
|
}
|
|
|
|
return sc;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMachineAdm::GetSZProperty, public
|
|
//
|
|
// Synopsis: Gets CI registry params
|
|
//
|
|
// Arguments: [bstrPropName] -- property name
|
|
// [pbstrVal] -- returned property value
|
|
//
|
|
// Returns: S_OK upon success, othervalues upon failure
|
|
//
|
|
// History: 4-6-97 mohamedn created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CMachineAdm::GetSZProperty(BSTR bstrPropName, BSTR * pbstrVal)
|
|
{
|
|
|
|
SCODE sc = S_OK;
|
|
|
|
CLock lock(_mtx);
|
|
|
|
TRANSLATE_EXCEPTIONS;
|
|
|
|
TRY
|
|
{
|
|
SafeForScripting();
|
|
|
|
ValidateInputParam( bstrPropName );
|
|
|
|
Initialize();
|
|
|
|
WCHAR awcPropVal[MAX_PATH+1];
|
|
|
|
if ( !_xMachineAdmin->GetSZParam( bstrPropName,
|
|
awcPropVal,
|
|
sizeof awcPropVal ) )
|
|
{
|
|
sc = E_FAIL;
|
|
}
|
|
else
|
|
{
|
|
BSTR pPropVal = SysAllocString( awcPropVal );
|
|
|
|
if ( !pPropVal )
|
|
{
|
|
sc = E_OUTOFMEMORY;
|
|
}
|
|
else
|
|
{
|
|
*pbstrVal = pPropVal;
|
|
}
|
|
}
|
|
}
|
|
CATCH( CException, e )
|
|
{
|
|
sc = e.GetErrorCode();
|
|
}
|
|
END_CATCH
|
|
|
|
UNTRANSLATE_EXCEPTIONS;
|
|
|
|
if ( FAILED(sc) )
|
|
{
|
|
odmDebugOut(( DEB_ERROR, "GetSZProperty Failed: %x\n", sc ));
|
|
|
|
SetErrorInfo( sc );
|
|
}
|
|
|
|
return sc;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMachineAdm::Pause, public
|
|
//
|
|
// Synopsis: Pauses cisvc service
|
|
//
|
|
// Returns: S_OK upon success, othervalues upon failure
|
|
//
|
|
// History: 10-08-98 kitmanh created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CMachineAdm::Pause()
|
|
{
|
|
SCODE sc = S_OK;
|
|
|
|
CLock lock(_mtx);
|
|
|
|
TRANSLATE_EXCEPTIONS;
|
|
|
|
TRY
|
|
{
|
|
SafeForScripting();
|
|
|
|
Initialize();
|
|
|
|
_xMachineAdmin->PauseCI();
|
|
}
|
|
CATCH( CException, e )
|
|
{
|
|
sc = e.GetErrorCode();
|
|
}
|
|
END_CATCH
|
|
|
|
UNTRANSLATE_EXCEPTIONS;
|
|
|
|
if ( FAILED(sc) )
|
|
{
|
|
odmDebugOut(( DEB_ERROR, "Pause cisvc Failed: %x\n", sc ));
|
|
|
|
SetErrorInfo( sc );
|
|
}
|
|
|
|
return sc;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMachineAdm::Continue, public
|
|
//
|
|
// Synopsis: Continues cisvc service
|
|
//
|
|
// Returns: S_OK upon success, othervalues upon failure
|
|
//
|
|
// History: 09-08-98 kitmanh created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CMachineAdm::Continue()
|
|
{
|
|
SCODE sc = S_OK;
|
|
|
|
CLock lock(_mtx);
|
|
|
|
TRANSLATE_EXCEPTIONS;
|
|
|
|
TRY
|
|
{
|
|
SafeForScripting();
|
|
|
|
Initialize();
|
|
|
|
_xMachineAdmin->StartCI();
|
|
}
|
|
CATCH( CException, e )
|
|
{
|
|
sc = e.GetErrorCode();
|
|
}
|
|
END_CATCH
|
|
|
|
UNTRANSLATE_EXCEPTIONS;
|
|
|
|
if ( FAILED(sc) )
|
|
{
|
|
odmDebugOut(( DEB_ERROR, "Start cisvc Failed: %x\n", sc ));
|
|
|
|
SetErrorInfo( sc );
|
|
}
|
|
|
|
return sc;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMachineAdm::SafeForScripting, public
|
|
//
|
|
// Synopsis: determines if it is safe to invoke this method from a given client site.
|
|
//
|
|
// Arguments: none.
|
|
//
|
|
// Returns: E_ACCESSDENIED if not safe to run, else S_OK
|
|
//
|
|
// History: 9/10/98 mohamedn created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
void CMachineAdm::SafeForScripting()
|
|
{
|
|
SCODE sc = S_OK;
|
|
|
|
if ( m_spUnkSite || m_dwSafety )
|
|
{
|
|
Win4Assert( m_spUnkSite );
|
|
|
|
XInterface<IUnknown> xpunkSite;
|
|
|
|
sc = GetSite( IID_IUnknown, xpunkSite.GetQIPointer() ); // m_spUnkSite
|
|
if ( FAILED(sc) )
|
|
{
|
|
odmDebugOut(( DEB_ERROR, "GetSite Failed sc: %x, m_spUnkSite: %x, punkSite:%x, m_dwSafety:%x\n", sc, m_spUnkSite, xpunkSite.GetPointer() , m_dwSafety ));
|
|
|
|
THROW( CException( E_ACCESSDENIED ) );
|
|
}
|
|
else
|
|
{
|
|
Win4Assert( !xpunkSite.IsNull() );
|
|
|
|
if ( m_dwSafety && LocalZoneCheck(xpunkSite.GetPointer()) != S_OK)
|
|
{
|
|
odmDebugOut(( DEB_ERROR, "LocalZoneCheck() Failed, Access denied\n" ));
|
|
|
|
THROW( CException( E_ACCESSDENIED ) );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMachineAdm::IUnknown_QueryService, private
|
|
//
|
|
// Synopsis: determines if it is safe to invoke this method from a given client site.
|
|
//
|
|
// Arguments: [punk] -- site's IUnkown
|
|
// [guidService] -- sp guid
|
|
// [riid] -- interface to query for.
|
|
// [ppvOut] -- out param, contaiing found interface
|
|
//
|
|
// Returns: S_OK upon success, failure codes otherwise.
|
|
//
|
|
// History: 9/10/98 mohamedn created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
HRESULT CMachineAdm::IUnknown_QueryService(IUnknown* punk, REFGUID guidService, REFIID riid, void **ppvOut)
|
|
{
|
|
HRESULT hres;
|
|
XInterface<IServiceProvider> xPsp;
|
|
|
|
*ppvOut = NULL;
|
|
if (!punk)
|
|
return E_FAIL;
|
|
|
|
hres = punk->QueryInterface(IID_IServiceProvider, xPsp.GetQIPointer() );
|
|
if ( SUCCEEDED(hres) )
|
|
{
|
|
hres = xPsp->QueryService(guidService, riid, ppvOut);
|
|
}
|
|
|
|
return hres;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMachineAdm::GetHTMLDoc2, private
|
|
//
|
|
// Synopsis: determines if it is safe to invoke this method from a given client site.
|
|
//
|
|
// Arguments: [punk] -- site's IUnknown
|
|
// [ppHtmlDoc] -- out param to htm doc
|
|
//
|
|
// Returns: S_OK upon success, failure codes otherwise.
|
|
//
|
|
// History: 9/10/98 mohamedn created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
HRESULT CMachineAdm::GetHTMLDoc2(IUnknown *punk, IHTMLDocument2 **ppHtmlDoc)
|
|
{
|
|
HRESULT hr = E_NOINTERFACE;
|
|
|
|
*ppHtmlDoc = NULL;
|
|
|
|
// The window.external, jscript "new ActiveXObject" and the <OBJECT> tag
|
|
// don't take us down the same road.
|
|
|
|
XInterface<IOleClientSite> xClientSite;
|
|
|
|
hr = punk->QueryInterface(IID_IOleClientSite, xClientSite.GetQIPointer());
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
// <OBJECT> tag path
|
|
|
|
XInterface<IOleContainer> xContainer;
|
|
|
|
hr = xClientSite->GetContainer(xContainer.GetPPointer());
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = xContainer->QueryInterface(IID_IHTMLDocument2, (void **)ppHtmlDoc);
|
|
}
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
// window.external path
|
|
XInterface<IWebBrowser2> xWebBrowser2;
|
|
|
|
hr = IUnknown_QueryService(xClientSite.GetPointer(), SID_SWebBrowserApp, IID_IHTMLDocument2, xWebBrowser2.GetQIPointer() );
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
XInterface<IDispatch> xDispatch;
|
|
|
|
hr = xWebBrowser2->get_Document(xDispatch.GetPPointer());
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = xDispatch->QueryInterface(IID_IHTMLDocument2, (void **)ppHtmlDoc);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// jscript path
|
|
hr = IUnknown_QueryService(punk, SID_SContainerDispatch, IID_IHTMLDocument2, (void **)ppHtmlDoc);
|
|
}
|
|
|
|
Win4Assert( FAILED(hr) || (*ppHtmlDoc) );
|
|
return hr;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMachineAdm::LocalZoneCheckPath, private
|
|
//
|
|
// Synopsis: determines if it is safe to invoke this method from a given client site.
|
|
//
|
|
// Arguments: [pbstrPath] -- out param. Path of htm page.
|
|
//
|
|
// Returns: S_OK upon success, failure codes otherwise.
|
|
//
|
|
// History: 9/10/98 mohamedn created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
HRESULT CMachineAdm::LocalZoneCheckPath(LPCWSTR pbstrPath)
|
|
{
|
|
HRESULT hr = E_ACCESSDENIED;
|
|
if (pbstrPath)
|
|
{
|
|
XInterface<IInternetSecurityManager> xSecMgr;
|
|
|
|
if (SUCCEEDED(CoCreateInstance(CLSID_InternetSecurityManager,
|
|
NULL, CLSCTX_INPROC_SERVER,
|
|
IID_IInternetSecurityManager,
|
|
xSecMgr.GetQIPointer())))
|
|
{
|
|
DWORD dwZoneID = URLZONE_UNTRUSTED;
|
|
if (SUCCEEDED(xSecMgr->MapUrlToZone(pbstrPath, &dwZoneID, 0)))
|
|
{
|
|
if (dwZoneID == URLZONE_LOCAL_MACHINE)
|
|
hr = S_OK;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = E_INVALIDARG;
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMachineAdm::LocalZoneCheck, private
|
|
//
|
|
// Synopsis: determines if it is safe to invoke this method from a given client site.
|
|
//
|
|
// Arguments: [punkSite] -- site's IUnknown.
|
|
//
|
|
// Returns: S_OK upon success, failure codes otherwise.
|
|
//
|
|
// History: 9/10/98 mohamedn created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
HRESULT CMachineAdm::LocalZoneCheck(IUnknown *punkSite)
|
|
{
|
|
|
|
// Return S_FALSE if we don't have a host site since we have no way of doing a
|
|
// security check. This is as far as VB 5.0 apps get.
|
|
if (!punkSite)
|
|
return S_FALSE;
|
|
|
|
// Try to use the URL from the document to zone check
|
|
|
|
XInterface<IHTMLDocument2> xHtmlDoc;
|
|
HRESULT hr = E_ACCESSDENIED;
|
|
|
|
if (SUCCEEDED(GetHTMLDoc2(punkSite, xHtmlDoc.GetPPointer()) ))
|
|
{
|
|
Win4Assert(xHtmlDoc.GetPointer());
|
|
|
|
BSTR bstrPath;
|
|
|
|
if ( SUCCEEDED( xHtmlDoc->get_URL(&bstrPath) ))
|
|
{
|
|
hr = LocalZoneCheckPath( bstrPath );
|
|
|
|
SysFreeString(bstrPath);
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
|
|
}
|