|
|
/******************************************************************************
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 "resource.h"
#include "rstrpriv.h"
#include "rstrmgr.h"
#include "extwrap.h"
#include "..\rstrcore\resource.h"
#define MAX_STR_DATETIME 256
#define MAX_STR_MESSAGE 1024
/*
#define PROGRESSBAR_INITIALIZING_MAXVAL 30
#define PROGRESSBAR_AFTER_INITIALIZING 30
#define PROGRESSBAR_AFTER_RESTORE_MAP 40
#define PROGRESSBAR_AFTER_RESTORE 100
*/
#define GET_FLAG(mask) ( ( m_dwFlags & (mask) ) != 0 )
#define SET_FLAG(mask,val) ( (val) ? ( m_dwFlags |= (mask) ) : ( m_dwFlags &= ~(mask) ) )
/////////////////////////////////////////////////////////////////////////////
//
// CSRTime
//
/////////////////////////////////////////////////////////////////////////////
CSRTime::CSRTime() { SetToCurrent(); }
const CSRTime& CSRTime::operator=( const CSRTime &cSrc ) { TraceFunctEnter("CSRTime::operator="); m_st = cSrc.m_st; TraceFunctLeave(); return( *this ); }
PSYSTEMTIME CSRTime::GetTime() { TraceFunctEnter("CSRTime::GetTime -> SYSTEMTIME*"); TraceFunctLeave(); return( &m_st ); }
void CSRTime::GetTime( PSYSTEMTIME pst ) { TraceFunctEnter("CSRTime::GetTime -> SYSTEMTIME*"); *pst = m_st; TraceFunctLeave(); }
BOOL CSRTime::GetTime( PFILETIME pft ) { TraceFunctEnter("CSRTime::GetTime -> FILETIME*"); BOOL fRet = FALSE;
if ( !::SystemTimeToFileTime( &m_st, pft ) ) { LPCWSTR cszErr = ::GetSysErrStr(); ErrorTrace(TRACE_ID, "::SystemTimeToFileTime failed - %ls", cszErr); goto Exit; }
fRet = TRUE; Exit: TraceFunctLeave(); return( fRet ); }
#define COMPARE_AND_EXIT_ON_DIFF(a,b) \
nDiff = (a) - (b); \ if ( nDiff != 0 ) \ goto Exit; \
int CSRTime::Compare( CSRTime &cTime ) { TraceFunctEnter("CSRTime::Compare"); int nDiff; SYSTEMTIME *st = cTime.GetTime();
COMPARE_AND_EXIT_ON_DIFF( m_st.wYear, st->wYear ); COMPARE_AND_EXIT_ON_DIFF( m_st.wMonth, st->wMonth ); COMPARE_AND_EXIT_ON_DIFF( m_st.wDay, st->wDay ); COMPARE_AND_EXIT_ON_DIFF( m_st.wHour, st->wYear ); COMPARE_AND_EXIT_ON_DIFF( m_st.wMinute, st->wMonth ); COMPARE_AND_EXIT_ON_DIFF( m_st.wSecond, st->wDay ); COMPARE_AND_EXIT_ON_DIFF( m_st.wMilliseconds, st->wDay );
Exit: TraceFunctLeave(); return( nDiff ); }
int CSRTime::CompareDate( CSRTime &cTime ) { TraceFunctEnter("CSRTime::CompareDate"); int nDiff; SYSTEMTIME *st = cTime.GetTime();
COMPARE_AND_EXIT_ON_DIFF( m_st.wYear, st->wYear ); COMPARE_AND_EXIT_ON_DIFF( m_st.wMonth, st->wMonth ); COMPARE_AND_EXIT_ON_DIFF( m_st.wDay, st->wDay );
Exit: TraceFunctLeave(); return( nDiff ); }
BOOL CSRTime::SetTime( PFILETIME pft, BOOL fLocal ) { TraceFunctEnter("CSRTime::SetFileTime"); BOOL fRet = FALSE; FILETIME ft; SYSTEMTIME st;
if ( !fLocal ) { if ( !::FileTimeToLocalFileTime( pft, &ft ) ) { LPCWSTR cszErr = ::GetSysErrStr(); ErrorTrace(TRACE_ID, "::FileTimeToLocalFileTime failed - %ls", cszErr); goto Exit; } } else ft = *pft;
if ( !::FileTimeToSystemTime( &ft, &st ) ) { LPCWSTR cszErr = ::GetSysErrStr(); ErrorTrace(TRACE_ID, "::FileTimeToSystemTime failed - %ls", cszErr); goto Exit; } m_st = st;
fRet = TRUE; Exit: TraceFunctLeave(); return( fRet ); }
void CSRTime::SetTime( PSYSTEMTIME st ) { TraceFunctEnter("CSRTime::SetSysTime"); m_st = *st; TraceFunctLeave(); }
void CSRTime::SetToCurrent() { TraceFunctEnter("CSRTime::SetToCurrent"); ::GetLocalTime( &m_st ); TraceFunctLeave(); }
/////////////////////////////////////////////////////////////////////////////
//
// CRestoreManager
//
/////////////////////////////////////////////////////////////////////////////
BOOL CreateRestoreManagerInstance( CRestoreManager **ppMgr ) { TraceFunctEnter("CreateRestoreManagerInstance"); BOOL fRet = FALSE;
if ( ppMgr == NULL ) { FatalTrace(TRACE_ID, "Invalid parameter, ppMgr is NULL..."); goto Exit; } *ppMgr = new CRestoreManager; if ( *ppMgr == NULL ) { FatalTrace(TRACE_ID, "Cannot create CRestoreManager instance..."); goto Exit; }
fRet = TRUE; Exit: TraceFunctLeave(); return( fRet ); }
/////////////////////////////////////////////////////////////////////////////
// CRestoreManager construction
CRestoreManager::CRestoreManager() { TraceFunctEnter("CRestoreManager::CRestoreManager");
m_nStartMode = SRRSM_NORMAL; m_fNeedReboot = FALSE; m_hwndFrame = NULL;
m_nMainOption = RMO_RESTORE; //m_nStatus = SRRMS_NONE;
m_fDenyClose = FALSE; m_dwFlags = 0; m_dwFlagsEx = 0; m_nSelectedRP = 0; m_nRealPoint = 0; m_ullManualRP = 0;
m_nRPUsed = -1; m_nRPNew = -1;
//m_nRPI = 0;
//m_aryRPI = NULL;
m_nLastRestore = -1; m_pCtx =NULL; //m_nRFI = 0;
//m_aryRFI = NULL;
//DisableArchiving( FALSE );
TraceFunctLeave(); }
CRestoreManager::~CRestoreManager() { TraceFunctEnter("CRestoreManager::~CRestoreManager");
Cleanup();
TraceFunctLeave(); }
void CRestoreManager::Release() { TraceFunctEnter("CRestoreManager::Release");
delete this;
TraceFunctLeave(); }
void FormatDriveNameProperly(WCHAR * pszDrive) { WCHAR * pszIndex; pszIndex = wcschr( pszDrive, L':' ); if (NULL != pszIndex) { *pszIndex = L'\0'; } }
/////////////////////////////////////////////////////////////////////////////
// CRestoreManager properties - Common
BOOL CRestoreManager::CanRunRestore( BOOL fThawIfFrozen ) { TraceFunctEnter("CRestoreManager::CanRunRestore"); BOOL fRet = FALSE; LPCWSTR cszErr; DWORD fDisable = FALSE; DWORD dwDSMin; DWORD dwRes, dwType, cbData; WCHAR szMsg[MAX_STR_MSG]; WCHAR szTitle[MAX_STR_TITLE]; ULARGE_INTEGER ulTotal, ulAvail, ulFree; WCHAR szSystemDrive[10], szSystemDriveCopy[10]; // Check if SR is disabled via group policy
if ( ::SRGetRegDword( HKEY_LOCAL_MACHINE, s_cszGroupPolicy, s_cszDisableSR, &fDisable ) && fDisable) { ErrorTrace(0, "SR is DISABLED by group policy!!!"); ::ShowSRErrDlg( IDS_ERR_SR_DISABLED_GROUP_POLICY ); goto Exit; }
fDisable = FALSE; // Check if SR is disabled
if ( !::SRGetRegDword( HKEY_LOCAL_MACHINE, s_cszSRRegKey, s_cszDisableSR, &fDisable ) ) goto Exit; if ( fDisable ) { ErrorTrace(0, "SR is DISABLED!!!");
//
// if safemode, show different error message
//
if (0 != GetSystemMetrics(SM_CLEANBOOT)) { ShowSRErrDlg(IDS_RESTORE_SAFEMODE); goto Exit; } if ( ::LoadString( g_hInst, IDS_ERR_SR_DISABLED, szMsg, MAX_STR_MESSAGE ) == 0 ) { cszErr = ::GetSysErrStr(); ErrorTrace(0, "::LoadString(%u) failed - %ls", IDS_ERR_SR_DISABLED, cszErr); goto Exit; } if ( ::LoadString( g_hInst, IDS_RESTOREUI_TITLE, szTitle, MAX_STR_TITLE ) == 0 ) { cszErr = ::GetSysErrStr(); ErrorTrace(0, "::LoadString(%u) failed - %ls", IDS_RESTOREUI_TITLE, cszErr); // continue anyway...
} if ( ::MessageBox( NULL, szMsg, szTitle, MB_YESNO ) == IDYES ) { STARTUPINFO sSI; PROCESS_INFORMATION sPI; WCHAR szCmdLine[MAX_PATH] = L"control sysdm.cpl,,4";
ZeroMemory (&sSI, sizeof(sSI)); sSI.cb = sizeof(sSI); if ( !::CreateProcess( NULL, szCmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &sSI, &sPI ) ) { cszErr = ::GetSysErrStr(); ErrorTrace(0, "::CreateProcess failed - %ls", cszErr); goto Exit; } ::CloseHandle( sPI.hThread ); ::CloseHandle( sPI.hProcess ); } goto Exit; } // Check if service is running
if ( FALSE == IsSRServiceRunning()) { ErrorTrace(0, "Service is not running..."); ::ShowSRErrDlg( IDS_ERR_SERVICE_DEAD ); goto Exit; }
// get free disk space
ulTotal.QuadPart = 0; ulAvail.QuadPart = 0; ulFree.QuadPart = 0;
if ( FALSE == GetSystemDrive( szSystemDrive ) ) { ErrorTrace(0, "SR cannot get system drive!!!"); goto CheckSRAgain; }
if ( szSystemDrive[2] != L'\\' ) szSystemDrive[2] = L'\\';
// Check if SR is frozen
if ( fThawIfFrozen && ::IsSRFrozen() ) { ErrorTrace(0, "SR is Frozen!!!");
if ( FALSE == GetDiskFreeSpaceEx( szSystemDrive, &ulAvail, &ulTotal, &ulFree ) ) { ErrorTrace(0, "SR cannot get free disk space!!!"); goto CheckSRAgain; }
if ( !::SRGetRegDword( HKEY_LOCAL_MACHINE, s_cszSRRegKey, s_cszDSMin, &dwDSMin ) ) dwDSMin = SR_DEFAULT_DSMIN;
if ( ulFree.QuadPart >= (dwDSMin * MEGABYTE) ) { STATEMGRSTATUS sMgrStatus; RESTOREPOINTINFO sRPInfo;
// Thaw SR by creating a restore point
sRPInfo.dwEventType = BEGIN_SYSTEM_CHANGE; sRPInfo.dwRestorePtType = CHECKPOINT; sRPInfo.llSequenceNumber = 0; if (ERROR_SUCCESS != SRLoadString(L"srrstr.dll", IDS_SYSTEM_CHECKPOINT_TEXT, sRPInfo.szDescription, MAX_PATH)) { lstrcpy(sRPInfo.szDescription, s_cszSystemCheckpointName); } if ( !::SRSetRestorePoint( &sRPInfo, &sMgrStatus ) ) { ErrorTrace(TRACE_ID, "SRSetRestorePoint failed"); goto CheckSRAgain; } } }
CheckSRAgain:
// Check if SR is frozen
if ( ::IsSRFrozen() ) { if ( !::SRGetRegDword( HKEY_LOCAL_MACHINE, s_cszSRRegKey, s_cszDSMin, &dwDSMin ) ) { dwDSMin = SR_DEFAULT_DSMIN; } lstrcpy(szSystemDriveCopy, szSystemDrive); FormatDriveNameProperly(szSystemDriveCopy); ::SRFormatMessage( szMsg, IDS_ERR_SR_FROZEN, dwDSMin, szSystemDriveCopy ); if ( ::LoadString( g_hInst, IDS_RESTOREUI_TITLE, szTitle, MAX_STR_TITLE ) == 0 ) { cszErr = ::GetSysErrStr(); ErrorTrace(0, "::LoadString(%u) failed - %ls", IDS_RESTOREUI_TITLE, cszErr); // continue anyway...
} if ( ::MessageBox( NULL, szMsg, szTitle, MB_YESNO ) == IDYES ) { ::InvokeDiskCleanup( szSystemDrive ); } goto Exit; }
// check if there is enough free space for restore to operate without freezing
// needed free space = 60mb for restoration + 20 mb for restore restore point
if (FALSE == GetDiskFreeSpaceEx(szSystemDrive, &ulAvail, &ulTotal, &ulFree)) { ErrorTrace(0, "! GetDiskFreeSpaceEx : %ld", GetLastError()); goto Exit; }
if (ulFree.QuadPart <= THRESHOLD_UI_DISKSPACE * MEGABYTE) { DebugTrace(0, "***Less than 80MB free - cannot run restore***"); ::SRFormatMessage( szMsg, IDS_ERR_SR_LOWDISK, THRESHOLD_UI_DISKSPACE, szSystemDrive ); if ( ::LoadString( g_hInst, IDS_RESTOREUI_TITLE, szTitle, MAX_STR_TITLE ) == 0 ) { cszErr = ::GetSysErrStr(); ErrorTrace(0, "::LoadString(%u) failed - %ls", IDS_RESTOREUI_TITLE, cszErr); // continue anyway...
} if ( ::MessageBox( NULL, szMsg, szTitle, MB_YESNO ) == IDYES ) { ::InvokeDiskCleanup( szSystemDrive ); } goto Exit; } fRet = TRUE; Exit: TraceFunctLeave(); return( fRet ); }
/***************************************************************************/
int CRestoreManager::GetFirstDayOfWeek() { TraceFunctEnter("CRestoreManager::GetFirstDayOfWeek"); int nFirstDay = -1; WCHAR szBuf[100]; int nRet; int nDay;
nRet = ::GetLocaleInfo( LOCALE_USER_DEFAULT, LOCALE_IFIRSTDAYOFWEEK, szBuf, sizeof(szBuf)/sizeof(WCHAR)); if ( nRet == 0 ) { LPCWSTR cszErr = ::GetSysErrStr(); ErrorTrace(TRACE_ID, "GetLocaleInfo(IFIRSTDAYOFWEEK) failed - %ls", cszErr); goto Exit; } nDay = ::_wtoi( szBuf ); if ( nDay < 0 || nDay > 6 ) { ErrorTrace(TRACE_ID, "Out of range, IFIRSTDAYOFWEEK = %d", nDay); goto Exit; }
DebugTrace(TRACE_ID, "nFirstDay=%d", nFirstDay); nFirstDay = nDay;
Exit: TraceFunctLeave(); return( nFirstDay ); }
/***************************************************************************/
BOOL CRestoreManager::GetIsRPSelected() { TraceFunctEnter("CRestoreManager::GetIsRPSelected"); TraceFunctLeave(); return( GET_FLAG( SRRMF_ISRPSELECTED ) ); }
/***************************************************************************/
BOOL CRestoreManager::GetIsSafeMode() { TraceFunctEnter("CRestoreManager::GetIsSafeMode"); BOOL fIsSafeMode;
fIsSafeMode = ( ::GetSystemMetrics( SM_CLEANBOOT ) != 0 );
TraceFunctLeave(); return( fIsSafeMode ); }
/***************************************************************************/
BOOL CRestoreManager::GetIsSmgrAvailable() { TraceFunctEnter("CRestoreManager::GetIsSmgrAvailable");
#if BUGBUG //NYI
WCHAR szTitle[MAX_STR_TITLE]; WCHAR szFmt[MAX_STR_MSG]; WCHAR szMsg[MAX_STR_MSG];
DWORD dwType, dwValue, dwSize, dwRet; WCHAR szBuf[16];
HRESULT hr = S_OK; BOOL fSmgrUnavailable = FALSE ;
VALIDATE_INPUT_ARGUMENT(pfSmgr);
//
// If StateMgr is not alive
//
if ( NULL == FindWindow(s_cszIDCSTATEMGRPROC, s_cszIDSAPPTITLE)) { PCHLoadString( IDS_RESTOREUI_TITLE, szTitle, MAX_STR_TITLE ); PCHLoadString( IDS_ERR_RSTR_SMGR_NOT_ALIVE, szMsg, MAX_STR_MSG ); ::MessageBox( m_hWndShell, szMsg, szTitle, MB_OK | MB_ICONINFORMATION ); fSmgrUnavailable = TRUE ; }
//
// If SM is frozen
//
dwType = REG_DWORD; dwSize = sizeof(dwValue); dwRet = ::SHGetValue(HKEY_LOCAL_MACHINE, s_cszReservedDiskSpaceKey, s_cszStatus, &dwType, &dwValue, &dwSize );
if ( dwRet == ERROR_SUCCESS && dwValue == SMCONFIG_FROZEN ) { dwType = REG_DWORD; dwSize = sizeof(DWORD); dwRet = ::SHGetValue(HKEY_LOCAL_MACHINE, s_cszReservedDiskSpaceKey, s_cszMin, &dwType, &dwValue, &dwSize ); if ( dwRet != ERROR_SUCCESS || dwValue == 0 ) dwValue = SMCONFIG_MIN; PCHLoadString( IDS_RESTOREUI_TITLE, szTitle, MAX_STR_TITLE ); PCHLoadString( IDS_RESTORE_SMFROZEN, szFmt, MAX_STR_MSG ); ::wsprintf( szMsg, szFmt, dwValue ); ::MessageBox( m_hWndShell, szMsg, szTitle, MB_OK | MB_ICONINFORMATION ); fSmgrUnavailable = TRUE ; } else { //
// If SR is disabled
//
dwType = REG_SZ; dwSize = sizeof(szBuf)-1; dwRet = ::SHGetValue( HKEY_LOCAL_MACHINE, L"System\\CurrentControlSet\\Services\\VxD\\VxDMon", L"SystemRestore", &dwType, szBuf, &dwSize ); if ( dwRet != ERROR_SUCCESS || StrCmpI( szBuf, L"Y" ) != 0 ) { PCHLoadString( IDS_RESTOREUI_TITLE, szTitle, MAX_STR_TITLE ); PCHLoadString( IDS_RESTORE_DISABLED, szMsg, MAX_STR_MSG ); ::MessageBox( m_hWndShell, szMsg, szTitle, MB_OK | MB_ICONINFORMATION ); fSmgrUnavailable = TRUE ; }
};
if ( fSmgrUnavailable ) { *pfSmgr = VARIANT_TRUE ; } else *pfSmgr = VARIANT_FALSE ; #endif //BUGBUG
TraceFunctLeave(); return( TRUE ); }
/***************************************************************************/
BOOL CRestoreManager::GetIsUndo() { TraceFunctEnter("CRestoreManager::GetIsUndo"); TraceFunctLeave(); return( GET_FLAG( SRRMF_ISUNDO ) ); }
/***************************************************************************/
int CRestoreManager::GetLastRestore() { TraceFunctEnter("CRestoreManager::GetLastRestore"); int nLastRP;
if ( UpdateRestorePointList() ) nLastRP = m_nLastRestore; else nLastRP = -1;
TraceFunctLeave(); return( nLastRP ); }
/***************************************************************************/
int CRestoreManager::GetMainOption() { TraceFunctEnter("CRestoreManager::GetMainOption"); TraceFunctLeave(); return( m_nMainOption ); }
/***************************************************************************/
LPCWSTR CRestoreManager::GetManualRPName() { TraceFunctEnter("CRestoreManager::GetManualRPName"); TraceFunctLeave(); return( m_strManualRP ); }
/***************************************************************************/
void CRestoreManager::GetMaxDate( PSYSTEMTIME pstMax ) { TraceFunctEnter("CRestoreManager::GetMaxDate"); m_stRPMax.GetTime( pstMax ); TraceFunctLeave(); }
/***************************************************************************/
void CRestoreManager::GetMinDate( PSYSTEMTIME pstMin ) { TraceFunctEnter("CRestoreManager::GetMinDate"); m_stRPMin.GetTime( pstMin ); TraceFunctLeave(); }
/***************************************************************************/
int CRestoreManager::GetRealPoint() { TraceFunctEnter("CRestoreManager::GetRealPoint"); TraceFunctLeave(); return( m_nRealPoint ); }
/***************************************************************************/
PSRFI CRestoreManager::GetRFI( int nIndex ) { TraceFunctEnter("CRestoreManager::GetRFI"); PSRFI pRet = NULL;
if ( nIndex < 0 || nIndex >= m_aryRFI.GetSize() ) { ErrorTrace(TRACE_ID, "Out of range, nIndex=%d - m_nRFI=%d", nIndex, m_aryRFI.GetSize()); goto Exit; }
pRet = m_aryRFI[nIndex]; if ( pRet == NULL ) { ErrorTrace(TRACE_ID, "FATAL, entry is NULL: nIndex=%d, m_nRFI=%d", nIndex, m_aryRFI.GetSize()); goto Exit; }
Exit: TraceFunctLeave(); return( pRet ); }
/***************************************************************************/
int CRestoreManager::GetRFICount() { TraceFunctEnter("CRestoreManager::GetRFICount"); TraceFunctLeave(); return( m_aryRFI.GetSize() ); }
/***************************************************************************/
PSRPI CRestoreManager::GetRPI( int nIndex ) { TraceFunctEnter("CRestoreManager::GetRPI"); PSRPI pRet = NULL;
if ( nIndex < 0 || nIndex >= m_aryRPI.GetSize() ) { ErrorTrace(TRACE_ID, "Out of range, nIndex=%d - m_nRPI=%d", nIndex, m_aryRPI.GetSize()); goto Exit; }
pRet = m_aryRPI[nIndex]; if ( pRet == NULL ) { ErrorTrace(TRACE_ID, "FATAL, entry is NULL: nIndex=%d, m_nRPI=%d", nIndex, m_aryRPI.GetSize()); goto Exit; }
Exit: TraceFunctLeave(); return( pRet ); }
/***************************************************************************/
int CRestoreManager::GetRPICount() { TraceFunctEnter("CRestoreManager::GetRPICount"); TraceFunctLeave(); return( m_aryRPI.GetSize() ); }
/***************************************************************************/
void CRestoreManager::GetSelectedDate( PSYSTEMTIME pstSel ) { TraceFunctEnter("CRestoreManager::GetSelectedDate"); m_stSelected.GetTime( pstSel ); TraceFunctLeave(); }
/***************************************************************************/
LPCWSTR CRestoreManager::GetSelectedName() { TraceFunctEnter("CRestoreManager::GetSelectedName"); TraceFunctLeave(); return( m_strSelected ); }
/***************************************************************************/
int CRestoreManager::GetSelectedPoint() { TraceFunctEnter("CRestoreManager::GetSelectedPoint"); TraceFunctLeave(); return( m_nSelectedRP ); }
/***************************************************************************/
int CRestoreManager::GetStartMode() { TraceFunctEnter("CRestoreManager::GetStartMode"); TraceFunctLeave(); return( m_nStartMode ); }
/***************************************************************************/
void CRestoreManager::GetToday( PSYSTEMTIME pstToday ) { TraceFunctEnter("CRestoreManager::GetToday"); m_stToday.GetTime( pstToday ); TraceFunctLeave(); }
/***************************************************************************/
void CRestoreManager::SetIsRPSelected( BOOL fSel ) { TraceFunctEnter("CRestoreManager::SetIsRPSelected"); SET_FLAG( SRRMF_ISRPSELECTED, fSel ); TraceFunctLeave(); }
/***************************************************************************/
void CRestoreManager::SetIsUndo( BOOL fUndo ) { TraceFunctEnter("CRestoreManager::SetIsUndo"); SET_FLAG( SRRMF_ISUNDO, fUndo ); TraceFunctLeave(); }
/***************************************************************************/
BOOL CRestoreManager::SetMainOption( int nOpt ) { TraceFunctEnter("CRestoreManager::SetMainOption"); BOOL fRet = FALSE;
if ( nOpt >= RMO_RESTORE && nOpt < RMO_MAX ) { m_nMainOption = nOpt; fRet = TRUE; }
TraceFunctLeave(); return( fRet ); }
/***************************************************************************/
void CRestoreManager::SetManualRPName( LPCWSTR cszRPName ) { TraceFunctEnter("CRestoreManager::SetManualRPName");
m_strManualRP = cszRPName;
TraceFunctLeave(); }
/***************************************************************************/
void CRestoreManager::SetSelectedDate( PSYSTEMTIME pstSel ) { TraceFunctEnter("CRestoreManager::SetSelectedDate"); int nTop; int i;
m_stSelected.SetTime( pstSel ); if ( m_aryRPI.GetSize() == 0 ) goto Exit;
nTop = 0; for ( i = m_aryRPI.GetUpperBound(); i > 0; i-- ) // exclude 0
{ CSRTime &rst = m_aryRPI[i]->stTimeStamp; if ( m_stSelected.CompareDate( rst ) < 0 ) continue; if ( rst.Compare( m_aryRPI[nTop]->stTimeStamp ) > 0 ) nTop = i; } m_nRealPoint = nTop;
Exit: TraceFunctLeave(); }
/***************************************************************************/
BOOL CRestoreManager::SetSelectedPoint( int nRP ) { TraceFunctEnter("CRestoreManager::SetSelectedPoint"); BOOL fRet = FALSE;
if ( nRP < 0 || nRP >= m_aryRPI.GetSize() ) { ErrorTrace(TRACE_ID, "Index is out of range"); goto Exit; }
// Set a flag to indicate a RP has been selected
SetIsRPSelected( TRUE );
// Set selected time
m_stSelected = m_aryRPI[nRP]->stTimeStamp;
m_nSelectedRP = nRP; m_nRealPoint = nRP; UpdateRestorePoint();
fRet = TRUE; Exit: TraceFunctLeave(); return( fRet ); }
/***************************************************************************/
BOOL CRestoreManager::SetStartMode( int nMode ) { TraceFunctEnter("CRestoreManager::SetStartMode"); BOOL fRet = FALSE;
m_nStartMode = nMode; if ( nMode != SRRSM_NORMAL ) { //if ( !LoadSettings() )
// goto Exit;
}
fRet = TRUE; //Exit:
TraceFunctLeave(); return( fRet ); }
/***************************************************************************/
void CRestoreManager::GetUsedDate( PSYSTEMTIME pstDate ) { TraceFunctEnter("CRestoreManager::GetUsedDate"); int i;
m_stToday.GetTime( pstDate ); if ( m_nRPUsed <= 0 ) goto Exit;
for ( i = m_aryRPI.GetUpperBound(); i >= 0; i-- ) if ( m_aryRPI[i]->dwNum == (DWORD)m_nRPUsed ) { m_aryRPI[i]->stTimeStamp.GetTime( pstDate ); break; }
Exit: TraceFunctLeave(); }
/***************************************************************************/
LPCWSTR CRestoreManager::GetUsedName() { TraceFunctEnter("CRestoreManager::GetUsedName"); LPCWSTR cszName = NULL; int i;
if ( m_nRPUsed <= 0 ) goto Exit; for ( i = m_aryRPI.GetUpperBound(); i >= 0; i-- ) if ( m_aryRPI[i]->dwNum == (DWORD)m_nRPUsed ) { cszName = m_aryRPI[i]->strName; break; }
Exit: TraceFunctLeave(); return( cszName ); }
/***************************************************************************/
DWORD CRestoreManager::GetUsedType() { TraceFunctEnter("CRestoreManager::GetUsedType"); DWORD dwType = -1; int i;
if ( m_nRPUsed <= 0 ) goto Exit; for ( i = m_aryRPI.GetUpperBound(); i >= 0; i-- ) if ( m_aryRPI[i]->dwNum == (DWORD)m_nRPUsed ) { dwType = m_aryRPI[i]->dwType; break; }
Exit: TraceFunctLeave(); return( dwType ); }
/////////////////////////////////////////////////////////////////////////////
// CRestoreManager properties - HTML UI specific
BOOL CRestoreManager::GetCanNavigatePage() { TraceFunctEnter("CRestoreManager::GetCanNavigatePage"); TraceFunctLeave(); return( GET_FLAG( SRRMF_CANNAVIGATEPAGE ) ); }
void CRestoreManager::SetCanNavigatePage( BOOL fCanNav ) { TraceFunctEnter("CRestoreManager::SetCanNavigatePage"); SET_FLAG( SRRMF_CANNAVIGATEPAGE, fCanNav ); TraceFunctLeave(); }
/////////////////////////////////////////////////////////////////////////////
// CRestoreManager properties
PSRPI CRestoreManager::GetUsedRP() { TraceFunctEnter("CRestoreManager::GetUsedRP"); PSRPI pRPI = NULL; int i;
if ( m_nRPUsed <= 0 ) goto Exit; for ( i = m_aryRPI.GetUpperBound(); i >= 0; i-- ) if ( m_aryRPI[i]->dwNum == (DWORD)m_nRPUsed ) { pRPI = m_aryRPI[i]; goto Exit; }
Exit: TraceFunctLeave(); return( pRPI ); }
int CRestoreManager::GetNewRP() { TraceFunctEnter("CRestoreManager::GetNewRP"); TraceFunctLeave(); return( m_nRPNew ); }
BOOL CRestoreManager::CheckForDomainChange (WCHAR *pwszFilename, WCHAR *pszMsg) { BOOL fError = FALSE; WCHAR wcsCurrent [MAX_PATH]; WCHAR wcsFile [MAX_PATH]; WCHAR szMsg [MAX_STR_MSG];
if (ERROR_SUCCESS == GetDomainMembershipInfo (NULL, wcsCurrent)) { HANDLE hFile = CreateFileW ( pwszFilename, // file name
GENERIC_READ, // file access
0, // share mode
NULL, // SD
OPEN_EXISTING, // how to create
0, // file attributes
NULL); // handle to template file
if (INVALID_HANDLE_VALUE != hFile) { DWORD dwSize = GetFileSize (hFile, NULL); DWORD cbRead;
if (dwSize != 0xFFFFFFFF && dwSize < MAX_PATH && (TRUE == ReadFile (hFile, (BYTE *) wcsFile, dwSize, &cbRead, NULL))) { if (memcmp (wcsCurrent, wcsFile, cbRead) != 0) fError = TRUE; }
CloseHandle (hFile); }
if (fError) { WCHAR szTitle[MAX_STR_TITLE]; WCHAR szNone[MAX_STR_TITLE]; WCHAR *pwszComputer2 = wcsFile; WCHAR *pwszDomain2 = pwszComputer2 + lstrlenW(pwszComputer2)+ 1; WCHAR *pwszFlag2 = pwszDomain2 + lstrlenW(pwszDomain2) + 1; WCHAR *pwszComputer1 = wcsCurrent; WCHAR *pwszDomain1 = pwszComputer1 + lstrlenW(pwszComputer1)+ 1; WCHAR *pwszFlag1 = pwszDomain1 + lstrlenW (pwszDomain1) + 1; WCHAR *pwszWorkgroup1 = NULL; WCHAR *pwszWorkgroup2 = NULL;
if ( ::LoadString( g_hInst, IDS_NONE, szNone, MAX_STR_TITLE) == 0) { lstrcpy (szNone, L" "); // use blanks instead
} pwszWorkgroup1 = szNone; pwszWorkgroup2 = szNone;
if (pwszFlag1[0] != L'1') // change domain to workgroup
{ WCHAR *pTemp = pwszWorkgroup1; pwszWorkgroup1 = pwszDomain1; pwszDomain1 = pTemp; }
if (pwszFlag2[0] != L'1') // change domain to workgroup
{ WCHAR *pTemp = pwszWorkgroup2; pwszWorkgroup2 = pwszDomain2; pwszDomain2 = pTemp; } PCHLoadString( IDS_RESTOREUI_TITLE, szTitle, MAX_STR_TITLE );
::SRFormatMessage( pszMsg, IDS_ERR_DOMAIN_CHANGED, pwszComputer1, pwszComputer2, pwszWorkgroup1, pwszWorkgroup2, pwszDomain1, pwszDomain2 );
::MessageBox( m_hwndFrame, pszMsg, szTitle, MB_ICONWARNING | MB_DEFBUTTON2); } } return TRUE; }
/////////////////////////////////////////////////////////////////////////////
// CRestoreManager operations
// Check Restore
// this creates a restore context (m_pCtx) which will be used by BeginRestore
BOOL CRestoreManager::CheckRestore( BOOL fSilent ) { TraceFunctEnter("CRestoreManager::CheckRestore"); BOOL fRet = FALSE; DWORD dwRP;
WCHAR szTitle[MAX_STR_TITLE]; WCHAR szMsg[MAX_STR_MSG]; WCHAR szMsg1[MAX_STR_MSG]; WCHAR szMsg2[MAX_STR_MSG]; WCHAR szOfflineDrives[MAX_STR_MSG];
m_fDenyClose = TRUE;
// Disable FIFO starting from the chosen restore point.
dwRP = m_aryRPI[m_nRealPoint]->dwNum; if ( !g_pExternal->DisableFIFO( dwRP ) ) { ErrorTrace(0, "DisableFIFO(%d) failed...", dwRP); goto Exit; }
if ( !::PrepareRestore( dwRP, &m_pCtx ) ) { ErrorTrace(0, "Prepare Restore failed..."); goto Exit; }
if ( !fSilent ) { //
// Check if all drives are valid, if some drives are not valid ask user if
// we should continue with the restore process
//
if ( m_pCtx->IsAnyDriveOfflineOrDisabled( szOfflineDrives ) ) { PCHLoadString( IDS_RESTOREUI_TITLE, szTitle, MAX_STR_TITLE ); PCHLoadString( IDS_ERR_ALL_DRIVES_NOT_ACTIVE1, szMsg1, MAX_STR_MSG ); PCHLoadString( IDS_ERR_ALL_DRIVES_NOT_ACTIVE2, szMsg2, MAX_STR_MSG ); ::wsprintf( szMsg, L"%s %s %s", szMsg1, szOfflineDrives, szMsg2 ); ::MessageBox( m_hwndFrame, szMsg, szTitle, MB_ICONWARNING | MB_DEFBUTTON2);
} } else { m_pCtx->SetSilent(); } if (!fSilent) { WCHAR wcsFile [MAX_PATH]; WCHAR wcsDrive [MAX_PATH / 2];
GetSystemDrive (wcsDrive); MakeRestorePath( wcsFile, wcsDrive, m_aryRPI[m_nRealPoint]->strDir); lstrcat (wcsFile, L"\\snapshot\\domain.txt");
CheckForDomainChange (wcsFile ,szMsg); }
if (GET_FLAG(SRRMF_ISUNDO)) { m_pCtx->SetUndo(); } fRet = TRUE; Exit: m_fDenyClose = FALSE; if ( !fRet ) SAFE_RELEASE(m_pCtx); TraceFunctLeave(); return( fRet ); }
/////////////////////////////////////////////////////////////////////////////
// CRestoreManager operations
// this uses a restore context (m_pCtx) which was created by CheckRestore
// CheckRestore must be called before this function is called
BOOL CRestoreManager::BeginRestore( ) { TraceFunctEnter("CRestoreManager::BeginRestore"); BOOL fRet = FALSE; DWORD dwRP; DWORD dwNewRP;
m_fDenyClose = TRUE; if (NULL == m_pCtx) { ErrorTrace(0, "m_pCtx is NULL"); _ASSERT(0); goto Exit; }
// Disable FIFO starting from the chosen restore point.
dwRP = m_aryRPI[m_nRealPoint]->dwNum; if ( !g_pExternal->DisableFIFO( dwRP ) ) { ErrorTrace(0, "DisableFIFO(%d) failed...", dwRP); goto Exit; }
if ( !::InitiateRestore( m_pCtx, &dwNewRP ) ) goto Exit;
m_fNeedReboot = TRUE; /*
if ( ::ExitWindowsEx( EWX_REBOOT, 0 ) ) { DebugTrace(0, "ExitWindowsEx succeeded"); } else { LPCWSTR cszErr = ::GetSysErrStr(); DebugTrace(0, "ExitWindowsEx failed - %ls", cszErr);
if ( !g_pExternal->RemoveRestorePoint( dwNewRP ) ) goto Exit;
goto Exit; } */
fRet = TRUE; Exit: m_fDenyClose = FALSE; if ( !fRet ) SAFE_RELEASE(m_pCtx); TraceFunctLeave(); return( fRet ); }
/***************************************************************************/
BOOL CRestoreManager::Cancel() { TraceFunctEnter("CRestoreManager::Cancel"); BOOL fRet = FALSE; LPCWSTR cszErr; WCHAR szTitle[256]; WCHAR szMsg[1024];
if ( m_fDenyClose ) goto Exit;
/*
if ( ::LoadString( g_hInst, IDS_RESTOREUI_TITLE, szTitle, sizeof(szTitle ) ) == 0 ) { cszErr = ::GetSysErrStr(); ErrorTrace(0, "::LoadString(%u) failed - %ls", IDS_RESTOREUI_TITLE, cszErr); goto Exit; } if ( ::LoadString( g_hInst, IDS_CANCEL_RESTORE, szMsg, sizeof(szMsg ) ) == 0 ) { cszErr = ::GetSysErrStr(); ErrorTrace(0, "::LoadString(%u) failed - %ls", IDS_CANCEL_RESTORE, cszErr); goto Exit; }
if ( ::MessageBox( m_hwndFrame, szMsg, szTitle, MB_YESNO ) == IDNO ) goto Exit; */
fRet = TRUE; Exit: TraceFunctLeave(); return( fRet ); }
/***************************************************************************/
BOOL CRestoreManager::CancelRestorePoint() { TraceFunctEnter("CRestoreManager::CancelRestorePoint"); BOOL fRet = FALSE; RESTOREPOINTINFO sRPInfo; STATEMGRSTATUS sSmgrStatus; HCURSOR hCursor;
hCursor = ::SetCursor( ::LoadCursor( NULL, IDC_WAIT ) );
/*
sRPInfo.dwEventType = END_SYSTEM_CHANGE; sRPInfo.dwRestorePtType = CANCELLED_OPERATION ; sRPInfo.llSequenceNumber = m_ullManualRP; //if ( !::SRSetRestorePoint( &sRPInfo, &sSmgrStatus ) )
if ( !g_pExternal->SetRestorePoint( &sRPInfo, &sSmgrStatus ) ) { // Why SRSetRestorePoint returns FALSE even though it succeeded?
// 5/16/00 - would this work now?
//ErrorTrace(TRACE_ID, "SRSetRestorePoint cancellation failed");
goto Exit; } */
if ( !UpdateRestorePointList() ) goto Exit;
fRet = TRUE; Exit: if ( hCursor != NULL ) ::SetCursor( hCursor ); TraceFunctLeave(); return( fRet ); }
/***************************************************************************/
BOOL CRestoreManager::CreateRestorePoint() { TraceFunctEnter("CRestoreManager::CreateRestorePoint"); BOOL fRet = FALSE; HCURSOR hCursor;
hCursor = ::SetCursor( ::LoadCursor( NULL, IDC_WAIT ) );
if ( !g_pExternal->SetRestorePoint( m_strManualRP, NULL ) ) goto Exit;
//m_ullManualRP = sSmgrStatus.llSequenceNumber;
if ( !UpdateRestorePointList() ) goto Exit;
fRet = TRUE; Exit: if ( hCursor != NULL ) ::SetCursor( hCursor ); TraceFunctLeave(); return( fRet ); }
/***************************************************************************/
BOOL CRestoreManager::DisableFIFO() { TraceFunctEnter("CRestoreManager::DisableFIFO"); BOOL fRet = FALSE; DWORD dwSize;
if ( !g_pExternal->DisableFIFO( 1 ) ) { ErrorTrace(TRACE_ID, "DisableFIFO(1) failed..."); goto Exit; }
fRet = TRUE; Exit: TraceFunctLeave(); return( fRet ); }
/***************************************************************************/
BOOL CRestoreManager::EnableFIFO() { TraceFunctEnter("CRestoreManager::EnableFIFO"); BOOL fRet = FALSE; DWORD dwSize;
if ( g_pExternal->EnableFIFO() != ERROR_SUCCESS ) { ErrorTrace(TRACE_ID, "EnableFIFO() failed..."); goto Exit; }
fRet = TRUE; Exit: TraceFunctLeave(); return( fRet ); }
/***************************************************************************/
BOOL CRestoreManager::FormatDate( PSYSTEMTIME pst, CSRStr &str, BOOL fLongFmt ) { TraceFunctEnter("CRestoreManager::FormatDate"); BOOL fRet; DWORD dwFlag;
dwFlag = fLongFmt ? DATE_LONGDATE : DATE_SHORTDATE; fRet = GetDateStr( pst, str, dwFlag, NULL );
TraceFunctLeave(); return( fRet ); }
/***************************************************************************/
BOOL CRestoreManager::FormatLowDiskMsg( LPCWSTR cszFmt, CSRStr &str ) { TraceFunctEnter("CRestoreManager::FormatLowDiskMsg"); BOOL fRet = FALSE; DWORD dwSize; WCHAR szBuf[MAX_STR_MESSAGE];
if ( !::SRGetRegDword( HKEY_LOCAL_MACHINE, s_cszSRRegKey, s_cszDSMin, &dwSize ) ) dwSize = SR_DEFAULT_DSMIN; ::wsprintf( szBuf, cszFmt, dwSize ); str = szBuf;
fRet = TRUE; TraceFunctLeave(); return( fRet ); }
/***************************************************************************/
BOOL CRestoreManager::FormatTime( PSYSTEMTIME pst, CSRStr &str ) { TraceFunctEnter("CRestoreManager::FormatTime"); BOOL fRet;
fRet = GetTimeStr( pst, str, 0 );
TraceFunctLeave(); return( fRet ); }
/***************************************************************************/
BOOL CRestoreManager::GetLocaleDateFormat( PSYSTEMTIME pst, LPCWSTR cszFmt, CSRStr &str ) { TraceFunctEnter("CRestoreManager::GetLocaleDateFormat"); BOOL fRet;
fRet = GetDateStr( pst, str, 0, cszFmt );
TraceFunctLeave(); return( fRet ); }
/***************************************************************************/
BOOL CRestoreManager::GetYearMonthStr( int nYear, int nMonth, CSRStr &str ) { TraceFunctEnter("CRestoreManager::GetYearMonthStr"); BOOL fRet; SYSTEMTIME st;
st.wYear = (WORD)nYear; st.wMonth = (WORD)nMonth; st.wDay = 1; fRet = GetDateStr( &st, str, DATE_YEARMONTH, NULL );
TraceFunctLeave(); return( fRet ); }
/***************************************************************************/
BOOL CRestoreManager::InitializeAll() { TraceFunctEnter("CRestoreManager::InitializeAll"); BOOL fRet = FALSE;
//
// The InitializeAll function is called every time the user goes to Screen 2
// to display the calendar so get the system calendar type and set it here
//
SRUtil_SetCalendarTypeBasedOnLocale(LOCALE_USER_DEFAULT);
if ( !UpdateRestorePointList() ) goto Exit;
fRet = TRUE; Exit: TraceFunctLeave(); return( fRet ); }
/***************************************************************************/
BOOL CRestoreManager::Restore( HWND hwndProgress ) { TraceFunctEnter("CRestoreManager::Restore");
#if BUGBUG
DWORD dwThreadId ;
m_hwndProgress = (HWND)hwndProgress;
//
// Reset the current bar size
//
m_lCurrentBarSize = 0 ;
//
// Create thread to run the restore map init
//
m_RSThread = CreateThread(NULL, 0, RestoreThreadStart, this, 0, &dwThreadId);
if( NULL == m_RSThread ) { FatalTrace(TRACE_ID, "Unable to create Restore thread; hr=0x%x", GetLastError()); hr = E_FAIL ; } #endif //BUGBUG
TraceFunctLeave(); return( TRUE ); }
/////////////////////////////////////////////////////////////////////////////
// CRestoreManager operations
BOOL CRestoreManager::AddRenamedFolder( PSRFI pRFI ) { TraceFunctEnter("CRestoreManager::AddRenamedFolder"); BOOL fRet;
fRet = m_aryRFI.AddItem( pRFI );
TraceFunctLeave(); return( fRet ); }
/***************************************************************************/
BOOL CRestoreManager::SetRPsUsed( int nRPUsed, int nRPNew ) { TraceFunctEnter("CRestoreManager::SetRPsUsed"); BOOL fRet = FALSE; DWORD dwRet; WCHAR szSysDrv[MAX_PATH]; WCHAR szRPDir[MAX_PATH]; WCHAR szSSPath[MAX_PATH]; CSnapshot cSS;
if ( !UpdateRestorePointList() ) goto Exit;
m_nRPUsed = nRPUsed; m_nRPNew = nRPNew;
// Calls CSnapshot::CleanupAfterRestore. It is supposed to be safe
// to call even if there was no restore, so I'm just calling it
// whenever the log file validation happens.
::GetSystemDrive( szSysDrv ); ::wsprintf( szRPDir, L"%s%d", s_cszRPDir, nRPUsed ); ::MakeRestorePath( szSSPath, szSysDrv, szRPDir ); dwRet = cSS.CleanupAfterRestore( szSSPath ); if ( dwRet != ERROR_SUCCESS ) { LPCWSTR cszErr = ::GetSysErrStr(dwRet); ErrorTrace(0, "CSnapshot::CleanupAfterRestore failed - %ls", cszErr); // ignore the error
}
fRet = TRUE; Exit: TraceFunctLeave(); return( fRet ); }
/***************************************************************************/
BOOL CRestoreManager::SilentRestore( DWORD dwRP ) { TraceFunctEnter("CRestoreManager::SilentRestore"); BOOL fRet = FALSE; int i;
if ( !CanRunRestore( FALSE ) ) goto Exit;
if ( !UpdateRestorePointList() ) goto Exit;
if ( dwRP == 0xFFFFFFFF ) { if ( m_aryRPI.GetSize() == 0 ) { goto Exit; } m_nRealPoint = m_aryRPI.GetUpperBound(); } else { for ( i = m_aryRPI.GetUpperBound(); i >= 0; i-- ) { if ( m_aryRPI[i]->dwNum == dwRP ) { m_nRealPoint = i; break; } } if ( i < 0 ) { goto Exit; } } DebugTrace(0, "m_nRealPoint=%d, m_nRP=%d", m_nRealPoint, m_aryRPI[m_nRealPoint]->dwNum);
if ( !CheckRestore(TRUE) ) { ErrorTrace(0, "CheckRestore failed"); goto Exit; } if ( !BeginRestore( ) ) { ErrorTrace(0, "BeginRestore failed"); goto Exit; }
m_fNeedReboot = TRUE;
fRet = TRUE; Exit: TraceFunctLeave(); return( fRet ); }
/////////////////////////////////////////////////////////////////////////////
// CRestoreManager operations - internal
void CRestoreManager::Cleanup() { TraceFunctEnter("CRestoreManager::Cleanup"); int i;
for ( i = m_aryRPI.GetUpperBound(); i >= 0; i-- ) { if ( m_aryRPI[i] != NULL ) delete m_aryRPI[i]; } m_aryRPI.Empty();
for ( i = m_aryRFI.GetUpperBound(); i >= 0; i-- ) { if ( m_aryRFI[i] != NULL ) delete m_aryRFI[i]; } m_aryRFI.Empty();
TraceFunctLeave(); }
/***************************************************************************/
BOOL CRestoreManager::GetDateStr( PSYSTEMTIME pst, CSRStr &str, DWORD dwFlags, LPCWSTR cszFmt ) { TraceFunctEnter("CRestoreManager::GetDateStr"); BOOL fRet = FALSE; int nRet; WCHAR szBuf[MAX_STR_DATETIME];
nRet = ::GetDateFormat( LOCALE_USER_DEFAULT, dwFlags, pst, cszFmt, szBuf, MAX_STR_DATETIME ); if ( nRet == 0 ) { LPCWSTR cszErr = ::GetSysErrStr(); ErrorTrace(TRACE_ID, "::GetDateFormat failed - %s", cszErr); goto Exit; } str = szBuf;
fRet = TRUE; Exit: TraceFunctLeave(); return( fRet ); }
/***************************************************************************/
BOOL CRestoreManager::GetTimeStr( PSYSTEMTIME pst, CSRStr &str, DWORD dwFlags ) { TraceFunctEnter("CRestoreManager::GetTimeStr"); BOOL fRet = FALSE; int nRet; WCHAR szBuf[MAX_STR_DATETIME];
nRet = ::GetTimeFormat( LOCALE_USER_DEFAULT, dwFlags, pst, NULL, szBuf, MAX_STR_DATETIME ); if ( nRet == 0 ) { LPCWSTR cszErr = ::GetSysErrStr(); ErrorTrace(TRACE_ID, "::GetTimeFormat failed - %s", cszErr); goto Exit; } str = szBuf;
fRet = TRUE; Exit: TraceFunctLeave(); return( fRet ); }
/***************************************************************************/
void CRestoreManager::UpdateRestorePoint() { TraceFunctEnter("CRestoreManager::UpdateRestorePoint"); PSRPI pRPI; SYSTEMTIME st; WCHAR szBuf[MAX_STR_MESSAGE]; CSRStr strTime;
m_strSelected.Empty();
//if ( m_nRPI <= 0 || m_aryRPI == NULL )
// goto Exit;
pRPI = m_aryRPI[m_nSelectedRP]; pRPI->stTimeStamp.GetTime( &st ); GetTimeStr( &st, strTime, TIME_NOSECONDS ); ::lstrcpy( szBuf, strTime ); ::lstrcat( szBuf, L" " ); ::lstrcat( szBuf, pRPI->strName ); m_strSelected = szBuf;
//Exit:
TraceFunctLeave(); }
/***************************************************************************/
struct SRPINode { PSRPI pRPI; SRPINode *pNext; };
BOOL CRestoreManager::UpdateRestorePointList() { TraceFunctEnter("CRestoreManager::UpdateRestorePointList"); BOOL fRet = FALSE; int i; CSRTime stRP;
//BUGBUG - Release old restore point list
m_aryRPI.DeleteAll();
if ( !g_pExternal->BuildRestorePointList( &m_aryRPI ) ) goto Exit; DebugTrace(TRACE_ID, "# of RP=%d", m_aryRPI.GetSize());
m_stToday.SetToCurrent(); m_stRPMin = m_stToday; m_stRPMax = m_stToday; m_nLastRestore = -1;
for ( i = 0; i < m_aryRPI.GetSize(); i++ ) { // Find last "Restore"
if ( m_aryRPI[i]->dwType == RESTORE ) m_nLastRestore = i;
// Get range of dates
stRP = m_aryRPI[i]->stTimeStamp; if ( ( i == 0 ) || ( stRP.Compare( m_stRPMin ) < 0 ) ) m_stRPMin = stRP; if ( stRP.Compare( m_stRPMax ) > 0 ) m_stRPMax = stRP; }
//
// BUGBUG - what happens if there were one or more RP, and then when
// UI refreshes, everything got FIFOed. Need a thoroughful review...
//
if ( m_aryRPI.GetSize() > 0 ) { m_nSelectedRP = m_aryRPI.GetUpperBound(); m_nRealPoint = m_aryRPI.GetUpperBound(); UpdateRestorePoint(); }
fRet = TRUE; Exit: TraceFunctLeave(); return( fRet ); }
/////////////////////////////////////////////////////////////////////////////
// CRestoreManager attributes
HWND CRestoreManager::GetFrameHwnd() { TraceFunctEnter("CRestoreManager::GetFrameHwnd"); TraceFunctLeave(); return( m_hwndFrame ); }
void CRestoreManager::SetFrameHwnd( HWND hWnd ) { TraceFunctEnter("CRestoreManager::SetFrameHwnd"); m_hwndFrame = hWnd; TraceFunctLeave(); }
/***************************************************************************/
/*
int CRestoreManager::GetStatus() { TraceFunctEnter("CRestoreManager::GetStatus"); DebugTrace(TRACE_ID, "m_nStatus=%d", m_nStatus); TraceFunctLeave(); return( m_nStatus ); } */
/***************************************************************************/
BOOL CRestoreManager::DenyClose() { TraceFunctEnter("CRestoreManager::DenyClose"); DebugTrace(TRACE_ID, "m_fDenyClose=%d", m_fDenyClose); TraceFunctLeave(); return( m_fDenyClose ); }
/***************************************************************************/
BOOL CRestoreManager::NeedReboot() { TraceFunctEnter("CRestoreManager::NeedReboot"); DebugTrace(TRACE_ID, "m_fNeedReboot=%d", m_fNeedReboot); TraceFunctLeave(); return( m_fNeedReboot ); }
// end of file
|