windows-nt/Source/XPSP1/NT/inetsrv/query/fsci/dll/scopeenm.hxx
2020-09-26 16:20:57 +08:00

207 lines
5.5 KiB
C++

//+-------------------------------------------------------------------------
//
// Copyright (C) Microsoft Corporation, 1992 - 2000.
//
// File: scopenm.hxx
//
// Contents: Scope enumerator for file systems
//
// History: 12-Dec-96 SitaramR Created
//
//--------------------------------------------------------------------------
#pragma once
#include <dirstk.hxx>
#include <ciintf.h>
#include <ffenum.hxx>
#include <propret.hxx>
#include <catalog.hxx>
const DIRECTORY_QUOTA = 30; // Current directory's quota is 30%,
// remaining 70% is for sub-directories
const SHALLOW_DIR_LIMIT = 90; // For shallow scope enumeration,
// RatioFinished goes upto 90% and
// then stays put
const FINDFIRST_BUFFER = 0x1000; // Size of buffer to retrieve in a
// single call to FindFirst.
//+-------------------------------------------------------------------------
//
// Class: CScopeEnum
//
// Purpose: Enumerator by scope for file stores
//
// History: 17-May-93 KyleP Created
//
// Notes: This class provides a true one-object-at-a-time enumerator
// on top of the base NT scope enumerator.
//
//--------------------------------------------------------------------------
class CScopeEnum : public CGenericPropRetriever, ICiCScopeEnumerator
{
public:
//
// From IUnknown
//
virtual SCODE STDMETHODCALLTYPE QueryInterface( REFIID riid, void **ppvObject );
virtual ULONG STDMETHODCALLTYPE AddRef();
virtual ULONG STDMETHODCALLTYPE Release();
//
// From CGenericPropRetriever
//
SCODE STDMETHODCALLTYPE BeginPropertyRetrieval( WORKID wid );
SCODE STDMETHODCALLTYPE IsInScope( BOOL *pfInScope);
//
// From ICiCScopeEnumerator
//
SCODE STDMETHODCALLTYPE Begin();
SCODE STDMETHODCALLTYPE CurrentDocument( WORKID *pWorkId);
SCODE STDMETHODCALLTYPE NextDocument( WORKID *pWorkId );
SCODE STDMETHODCALLTYPE RatioFinished( ULONG *pulDenominator,
ULONG *pulNumerator);
SCODE STDMETHODCALLTYPE End();
//
// Local methods
//
CScopeEnum( PCatalog & cat,
ICiQueryPropertyMapper *pQueryPropMapper,
CSecurityCache & secCache,
BOOL fUsePathAlias,
CRestriction const & scope );
protected:
virtual ~CScopeEnum();
WORKID NextObject();
//
// Stat properties.
//
inline UNICODE_STRING const * GetName();
inline UNICODE_STRING const * GetShortName();
inline UNICODE_STRING const * GetPath();
UNICODE_STRING const * GetVirtualPath();
inline LONGLONG CreateTime();
inline LONGLONG ModifyTime();
inline LONGLONG AccessTime();
inline LONGLONG ObjectSize();
inline ULONG Attributes();
private:
void PushScope( CScopeRestriction const & scp );
BOOL Refresh();
HANDLE _hDir; // Handle to current directory
CDirEntry const * _pCurEntry; // Position in buffer of current entry
WORKID _widCurrent; // Wid on which the scope enumerator
// is currently positioned
XArray<BYTE> _xbBuf; // Buffer for results
CDirStack _stack; // Stack of directories
UNICODE_STRING _Name;
UNICODE_STRING _ShortName;
UNICODE_STRING _Path; // Path sans filename for items in
// buffer.
CRestriction const & _scope; // Scope to enumerate
XPtr<CDirStackEntry> _xDirStackEntry; // Pointer to current directory entry
int _iFirstSubDir; // Index to first sub-directory on stack
ULONG _num; // Current value of numerator
ULONG _numHighValue; // Numerator's high watermark for current dir
ULONG _numLowValue; // Numerator's low watermark for current dir
UNICODE_STRING _VPath; // Virtual path support
// Limited to MAX_PATH, but so is IIS
WCHAR _awcVPath[MAX_PATH]; // Virtual path support
BOOL _fNullCatalog; // Are we dealing with a null catalog?
};
inline UNICODE_STRING const * CScopeEnum::GetName()
{
_Name.Length = _Name.MaximumLength = _pCurEntry->FilenameSize();
//
// We really need a UNICODE_STRING with a WCHAR const * Buffer.
//
_Name.Buffer = (WCHAR *)_pCurEntry->Filename();
return( &_Name );
}
inline UNICODE_STRING const * CScopeEnum::GetShortName()
{
_ShortName.Length = _ShortName.MaximumLength = _pCurEntry->ShortNameSize();
//
// We really need a UNICODE_STRING with a WCHAR const * Buffer.
//
_ShortName.Buffer = (WCHAR *)_pCurEntry->ShortName();
return( &_ShortName );
}
inline UNICODE_STRING const * CScopeEnum::GetPath()
{
return( &_Path );
}
inline LONGLONG CScopeEnum::CreateTime()
{
return( _pCurEntry->CreateTime() );
}
inline LONGLONG CScopeEnum::ModifyTime()
{
return( _pCurEntry->ModifyTime() );
}
inline LONGLONG CScopeEnum::AccessTime()
{
return( _pCurEntry->AccessTime() );
}
inline LONGLONG CScopeEnum::ObjectSize()
{
return( _pCurEntry->ObjectSize() );
}
inline ULONG CScopeEnum::Attributes()
{
return( _pCurEntry->Attributes() );
}