//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1998. // // File: scopetbl.hxx // // Contents: Persistent scope table // // Classes: CCiScopeTable // // History: 14-Jul-97 SitaramR Created from dlnotify.hxx // //---------------------------------------------------------------------------- #pragma once #include #include #include #include #include #include "scaninfo.hxx" #include "acinotfy.hxx" #include "usnlist.hxx" #include "usnmgr.hxx" class CiCat; class CCiNotifyMgr; class CClientDocStore; extern WCHAR GetDriveLetterOfAnyScope( WCHAR const * pwcCatalog ); //+--------------------------------------------------------------------------- // // Class: CCiScopeUsrHdr // // Purpose: Format of the user header area in the scope table. // // History: 1-26-96 srikants Created // 3-06-98 kitmanh Added IsReadOnly method() // // Notes: // //---------------------------------------------------------------------------- class CCiScopeUsrHdr { enum { CURRENT_VERSION = 1 }; public: CCiScopeUsrHdr * GetPointer() { return this; } // ULONG GetVersion() const { return _nVersion; } // void SetVersion( ULONG nVersion ) { _nVersion = nVersion; } // BOOL IsCurrentVersion() const { return CURRENT_VERSION == _nVersion; } // void SetCurrentVersion() { _nVersion = CURRENT_VERSION; } BOOL IsInitialized() const { return 0 != _nVersion; } void Initialize() { RtlZeroMemory( this, sizeof(CCiScopeUsrHdr) ); _nVersion = CURRENT_VERSION; } BOOL IsCiDataCorrupt() const { return _corruptInfo & eCiDataCorrupt; } BOOL IsFsCiDataCorrupt() const { return _corruptInfo & eFsCiDataCorrupt; } void SetCiDataCorrupt() { _corruptInfo |= eCiDataCorrupt; } void SetFsCiDataCorrupt() { _corruptInfo |= eFsCiDataCorrupt; } void ClearCiDataCorrupt() { _corruptInfo &= ~eCiDataCorrupt; } void ClearFsCiDataCorrupt() { _corruptInfo &= ~eFsCiDataCorrupt; } void SetFullScanNeeded() { _fFullScan = TRUE; } void ClearFullScanNeeded() { _fFullScan = FALSE; } BOOL IsFullScanNeeded() const { return _fFullScan; } private: enum ECorruptInfo { eNoCorruption = 0x0, eCiDataCorrupt = 0x1, eFsCiDataCorrupt = 0x2 }; ULONG _nVersion; // Version number - unused FILETIME _ftLastScan; // Time of the last successful scan ULONG _corruptInfo; // Set to TRUE if there is corruption BOOL _fFullScan; // Set to TRUE if full scan is needed }; //+--------------------------------------------------------------------------- // // Class: CCiScopeTable // // Purpose: Manages the persistent table of scopes that are of indexed // in a specific downlevel CI. // // History: 1-22-96 srikants Created // 2-20-98 kitmanh Move ClearCiDataCorrupt to scopetbl.cxx // // Notes: // //---------------------------------------------------------------------------- const LONGLONG eSigCiScopeTable = 0x5158515851585158i64; const LONGLONG eFtCorrection = 2 * 60 * 1000 * 10000; // 2 minutes in 100 // nanosecond intervals class CCiScopeTable { enum EContentScanState { eNoScan, eIncrScanNeeded, eFullScanNeeded, eDoingFullScan, eDoingIncrScan }; public: CCiScopeTable( CiCat & cicat, CCiNotifyMgr & notifyMgr, CCiScanMgr & scanMgr, CUsnMgr & usnMgr ) : _cicat(cicat), _notifyMgr(notifyMgr), _scanMgr(scanMgr), _usnMgr(usnMgr), _pTable(0), _state( eNoScan ), _fInitialized(FALSE) { } ~CCiScopeTable(); void FastInit(); void Empty(); BOOL IsInit() const { return 0 != _pTable; } BOOL Enumerate( WCHAR *pwcScope, unsigned cwc, unsigned & iBmk ); void AddScope( VOLUMEID volumeid, WCHAR const * pwcsScope, WCHAR const * pwcsCatScope = 0 ); void StartUp( CClientDocStore & docStore, PARTITIONID partId ); void ScanAllScopes( PARTITIONID partId ); void RemoveSubScopes( WCHAR const * pwcsScope, WCHAR const * pwcsCatScope = 0 ); void RemoveScope( WCHAR const * pwcsScope, WCHAR const * pwcsCatScope = 0 ); static void RefreshShadow( WCHAR const * pwcsPScope, WCHAR const * pwcsCatScope ); void ProcessChangesFlush(); void UpdateScanTime( WCHAR const * pwcsScope, FILETIME const & ft ); void MarkCiDataCorrupt(); void ClearCiDataCorrupt(); void MarkFsCiDataCorrupt() { _hdr.SetFsCiDataCorrupt(); _UpdateHeader(); } void ClearFsCiDataCorrupt() { _hdr.ClearFsCiDataCorrupt(); _UpdateHeader(); } BOOL IsCiDataCorrupt() const { return _hdr.IsCiDataCorrupt(); } BOOL IsFsCiDataCorrupt() const { return _hdr.IsFsCiDataCorrupt(); } BOOL IsDoingFullScan() const { return eDoingFullScan == _state; } BOOL IsFullScanNeeded() const { return eFullScanNeeded == _state; } BOOL IsIncrScanNeeded() const { return eIncrScanNeeded == _state; } void RecordFullScanNeeded(); void RecordIncrScanNeeded( BOOL fStartup ); void ScheduleScansIfNeeded(CClientDocStore & docStore); void RecordScansComplete(); void ProcessDiskFull( CClientDocStore & docStore, PARTITIONID partId ); void ClearDiskFull( CClientDocStore & docStore ); #if CIDBG==1 void Dump(); #endif private: CiCat & _cicat; CCiNotifyMgr & _notifyMgr; CCiScanMgr & _scanMgr; CUsnMgr & _usnMgr; CMutexSem _mutex; PRcovStorageObj * _pTable; EContentScanState _state; BOOL _fInitialized; union { CRcovUserHdr _usrHdr; CCiScopeUsrHdr _hdr; }; void _Serialize( CScopeInfoStack const & stk ); void _Serialize(); void _DeSerialize( CScopeInfoStack & stk ); void _UpdateHeader(); void _FatalCorruption(); void _LokScheduleScans( PARTITIONID partId, BOOL &fSerializeNotifyList ); };