windows-nt/Source/XPSP1/NT/inetsrv/query/ciodm/scopeadm.cxx
2020-09-26 16:20:57 +08:00

749 lines
17 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997-1998
//
// File: ScopeAdm.cxx
//
// Contents: CI Scope Administration Interface methods
//
// Classes: CScopeAdm
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
#include "pch.cxx"
#pragma hdrstop
#include "stdafx.h"
//+---------------------------------------------------------------------------
//
// Member: CScopeAdm::InterfaceSupportsErrorInfo, public
//
// Arguments: [riid] -- interface iid
//
// Returns: S_OK if interface supports IErrorInfo
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CScopeAdm::InterfaceSupportsErrorInfo(REFIID riid)
{
return ( riid == IID_IScopeAdm );
}
//+---------------------------------------------------------------------------
//
// Member: CScopeAdm::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 CScopeAdm::SetErrorInfo( HRESULT hRes )
{
CiodmError err(hRes);
AtlSetErrorInfo(CLSID_ScopeAdm, err.GetErrorMessage(), 0 , 0, IID_IScopeAdm, hRes, 0 );
}
//+---------------------------------------------------------------------------
//
// Member: CScopeAdm::Initialize, public
//
// Synopsis: Initializes CScopeAdm object
//
// Arguments: [xScopeAdmin] -- CScopeAdmin to encapsulate.
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
void CScopeAdm::Initialize( XPtr<CScopeAdmin> & xScopeAdmin )
{
Win4Assert( _pICatAdm );
Win4Assert( !xScopeAdmin.IsNull() );
_xScopeAdmin.Set( xScopeAdmin.Acquire() );
_fValid = TRUE;
}
//+---------------------------------------------------------------------------
//
// Member: CScopeAdm::InternalAddRef, public
//
// Synopsis: overrides CComObjectRootEx<Base>::InternalAddRef, to AddRef parent too
//
// Arguments: none
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
ULONG CScopeAdm::InternalAddRef()
{
CLock lock(_mtx);
//
// AddRef self
//
unsigned cRef = CComObjectRootEx<CComMultiThreadModel>::InternalAddRef();
odmDebugOut(( DEB_TRACE,"CScopeAdm(%ws) AddRef returned: %d\n",
_xScopeAdmin.IsNull() ? L"" : _xScopeAdmin->GetPath(), cRef ));
//
// AddRef parent. It won't exist if the object is created independently
//
if ( 0 != _pICatAdm )
_pICatAdm->AddRef();
return cRef;
} //InternalAddRef
//+---------------------------------------------------------------------------
//
// Member: CScopeAdm::InternalRelease, public
//
// Synopsis: overrides CComObjectRootEx<Base>::InternalRelease, to release parent too.
//
// Arguments: none
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
ULONG CScopeAdm::InternalRelease()
{
CLock lock(_mtx);
//
// Rlease parent
//
if ( ( 0 != _pICatAdm ) &&
( 1 == m_dwRef ) ) // we're being deleted
{
_pICatAdm->DecObjectCount();
}
//
// Release self
//
unsigned cRef = CComObjectRootEx<CComMultiThreadModel>::InternalRelease();
if ( 0 != _pICatAdm )
_pICatAdm->Release();
return cRef;
} //InternalRelease
//+---------------------------------------------------------------------------
//
// Member: CScopeAdm::Rescan, public
//
// Synopsis: Forces a rescan
//
// Arguments: [fFull] -- TRUE --> full rescan, FALSE --> incremental
//
// Returns: S_OK upon success, other values upon failure
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CScopeAdm::Rescan(VARIANT_BOOL fFull)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
if ( !_fValid )
{
odmDebugOut(( DEB_ERROR, "Invalid Scope: %ws\n", _xScopeAdmin->GetPath() ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else
{
CCatalogAdmin * pCatalogAdmin = _pICatAdm->GetCatalogAdmin();
Win4Assert( pCatalogAdmin );
sc = UpdateContentIndex( _xScopeAdmin->GetPath(), // root of scope to scan for updates
pCatalogAdmin->GetName(), // catalog name
pCatalogAdmin->GetMachName(),// machine name
fFull );
}
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "Rescan Failed: %x\n",sc ));
SetErrorInfo( sc );
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CScopeAdm::SetLogonInfo, public
//
// Synopsis: Sets Logon Name/password
//
// Arguments: [bstrLogon] -- Logon name
// [bstrPassword] -- password
//
// Returns: S_OK upon success, other values upon failure
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CScopeAdm::SetLogonInfo( BSTR bstrLogon, BSTR bstrPassword )
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
ValidateInputParam( bstrLogon );
ValidateInputParam( bstrPassword );
if ( !_fValid )
{
odmDebugOut(( DEB_ERROR, "Invalid Scope: %ws\n", _xScopeAdmin->GetPath() ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else
{
CCatalogAdmin * pCatalogAdmin = _pICatAdm->GetCatalogAdmin();
WCHAR const * pwszPath = _xScopeAdmin->GetPath();
Win4Assert( pCatalogAdmin );
Win4Assert( pwszPath );
if ( pwszPath[1] == L':' )
{
odmDebugOut(( DEB_ERROR, "Can't set Logon info for local drives\n" ));
sc = E_INVALIDARG;
}
else if ( bstrLogon && *bstrLogon )
{
_xScopeAdmin->SetLogonInfo( bstrLogon, bstrPassword, *pCatalogAdmin );
}
else
{
odmDebugOut(( DEB_ERROR, "invalid logon arguments\n" ));
sc = E_INVALIDARG;
}
}
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "SetLogonInfo Failed: %x\n",sc ));
SetErrorInfo( sc );
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CScopeAdm::get_Path, public
//
// Synopsis: Gets the scope path Property
//
// Arguments: [pVal] -- out param, buffer containing scope path
//
// Returns: S_OK upon success, other values upon failure.
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CScopeAdm::get_Path(BSTR * pVal)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
if ( !_fValid )
{
odmDebugOut(( DEB_ERROR, "Invalid Scope: %ws\n", _xScopeAdmin->GetPath() ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else
{
WCHAR const * pwszPath = _xScopeAdmin->GetPath();
*pVal = SysAllocString(pwszPath);
if ( !*pVal )
{
sc = E_OUTOFMEMORY;
}
}
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "get_PathRescan Failed: %x\n",sc ));
SetErrorInfo( sc );
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CScopeAdm::put_Path, public
//
// Synopsis: Sets the scope path Property
//
// Arguments: [newVal] -- in param, buffer containing scope path
//
// Returns: S_OK upon success, other values upon failure.
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CScopeAdm::put_Path(BSTR newVal)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
ValidateInputParam( newVal );
if ( !_fValid )
{
odmDebugOut(( DEB_ERROR, "Invalid Scope: %ws\n", _xScopeAdmin->GetPath() ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else
{
if ( _xScopeAdmin->IsVirtual() )
{
odmDebugOut(( DEB_ERROR, "Can't change virtual path, must use IIS\n" ));
sc = HRESULT_FROM_WIN32(ERROR_INVALID_FUNCTION);
}
else
{
_xScopeAdmin->SetPath(newVal);
}
}
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "put_PathRescan Failed: %x\n",sc ));
SetErrorInfo( sc );
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CScopeAdm::get_Alias, public
//
// Synopsis: Gets the scope Alias Property
//
// Arguments: [pVal] -- out param, buffer containing scope Alias
//
// Returns: S_OK upon success, other values upon failure.
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CScopeAdm::get_Alias(BSTR * pVal)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
if ( !_fValid )
{
odmDebugOut(( DEB_ERROR, "Invalid Scope: %ws\n", _xScopeAdmin->GetPath() ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else
{
WCHAR const * pwszAlias = _xScopeAdmin->GetAlias();
*pVal = SysAllocString(pwszAlias);
if ( !*pVal )
{
sc = E_OUTOFMEMORY;
}
}
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "get_Alias Failed: %x\n",sc ));
SetErrorInfo( sc );
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CScopeAdm::put_Alias , public
//
// Synopsis: Sets the scope alias Property
//
// Arguments: [newVal] -- in param, buffer containing scope alias
//
// Returns: S_OK upon success, other values upon failure.
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CScopeAdm::put_Alias(BSTR newVal)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
ValidateInputParam( newVal );
if ( !_fValid )
{
odmDebugOut(( DEB_ERROR, "Invalid Scope: %ws\n", _xScopeAdmin->GetPath() ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else
{
_xScopeAdmin->SetAlias(newVal);
}
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "put_Alias Failed: %x\n",sc ));
SetErrorInfo( sc );
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CScopeAdm::get_ExcludeScope, public
//
// Synopsis: Gets the exclude scope Property
//
// Arguments: [pVal] -- out param, containing exclude scope flag
//
// Returns: S_OK upon success, other values upon failure.
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CScopeAdm::get_ExcludeScope(VARIANT_BOOL * pVal)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
if ( !_fValid )
{
odmDebugOut(( DEB_ERROR, "Invalid Scope: %ws\n", _xScopeAdmin->GetPath() ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else
{
*pVal = (SHORT)_xScopeAdmin->IsExclude();
}
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "get_ExcludeScope Failed: %x\n",sc ));
SetErrorInfo( sc );
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CScopeAdm::put_ExcludeScope , public
//
// Synopsis: Sets the scope Exclude flag Property
//
// Arguments: [newVal] -- in param, Exclude scope flag to set
//
// Returns: S_OK upon success, other values upon failure.
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CScopeAdm::put_ExcludeScope(VARIANT_BOOL newVal)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
if ( !_fValid )
{
odmDebugOut(( DEB_ERROR, "Invalid Scope: %ws\n", _xScopeAdmin->GetPath() ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else
{
_xScopeAdmin->SetExclude(newVal);
}
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "put_ExcludeScope Failed: %x\n",sc ));
SetErrorInfo( sc );
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CScopeAdm::get_VirtualScope, public
//
// Synopsis: Gets the VirtualScope property
//
// Arguments: [pVal] -- out param, containing VirtualScope flag
//
// Returns: S_OK upon success, other values upon failure.
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CScopeAdm::get_VirtualScope(VARIANT_BOOL * pVal)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
if ( !_fValid )
{
odmDebugOut(( DEB_ERROR, "Invalid Scope: %ws\n", _xScopeAdmin->GetPath() ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else
{
*pVal = (SHORT)_xScopeAdmin->IsVirtual();
}
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "get_VirtualScope Failed: %x\n",sc ));
SetErrorInfo( sc );
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CScopeAdm::get_Logon, public
//
// Synopsis: Gets the logon name
//
// Arguments: [pVal] -- out param, containing logon name
//
// Returns: S_OK upon success, other values upon failure.
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CScopeAdm::get_Logon(BSTR * pVal)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
if ( !_fValid )
{
odmDebugOut(( DEB_ERROR, "Invalid Scope: %ws\n", _xScopeAdmin->GetPath() ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else
{
WCHAR const * pwszLogon = _xScopeAdmin->GetLogon();
*pVal = SysAllocString(pwszLogon);
if ( !*pVal )
{
sc = E_OUTOFMEMORY;
}
}
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "get_Logon Failed: %x\n",sc ));
SetErrorInfo( sc );
}
return sc;
}