Windows2003-3790/inetsrv/query/ciodm/catadm.cxx
2020-09-30 16:53:55 +02:00

2593 lines
62 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997 - 2000.
//
// File: CatAdm.cxx
//
// Contents: CI Catalog Administration Interface methods
//
// Classes: CCatAdm
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
#include "pch.cxx"
#pragma hdrstop
#include "stdafx.h"
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::InterfaceSupportsErrorInfo, public
//
// Arguments: [riid] -- interface iid
//
// Returns: TRUE if interface supports IErrorInfo
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCatAdm::InterfaceSupportsErrorInfo(REFIID riid)
{
return ( riid == IID_ICatAdm );
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::SetErrorInfo, public
//
// Synopsis: Creates & sets the error object
//
// Arguments: [hRes] -- HRESULT error code to set
// [pwszDesc] -- error description
//
// Returns: none
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
void CCatAdm::SetErrorInfo( HRESULT hRes )
{
CiodmError err(hRes);
AtlSetErrorInfo(CLSID_CatAdm, err.GetErrorMessage(), 0 , 0, IID_ICatAdm, hRes, 0 );
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::CCatAdm, public
//
// Synopsis: Constructor
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
CCatAdm::CCatAdm()
:_eCurrentState(CIODM_NOT_INITIALIZED),
_cMinRefCountToDestroy(1),
_cEnumIndex(0),
_pIMacAdm(0),
_dwTickCount(0)
{
//
// empty
//
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::Initialize, public
//
// Synopsis: Initializes CCatAdm object, populates scopes list
//
// Arguments: [xCatAdmin] -- contained catAdmin
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
void CCatAdm::Initialize( XPtr<CCatalogAdmin> & xCatAdmin )
{
Win4Assert( 0 == _aIScopeAdmin.Count() );
Win4Assert( !xCatAdmin.IsNull() );
CTranslateSystemExceptions xlate;
TRY
{
_xCatAdmin.Set( xCatAdmin.Acquire() );
XPtr<CScopeEnum> xScopeEnum(_xCatAdmin->QueryScopeEnum());
for ( ; xScopeEnum->Next(); )
{
XPtr<CScopeAdmin> xScopeAdmin( xScopeEnum->QueryScopeAdmin() );
XInterface<ScopeAdmObject> xIScopeAdm;
GetScopeAutomationObject( xScopeAdmin, xIScopeAdm );
_aIScopeAdmin.Add ( xIScopeAdm.GetPointer() , _aIScopeAdmin.Count() );
xIScopeAdm.Acquire();
}
_eCurrentState = CIODM_INITIALIZED;
}
CATCH( CException,e )
{
_eCurrentState = CIODM_NOT_INITIALIZED;
_cEnumIndex = 0;
_xCatAdmin.Free();
_aIScopeAdmin.Free();
RETHROW();
}
END_CATCH
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::InternalAddRef, public
//
// Synopsis: overrides CComObjectRootEx<Base>::InternalAddRef, to AddRef parent too
//
// Arguments: none
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
ULONG CCatAdm::InternalAddRef()
{
CLock lock(_mtx);
//
// AddRef self
//
unsigned cRef = CComObjectRootEx<CComMultiThreadModel>::InternalAddRef();
odmDebugOut(( DEB_TRACE,"CCatAdm(%ws) AddRef returned: %d\n",
_xCatAdmin.IsNull() ? L"" : _xCatAdmin->GetName(), cRef ));
//
// AddRef parent if it exists (it won't if catadmin was created in bogus context)
//
if ( 0 != _pIMacAdm )
_pIMacAdm->AddRef();
odmDebugOut(( DEB_TRACE,"=========================== CCatAdm(%ws) object count: %d\n",
_xCatAdmin.IsNull() ? L"" : _xCatAdmin->GetName(), _cMinRefCountToDestroy ));
return cRef;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::InternalRelease, public
//
// Synopsis: overrides CComObjectRootEx<Base>::InternalRelease, to release parent too.
//
// Arguments: none
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
ULONG CCatAdm::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;
_aIScopeAdmin.Free();
//
// Assert we're the only object left to be destroyed.
//
Win4Assert( 1 == m_dwRef );
Win4Assert( _cMinRefCountToDestroy == 1 );
if ( 0 != _pIMacAdm )
_pIMacAdm->DecObjectCount();
}
else
{
Win4Assert( 1 < m_dwRef );
Win4Assert( 1 <= _cMinRefCountToDestroy );
}
//
// Release parent
//
unsigned cRef = CComObjectRootEx<CComMultiThreadModel>::InternalRelease();
odmDebugOut(( DEB_TRACE,"CCatAdm(%ws) Release returned: %d\n",
_xCatAdmin.IsNull() ? L"" : _xCatAdmin->GetName(), cRef ));
if ( 0 != _pIMacAdm )
_pIMacAdm->Release();
return cRef;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::GetScopeAutomationObject, public
//
// Synopsis: Wraps a CScopeAdmin pointer in an IDispatch interface.
//
// Arguments: [xScopeAdmin] -- Scope admin object
// [xIScopeAdm] -- xInterface to contain created ScopeAdmObject
//
// Returns: none, throws upon failure.
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
void CCatAdm::GetScopeAutomationObject( XPtr<CScopeAdmin> & xScopeAdmin,
XInterface<ScopeAdmObject> & xIScopeAdm )
{
Win4Assert( !xScopeAdmin.IsNull() );
SCODE sc = ScopeAdmObject::CreateInstance( xIScopeAdm.GetPPointer() );
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "CoCreateInstance(CLSID_ScopeAdm) Failed: %x\n",sc ));
THROW(CException(sc) );
}
else
{
Win4Assert( !xIScopeAdm.IsNull() );
xIScopeAdm->SetParent( (CComObject<CCatAdm> *)this );
xIScopeAdm->AddRef();
IncObjectCount(); // inc. internal object count
}
//
// Initialize the new object
//
xIScopeAdm->Initialize( xScopeAdmin );
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::GetIDisp, public
//
// Synopsis: QI for IDispatch on CScopeAdm object given by the passed in index.
//
// Arguments: [cPosition] -- index of CScopeAdm object
//
// Returns: [IDispatch *] -- pointer to IDispatch on CScopeAdm, throws upon failure.
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
IDispatch * CCatAdm::GetIDisp( unsigned cPosition )
{
IDispatch * pTmpIDisp = 0;
SCODE sc = _aIScopeAdmin[cPosition]->QueryInterface(IID_IDispatch, (void **) &pTmpIDisp);
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "QueryInterface() Failed: %x\n", sc ));
THROW(CException(sc));
}
Win4Assert( pTmpIDisp );
return pTmpIDisp;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::ForceMasterMerge, public
//
// Synopsis: Starts a master merge
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCatAdm::ForceMasterMerge(void)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
sc = ::ForceMasterMerge ( L"\\",
_xCatAdmin->GetName(),
_xCatAdmin->GetMachName() );
}
CATCH ( CException,e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "ForceMasterMerge Failed: %x\n",sc ));
SetErrorInfo(sc);
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::AddScope, public
//
// Synopsis: Adds a scope to current catalog, logon & password should only
// be passed in if path is UNC.
//
// Arguments: [bstrScopeName] - in param, scope to Add
// [fExclude] - in param, Exclude flag to set
// [vtLogon] - in param, logon name
// [vtPassword] - in param,
// [pIDisp] - out param, IDispatch for new scope.
//
// Returns: S_OK upon success, other values upon failure.
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCatAdm::AddScope(BSTR bstrScopeName,
VARIANT_BOOL fExclude,
VARIANT vtLogon,
VARIANT vtPassword,
IDispatch * * pIDisp)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
ValidateInputParam( bstrScopeName );
if ( !IsCurrentObjectValid() )
{
odmDebugOut(( DEB_ERROR, "Invalid catalog\n" ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else
{
sc = IsScopeValid( bstrScopeName, SysStringLen(bstrScopeName), _xCatAdmin->IsLocal() );
if ( SUCCEEDED(sc) )
{
WCHAR const * pwszLogon = GetWCHARFromVariant(vtLogon);
WCHAR const * pwszPassword = GetWCHARFromVariant(vtPassword);
if ( (( pwszLogon && *pwszLogon && pwszPassword ) && ( bstrScopeName[0] == L'\\' || bstrScopeName[1] == L'\\')) ||
(( !pwszLogon && !pwszPassword ) && ( bstrScopeName[1] == L':' )) )
{
if ( ScopeExists( bstrScopeName ) )
{
sc = HRESULT_FROM_WIN32( ERROR_ALREADY_EXISTS );
}
else
{
_xCatAdmin->AddScope(bstrScopeName, NULL, fExclude, pwszLogon, pwszPassword);
XPtr<CScopeAdmin> xScopeAdmin( _xCatAdmin->QueryScopeAdmin(bstrScopeName) );
unsigned cPosition = _aIScopeAdmin.Count();
XInterface<ScopeAdmObject> xIScopeAdm;
GetScopeAutomationObject( xScopeAdmin, xIScopeAdm );
_aIScopeAdmin.Add ( xIScopeAdm.GetPointer() , cPosition );
xIScopeAdm.Acquire();
*pIDisp = GetIDisp(cPosition);
}
}
else
{
odmDebugOut(( DEB_ERROR,"Invalid Scope params: UNC scope name require Logon & passwd, local drive doesn't\n"));
sc = E_INVALIDARG;
}
}
}
}
CATCH ( CException,e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "AddScope Failed: %x\n",sc ));
SetErrorInfo(sc);
}
return sc;
}
//+---------------------------------------------------------------------------
//
// member: CCatAdm::ScopeExists, public
//
// Synopsis: determines if a scope exists on this catalog.
//
// Arguments: [pScopePath] -- scope path
//
// Returns: TRUE if scope already exists, false otherwise.
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
BOOL CCatAdm::ScopeExists(WCHAR const * pScopePath)
{
Win4Assert( pScopePath );
unsigned cPosition = _aIScopeAdmin.Count();
for ( DWORD i = 0; i < cPosition; i++ )
{
Win4Assert( _aIScopeAdmin[i] );
CScopeAdmin * pScopeAdmin = _aIScopeAdmin[i]->GetScopeAdmin();
Win4Assert( pScopeAdmin );
if ( !_wcsicmp( pScopePath, pScopeAdmin->GetPath() ) )
{
return TRUE;
}
}
return FALSE;
}
//+---------------------------------------------------------------------------
//
// Function: GetWCHARFromVariant
//
// Synopsis: returns a pointer to WCHAR within a variant
//
// Arguments: [Var] - variant containing a bstr
//
// Returns: valid WCHAR * to the bstr in the variant
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
WCHAR const * GetWCHARFromVariant( VARIANT & Var )
{
switch ( Var.vt )
{
case VT_BSTR:
if ( 0 == Var.bstrVal )
{
THROW(CException(E_INVALIDARG));
}
return Var.bstrVal;
break;
case VT_BSTR|VT_BYREF:
if ( 0 == Var.pbstrVal || 0 == *Var.pbstrVal )
{
THROW(CException(E_INVALIDARG));
}
return *Var.pbstrVal;
break;
case VT_BYREF|VT_VARIANT:
if ( 0 == Var.pvarVal )
{
THROW( CException(E_INVALIDARG) );
}
return GetWCHARFromVariant(*Var.pvarVal);
break;
case VT_ERROR: // set if optional param is not set.
case VT_EMPTY:
//
// do nothing
//
break;
default:
odmDebugOut(( DEB_ERROR, "Unexpected Variant type: %x\n", Var.vt ));
THROW( CException(E_INVALIDARG) );
}
return 0;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::RemoveScope, public
//
// Synopsis: deletes a scope
//
// Arguments: [bstrScopePath] - in param, scope to delete
//
// Returns: S_OK upon success, other values upon failure.
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCatAdm::RemoveScope(BSTR bstrScopePath)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
ValidateInputParam( bstrScopePath );
if ( !IsCurrentObjectValid() )
{
odmDebugOut(( DEB_ERROR, "Invalid catalog\n" ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else
{
unsigned cPosition = _aIScopeAdmin.Count();
for ( DWORD i = 0; i < cPosition; i++ )
{
Win4Assert( _aIScopeAdmin[i] );
CScopeAdmin * pScopeAdmin = _aIScopeAdmin[i]->GetScopeAdmin();
Win4Assert( pScopeAdmin );
if ( !_wcsicmp( bstrScopePath, pScopeAdmin->GetPath() ) )
{
//
// Remove scope from local list, move last element to empty spot,
// Release corresponding IDispatch
//
ScopeAdmObject * pIScopeAdm = _aIScopeAdmin.AcquireAndShrink(i);
Win4Assert( pIScopeAdm );
pIScopeAdm->SetInvalid();
pIScopeAdm->Release();
//
// Remove from CI
//
_xCatAdmin->RemoveScope(bstrScopePath);
break;
}
}
if ( i == cPosition )
{
odmDebugOut(( DEB_ERROR, "RemoveScope Failed, Scope(%ws) not found\n", bstrScopePath ));
sc = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
}
}
}
CATCH ( CException,e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "RemoveScope Failed: %x\n",sc ));
SetErrorInfo( sc );
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::GetScopeByPath, public
//
// Synopsis: Searches for scopes on this catalog by Path
//
// Arguments: [bstrPath] -- Path to search for.
// [pIDisp] -- out param, IDispatch for CScopeAdmin if Path matches
//
// Returns: S_OK upon success, other values upon failure.
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCatAdm::GetScopeByPath(BSTR bstrPath, IDispatch * * pIDisp)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
ValidateInputParam( bstrPath );
if ( !IsCurrentObjectValid() )
{
odmDebugOut(( DEB_ERROR, "Invalid catalog\n" ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else
{
unsigned cMaxScopes = _aIScopeAdmin.Count();
for ( DWORD i = 0; i < cMaxScopes; i++ )
{
Win4Assert( _aIScopeAdmin[i] );
CScopeAdmin *pScopeAdmin = _aIScopeAdmin[i]->GetScopeAdmin();
Win4Assert( pScopeAdmin );
if ( !_wcsicmp( pScopeAdmin->GetPath(), bstrPath ) )
{
*pIDisp = GetIDisp(i);
break;
}
}
//
// Scope not found
//
if ( i == cMaxScopes )
{
odmDebugOut(( DEB_ERROR, "GetScopeByPath(%ws) Failed: Scope Not found\n",bstrPath ));
sc = HRESULT_FROM_WIN32( ERROR_NOT_FOUND );
}
}
}
CATCH ( CException,e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "GetScopeByPath Failed: %x\n",sc ));
SetErrorInfo( sc );
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::FindFirstScope, public
//
// Synopsis: Scope enumerator. Resets scan to start of list.
//
// Arguments: [pfFound] -- out param, True --> Found at least one scope
//
// Returns: SO_OK upon success, other values upon faillure
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCatAdm::FindFirstScope(VARIANT_BOOL * pfFound)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
if ( !IsCurrentObjectValid() )
{
odmDebugOut(( DEB_ERROR, "Invalid catalog\n" ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else
{
_cEnumIndex = 0;
if ( _aIScopeAdmin.Count() > 0 )
{
Win4Assert( _aIScopeAdmin[0] );
*pfFound = VARIANT_TRUE;
}
else
{
*pfFound = VARIANT_FALSE;
}
}
}
CATCH ( CException,e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "FindFirstScope Failed: %x\n",sc ));
SetErrorInfo( sc );
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::FindNextScope, public
//
// Synopsis: Scope enumerator. Scans for next scope in the list
//
// Arguments: [pfFound] -- out param, True --> Found next scope
//
// Returns: SO_OK upon success, other values upon faillure
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCatAdm::FindNextScope(VARIANT_BOOL * pfFound)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
if ( !IsCurrentObjectValid() )
{
odmDebugOut(( DEB_ERROR, "Invalid catalog\n" ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else
{
_cEnumIndex++;
if ( _cEnumIndex < _aIScopeAdmin.Count() )
{
Win4Assert( _aIScopeAdmin[0] );
*pfFound = VARIANT_TRUE;
}
else
{
*pfFound = VARIANT_FALSE;
}
}
}
CATCH ( CException,e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "FindNextScope Failed: %x\n",sc ));
SetErrorInfo( sc );
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::GetScope, public
//
// Synopsis: Scope enumerator. Returns IDispatch to current scope
//
// Arguments: [pIDisp] -- out param, IDispatch to current scope
//
// Returns: SO_OK upon success, other values upon faillure
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCatAdm::GetScope(IDispatch * * pIDisp)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
if ( !IsCurrentObjectValid() )
{
odmDebugOut(( DEB_ERROR, "Invalid catalog\n" ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else
{
if ( _cEnumIndex >= _aIScopeAdmin.Count() )
{
odmDebugOut(( DEB_ERROR, "No More Scopes, Index: %d\n", _cEnumIndex ));
sc = HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS);
}
else
{
Win4Assert( _aIScopeAdmin[_cEnumIndex] );
*pIDisp = GetIDisp(_cEnumIndex);
}
}
}
CATCH ( CException,e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "GetScope Failed: %x\n",sc ));
SetErrorInfo( sc );
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::get_CatalogName, public
//
// Synopsis: Gets the CatalogName Property
//
// Arguments: [pVal] -- out param, buffer containing catalog name
//
// Returns: S_OK upon success, other values upon failure.
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCatAdm::get_CatalogName(BSTR * pVal)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
if ( !IsCurrentObjectValid() )
{
odmDebugOut(( DEB_ERROR, "Invalid catalog: %ws\n", _xCatAdmin->GetName() ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else
{
WCHAR const * pwszName = _xCatAdmin->GetName();
*pVal = SysAllocString(pwszName);
if ( !*pVal )
{
odmDebugOut(( DEB_ERROR, "get_CatalogName Failed: Out of memory\n" ));
sc = E_OUTOFMEMORY;
}
}
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "get_CatalogName Failed: %x\n",sc ));
SetErrorInfo( sc );
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::get_CatalogLocation, public
//
// Synopsis: Gets the CatalogLocation property
//
// Arguments: [pVal] -- out param, buffer containing catalog location
//
// Returns: S_OK upon success, other values upon failure.
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCatAdm::get_CatalogLocation(BSTR * pVal)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
if ( !IsCurrentObjectValid() )
{
odmDebugOut(( DEB_ERROR, "Invalid catalog\n" ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else
{
WCHAR const * pwszLocation = _xCatAdmin->GetLocation();
*pVal = SysAllocString(pwszLocation);
if ( !*pVal )
{
odmDebugOut(( DEB_ERROR, "get_CatalogLocation Failed: Out of memory\n"));
sc = E_OUTOFMEMORY;
}
}
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "get_CatalogLocation Failed: %x\n",sc ));
SetErrorInfo( sc );
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::GetScopeByAlias, public
//
// Synopsis: Searches for scopes on this catalog by Alias
//
// Arguments: [bstrAlias] -- Alias to search for.
// [pIDisp] -- out param, IDispatch for CScopeAdmin if Alias matches
//
// Returns: S_OK upon success, other values upon failure.
//
// History: 12-10-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCatAdm::GetScopeByAlias(BSTR bstrAlias, IDispatch * * pIDisp)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
ValidateInputParam( bstrAlias );
if ( !IsCurrentObjectValid() )
{
odmDebugOut(( DEB_ERROR, "Invalid catalog: %ws\n", _xCatAdmin->GetName() ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else
{
unsigned cMaxScopes = _aIScopeAdmin.Count();
for ( DWORD i = 0; i < cMaxScopes; i++ )
{
Win4Assert( _aIScopeAdmin[i] );
CScopeAdmin * pScopeAdmin = _aIScopeAdmin[i]->GetScopeAdmin();
Win4Assert( pScopeAdmin );
if ( !_wcsicmp( pScopeAdmin->GetAlias(), bstrAlias ) )
{
*pIDisp = GetIDisp(i);
break;
}
}
//
// Scope not found
//
if ( i == cMaxScopes )
{
odmDebugOut(( DEB_ERROR, "GetScopeByAlias(%ws) Failed: Alias not found\n", bstrAlias ));
sc = HRESULT_FROM_WIN32(ERROR_NOT_FOUND);
}
}
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "GetScopeByAlias Failed: %x\n",sc ));
SetErrorInfo( sc );
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::get_WordListCount, public property
//
// Synopsis: returns catalog's WordListCount property
//
// Arguments: [pVal] -- out param
//
// Returns: S_OK upon success, other values upon failure.
//
// Notes: Property value is an unsigned, though it is being
// passed in as a signed LONG for compatiblity with automation
// clients (VB5, VB6 don't support unsigned long).
//
// History: 4-6-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCatAdm::get_WordListCount(LONG *pVal)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
CCatStateInfo & state = _xCatAdmin->State();
if ( !IsCurrentObjectValid() )
{
odmDebugOut(( DEB_ERROR, "Invalid catalog\n" ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else if ( GetTickCount() > _dwTickCount + UpdateInterval )
{
state.LokUpdate();
_dwTickCount = GetTickCount();
}
if ( state.IsValid() )
{
*pVal = state.GetWordListCount();
}
else
{
sc = state.GetErrorCode();
}
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "get_WordListCount Failed: %x\n",sc ));
SetErrorInfo( sc );
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::get_PersistentIndexCount, public property
//
// Synopsis: returns catalog's PersistentIndexCount property
//
// Arguments: [pVal] -- out param
//
// Returns: S_OK upon success, other values upon failure.
//
// Notes: Property value is an unsigned, though it is being
// passed in as a signed LONG for compatiblity with automation
// clients (VB5, VB6 don't support unsigned long).
//
// History: 4-6-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCatAdm::get_PersistentIndexCount(LONG *pVal)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
CCatStateInfo & state = _xCatAdmin->State();
if ( !IsCurrentObjectValid() )
{
odmDebugOut(( DEB_ERROR, "Invalid catalog\n" ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else if ( GetTickCount() > _dwTickCount + UpdateInterval )
{
state.LokUpdate();
_dwTickCount = GetTickCount();
}
if ( state.IsValid() )
{
*pVal = state.GetPersistentIndexCount();
}
else
{
sc = state.GetErrorCode();
}
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "get_PersistentIndexCount Failed: %x\n",sc ));
SetErrorInfo( sc );
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::get_QueryCount, public property
//
// Synopsis: returns catalog's QueryCount property
//
// Arguments: [pVal] -- out param,
//
// Returns: S_OK upon success, other values upon failure.
//
// Notes: Property value is an unsigned, though it is being
// passed in as a signed LONG for compatiblity with automation
// clients (VB5, VB6 don't support unsigned long).
//
// History: 4-6-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCatAdm::get_QueryCount(LONG *pVal)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
CCatStateInfo & state = _xCatAdmin->State();
if ( !IsCurrentObjectValid() )
{
odmDebugOut(( DEB_ERROR, "Invalid catalog\n" ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else if ( GetTickCount() > _dwTickCount + UpdateInterval )
{
state.LokUpdate();
_dwTickCount = GetTickCount();
}
if ( state.IsValid() )
{
*pVal = state.GetQueryCount();
}
else
{
sc = state.GetErrorCode();
}
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "get_QueryCount Failed: %x\n",sc ));
SetErrorInfo( sc );
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::get_DocumentsToFilter, public property
//
// Synopsis: returns catalog's DocumentsToFilter property
//
// Arguments: [pVal] -- out param,
//
// Returns: S_OK upon success, other values upon failure.
//
// Notes: Property value is an unsigned, though it is being
// passed in as a signed LONG for compatiblity with automation
// clients (VB5, VB6 don't support unsigned long).
//
// History: 4-6-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCatAdm::get_DocumentsToFilter(LONG *pVal)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
CCatStateInfo & state = _xCatAdmin->State();
if ( !IsCurrentObjectValid() )
{
odmDebugOut(( DEB_ERROR, "Invalid catalog\n" ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else if ( GetTickCount() > _dwTickCount + UpdateInterval )
{
state.LokUpdate();
_dwTickCount = GetTickCount();
}
if ( state.IsValid() )
{
*pVal = state.GetDocumentsToFilter();
}
else
{
sc = state.GetErrorCode();
}
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "get_DocumentsToFilter Failed: %x\n",sc ));
SetErrorInfo( sc );
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::get_FreshTestCount, public property
//
// Synopsis: returns catalog's FreshTestCount
//
// Arguments: [pVal] -- out param,
//
// Returns: S_OK upon success, other values upon failure.
//
// Notes: Property value is an unsigned, though it is being
// passed in as a signed LONG for compatiblity with automation
// clients (VB5, VB6 don't support unsigned long).
//
// History: 4-6-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCatAdm::get_FreshTestCount(LONG *pVal)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
CCatStateInfo & state = _xCatAdmin->State();
if ( !IsCurrentObjectValid() )
{
odmDebugOut(( DEB_ERROR, "Invalid catalog\n" ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else if ( GetTickCount() > _dwTickCount + UpdateInterval )
{
state.LokUpdate();
_dwTickCount = GetTickCount();
}
if ( state.IsValid() )
{
*pVal = state.GetFreshTestCount();
}
else
{
sc = state.GetErrorCode();
}
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "get_FreshTestCount Failed: %x\n",sc ));
SetErrorInfo( sc );
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::get_PctMergeComplete, public property
//
// Synopsis: returns catalog's PctMergeComplete property
//
// Arguments: [pVal] -- out param,
//
// Returns: S_OK upon success, other values upon failure.
//
// Notes: Property value is an unsigned, though it is being
// passed in as a signed LONG for compatiblity with automation
// clients (VB5, VB6 don't support unsigned long).
//
// History: 4-6-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCatAdm::get_PctMergeComplete(LONG *pVal)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
CCatStateInfo & state = _xCatAdmin->State();
if ( !IsCurrentObjectValid() )
{
odmDebugOut(( DEB_ERROR, "Invalid catalog\n" ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else if ( GetTickCount() > _dwTickCount + UpdateInterval )
{
state.LokUpdate();
_dwTickCount = GetTickCount();
}
if ( state.IsValid() )
{
*pVal = state.PctMergeComplete();
}
else
{
sc = state.GetErrorCode();
}
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "get_PctMergeComplete Failed: %x\n",sc ));
SetErrorInfo( sc );
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::get_FilteredDocumentCount, public property
//
// Synopsis: returns catalog's FilteredDocumentCount property
//
// Arguments: [pVal] -- out param,
//
// Returns: S_OK upon success, other values upon failure.
//
// Notes: Property value is an unsigned, though it is being
// passed in as a signed LONG for compatiblity with automation
// clients (VB5, VB6 don't support unsigned long).
//
// History: 4-6-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCatAdm::get_FilteredDocumentCount(LONG *pVal)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
CCatStateInfo & state = _xCatAdmin->State();
if ( !IsCurrentObjectValid() )
{
odmDebugOut(( DEB_ERROR, "Invalid catalog\n" ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else if ( GetTickCount() > _dwTickCount + UpdateInterval )
{
state.LokUpdate();
_dwTickCount = GetTickCount();
}
if ( state.IsValid() )
{
*pVal = state.GetFilteredDocumentCount();
}
else
{
sc = state.GetErrorCode();
}
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "get_FilteredDocumentCount Failed: %x\n",sc ));
SetErrorInfo( sc );
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::get_TotalDocumentCount, public property
//
// Synopsis: returns catalog's TotalDocumentCount property
//
// Arguments: [pVal] -- out param,
//
// Returns: S_OK upon success, other values upon failure.
//
// Notes: Property value is an unsigned, though it is being
// passed in as a signed LONG for compatiblity with automation
// clients (VB5, VB6 don't support unsigned long).
//
// History: 4-6-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCatAdm::get_TotalDocumentCount(LONG *pVal)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
CCatStateInfo & state = _xCatAdmin->State();
if ( !IsCurrentObjectValid() )
{
odmDebugOut(( DEB_ERROR, "Invalid catalog\n" ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else if ( GetTickCount() > _dwTickCount + UpdateInterval )
{
state.LokUpdate();
_dwTickCount = GetTickCount();
}
if ( state.IsValid() )
{
*pVal = state.GetTotalDocumentCount();
}
else
{
sc = state.GetErrorCode();
}
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "get_TotalDocumentCount Failed: %x\n",sc ));
SetErrorInfo( sc );
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::get_PendingScanCount, public property
//
// Synopsis: returns catalog's PendingDocumentCount property
//
// Arguments: [pVal] -- out param,
//
// Returns: S_OK upon success, other values upon failure.
//
// Notes: Property value is an unsigned, though it is being
// passed in as a signed LONG for compatiblity with automation
// clients (VB5, VB6 don't support unsigned long).
//
// History: 4-6-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCatAdm::get_PendingScanCount(LONG *pVal)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
CCatStateInfo & state = _xCatAdmin->State();
if ( !IsCurrentObjectValid() )
{
odmDebugOut(( DEB_ERROR, "Invalid catalog\n" ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else if ( GetTickCount() > _dwTickCount + UpdateInterval )
{
state.LokUpdate();
_dwTickCount = GetTickCount();
}
if ( state.IsValid() )
{
*pVal = state.GetPendingScanCount();
}
else
{
sc = state.GetErrorCode();
}
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "get_PendingScanCount Failed: %x\n",sc ));
SetErrorInfo( sc );
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::get_IndexSize, public property
//
// Synopsis: returns catalog's IndexSize property
//
// Arguments: [pVal] -- out param,
//
// Returns: S_OK upon success, other values upon failure.
//
// Notes: Property value is an unsigned, though it is being
// passed in as a signed LONG for compatiblity with automation
// clients (VB5, VB6 don't support unsigned long).
//
// History: 4-6-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCatAdm::get_IndexSize(LONG *pVal)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
CCatStateInfo & state = _xCatAdmin->State();
if ( !IsCurrentObjectValid() )
{
odmDebugOut(( DEB_ERROR, "Invalid catalog\n" ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else if ( GetTickCount() > _dwTickCount + UpdateInterval )
{
state.LokUpdate();
_dwTickCount = GetTickCount();
}
if ( state.IsValid() )
{
*pVal = state.GetIndexSize();
}
else
{
sc = state.GetErrorCode();
}
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "get_IndexSize Failed: %x\n",sc ));
SetErrorInfo( sc );
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::get_UniqueKeyCount, public property
//
// Synopsis: returns catalog's UniqueKeyCount
//
// Arguments: [pVal] -- out param,
//
// Returns: S_OK upon success, other values 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: 4-6-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCatAdm::get_UniqueKeyCount(LONG *pVal)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
CCatStateInfo & state = _xCatAdmin->State();
if ( !IsCurrentObjectValid() )
{
odmDebugOut(( DEB_ERROR, "Invalid catalog\n" ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else if ( GetTickCount() > _dwTickCount + UpdateInterval )
{
state.LokUpdate();
_dwTickCount = GetTickCount();
}
if ( state.IsValid() )
{
*pVal = state.GetUniqueKeyCount();
}
else
{
sc = state.GetErrorCode();
}
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "get_UniqueKeyCount Failed: %x\n",sc ));
SetErrorInfo( sc );
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::get_StateInfo, public property
//
// Synopsis: returns catalog's StateInformation
//
// Arguments: [pVal] -- out param,
//
// Returns: S_OK upon success, other values 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: 4-6-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCatAdm::get_StateInfo(LONG *pVal)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
CCatStateInfo & state = _xCatAdmin->State();
if ( !IsCurrentObjectValid() )
{
odmDebugOut(( DEB_ERROR, "Invalid catalog\n" ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else if ( GetTickCount() > _dwTickCount + UpdateInterval )
{
state.LokUpdate();
_dwTickCount = GetTickCount();
}
if ( state.IsValid() )
{
*pVal = state.GetStateInfo();
}
else
{
sc = state.GetErrorCode();
}
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "get_StateInfo Failed: %x\n",sc ));
SetErrorInfo( sc );
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::get_IsUpToDate, public property
//
// Synopsis: property is TRUE if catalog is up to date.
//
// Arguments: [pVal] -- out param,
//
// Returns: S_OK upon success, other values upon failure.
//
// History: 4-6-97 mohamedn created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCatAdm::get_IsUpToDate(VARIANT_BOOL *pVal)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
CCatStateInfo & state = _xCatAdmin->State();
if ( !IsCurrentObjectValid() )
{
odmDebugOut(( DEB_ERROR, "Invalid catalog\n" ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else if ( GetTickCount() > _dwTickCount + UpdateInterval )
{
state.LokUpdate();
_dwTickCount = GetTickCount();
}
if ( state.IsValid() )
{
DWORD currentState = state.GetStateInfo();
if ( 0 != state.GetDocumentsToFilter() ||
currentState & CI_STATE_CONTENT_SCAN_REQUIRED ||
currentState & CI_STATE_SCANNING ||
currentState & CI_STATE_RECOVERING ||
currentState & CI_STATE_READING_USNS ||
currentState & CI_STATE_STARTING )
{
*pVal = VARIANT_FALSE;
}
else
{
*pVal = VARIANT_TRUE;
}
}
else
{
sc = state.GetErrorCode();
}
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "get_IsUpToDate Failed: %x\n",sc ));
SetErrorInfo( sc );
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::get_DelayedFilterCount, public property
//
// Synopsis: returns catalog's DelayedFilterCount property
//
// Arguments: [pVal] -- out param
//
// Returns: S_OK upon success, other values upon failure.
//
// Notes: out value is an unsigned value, though it is being
// passed as a signed LONG for compatiblity with automation
// clients (VB5, VB6 don't support unsigned long).
//
// History: 4-14-98 vikasman created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCatAdm::get_DelayedFilterCount(LONG *pVal)
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
CCatStateInfo & state = _xCatAdmin->State();
if ( !IsCurrentObjectValid() )
{
odmDebugOut(( DEB_ERROR, "Invalid catalog\n" ));
sc = HRESULT_FROM_WIN32( ERROR_INVALID_STATE );
}
else if ( GetTickCount() > _dwTickCount + UpdateInterval )
{
state.LokUpdate();
_dwTickCount = GetTickCount();
}
if ( state.IsValid() )
{
*pVal = state.GetDelayedFilterCount();
}
else
{
sc = state.GetErrorCode();
}
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "get_DelayedFilterCount Failed: %x\n",sc ));
SetErrorInfo( sc );
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::PauseCatalog, public
//
// Synopsis: Pauses the catalog
//
// Returns: S_OK upon success, other values upon failure.
//
// Arguments: [pdwOldState] -- out param, DWORD indicating the previous
// state of the catalog
//
// History: 08-03-98 kitmanh created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCatAdm::PauseCatalog( CatalogStateType * pdwOldState )
{
Win4Assert( CICAT_STOPPED == csStopped );
Win4Assert( CICAT_READONLY == csReadOnly );
Win4Assert( CICAT_WRITABLE == csWritable );
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
DWORD dwOldState;
sc = SetCatalogState ( _xCatAdmin->GetName(),
_xCatAdmin->GetMachName(),
CICAT_READONLY,
&dwOldState );
// mask off the no_query bit
*pdwOldState = (CatalogStateType)(dwOldState & (~CICAT_NO_QUERY));
}
CATCH ( CException,e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "PauseCatalog Failed: %x\n",sc ));
SetErrorInfo(sc);
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::StartCatalog, public
//
// Synopsis: Starts the catalog
//
// Returns: S_OK upon success, other values upon failure.
//
// Arguments: [pdwOldState] -- out param, DWORD indicating the previous
// state of the catalog
//
// History: 08-05-98 kitmanh created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCatAdm::StartCatalog( CatalogStateType * pdwOldState )
{
Win4Assert( CICAT_STOPPED == csStopped );
Win4Assert( CICAT_READONLY == csReadOnly );
Win4Assert( CICAT_WRITABLE == csWritable );
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
DWORD dwOldState;
sc = SetCatalogState ( _xCatAdmin->GetName(),
_xCatAdmin->GetMachName(),
CICAT_WRITABLE,
&dwOldState );
// mask off the no_query bit
*pdwOldState = (CatalogStateType)(dwOldState & (~CICAT_NO_QUERY));
}
CATCH ( CException,e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "StartCatalog Failed: %x\n",sc ));
SetErrorInfo(sc);
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::StopCatalog, public
//
// Synopsis: Stops the catalog
//
// Returns: S_OK upon success, other values upon failure.
//
// Arguments: [pdwOldState] -- out param, DWORD indicating the previous
// state of the catalog
//
// History: 08-05-98 kitmanh created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCatAdm::StopCatalog( CatalogStateType * pdwOldState )
{
Win4Assert( CICAT_STOPPED == csStopped );
Win4Assert( CICAT_READONLY == csReadOnly );
Win4Assert( CICAT_WRITABLE == csWritable );
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
DWORD dwOldState;
sc = SetCatalogState ( _xCatAdmin->GetName(),
_xCatAdmin->GetMachName(),
CICAT_STOPPED,
&dwOldState );
// mask off the no_query bit
*pdwOldState = (CatalogStateType)(dwOldState & (~CICAT_NO_QUERY));
}
CATCH ( CException,e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "StopCatalog Failed: %x\n",sc ));
SetErrorInfo(sc);
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::ContinueCatalog, public
//
// Synopsis: Continues the catalog
//
// Returns: S_OK upon success, other values upon failure.
//
// Arguments: [pdwOldState] -- out param, DWORD indicating the previous
// state of the catalog
//
// History: 09-08-98 kitmanh created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCatAdm::ContinueCatalog( CatalogStateType * pdwOldState )
{
Win4Assert( CICAT_STOPPED == csStopped );
Win4Assert( CICAT_READONLY == csReadOnly );
Win4Assert( CICAT_WRITABLE == csWritable );
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
DWORD dwOldState;
sc = SetCatalogState ( _xCatAdmin->GetName(),
_xCatAdmin->GetMachName(),
CICAT_WRITABLE,
&dwOldState );
// mask off the no_query bit
*pdwOldState = (CatalogStateType)(dwOldState & (~CICAT_NO_QUERY));
}
CATCH ( CException,e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "ContinueCatalog Failed: %x\n",sc ));
SetErrorInfo(sc);
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::IsCatalogRunning, public
//
// Synopsis: check if the catalog is in R/W mode
//
// Returns: S_OK upon success, other values upon failure.
//
// Arguments: [pfIsRunning] -- out param
//
// History: 08-10-98 kitmanh created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCatAdm::IsCatalogRunning( VARIANT_BOOL *pfIsRunning )
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
DWORD dwOldState;
sc = SetCatalogState ( _xCatAdmin->GetName(),
_xCatAdmin->GetMachName(),
CICAT_GET_STATE,
&dwOldState );
*pfIsRunning = ( ( CICAT_WRITABLE & dwOldState ) &&
!( CICAT_NO_QUERY & dwOldState) ) ? VARIANT_TRUE : VARIANT_FALSE;
}
CATCH ( CException,e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "IsCatalogRunning Failed: %x\n",sc ));
SetErrorInfo(sc);
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::IsCatalogPaused, public
//
// Synopsis: check if the catalog is paused (read-only)
//
// Returns: S_OK upon success, other values upon failure.
//
// Arguments: [pfIsPaused] -- out param
//
// History: 08-10-98 kitmanh created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCatAdm::IsCatalogPaused( VARIANT_BOOL *pfIsPaused )
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
DWORD dwOldState;
sc = SetCatalogState ( _xCatAdmin->GetName(),
_xCatAdmin->GetMachName(),
CICAT_GET_STATE,
&dwOldState );
*pfIsPaused = (CICAT_READONLY & dwOldState) ? VARIANT_TRUE : VARIANT_FALSE;
}
CATCH ( CException,e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "IsCatalogPaused Failed: %x\n",sc ));
SetErrorInfo(sc);
}
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CCatAdm::IsCatalogStopped, public
//
// Synopsis: check if the catalog is stopped
//
// Returns: S_OK upon success, other values upon failure.
//
// Arguments: [pfIsStopped] -- out param
//
// History: 08-10-98 kitmanh created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCatAdm::IsCatalogStopped( VARIANT_BOOL *pfIsStopped )
{
SCODE sc = S_OK;
CLock lock(_mtx);
TRANSLATE_EXCEPTIONS;
TRY
{
SafeForScripting();
DWORD dwOldState;
sc = SetCatalogState ( _xCatAdmin->GetName(),
_xCatAdmin->GetMachName(),
CICAT_GET_STATE,
&dwOldState );
*pfIsStopped = (CICAT_STOPPED & dwOldState) ? VARIANT_TRUE : VARIANT_FALSE;
}
CATCH ( CException,e )
{
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
if ( FAILED(sc) )
{
odmDebugOut(( DEB_ERROR, "IsCatalogStopped Failed: %x\n",sc ));
SetErrorInfo(sc);
}
return sc;
}