237 lines
6.3 KiB
C++
237 lines
6.3 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// 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 <refcount.hxx>
|
|
#include <regevent.hxx>
|
|
#include <fatnot.hxx>
|
|
#include <rcstrmhd.hxx>
|
|
#include <cimbmgr.hxx>
|
|
|
|
#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 );
|
|
|
|
};
|
|
|
|
|