1047 lines
18 KiB
C++
1047 lines
18 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) 1994-1998 Microsoft Corporation
|
||
|
|
||
|
Module Name :
|
||
|
|
||
|
metaback.cpp
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Metabase backup and restore dialog
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Ronald Meijer (ronaldm)
|
||
|
|
||
|
Project:
|
||
|
|
||
|
Internet Services Manager
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
//
|
||
|
// Include Files
|
||
|
//
|
||
|
#include "stdafx.h"
|
||
|
#include "inetmgr.h"
|
||
|
#include "mddefw.h"
|
||
|
#include "metaback.h"
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#define new DEBUG_NEW
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// CBackupsListBox : a listbox of CBackup objects
|
||
|
//
|
||
|
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// Column width relative weights
|
||
|
//
|
||
|
#define WT_LOCATION 8
|
||
|
#define WT_VERSION 2
|
||
|
#define WT_DATE 6
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// Registry key name for this dialog
|
||
|
//
|
||
|
const TCHAR g_szRegKey[] = _T("MetaBack");
|
||
|
|
||
|
|
||
|
|
||
|
IMPLEMENT_DYNAMIC(CBackupsListBox, CHeaderListBox);
|
||
|
|
||
|
|
||
|
|
||
|
const int CBackupsListBox::nBitmaps = 1;
|
||
|
|
||
|
|
||
|
|
||
|
CBackupsListBox::CBackupsListBox()
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Backups listbox constructor
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
N/A
|
||
|
|
||
|
--*/
|
||
|
: CHeaderListBox(HLS_STRETCH, g_szRegKey)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void
|
||
|
CBackupsListBox::DrawItemEx(
|
||
|
IN CRMCListBoxDrawStruct & ds
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Draw item in the listbox
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
CRMCListBoxDrawStruct & ds : Input data structure
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
N/A
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
CBackupFile * p = (CBackupFile *)ds.m_ItemData;
|
||
|
ASSERT(p != NULL);
|
||
|
|
||
|
DrawBitmap(ds, 0, 0);
|
||
|
|
||
|
CString strVersion;
|
||
|
strVersion.Format(_T("%ld"), p->QueryVersion());
|
||
|
|
||
|
#define MAXLEN (128)
|
||
|
|
||
|
CTime tm;
|
||
|
p->GetTime(tm);
|
||
|
|
||
|
SYSTEMTIME stm =
|
||
|
{
|
||
|
(WORD)tm.GetYear(),
|
||
|
(WORD)tm.GetMonth(),
|
||
|
(WORD)tm.GetDayOfWeek(),
|
||
|
(WORD)tm.GetDay(),
|
||
|
(WORD)tm.GetHour(),
|
||
|
(WORD)tm.GetMinute(),
|
||
|
(WORD)tm.GetSecond(),
|
||
|
0 // Milliseconds
|
||
|
};
|
||
|
|
||
|
CString strDate, strTime;
|
||
|
LPTSTR lp = strDate.GetBuffer(MAXLEN);
|
||
|
::GetDateFormat(
|
||
|
LOCALE_USER_DEFAULT,
|
||
|
DATE_SHORTDATE,
|
||
|
&stm,
|
||
|
NULL,
|
||
|
lp,
|
||
|
MAXLEN
|
||
|
);
|
||
|
strDate.ReleaseBuffer();
|
||
|
|
||
|
lp = strTime.GetBuffer(MAXLEN);
|
||
|
GetTimeFormat(LOCALE_USER_DEFAULT, 0L, &stm, NULL, lp, MAXLEN);
|
||
|
strTime.ReleaseBuffer();
|
||
|
|
||
|
strDate += _T(" ");
|
||
|
strDate += strTime;
|
||
|
|
||
|
ColumnText(ds, 0, TRUE, (LPCTSTR)p->QueryLocation());
|
||
|
ColumnText(ds, 1, FALSE, strVersion);
|
||
|
ColumnText(ds, 2, FALSE, strDate);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/* virtual */
|
||
|
BOOL
|
||
|
CBackupsListBox::Initialize()
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
initialize the listbox. Insert the columns
|
||
|
as requested, and lay them out appropriately
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
TRUE if initialized successfully, FALSE otherwise
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
if (!CHeaderListBox::Initialize())
|
||
|
{
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
InsertColumn(0, WT_LOCATION, IDS_BACKUP_LOCATION);
|
||
|
InsertColumn(1, WT_VERSION, IDS_BACKUP_VERSION);
|
||
|
InsertColumn(2, WT_DATE, IDS_BACKUP_DATE);
|
||
|
|
||
|
//
|
||
|
// Try to set the widths from the stored registry value,
|
||
|
// otherwise distribute according to column weights specified
|
||
|
//
|
||
|
if (!SetWidthsFromReg())
|
||
|
{
|
||
|
DistributeColumns();
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// Backup file object properties dialog
|
||
|
//
|
||
|
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
||
|
|
||
|
|
||
|
|
||
|
CBkupPropDlg::CBkupPropDlg(
|
||
|
IN LPCTSTR lpszServer,
|
||
|
IN CWnd * pParent OPTIONAL
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Constructor
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
LPCTSTR lpszServer : Server name
|
||
|
CWnd * pParent : Optional parent window
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
N/A
|
||
|
|
||
|
--*/
|
||
|
: CDialog(CBkupPropDlg::IDD, pParent),
|
||
|
m_strServer(lpszServer),
|
||
|
m_strName(),
|
||
|
m_strPassword()
|
||
|
{
|
||
|
|
||
|
#if 0 // Keep class-wizard happy
|
||
|
|
||
|
//{{AFX_DATA_INIT(CBkupPropDlg)
|
||
|
m_strName = _T("");
|
||
|
m_strPassword = _T("");
|
||
|
//}}AFX_DATA_INIT
|
||
|
|
||
|
#endif // 0
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void
|
||
|
CBkupPropDlg::DoDataExchange(
|
||
|
IN CDataExchange * pDX
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Initialise/Store control data
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
CDataExchange * pDX - DDX/DDV control structure
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
None
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
CDialog::DoDataExchange(pDX);
|
||
|
|
||
|
//{{AFX_DATA_MAP(CBkupPropDlg)
|
||
|
DDX_Control(pDX, IDC_EDIT_BACKUP_NAME, m_edit_Name);
|
||
|
DDX_Control(pDX, IDC_BACKUP_PASSWORD, m_edit_Password);
|
||
|
DDX_Control(pDX, IDC_BACKUP_PASSWORD_CONFIRM, m_edit_PasswordConfirm);
|
||
|
DDX_Control(pDX, IDC_USE_PASSWORD, m_button_Password);
|
||
|
DDX_Control(pDX, IDOK, m_button_OK);
|
||
|
DDX_Text(pDX, IDC_EDIT_BACKUP_NAME, m_strName);
|
||
|
DDV_MaxChars(pDX, m_strName, MD_BACKUP_MAX_LEN - 1);
|
||
|
//}}AFX_DATA_MAP
|
||
|
if (m_button_Password.GetCheck())
|
||
|
{
|
||
|
DDX_Text(pDX, IDC_BACKUP_PASSWORD, m_strPassword);
|
||
|
DDV_MinChars(pDX, m_strPassword, MIN_PASSWORD_LENGTH);
|
||
|
DDX_Text(pDX, IDC_BACKUP_PASSWORD_CONFIRM, m_strPasswordConfirm);
|
||
|
DDV_MinChars(pDX, m_strPasswordConfirm, MIN_PASSWORD_LENGTH);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// Message Map
|
||
|
//
|
||
|
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
||
|
|
||
|
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CBkupPropDlg, CDialog)
|
||
|
//{{AFX_MSG_MAP(CBkupPropDlg)
|
||
|
ON_EN_CHANGE(IDC_EDIT_BACKUP_NAME, OnChangeEditBackupName)
|
||
|
ON_EN_CHANGE(IDC_BACKUP_PASSWORD, OnChangeEditPassword)
|
||
|
ON_EN_CHANGE(IDC_BACKUP_PASSWORD_CONFIRM, OnChangeEditPassword)
|
||
|
ON_BN_CLICKED(IDC_USE_PASSWORD, OnUsePassword)
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// Message Handlers
|
||
|
//
|
||
|
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
||
|
|
||
|
|
||
|
|
||
|
void
|
||
|
CBkupPropDlg::OnChangeEditBackupName()
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Backup name edit change notification handler.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None.
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
BOOL bEnableOK = m_edit_Name.GetWindowTextLength() > 0;
|
||
|
m_button_OK.EnableWindow(bEnableOK);
|
||
|
if (bEnableOK && m_button_Password.GetCheck())
|
||
|
m_button_OK.EnableWindow(
|
||
|
m_edit_Password.GetWindowTextLength() >= MIN_PASSWORD_LENGTH
|
||
|
&& m_edit_PasswordConfirm.GetWindowTextLength() >= MIN_PASSWORD_LENGTH);
|
||
|
}
|
||
|
|
||
|
|
||
|
void
|
||
|
CBkupPropDlg::OnChangeEditPassword()
|
||
|
{
|
||
|
m_button_OK.EnableWindow(
|
||
|
m_edit_Password.GetWindowTextLength() >= MIN_PASSWORD_LENGTH
|
||
|
&& m_edit_PasswordConfirm.GetWindowTextLength() >= MIN_PASSWORD_LENGTH
|
||
|
&& m_edit_Name.GetWindowTextLength() > 0);
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL
|
||
|
CBkupPropDlg::OnInitDialog()
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
WM_INITDIALOG handler. Initialize the dialog.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None.
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
TRUE if no focus is to be set automatically, FALSE if the focus
|
||
|
is already set.
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
CDialog::OnInitDialog();
|
||
|
|
||
|
m_button_OK.EnableWindow(FALSE);
|
||
|
m_button_Password.SetCheck(FALSE);
|
||
|
m_edit_Password.EnableWindow(FALSE);
|
||
|
m_edit_PasswordConfirm.EnableWindow(FALSE);
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
void
|
||
|
CBkupPropDlg::OnUsePassword()
|
||
|
{
|
||
|
BOOL bUseIt = m_button_Password.GetCheck();
|
||
|
m_edit_Password.EnableWindow(bUseIt);
|
||
|
m_edit_PasswordConfirm.EnableWindow(bUseIt);
|
||
|
if (bUseIt)
|
||
|
{
|
||
|
OnChangeEditPassword();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void
|
||
|
CBkupPropDlg::OnOK()
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
'OK' button handler -- create the backup.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
None
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
if (UpdateData(TRUE))
|
||
|
{
|
||
|
if (m_button_Password.GetCheck() && m_strPassword.Compare(m_strPasswordConfirm) != 0)
|
||
|
{
|
||
|
AfxMessageBox(IDS_PASSWORDS_DOESNT_MATCH);
|
||
|
return;
|
||
|
}
|
||
|
BeginWaitCursor();
|
||
|
|
||
|
CMetaBack mb(m_strServer);
|
||
|
CError err(mb.QueryResult());
|
||
|
|
||
|
if (err.Succeeded())
|
||
|
{
|
||
|
if (m_button_Password.GetCheck())
|
||
|
{
|
||
|
err = mb.BackupWithPassword(m_strName, m_strPassword);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
err = mb.BackupWithPassword(m_strName, _T(""));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
EndWaitCursor();
|
||
|
|
||
|
if (err.Failed())
|
||
|
{
|
||
|
//
|
||
|
// Special error message if IISADMIN just didn't
|
||
|
// like the name.
|
||
|
//
|
||
|
if (err.Win32Error() == ERROR_INVALID_PARAMETER)
|
||
|
{
|
||
|
::AfxMessageBox(IDS_BACKUP_BAD_NAME);
|
||
|
((CEdit *)GetDlgItem(IDC_EDIT_BACKUP_NAME))->SetSel(0, -1);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ASSERT(FALSE);
|
||
|
err.MessageBox();
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Don't dismiss the dialog
|
||
|
//
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
CDialog::OnOK();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// Metabase/Restore dialog
|
||
|
//
|
||
|
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
||
|
|
||
|
CBackupDlg::CBackupDlg(
|
||
|
IN LPCTSTR lpszServer,
|
||
|
IN CWnd * pParent OPTIONAL
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Constructor
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
LPCTSTR lpszServer : Server name
|
||
|
CWnd * pParent : Optional parent window
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
N/A
|
||
|
|
||
|
--*/
|
||
|
: m_strServer(lpszServer),
|
||
|
m_list_Backups(),
|
||
|
m_ListBoxRes(IDB_BACKUPS, m_list_Backups.nBitmaps),
|
||
|
m_oblBackups(),
|
||
|
m_fChangedMetabase(FALSE),
|
||
|
CDialog(CBackupDlg::IDD, pParent)
|
||
|
{
|
||
|
//{{AFX_DATA_INIT(CBackupDlg)
|
||
|
//}}AFX_DATA_INIT
|
||
|
|
||
|
m_list_Backups.AttachResources(&m_ListBoxRes);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void
|
||
|
CBackupDlg::DoDataExchange(
|
||
|
IN CDataExchange * pDX
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Initialise/Store control data
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
CDataExchange * pDX - DDX/DDV control structure
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
None
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
CDialog::DoDataExchange(pDX);
|
||
|
//{{AFX_DATA_MAP(CBackupDlg)
|
||
|
DDX_Control(pDX, IDC_BUTTON_RESTORE, m_button_Restore);
|
||
|
DDX_Control(pDX, IDC_BUTTON_DELETE, m_button_Delete);
|
||
|
DDX_Control(pDX, IDOK, m_button_Close);
|
||
|
//}}AFX_DATA_MAP
|
||
|
|
||
|
DDX_Control(pDX, IDC_LIST_BACKUPS, m_list_Backups);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void
|
||
|
CBackupDlg::SetControlStates()
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Setting control states depending on the state of the dialog
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
None
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
m_button_Restore.EnableWindow(m_list_Backups.GetSelCount() == 1);
|
||
|
m_button_Delete.EnableWindow(m_list_Backups.GetSelCount() > 0);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
CBackupDlg::EnumerateBackups(
|
||
|
LPCTSTR lpszSelect OPTIONAL
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Enumerate all existing backups, and add them to the listbox
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
LPCTSTR lpszSelect : Optional item to select
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
HRESULT
|
||
|
|
||
|
Notes:
|
||
|
|
||
|
The highest version number of the given name (if any) will
|
||
|
be selected.
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
CWaitCursor wait;
|
||
|
|
||
|
m_list_Backups.SetRedraw(FALSE);
|
||
|
m_list_Backups.ResetContent();
|
||
|
m_oblBackups.RemoveAll();
|
||
|
|
||
|
int nSel = LB_ERR;
|
||
|
|
||
|
CMetaBack mb(m_strServer);
|
||
|
CError err(mb.QueryResult());
|
||
|
|
||
|
if (err.Succeeded())
|
||
|
{
|
||
|
DWORD dwVersion;
|
||
|
FILETIME ft;
|
||
|
TCHAR szPath[MAX_PATH + 1] = _T("");
|
||
|
|
||
|
int nItem = 0;
|
||
|
|
||
|
FOREVER
|
||
|
{
|
||
|
*szPath = _T('\0');
|
||
|
err = mb.Next(&dwVersion, szPath, &ft);
|
||
|
|
||
|
if (err.Failed())
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
TRACEEOLID(szPath << " v" << dwVersion);
|
||
|
|
||
|
CBackupFile * pItem = new CBackupFile(szPath, dwVersion, &ft);
|
||
|
m_oblBackups.AddTail(pItem);
|
||
|
m_list_Backups.AddItem(pItem);
|
||
|
|
||
|
if (lpszSelect != NULL && lstrcmpi(lpszSelect, szPath) == 0)
|
||
|
{
|
||
|
//
|
||
|
// Remember selection for later
|
||
|
//
|
||
|
nSel = nItem;
|
||
|
}
|
||
|
|
||
|
++nItem;
|
||
|
}
|
||
|
|
||
|
if (err.Win32Error() == ERROR_NO_MORE_ITEMS)
|
||
|
{
|
||
|
//
|
||
|
// Finished enumeration successfully
|
||
|
//
|
||
|
err.Reset();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Select item requested if any
|
||
|
//
|
||
|
m_list_Backups.SetCurSel(nSel);
|
||
|
m_list_Backups.SetRedraw(TRUE);
|
||
|
SetControlStates();
|
||
|
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// Message Map
|
||
|
//
|
||
|
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
||
|
|
||
|
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CBackupDlg, CDialog)
|
||
|
//{{AFX_MSG_MAP(CBackupDlg)
|
||
|
ON_BN_CLICKED(IDC_BUTTON_CREATE, OnButtonCreate)
|
||
|
ON_BN_CLICKED(IDC_BUTTON_DELETE, OnButtonDelete)
|
||
|
ON_BN_CLICKED(IDC_BUTTON_RESTORE, OnButtonRestore)
|
||
|
ON_LBN_DBLCLK(IDC_LIST_BACKUPS, OnDblclkListBackups)
|
||
|
ON_LBN_SELCHANGE(IDC_LIST_BACKUPS, OnSelchangeListBackups)
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// Message Handlers
|
||
|
//
|
||
|
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
||
|
|
||
|
|
||
|
|
||
|
BOOL
|
||
|
CBackupDlg::OnInitDialog()
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
WM_INITDIALOG handler
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
TRUE if successfully initialized, FALSE otherwise.
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
CDialog::OnInitDialog();
|
||
|
|
||
|
TEMP_ERROR_OVERRIDE(REGDB_E_CLASSNOTREG, IDS_NO_BACKUP_RESTORE);
|
||
|
|
||
|
m_list_Backups.Initialize();
|
||
|
|
||
|
CError err(EnumerateBackups());
|
||
|
|
||
|
if (err.Failed())
|
||
|
{
|
||
|
err.MessageBox();
|
||
|
EndDialog(IDCANCEL);
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void
|
||
|
CBackupDlg::OnButtonCreate()
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
"Create" button handler
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
None
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
CBkupPropDlg dlg(m_strServer, this);
|
||
|
|
||
|
if (dlg.DoModal() == IDOK)
|
||
|
{
|
||
|
//
|
||
|
// We can only return OK if the creation worked
|
||
|
// which is done in the properties dialog.
|
||
|
//
|
||
|
EnumerateBackups(dlg.QueryName());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void
|
||
|
CBackupDlg::OnButtonDelete()
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
"Delete" button handler
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
None
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
if (!NoYesMessageBox(IDS_CONFIRM_DELETE_ITEMS))
|
||
|
{
|
||
|
//
|
||
|
// Changed his mind
|
||
|
//
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
m_list_Backups.SetRedraw(FALSE);
|
||
|
CWaitCursor wait;
|
||
|
|
||
|
CMetaBack mb(m_strServer);
|
||
|
CError err(mb.QueryResult());
|
||
|
|
||
|
if (err.MessageBoxOnFailure())
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
int nSel = 0;
|
||
|
CBackupFile * pItem;
|
||
|
|
||
|
while ((pItem = m_list_Backups.GetNextSelectedItem(&nSel)) != NULL)
|
||
|
{
|
||
|
TRACEEOLID("Deleting backup "
|
||
|
<< pItem->QueryLocation()
|
||
|
<< " v"
|
||
|
<< pItem->QueryVersion()
|
||
|
);
|
||
|
|
||
|
err = mb.Delete(
|
||
|
pItem->QueryLocation(),
|
||
|
pItem->QueryVersion()
|
||
|
);
|
||
|
|
||
|
if (err.MessageBoxOnFailure())
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
m_list_Backups.DeleteString(nSel);
|
||
|
|
||
|
//
|
||
|
// Don't advance counter to account for shift
|
||
|
//
|
||
|
}
|
||
|
|
||
|
m_list_Backups.SetRedraw(TRUE);
|
||
|
SetControlStates();
|
||
|
|
||
|
//
|
||
|
// Ensure focus is not on a disabled button.
|
||
|
//
|
||
|
m_button_Close.SetFocus();
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void
|
||
|
CBackupDlg::OnButtonRestore()
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
'Restore' button handler
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
None
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
CBackupFile * pItem = GetSelectedListItem();
|
||
|
ASSERT(pItem != NULL);
|
||
|
|
||
|
if (pItem != NULL)
|
||
|
{
|
||
|
if (NoYesMessageBox(IDS_RESTORE_CONFIRM))
|
||
|
{
|
||
|
CMetaBack mb(m_strServer);
|
||
|
CError err(mb.QueryResult());
|
||
|
|
||
|
if (err.Succeeded())
|
||
|
{
|
||
|
//
|
||
|
// the WAM stuff takes a while
|
||
|
//
|
||
|
CWaitCursor wait;
|
||
|
|
||
|
//
|
||
|
// Restore method will take care of WAM save/recover
|
||
|
//
|
||
|
err = mb.RestoreWithPassword(pItem->QueryLocation(), pItem->QueryVersion(), _T(""));
|
||
|
}
|
||
|
|
||
|
if (err.Win32Error() == ERROR_WRONG_PASSWORD)
|
||
|
{
|
||
|
CBackupPassword dlg(this);
|
||
|
if (dlg.DoModal() == IDOK)
|
||
|
{
|
||
|
CWaitCursor wait;
|
||
|
err = mb.RestoreWithPassword(pItem->QueryLocation(), pItem->QueryVersion(), dlg.m_password);
|
||
|
if (err.Win32Error() == ERROR_WRONG_PASSWORD)
|
||
|
{
|
||
|
::AfxMessageBox(
|
||
|
IDS_WRONG_PASSWORD,
|
||
|
MB_OK | MB_ICONEXCLAMATION
|
||
|
);
|
||
|
return;
|
||
|
}
|
||
|
else if (err.Failed())
|
||
|
{
|
||
|
::AfxMessageBox(
|
||
|
IDS_ERR_CANNOT_RESTORE,
|
||
|
MB_OK | MB_ICONEXCLAMATION
|
||
|
);
|
||
|
return;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
::AfxMessageBox(IDS_SUCCESS, MB_OK | MB_ICONINFORMATION);
|
||
|
m_button_Close.SetFocus();
|
||
|
m_fChangedMetabase = TRUE;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
err.MessageBox();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void
|
||
|
CBackupDlg::OnDblclkListBackups()
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Backup list "double click" notification handler
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
None
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
//
|
||
|
// Nothing presents itself as an obvious action here
|
||
|
//
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void
|
||
|
CBackupDlg::OnSelchangeListBackups()
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Backup list "selection change" notification handler
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
None
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
SetControlStates();
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
void
|
||
|
CBackupDlg::OnHelp()
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
"Help" button handler
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
None
|
||
|
|
||
|
--/
|
||
|
{
|
||
|
DWORD dwHelpID = (DWORD)m_nIDHelp + HID_BASE_RESOURCE;
|
||
|
|
||
|
//
|
||
|
// Make sure the help id matched what we told the
|
||
|
// doc writers
|
||
|
//
|
||
|
ASSERT(dwHelpID == 0x207D1);
|
||
|
|
||
|
::WinHelp(
|
||
|
m_hWnd,
|
||
|
theApp.QueryInetMgrHelpPath(),
|
||
|
HELP_CONTEXT,
|
||
|
dwHelpID
|
||
|
);
|
||
|
}
|
||
|
|
||
|
*/
|
||
|
|
||
|
CBackupPassword::CBackupPassword(CWnd * pParent) :
|
||
|
CDialog(CBackupPassword::IDD, pParent)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CBackupPassword, CDialog)
|
||
|
//{{AFX_MSG_MAP(CBackupPassword)
|
||
|
ON_EN_CHANGE(IDC_BACKUP_PASSWORD, OnChangedPassword)
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
void
|
||
|
CBackupPassword::DoDataExchange(
|
||
|
IN CDataExchange * pDX
|
||
|
)
|
||
|
{
|
||
|
CDialog::DoDataExchange(pDX);
|
||
|
|
||
|
//{{AFX_DATA_MAP(CBackupPassword)
|
||
|
DDX_Control(pDX, IDC_BACKUP_PASSWORD, m_edit);
|
||
|
DDX_Control(pDX, IDOK, m_button_OK);
|
||
|
DDX_Text(pDX, IDC_BACKUP_PASSWORD, m_password);
|
||
|
//}}AFX_DATA_MAP
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
CBackupPassword::OnInitDialog()
|
||
|
{
|
||
|
CDialog::OnInitDialog();
|
||
|
|
||
|
m_button_OK.EnableWindow(FALSE);
|
||
|
// ::SetFocus(GetDlgItem(IDC_BACKUP_PASSWORD)->m_hWnd);
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CBackupPassword::OnChangedPassword()
|
||
|
{
|
||
|
m_button_OK.EnableWindow(
|
||
|
m_edit.GetWindowTextLength() > 0);
|
||
|
}
|
||
|
|
||
|
////////////////////
|
||
|
|