📄 cnewdiskwizard.cpp
字号:
/*____________________________________________________________________________
Copyright (C) 2002 PGP Corporation
All rights reserved.
$Id: CNewDiskWizard.cpp,v 1.43 2002/11/05 02:10:53 wjb Exp $
____________________________________________________________________________*/
#include "pgpClassesConfig.h"
#include <stdlib.h>
#include "CFile.h"
#include "CMutex.h"
#include "CThread.h"
#include "CDC.h"
#include "CIcon.h"
#include "CImageList.h"
#include "CMessageBox.h"
#include "CPath.h"
#include "CProgressBar.h"
#include "CSaveFileDialog.h"
#include "CUpDownControl.h"
#include "UModuleInstance.h"
#include "USecurity.h"
#include "UWinVersion.h"
#include "pgpClientErrors.h"
#include "UCommonStrings.h"
#include "UFileSys.h"
#include "CPGPclPrefs.h"
#include "CPGPdiskEngine.h"
#include "CPGPGlobalRandomPool.h"
#include "CPGPKey.h"
#include "CPGPKeyDB.h"
#include "PGPdiskUIPriv.h"
#include "CAlgorithmCombo.h"
#include "CCreateScaleCombo.h"
#include "CDriveLetterCombo.h"
#include "CFileSystemCombo.h"
#include "CHelpShower.h"
#include "CNewUserPages.h"
#include "CNewDiskWizard.h"
#include "CPassphraseDialog.h"
#include "CPercentDone.h"
#include "CPGPdiskFormatter.h"
#include "CPGPdiskPage.h"
#include "CRandomDataPage.h"
#include "ImageIDs.h"
#include "PGPdiskHelp.h"
#include "Resource.h"
#include "UEditMount.h"
#include "UMountPoint.h"
#include "CUTF8Edit.h"
_USING_PGP
_UNNAMED_BEGIN
// Constants
const double kSizeFudgeFraction = 0.95;
enum
{
kScaleStepFactor = 10
};
DWORD NewDiskWizADKPageHelpIDs[] =
{
IDC_DISKSTATIC1, -1,
IDC_DISKSTATIC2, -1,
IDC_DISKSTATIC3, -1,
IDC_HEADING, -1,
IDC_ADK_CAPTION, IDH_PGPDISKUI_DISKWIZADKPAGE_ADKUSERID,
IDC_ADK_EDIT, IDH_PGPDISKUI_DISKWIZADKPAGE_ADKUSERID,
0, 0
};
DWORD NewDiskWizCreationPageHelpIDs[] =
{
IDC_DISKSTATIC1, -1,
IDC_DISKSTATIC2, -1,
IDC_DISKSTATIC3, -1,
IDC_DISKSTATIC4, -1,
IDC_DISKSTATIC5, -1,
IDC_HEADING, -1,
IDC_TASKICON1, -1,
IDC_TASKICON2, -1,
IDC_CURTASK_CAPTION, IDH_PGPDISKUI_DISKWIZCREATEPAGE_CURTASK,
IDC_CURTASK_TEXT, IDH_PGPDISKUI_DISKWIZCREATEPAGE_CURTASK,
IDC_CURTASK_BAR, IDH_PGPDISKUI_DISKWIZCREATEPAGE_CURTASK,
IDC_ALLTASK_CAPTION, IDH_PGPDISKUI_DISKWIZCREATEPAGE_ALLTASK,
IDC_ALLTASK_BAR, IDH_PGPDISKUI_DISKWIZCREATEPAGE_ALLTASK,
0, 0
};
DWORD NewDiskWizDonePageHelpIDs[] =
{
IDC_DISKSTATIC1, -1,
IDC_DISKSTATIC2, -1,
IDC_DISKSTATIC3, -1,
IDC_DISKSTATIC4, -1,
IDC_DISKSTATIC5, -1,
IDC_HEADING, -1,
IDC_SIDEBAR, -1,
0, 0
};
DWORD NewDiskWizIntroPageHelpIDs[] =
{
IDC_DISKSTATIC1, -1,
IDC_DISKSTATIC2, -1,
IDC_DISKSTATIC3, -1,
IDC_DISKSTATIC4, -1,
IDC_HEADING, -1,
IDC_SIDEBAR, -1,
0, 0
};
DWORD NewDiskWizOptionsDlgHelpIDs[] =
{
IDC_DISKSTATIC1, -1,
IDC_DISKSTATIC2, -1,
IDC_DISKSTATIC3, -1,
IDC_DRIVE_RADIO, IDH_PGPDISKUI_DISKWIZOPTSDLG_DRIVE,
IDC_DRIVE_COMBO, IDH_PGPDISKUI_DISKWIZOPTSDLG_DRIVE,
IDC_DIR_RADIO, IDH_PGPDISKUI_DISKWIZOPTSDLG_DIR,
IDC_DIR_EDIT, IDH_PGPDISKUI_DISKWIZOPTSDLG_DIR,
IDC_BROWSE_BUTTON, IDH_PGPDISKUI_DISKWIZOPTSDLG_BROWSEDIR,
IDC_ALGORITHM_CAPTION, IDH_PGPDISKUI_DISKWIZOPTSDLG_ALGORITHM,
IDC_ALGORITHM_COMBO, IDH_PGPDISKUI_DISKWIZOPTSDLG_ALGORITHM,
IDC_FILESYSTEM_CAPTION, IDH_PGPDISKUI_DISKWIZOPTSDLG_FILESYSTEM,
IDC_FILESYSTEM_COMBO, IDH_PGPDISKUI_DISKWIZOPTSDLG_FILESYSTEM,
IDC_STARTUP_CHECK, IDH_PGPDISKUI_DISKWIZOPTSDLG_STARTUP,
IDOK, IDH_PGPDISKUI_DISKWIZOPTSDLG_OK,
IDCANCEL, IDH_PGPDISKUI_DISKWIZOPTSDLG_CANCEL,
0, 0
};
DWORD NewDiskWizVolInfoPageHelpIDs[] =
{
IDC_DISKSTATIC1, -1,
IDC_DISKSTATIC2, -1,
IDC_DISKSTATIC3, -1,
IDC_DISKSTATIC4, -1,
IDC_HEADING, -1,
IDC_SIDEBAR, -1,
IDC_FREESIZE_TEXT, -1,
IDC_PATH_CAPTION, IDH_PGPDISKUI_DISKWIZVOLINFOPAGE_PATH,
IDC_PATH_EDIT, IDH_PGPDISKUI_DISKWIZVOLINFOPAGE_PATH,
IDC_BROWSE_BUTTON, IDH_PGPDISKUI_DISKWIZVOLINFOPAGE_BROWSEPATH,
IDC_SIZE_CAPTION, IDH_PGPDISKUI_DISKWIZVOLINFOPAGE_SIZE,
IDC_SIZE_EDIT, IDH_PGPDISKUI_DISKWIZVOLINFOPAGE_SIZE,
IDC_SIZE_UDCTRL, IDH_PGPDISKUI_DISKWIZVOLINFOPAGE_SIZE,
IDC_SCALE_COMBO, IDH_PGPDISKUI_DISKWIZVOLINFOPAGE_SIZE,
IDC_OPTIONS_BUTTON, IDH_PGPDISKUI_DISKWIZVOLINFOPAGE_ADVOPTS,
0, 0
};
// Types
class CNewDiskWizRandomPage;
struct DiskWizardInfo
{
CComboError error;
CNewUserPages *pNewUserPages;
CPath path;
PGPUInt64 blocks;
PGPBoolean mountAtStartup;
const CPGPdiskContext *pContext;
CPGPGlobalRandomPool *pRandomPool;
PGPdiskEncryptionAlgorithm algorithm;
FileSys::Type fileSys;
PGPBoolean fileCreated;
CPath root;
// Data from CNewUserPages::Finish(...).
PGPBoolean userChosePub;
CPGPKey pubKey[100];
PGPUInt32 uNumPubKeys;
CString userName;
CSecureString securePass;
};
// Class CNewDiskOptionsDialog
class CNewDiskOptionsDialog : public CDialog
{
public:
CNewDiskOptionsDialog() { }
~CNewDiskOptionsDialog() { }
PGPUInt16 GetDialogId() const
{
return IDD_DISKWIZ_OPTIONS_DLG;
}
void Display(HWND parentWnd, PGPUInt64 blocks,
PGPdiskEncryptionAlgorithm& algorithm, FileSys::Type& fileSys,
PGPUInt8& drive, CPath& mountPoint, PGPBoolean& choseDrive,
PGPBoolean& mountStartup);
private:
CAlgorithmCombo mAlgoCombo;
CButton mBrowseButton;
CButton mDriveRadio;
CButton mDirRadio;
CButton mStartupCheck;
CDriveLetterCombo mDriveCombo;
CUTF8Edit mDirEdit;
CFileSystemCombo mFileSysCombo;
PGPUInt64 mBlocks;
PGPdiskEncryptionAlgorithm mAlgorithm;
FileSys::Type mFileSys;
PGPUInt8 mDrive;
CPath mMountPoint;
PGPBoolean mChoseDrive;
PGPBoolean mMountStartup;
void InitControls();
void OnBrowseButton();
void OnDirCheck();
void OnDriveCheck();
void OnOk();
BOOL OnCommand(PGPUInt16 notifyCode, PGPUInt16 itemId, HWND ctrl);
void OnContextMenu(HWND menuWnd, CPoint coords);
void OnHelp(HELPINFO *pInfo);
BOOL OnInitDialog(HWND focusCtrl);
};
// Class CNewDiskWizADKPage
class CNewDiskWizADKPage : public CPGPdiskPage
{
public:
CNewDiskWizADKPage(DiskWizardInfo *pInfo) : mPInfo(pInfo)
{
pgpAssertAddrValid(pInfo, DiskWizardInfo);
}
~CNewDiskWizADKPage()
{
}
PGPUInt16 GetDialogId() const
{
return IDD_DISKWIZ_ADK;
}
private:
DiskWizardInfo *mPInfo;
CUTF8Edit mADKEdit;
DWORD GetPageHelpId() const {return IDH_PGPDISKUI_DISKWIZADKPAGE;}
PVOID GetPageHelpIds() const {return NewDiskWizADKPageHelpIDs;}
BOOL OnInitDialog(HWND focusCtrl);
PGPInt32 OnPsnSetActive();
};
// Class CNewDiskWizCreationPage
class CNewDiskWizCreationPage : public CPGPdiskPage
{
private:
enum
{
WM_CREATE_HALFWAYDONE = WM_USER + 10,
WM_CREATE_DONE = WM_USER + 11
};
public:
CNewDiskWizCreationPage(DiskWizardInfo *pInfo) : mPInfo(pInfo)
{
pgpAssertAddrValid(pInfo, DiskWizardInfo);
}
~CNewDiskWizCreationPage()
{
}
PGPUInt16 GetDialogId() const
{
return IDD_DISKWIZ_CREATION;
}
private:
DiskWizardInfo *mPInfo;
CIcon mDoingIcon;
CIcon mDoneIcon;
CIcon mFailedIcon;
CImageList mImages;
CProgressBar mCurTaskBar;
CProgressBar mAllTaskBar;
CStatic mCurTaskText;
CStatic mTaskIcon1;
CStatic mTaskIcon2;
CPath mFileName;
CThread mCreateThread;
CMutex mCancelMutex;
PGPBoolean mShouldCancel;
DWORD GetPageHelpId() const {return IDH_PGPDISKUI_DISKWIZCREATEPAGE;}
PVOID GetPageHelpIds() const {return NewDiskWizCreationPageHelpIDs;}
PGPBoolean CreateStatusCallbackAux(PGPBoolean areFormatting,
PGPUInt32 percent);
static PGPBoolean CreateStatusCallback(PGPBoolean areFormatting,
PGPUInt32 percent, void *userVal);
void CreateCallbackAux();
static void _cdecl CreateCallback(void *userVal);
void InitImages();
void OnCreateDone();
void OnCreateHalfwayDone();
BOOL OnInitDialog(HWND focusCtrl);
PGPBoolean OnPsnQueryCancel();
PGPInt32 OnPsnSetActive();
PGPInt32 OnPsnWizNext();
PGPBoolean PreProcess(const CMessage& msg, LRESULT& result);
};
// Class CNewDiskWizDonePage
class CNewDiskWizDonePage : public CPGPdiskPage
{
public:
CNewDiskWizDonePage(DiskWizardInfo *pInfo) : mPInfo(pInfo)
{
pgpAssertAddrValid(pInfo, DiskWizardInfo);
}
~CNewDiskWizDonePage()
{
}
PGPUInt16 GetDialogId() const
{
return IDD_DISKWIZ_DONE;
}
private:
DiskWizardInfo *mPInfo;
DWORD GetPageHelpId() const {return IDH_PGPDISKUI_DISKWIZDONEPAGE;}
PVOID GetPageHelpIds() const {return NewDiskWizDonePageHelpIDs;}
PGPInt32 OnPsnSetActive();
};
// Class CNewDiskWizIntroPage
class CNewDiskWizIntroPage : public CPGPdiskPage
{
public:
CNewDiskWizIntroPage(DiskWizardInfo *pInfo) : mPInfo(pInfo)
{
pgpAssertAddrValid(pInfo, DiskWizardInfo);
}
~CNewDiskWizIntroPage()
{
}
PGPUInt16 GetDialogId() const
{
return IDD_DISKWIZ_INTRO;
}
private:
DiskWizardInfo *mPInfo;
DWORD GetPageHelpId() const {return IDH_PGPDISKUI_DISKWIZINTROPAGE;}
PVOID GetPageHelpIds() const {return NewDiskWizIntroPageHelpIDs;}
BOOL OnInitDialog(HWND focusCtrl);
PGPInt32 OnPsnSetActive();
};
// Class CNewDiskWizVolInfoPage
class CNewDiskWizVolInfoPage : public CPGPdiskPage
{
private:
enum {kTypicalBlocksHeaders = 8};
public:
CNewDiskWizVolInfoPage::CNewDiskWizVolInfoPage(DiskWizardInfo *pInfo) :
mPInfo(pInfo)
{
pgpAssertAddrValid(pInfo, DiskWizardInfo);
}
CNewDiskWizVolInfoPage::~CNewDiskWizVolInfoPage()
{
}
PGPUInt16 GetDialogId() const
{
return IDD_DISKWIZ_VOLINFO;
}
void SavePrefs();
private:
DiskWizardInfo *mPInfo;
CButton mOptionsButton;
CCreateScaleCombo mScaleCombo;
CUTF8Edit mPathEdit;
CEdit mSizeEdit;
CStatic mFreeSizeText;
CUpDownControl mSizeUDCtrl;
PGPUInt32 mSizeValue;
PGPdiskUIPriv::CreateScale mCreateScale;
PGPUInt64 mKbSize;
PGPUInt8 mDrive;
CPath mMountPoint;
PGPBoolean mChoseDrive;
PGPUInt64 mKbFree;
PGPUInt64 mPlatformMaxKbSize;
PGPUInt64 mPlatformMinKbSize;
PGPUInt64 mLocalMaxKbSize;
PGPUInt64 mLocalMinKbSize;
PGPBoolean mAreWeFailingDiskFree;
PGPBoolean mUserChangedOptions;
DWORD GetPageHelpId() const {return IDH_PGPDISKUI_DISKWIZVOLINFOPAGE;}
PVOID GetPageHelpIds() const {return NewDiskWizVolInfoPageHelpIDs;}
void FormatSizeText(PGPUInt64 kbSize, CString& text) const;
PGPUInt32 FudgeSizeValue(PGPUInt32 size,
PGPBoolean scale = FALSE) const;
void SizeScaleToKb(PGPUInt32 sizeValue,
PGPdiskUIPriv::CreateScale createScale, PGPUInt64& kbSize);
void KbToSizeScale(PGPUInt64 kbSize);
void ExportValuesToUI();
void ImportValuesFromUI();
PGPBoolean SaveDialogValidateCallbackAux(const CPath& path);
static PGPBoolean SaveDialogValidateCallback(const CPath& path,
void *userVal);
PGPBoolean ValidateDiskPath();
PGPBoolean FixWarnOptions(PGPBoolean silently = FALSE);
PGPBoolean FixWarnSizeAndScale(PGPBoolean silently = FALSE);
void UpdateMinMaxSizeFromPath(const CPath& path);
void InitControls();
void OnOptionsButton();
void OnBrowseButton();
BOOL OnCommand(PGPUInt16 notifyCode, PGPUInt16 itemId, HWND ctrl);
BOOL OnInitDialog(HWND focusCtrl);
PGPInt32 OnPsnSetActive();
PGPInt32 OnPsnWizNext();
};
_UNNAMED_END
// Class CNewDiskOptionsDialog member functions
void
CNewDiskOptionsDialog::Display(
HWND parentWnd,
PGPUInt64 blocks,
PGPdiskEncryptionAlgorithm& algorithm,
FileSys::Type& fileSys,
PGPUInt8& drive,
CPath& mountPoint,
PGPBoolean& choseDrive,
PGPBoolean& mountStartup)
{
mBlocks = blocks;
mAlgorithm = algorithm;
mFileSys = fileSys;
mDrive = drive;
mMountPoint = mountPoint;
mChoseDrive = choseDrive;
mMountStartup = mountStartup;
CreateModal(parentWnd);
algorithm = mAlgorithm;
fileSys = mFileSys;
drive = mDrive;
mountPoint = mMountPoint;
choseDrive = mChoseDrive;
mountStartup = mMountStartup;
}
void
CNewDiskOptionsDialog::InitControls()
{
mAlgoCombo.Fill();
mAlgoCombo.Set(mAlgorithm);
mDriveCombo.Fill();
mDriveCombo.Set(mDrive);
mFileSysCombo.Fill(mBlocks);
mFileSysCombo.Set(mFileSys);
mStartupCheck.SetCheck(mMountStartup ? BST_CHECKED : BST_UNCHECKED);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -