//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1999 // // File: scaninfo.hxx // // Contents: Scan scope info // // History: 1-23-96 srikants Created // //---------------------------------------------------------------------------- #pragma once //+--------------------------------------------------------------------------- // // Class: CCiScanInfo // // Purpose: A class to hold information for a single scope that must be // scanned. The class is used for regular scans and for scans on // usn enabled scopes. // // History: 1-19-96 srikants Created // 7-May-97 SitaramR Usns // //---------------------------------------------------------------------------- class CCiScanInfo : public CDoubleLink { enum EState { eStart, eRetry, eDone }; enum EWorkType { eNone, eScan, eDelete, eRename, eMonitor, eFullUsnScan }; public: enum { MAX_RETRIES = 8 }; CCiScanInfo( XArray & xPath, PARTITIONID partId, ULONG updFlag, BOOL fDoDeletions, VOLUMEID volumeId, USN usnStart, BOOL fUserInitiated = FALSE, BOOL fNewScope = FALSE ) : _state(eStart), _op(eNone), _pwcsRoot(xPath.Acquire()), _pwcsDirOldName(0), _fProcessRoot(FALSE), _partId(partId), _updFlag(updFlag), _nRetries(0), _fDoDeletions(fDoDeletions), _volumeId(volumeId), _usnStart(usnStart), _fUserInitiated( fUserInitiated ), _fNewScope( fNewScope ) { } ~CCiScanInfo() { delete [] _pwcsRoot; delete [] _pwcsDirOldName; } WCHAR const * GetPath() const { return _pwcsRoot; } WCHAR * GetPath() { return _pwcsRoot; } WCHAR * GetDirOldName() { return _pwcsDirOldName; } void CCiScanInfo::LokSetPath( WCHAR const *pwcsPath ) { ULONG ulLen = wcslen( pwcsPath ); if ( ulLen > wcslen( _pwcsRoot ) ) { delete [] _pwcsRoot; _pwcsRoot = 0; _pwcsRoot = new WCHAR[ulLen + 1]; } RtlCopyMemory( _pwcsRoot, pwcsPath, (ulLen+1) * sizeof( WCHAR ) ); } void CCiScanInfo::SetDirOldName( const WCHAR * pwcsDirOldName ) { ULONG ulLen = wcslen( pwcsDirOldName ); _pwcsDirOldName = new WCHAR[ulLen + 1]; RtlCopyMemory( _pwcsDirOldName, pwcsDirOldName, ( ulLen + 1 )*sizeof( WCHAR ) ); } BOOL GetProcessRoot() { return _fProcessRoot; } void SetProcessRoot() { _fProcessRoot = TRUE; } PARTITIONID PartitionId() const { return _partId; } ULONG GetFlags() const { return _updFlag; } void SetDoDeletions() { _fDoDeletions = TRUE; } BOOL IsDoDeletions() const { return _fDoDeletions; } unsigned GetRetries() const { return _nRetries; } void IncrementRetries() { _nRetries++; } BOOL IsRetryableError( NTSTATUS status ) const { return STATUS_INSUFFICIENT_RESOURCES == status || STATUS_DISK_FULL == status || ERROR_DISK_FULL == status || HRESULT_FROM_WIN32(ERROR_DISK_FULL) == status || FILTER_S_DISK_FULL == status || CI_E_CONFIG_DISK_FULL == status; } void SetStartState() { _state = eStart; _op = eNone; } BOOL LokIsInFinalState() const { return eDone == _state; } void SetScan() { Win4Assert( !LokIsInFinalState() ); _op = eScan; } BOOL LokIsInScan() const { return eScan == _op; } void LokSetRetry() { if ( !LokIsInFinalState() ) { _nRetries++; _state = eRetry; } } BOOL LokIsRetry() const { return eRetry == _state; } void LokSetDone() { Win4Assert( LokIsInScan() || LokIsInFullUsnScan() || LokIsDelScope() || LokIsRenameDir() || LokIsMonitorOnly() ); _state = eDone; } BOOL LokIsDone() const { return eDone == _state; } void LokSetDelScope() { Win4Assert( eNone == _op || eScan == _op || eRename == _op || eMonitor == _op ); _op = eDelete; } BOOL LokIsDelScope() const { return eDelete == _op; } void SetFullUsnScan() { _op = eFullUsnScan; } BOOL LokIsInFullUsnScan() const { return eFullUsnScan == _op; } void SetRenameDir() { _op = eRename; } BOOL LokIsRenameDir() const { return _op == eRename; } void SetMonitorOnly() { _op = eMonitor; } BOOL LokIsMonitorOnly() const { return _op == eMonitor; } EWorkType LokGetWorkType() const { return _op; } VOLUMEID VolumeId() { return _volumeId; } USN UsnStart() { return _usnStart; } void SetStartUsn(USN usn) { _usnStart = usn; } BOOL IsUserInitiated() const { return _fUserInitiated; } BOOL IsNewScope() const { return _fNewScope; } private: EState _state; // state of the operation EWorkType _op; // Operation being performed WCHAR * _pwcsRoot; WCHAR * _pwcsDirOldName;// Previous name of dir (during dir rename) BOOL _fProcessRoot; // Should the root dir also be filtered ? PARTITIONID _partId; ULONG _updFlag; BOOL _fDoDeletions; unsigned _nRetries; VOLUMEID _volumeId; // Volume id USN _usnStart; // Usn to start monitoriing from BOOL _fUserInitiated; // Did the user force a scan? BOOL _fNewScope; // TRUE if a new scope }; typedef class TDoubleList CScanInfoList; typedef class TFwdListIter CFwdScanInfoIter;