459 lines
12 KiB
C++
459 lines
12 KiB
C++
//+-------------------------------------------------------------------------
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1993.
|
|
//
|
|
// File: metapenm.cxx
|
|
//
|
|
// Contents: Meta property enumerator
|
|
//
|
|
// History: 12-Dec-96 SitaramR Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#include <pch.cxx>
|
|
#pragma hdrstop
|
|
|
|
#include <metapenm.hxx>
|
|
#include <catalog.hxx>
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Member: CMetaPropEnum::CMetaPropEnum, public
|
|
//
|
|
// Synopsis: Constructor
|
|
//
|
|
// Arguments: [cat] -- Catalog
|
|
// [pQueryPropMapper] -- Pid Remapper associated with the query
|
|
// [secCache] -- Cache of AccessCheck() results
|
|
// [fUsePathAlias] -- TRUE if client is going through rdr/svr
|
|
//
|
|
// History: 19-Aug-93 KyleP Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
CMetaPropEnum::CMetaPropEnum( PCatalog & cat,
|
|
ICiQueryPropertyMapper *pQueryPropMapper,
|
|
CSecurityCache & secCache,
|
|
BOOL fUsePathAlias )
|
|
: CGenericPropRetriever( cat,
|
|
pQueryPropMapper,
|
|
secCache,
|
|
0 ), // Never fixup 'path'
|
|
_iBmk( 0 )
|
|
{
|
|
_Path.Buffer = _awcGuid;
|
|
_Path.Length = ccStringizedGuid * sizeof(WCHAR);
|
|
}
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Member: CMetaPropEnum::~CMetaPropEnum, public
|
|
//
|
|
// Synopsis: Destructor
|
|
//
|
|
// History: 19-Aug-93 KyleP Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
CMetaPropEnum::~CMetaPropEnum()
|
|
{
|
|
}
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Member: CMetaPropEnum::NextObject, public
|
|
//
|
|
// Synopsis: Move to next object
|
|
//
|
|
// Returns: Work id of next valid object, or widInvalid if end of
|
|
// iteration.
|
|
//
|
|
// History: 19-Aug-93 KyleP Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
WORKID CMetaPropEnum::NextObject()
|
|
{
|
|
if ( !_cat.EnumerateProperty( _psCurrent, _cbCurrent, _typeCurrent,
|
|
_storeLevelCurrent, _fModifiableCurrent,
|
|
_iBmk ) )
|
|
return widInvalid;
|
|
|
|
//
|
|
// String-ify the guid
|
|
//
|
|
|
|
swprintf( _awcGuid,
|
|
L"%08lX-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X",
|
|
_psCurrent.GetPropSet().Data1,
|
|
_psCurrent.GetPropSet().Data2,
|
|
_psCurrent.GetPropSet().Data3,
|
|
_psCurrent.GetPropSet().Data4[0], _psCurrent.GetPropSet().Data4[1],
|
|
_psCurrent.GetPropSet().Data4[2], _psCurrent.GetPropSet().Data4[3],
|
|
_psCurrent.GetPropSet().Data4[4], _psCurrent.GetPropSet().Data4[5],
|
|
_psCurrent.GetPropSet().Data4[6], _psCurrent.GetPropSet().Data4[7] );
|
|
|
|
//
|
|
// String-ify the PropId, if appropriate.
|
|
//
|
|
|
|
if ( _psCurrent.IsPropertyPropid() )
|
|
{
|
|
_Name.Length = (USHORT)(sizeof(WCHAR) * swprintf( _awcPropId, L"%u", _psCurrent.GetPropertyPropid() ));
|
|
_Name.Buffer = _awcPropId;
|
|
}
|
|
else
|
|
{
|
|
_Name.Buffer = (WCHAR *)_psCurrent.GetPropertyName();
|
|
_Name.Length = sizeof(WCHAR) * wcslen( _Name.Buffer );
|
|
}
|
|
|
|
return _iBmk;
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Member: CMetaPropEnum::GetPropGuid
|
|
//
|
|
// Synopsis: Returns guid property
|
|
//
|
|
// History: 12-Dec-96 SitaramR Added header
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
BOOL CMetaPropEnum::GetPropGuid( GUID & guid )
|
|
{
|
|
RtlCopyMemory( &guid, &(_psCurrent.GetPropSet()), sizeof(guid) );
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Member: CMetaPropEnum::GetPropPid
|
|
//
|
|
// Synopsis: Returns propid property
|
|
//
|
|
// History: 12-Dec-96 SitaramR Added header
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
PROPID CMetaPropEnum::GetPropPropid()
|
|
{
|
|
if ( _psCurrent.IsPropertyPropid() )
|
|
return _psCurrent.GetPropertyPropid();
|
|
else
|
|
return pidInvalid;
|
|
}
|
|
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Member: CMetaPropEnum::GetPropName
|
|
//
|
|
// Synopsis: Returns propname property
|
|
//
|
|
// History: 12-Dec-96 SitaramR Added header
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
UNICODE_STRING const * CMetaPropEnum::GetPropName()
|
|
{
|
|
if ( _psCurrent.IsPropertyName() )
|
|
return &_Name;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Member: CMetaPropEnum::BeginPropertyRetrieval
|
|
//
|
|
// Synopsis: Prime wid for property retrieval
|
|
//
|
|
// Arguments: [wid] -- Wid to prime
|
|
//
|
|
// History: 12-Dec-96 SitaramR Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
SCODE STDMETHODCALLTYPE CMetaPropEnum::BeginPropertyRetrieval( WORKID wid )
|
|
{
|
|
//
|
|
// Check that we are retrieving the property for the wid on
|
|
// which we are currently positioned
|
|
//
|
|
Win4Assert( wid == _widCurrent );
|
|
Win4Assert( _widPrimedForPropRetrieval == widInvalid );
|
|
|
|
if ( wid == _widCurrent )
|
|
{
|
|
_widPrimedForPropRetrieval = _widCurrent;
|
|
return S_OK;
|
|
}
|
|
else
|
|
return E_FAIL;
|
|
}
|
|
|
|
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Member: CMetaPropEnum::IsInScope
|
|
//
|
|
// Synopsis: Checks if current wid is in scope
|
|
//
|
|
// Arguments: [pfInScope] -- Scope check result returned here
|
|
//
|
|
// History: 12-Dec-96 SitaramR Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
SCODE STDMETHODCALLTYPE CMetaPropEnum::IsInScope( BOOL *pfInScope )
|
|
{
|
|
if ( widInvalid == _widPrimedForPropRetrieval )
|
|
return CI_E_WORKID_NOTVALID;
|
|
|
|
*pfInScope = TRUE;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Member: CMetaPropEnum::CheckSecurity
|
|
//
|
|
// Synopsis: Test wid for security access
|
|
//
|
|
// Arguments: [am] -- Access Mask
|
|
// [pfGranted] -- Result of security check returned here
|
|
//
|
|
// History: 12-Dec-96 SitaramR Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
SCODE STDMETHODCALLTYPE CMetaPropEnum::CheckSecurity( ACCESS_MASK am,
|
|
BOOL *pfGranted)
|
|
{
|
|
if ( _widPrimedForPropRetrieval == widInvalid )
|
|
return CI_E_WORKID_NOTVALID;
|
|
|
|
*pfGranted = TRUE;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Member: CMetaPropEnum::Begin
|
|
//
|
|
// Synopsis: Begins an enumeration
|
|
//
|
|
// History: 12-Dec-96 SitaramR Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
SCODE STDMETHODCALLTYPE CMetaPropEnum::Begin()
|
|
{
|
|
SCODE sc = S_OK;
|
|
|
|
TRY
|
|
{
|
|
_iBmk = 0;
|
|
|
|
_widCurrent = NextObject();
|
|
}
|
|
CATCH( CException, e )
|
|
{
|
|
sc = e.GetErrorCode();
|
|
|
|
vqDebugOut(( DEB_ERROR,
|
|
"CMetaPropEnum::Begin - Exception caught 0x%x\n",
|
|
sc ));
|
|
}
|
|
END_CATCH;
|
|
|
|
return sc;
|
|
}
|
|
|
|
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Member: CMetaPropEnum::CurrentDocument
|
|
//
|
|
// Synopsis: Returns current document
|
|
//
|
|
// Arguments: [pWorkId] -- Wid of current doc returned here
|
|
//
|
|
// History: 12-Dec-96 SitaramR Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
SCODE STDMETHODCALLTYPE CMetaPropEnum::CurrentDocument( WORKID *pWorkId )
|
|
{
|
|
*pWorkId = _widCurrent;
|
|
if ( _widCurrent == widInvalid )
|
|
return CI_S_END_OF_ENUMERATION;
|
|
else
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Member: CMetaPropEnum::NextDocument
|
|
//
|
|
// Synopsis: Returns next document
|
|
//
|
|
// Arguments: [pWorkId] -- Wid of next doc returned here
|
|
//
|
|
// History: 12-Dec-96 SitaramR Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
SCODE STDMETHODCALLTYPE CMetaPropEnum::NextDocument( WORKID *pWorkId )
|
|
{
|
|
SCODE sc = S_OK;
|
|
|
|
TRY
|
|
{
|
|
_widCurrent = NextObject();
|
|
|
|
sc = CurrentDocument( pWorkId );
|
|
}
|
|
CATCH( CException, e )
|
|
{
|
|
sc = e.GetErrorCode();
|
|
|
|
vqDebugOut(( DEB_ERROR,
|
|
"CMetaPropEnum::NextDocument - Exception caught 0x%x\n",
|
|
sc ));
|
|
}
|
|
END_CATCH;
|
|
|
|
return sc;
|
|
}
|
|
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Member: CMetaPropEnum::End
|
|
//
|
|
// Synopsis: Ends an enumeration
|
|
//
|
|
// History: 12-Dec-96 SitaramR Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
SCODE STDMETHODCALLTYPE CMetaPropEnum::End()
|
|
{
|
|
_widCurrent = widInvalid;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Method: CMetaPropEnum::AddRef
|
|
//
|
|
// Synopsis: Increments refcount
|
|
//
|
|
// History: 12-Dec-1996 SitaramR Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
ULONG STDMETHODCALLTYPE CMetaPropEnum::AddRef()
|
|
{
|
|
return CGenericPropRetriever::AddRef();
|
|
}
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Method: CMetaPropEnum::Release
|
|
//
|
|
// Synopsis: Decrement refcount. Delete if necessary.
|
|
//
|
|
// History: 12-Dec-1996 SitaramR Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
ULONG STDMETHODCALLTYPE CMetaPropEnum::Release()
|
|
{
|
|
return CGenericPropRetriever::Release();
|
|
}
|
|
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Method: CMetaPropEnum::QueryInterface
|
|
//
|
|
// Synopsis: Rebind to other interface
|
|
//
|
|
// Arguments: [riid] -- IID of new interface
|
|
// [ppvObject] -- New interface * returned here
|
|
//
|
|
// Returns: S_OK if bind succeeded, E_NOINTERFACE if bind failed
|
|
//
|
|
// History: 12-Dec-1996 SitaramR Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
SCODE STDMETHODCALLTYPE CMetaPropEnum::QueryInterface(
|
|
REFIID riid,
|
|
void ** ppvObject)
|
|
{
|
|
if ( IID_ICiCScopeEnumerator == riid )
|
|
*ppvObject = (ICiCScopeEnumerator *)this;
|
|
else if ( IID_ICiCPropRetriever == riid )
|
|
*ppvObject = (ICiCPropRetriever *)this;
|
|
else if ( IID_IUnknown == riid )
|
|
*ppvObject = (IUnknown *)(ICiCScopeEnumerator *) this;
|
|
else
|
|
{
|
|
*ppvObject = 0;
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
AddRef();
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CMetaPropEnum::RatioFinished, public
|
|
//
|
|
// Synopsis: Returns query progress estimate
|
|
//
|
|
// Arguments: [denom] -- Denominator returned here
|
|
// [num] -- Numerator returned here
|
|
//
|
|
// History: 12-Dec-96 SitaramR Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
SCODE STDMETHODCALLTYPE CMetaPropEnum::RatioFinished (ULONG *pDenom, ULONG *pNum)
|
|
{
|
|
*pNum = 50;
|
|
*pDenom = 100;
|
|
|
|
return S_OK;
|
|
}
|
|
|