/****************************************************************************** Copyright (c) 1999-2000 Microsoft Corporation Module Name: rstrmgr.cpp Abstract: This file contains the implementation of the CRestoreManager class, which controls overall restoration process and provides methods to control & help user experience flow. Revision History: Seong Kook Khang (SKKhang) 05/10/00 created ******************************************************************************/ #include "stdwin.h" #include #include "enumlogs.h" #include "rstrpriv.h" #include "rstrmgr.h" #include "extwrap.h" ///////////////////////////////////////////////////////////////////////////// // // CSRExternalWrapper class // ///////////////////////////////////////////////////////////////////////////// class CSRExternalWrapper : public ISRExternalWrapper { // ISRExternalWrapper methods public: BOOL BuildRestorePointList( CDPA_RPI *paryRPI ); BOOL DisableFIFO( DWORD dwRP ); DWORD EnableFIFO(); //BOOL SetRestorePoint( RESTOREPOINTINFO *pRPI, STATEMGRSTATUS *pStatus ); BOOL SetRestorePoint( LPCWSTR cszDesc, INT64 *pllRP ); BOOL RemoveRestorePoint( DWORD dwRP ); BOOL Release(); }; ///////////////////////////////////////////////////////////////////////////// // CSRExternalWrapper - ISRExternalWrapper methods BOOL CSRExternalWrapper::BuildRestorePointList( CDPA_RPI *paryRPI ) { TraceFunctEnter("CSRExternalWrapper::BuildRestorePointList"); BOOL fRet = FALSE; BOOL fExist; CRestorePointEnum cRPEnum; CRestorePoint cRP; DWORD dwRes; PSRPI pRPI; dwRes = cRPEnum.FindFirstRestorePoint( cRP ); // if rp.log doesn't exist for a restore point, we skip it and list all others while ( dwRes == ERROR_SUCCESS || dwRes == ERROR_FILE_NOT_FOUND) { // Ignoring any nonstandard restore point types (e.g. shutdown), // assuming they can no longer be created on Whistler. // skip restore points that don't have rp.log + // skip cancelled restore points if (dwRes != ERROR_FILE_NOT_FOUND && ! cRP.IsDefunct()) { pRPI = new SRestorePointInfo; if ( pRPI == NULL ) { ErrorTrace(TRACE_ID, "Cannot create RPI Instance..."); goto Exit; } pRPI->dwType = cRP.GetType(); pRPI->dwNum = cRP.GetNum(); pRPI->strDir = cRP.GetDir(); pRPI->strName = cRP.GetName(); pRPI->stTimeStamp.SetTime( cRP.GetTime(), FALSE ); if ( !paryRPI->AddItem( pRPI ) ) goto Exit; } else { DebugTrace(TRACE_ID, "Ignoring cancelled restore point"); } dwRes = cRPEnum.FindNextRestorePoint( cRP ); } fRet = TRUE; Exit: //BUGBUG - keep an eye on this, dummy at this moment cRPEnum.FindClose(); TraceFunctLeave(); return( fRet ); } /***************************************************************************/ BOOL CSRExternalWrapper::DisableFIFO( DWORD dwRP ) { TraceFunctEnter("CSRExternalWrapper::DisableFIFO"); BOOL fRet = FALSE; DWORD dwRes; dwRes = ::DisableFIFO( dwRP ); if ( dwRes != ERROR_SUCCESS ) { LPCWSTR cszErr = ::GetSysErrStr( dwRes ); ErrorTrace(0, "::DisableFIFO failed - %ls", cszErr); goto Exit; } fRet = TRUE; Exit: TraceFunctLeave(); return( fRet ); } /***************************************************************************/ DWORD CSRExternalWrapper::EnableFIFO() { TraceFunctEnter("CSRExternalWrapper::EnableFIFO"); DWORD dwRes; dwRes = ::EnableFIFO(); if ( dwRes != ERROR_SUCCESS ) { LPCWSTR cszErr = ::GetSysErrStr( dwRes ); ErrorTrace(0, "::EnableFIFO failed - %ls", cszErr); goto Exit; } Exit: TraceFunctLeave(); return( dwRes ); } /* BOOL CSRExternalWrapper::SetRestorePoint( RESTOREPOINTINFO *pRPI, STATEMGRSTATUS *pStatus ) { return( TRUE ); } */ /***************************************************************************/ BOOL CSRExternalWrapper::SetRestorePoint( LPCWSTR cszDesc, INT64 *pllRP ) { TraceFunctEnter("CSRExternalWrapper::SetRestorePoint"); BOOL fRet = FALSE; RESTOREPOINTINFO sRPInfo; STATEMGRSTATUS sSmgrStatus; sRPInfo.dwEventType = BEGIN_SYSTEM_CHANGE; sRPInfo.dwRestorePtType = CHECKPOINT; sRPInfo.llSequenceNumber = 0; sRPInfo.szDescription[MAX_DESC_W-1] = L'\0'; ::lstrcpyn( sRPInfo.szDescription, cszDesc, MAX_DESC_W ); if ( !::SRSetRestorePoint( &sRPInfo, &sSmgrStatus ) ) { ErrorTrace(0, "::SRSetRestorePoint failed, status=%d", sSmgrStatus.nStatus); goto Exit; } if ( pllRP != NULL ) *pllRP = sSmgrStatus.llSequenceNumber; fRet = TRUE; Exit: TraceFunctLeave(); return( fRet ); } /***************************************************************************/ BOOL CSRExternalWrapper::RemoveRestorePoint( DWORD dwRP ) { TraceFunctEnter("CSRExternalWrapper::RemoveRestorePoint"); BOOL fRet = FALSE; DWORD dwRes; dwRes = ::SRRemoveRestorePoint( dwRP ); if ( dwRes != ERROR_SUCCESS ) { LPCWSTR cszErr = ::GetSysErrStr( dwRes ); ErrorTrace(0, "::SRRemoveRestorePoint failed - %ls", cszErr); goto Exit; } fRet = TRUE; Exit: TraceFunctLeave(); return( fRet ); } /***************************************************************************/ BOOL CSRExternalWrapper::Release() { TraceFunctEnter("CSRExternalWrapper::Release"); delete this; TraceFunctLeave(); return( TRUE ); } ///////////////////////////////////////////////////////////////////////////// // // CSRExternalWrapperStub class // ///////////////////////////////////////////////////////////////////////////// class CSRExternalWrapperStub : public ISRExternalWrapper { // ISRExternalWrapper methods public: BOOL BuildRestorePointList( CDPA_RPI *paryRPI ); BOOL DisableFIFO( DWORD dwRP ); DWORD EnableFIFO(); //BOOL SetRestorePoint( RESTOREPOINTINFO *pRPI, STATEMGRSTATUS *pStatus ); BOOL SetRestorePoint( LPCWSTR cszDesc, INT64 *pllRP ); BOOL RemoveRestorePoint( DWORD dwRP ); BOOL Release(); }; ///////////////////////////////////////////////////////////////////////////// // CSRExternalWrapperStub - ISRExternalWrapper methods #define FTUNITPERDAY ((INT64)24*60*60*1000*1000*10) struct SRPIStub { DWORD dwType; LPCWSTR cszName; //CSRTime stTime; }; static SRPIStub s_aryRPIList[] = { { CHECKPOINT, L"System Check Point" }, { APPLICATION_INSTALL, L"Office 2000 Install" }, { RESTORE, L"Restore" }, { CHECKPOINT, L"System Check Point" }, { CHECKPOINT, L"System Check Point" }, { CHECKPOINT, L"System Check Point" }, { APPLICATION_INSTALL, L"InocuLan Install" }, { APPLICATION_INSTALL, L"Flight Simulator 2000 Install" }, { APPLICATION_INSTALL, L"Norton Utilities Install" }, { CHECKPOINT, L"System Check Point" }, { APPLICATION_INSTALL, L"Evil App Install" }, { CHECKPOINT, L"System Check Point" }, { RESTORE, L"Restore" }, { RESTORE, L"Restore" }, { CHECKPOINT, L"System Check Point" }, { CHECKPOINT, L"System Check Point" } }; #define COUNT_RPI_ENTRY (sizeof(s_aryRPIList)/sizeof(SRPIStub)) static int s_nRPTimeOff[COUNT_RPI_ENTRY] = { -60, -59, -57, -57, -31, -30, -6, -6, -6, -6, -4, -3, -2, -2, -1, 0 }; BOOL CSRExternalWrapperStub::BuildRestorePointList( CDPA_RPI *paryRPI ) { TraceFunctEnter("CSRExternalWrapperStub::BuildRestorePointList"); BOOL fRet = FALSE; int i; PSRPI pRPI; ULARGE_INTEGER ullTime; ULARGE_INTEGER ullOff; ::GetSystemTimeAsFileTime( (PFILETIME)&ullTime ); for ( i = 0; i < COUNT_RPI_ENTRY; i++ ) { pRPI = new SRestorePointInfo; if ( pRPI == NULL ) { ErrorTrace(TRACE_ID, "Insufficient memory, cannot allocate RPI"); goto Exit; } pRPI->dwType = s_aryRPIList[i].dwType; pRPI->strDir = L"c:\\some\\dummy\\directory\\name"; pRPI->strName = s_aryRPIList[i].cszName; ullOff = ullTime; ullOff.QuadPart += s_nRPTimeOff[i] * FTUNITPERDAY; pRPI->stTimeStamp.SetTime( (PFILETIME)&ullOff ); paryRPI->AddItem( pRPI ); } fRet = TRUE; Exit: TraceFunctLeave(); return( fRet ); } /***************************************************************************/ BOOL CSRExternalWrapperStub::DisableFIFO( DWORD ) { TraceFunctEnter("CSRExternalWrapperStub::DisableFIFO"); TraceFunctLeave(); return( TRUE ); } /***************************************************************************/ DWORD CSRExternalWrapperStub::EnableFIFO() { TraceFunctEnter("CSRExternalWrapperStub::EnableFIFO"); TraceFunctLeave(); return( ERROR_SUCCESS ); } /* BOOL CSRExternalWrapperStub::SetRestorePoint( RESTOREPOINTINFO *pRPI, STATEMGRSTATUS *pStatus ) { TraceFunctEnter("CSRExternalWrapperStub::SetRestorePoint"); TraceFunctLeave(); return( TRUE ); } */ /***************************************************************************/ BOOL CSRExternalWrapperStub::SetRestorePoint( LPCWSTR, INT64* ) { TraceFunctEnter("CSRExternalWrapperStub::SetRestorePoint"); TraceFunctLeave(); return( TRUE ); } /***************************************************************************/ BOOL CSRExternalWrapperStub::RemoveRestorePoint( DWORD ) { TraceFunctEnter("CSRExternalWrapperStub::RemoveRestorePoint"); TraceFunctLeave(); return( TRUE ); } /***************************************************************************/ BOOL CSRExternalWrapperStub::Release() { TraceFunctEnter("CSRExternalWrapperStub::Release"); delete this; TraceFunctLeave(); return( TRUE ); } ///////////////////////////////////////////////////////////////////////////// // // CreateSRExternalWrapper // ///////////////////////////////////////////////////////////////////////////// BOOL CreateSRExternalWrapper( BOOL fUseStub, ISRExternalWrapper **ppExtWrap ) { TraceFunctEnter("CreateSRExternalWrapper"); BOOL fRet = FALSE; if ( fUseStub ) *ppExtWrap = new CSRExternalWrapperStub; else *ppExtWrap = new CSRExternalWrapper; if ( *ppExtWrap == NULL ) { ErrorTrace(TRACE_ID, "Insufficient memory..."); goto Exit; } fRet = TRUE; Exit: TraceFunctLeave(); return( fRet ); } // end of file