|
|
/******************************************************************************
* * Copyright (c) 2000 Microsoft Corporation * * Module Name: * datastormgr.h * * Abstract: * CDataStoreMgr class definition * * Revision History: * Brijesh Krishnaswami (brijeshk) 03/28/2000 * created * *****************************************************************************/
#ifndef _DATASTORMGR_H_
#define _DATASTORMGR_H_
#include "datastor.h"
class CDataStoreMgr; class CDriveTable; class CRestorePoint;
//
// DriveTable structure with pointers to CDataStore objects
//
// pointer to CDataStore method for looping through all drives
//
typedef DWORD (CDataStore::* PDATASTOREMETHOD) (LONG_PTR lParam);
//+-------------------------------------------------------------------------
//
// Class: CDriveTable
//
// Synopsis: maintains table of drives and CDataStore objects
//
// History: 13-Apr-2000 HenryLee Created
//
//--------------------------------------------------------------------------
struct SDriveTableEnumContext { const CDriveTable * _pdt; int _iIndex;
void Reset () { _pdt = NULL; _iIndex = 0; } };
#define RP_NORMAL 0
#define RP_ADVANCED 1
class CDriveTable : public CSRAlloc { public: friend CDataStoreMgr;
CDriveTable(); ~CDriveTable();
CDataStore * FindDriveInTable (WCHAR *pwszDrive) const; CDataStore * FindGuidInTable (WCHAR *pwszGuid) const; CDataStore * FindSystemDrive () const;
DWORD AddDriveToTable(WCHAR *pwszDrive, WCHAR *pwszGuid); DWORD RemoveDrivesFromTable ();
DWORD FindMountPoint (WCHAR *pwszGuid, WCHAR *pwszPath) const; DWORD SaveDriveTable (CRestorePoint *prp); DWORD SaveDriveTable (WCHAR *pwszPath); DWORD LoadDriveTable (WCHAR *pwszPath); DWORD IsAdvancedRp (CRestorePoint *prp, PDWORD pdwFlags); BOOL AnyMountedDrives();
DWORD ForAllDrives (PDATASTOREMETHOD pMethod, LONG_PTR lParam); DWORD ForOneOrAllDrives (WCHAR *pwszDrive, PDATASTOREMETHOD pMethod, LONG_PTR lParam);
CDataStore * FindFirstDrive (SDriveTableEnumContext & dtec) const; CDataStore * FindNextDrive (SDriveTableEnumContext & dtec) const;
DWORD Merge (CDriveTable &dt); // merge one table into another
DWORD EnumAllVolumes (); // fill in the drive table
inline void SetDirty () { _fDirty = TRUE; }
BOOL GetDirty() { return _fDirty; }
private: DWORD CreateNewEntry (CDataStore *pds);
static const enum { DRIVE_TABLE_SIZE = 26 };
CDataStore * _rgDriveTable[DRIVE_TABLE_SIZE]; CDriveTable * _pdtNext; int _nLastDrive; BOOL _fDirty; BOOL _fLockInit; CLock _lock; };
//+-------------------------------------------------------------------------
//
// Class: CDataStoreMgr
//
// Synopsis: there will be one global instance of this class
// this is the starting point for all of the datastore tasks
// all the datastore objects will be accessible from here
//
// History: 13-Apr-2000 BrijeshK Created
//
//--------------------------------------------------------------------------
class CDataStoreMgr : public CSRAlloc { public: CDataStoreMgr(); ~CDataStoreMgr();
CDriveTable * GetDriveTable () { return &_dt; }
// pass NULL for action on all datastores
DWORD Initialize (BOOL fFirstRun); DWORD Fifo(WCHAR *pwszDrive, DWORD dwTargetRPNum, int nTargetPercent, BOOL fIncludeCurrentRp, BOOL fFifoAtLeastOneRp); DWORD FifoOldRps(INT64 llTimeInSeconds); DWORD FreezeDrive(WCHAR *pwszDrive); DWORD ThawDrives(BOOL fCheckOnly); DWORD MonitorDrive(WCHAR *pwszDrive, BOOL fSet);
DWORD TriggerFreezeOrFifo(); DWORD FindFrozenDrive(); BOOL IsDriveFrozen(LPWSTR pszDrive); void SignalStop () { _fStop = TRUE; _dt.SaveDriveTable ((CRestorePoint*) NULL); }
DWORD UpdateDataStoreUsage(WCHAR *pwszDrive, INT64 llDelta);
DWORD CreateDataStore (WCHAR *pwszDrive) { return _dt.ForOneOrAllDrives (pwszDrive, &CDataStore::CreateDataStore, NULL); }
DWORD DestroyDataStore (WCHAR *pwszDrive) { return _dt.ForOneOrAllDrives (pwszDrive, &CDataStore::DestroyDataStore, TRUE); }
DWORD SetDriveParticipation (WCHAR *pwszDrive, BOOL fParticipate) { return _dt.ForOneOrAllDrives (pwszDrive, &CDataStore::SetParticipate, fParticipate); }
DWORD UpdateDriveParticipation (WCHAR *pwszDrive, LPWSTR pwszDir) { return _dt.ForOneOrAllDrives (pwszDrive, &CDataStore::UpdateParticipate, (LONG_PTR) pwszDir); }
DWORD UpdateDiskFree (WCHAR *pwszDrive) { return _dt.ForOneOrAllDrives (pwszDrive, &CDataStore::UpdateDiskFree, NULL); }
DWORD SetDriveError (WCHAR *pwszDrive) { return _dt.ForOneOrAllDrives (pwszDrive, &CDataStore::SetError, NULL); }
DWORD Compress (LPWSTR pszDrive, LONG lDuration); // Used to get the participation, monitor, freeze, and other flags
DWORD GetFlags (WCHAR *pwszDrive, DWORD *pdwFlags); DWORD GetUsagePercent(WCHAR *pwszDrive, int * pnPercent);
DWORD CountChangeLogs (CRestorePoint *prp) { return _dt.ForAllDrives (&CDataStore::CountChangeLogs, (LONG_PTR) prp); }
DWORD SwitchRestorePoint (CRestorePoint *prp);
BOOL * GetStopFlag () // used for Delnode_Recurse
{ return &_fStop; }
DWORD DeleteMachineGuidFile ();
private: CDriveTable _dt; BOOL _fStop;
DWORD WriteFifoLog(LPWSTR pwszDrive, LPWSTR pwszRPDir); DWORD WriteMachineGuid (); };
extern CDataStoreMgr * g_pDataStoreMgr; // the global instance
#endif
|