📄 cdiskwizvolumeinfopage.cpp
字号:
//////////////////////////////////////////////////////////////////////////////
// CDiskWizVolumeInfoPage.cpp
//
// Implementation of class CDiskWizVolumeInfoPage.
//////////////////////////////////////////////////////////////////////////////
// $Id: CDiskWizVolumeInfoPage.cpp,v 1.9 1999/05/24 23:41:05 heller Exp $
// Copyright (C) 1998 by Network Associates, Inc.
// All rights reserved.
#include "StdAfx.h"
#include <math.h>
#include "Required.h"
#include "PGPdiskPrefs.h"
#include "StringAssociation.h"
#include "UtilityFunctions.h"
#include "CDiskWizardSheet.h"
#include "CDiskWizVolumeInfoPage.h"
#include "File.h"
#include "Globals.h"
#include "PGPdiskHelpIds.h"
/////////////////////
// Context help array
/////////////////////
static PGPUInt32 HelpIds[] =
{
IDC_SIZE_EDIT, IDH_PGPDISKAPP_DISKWIZVOLSIZEEDIT,
IDC_SIZE_SPIN, IDH_PGPDISKAPP_DISKWIZVOLSIZESPIN,
IDC_DRIVE_COMBO, IDH_PGPDISKAPP_DISKWIZVOLDRIVECOMBO,
IDC_GB_CHECK, IDH_PGPDISKAPP_DISKWIZVOLGBCHECK,
IDC_MB_CHECK, IDH_PGPDISKAPP_DISKWIZVOLMBCHECK,
IDC_KB_CHECK, IDH_PGPDISKAPP_DISKWIZVOLKBCHECK,
IDC_FREESIZE_TEXT, ((PGPUInt32) -1),
IDC_SIDEBAR, ((PGPUInt32) -1),
0,0
};
///////////////////////////
// MFC specific definitions
///////////////////////////
BEGIN_MESSAGE_MAP(CDiskWizVolumeInfoPage, CPropertyPage)
//{{AFX_MSG_MAP(CDiskWizVolumeInfoPage)
ON_WM_HELPINFO()
ON_BN_CLICKED(IDC_KB_CHECK, OnKbCheck)
ON_BN_CLICKED(IDC_MB_CHECK, OnMbCheck)
ON_WM_PAINT()
ON_BN_CLICKED(IDC_GB_CHECK, OnGbCheck)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
////////////
// Constants
////////////
const double kSizeIsCloseRatio = 0.95;
//////////////////////////////////////////////////////////////////////////
// CDiskWizVolumeInfoPage public custom functions and non-default handlers
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNCREATE(CDiskWizVolumeInfoPage, CPropertyPage)
// The CDiskWizVolumeInfoPage default constructor.
CDiskWizVolumeInfoPage::CDiskWizVolumeInfoPage()
: CPropertyPage(CDiskWizVolumeInfoPage::IDD)
{
//{{AFX_DATA_INIT(CDiskWizVolumeInfoPage)
mSizeValue = 0;
mFreeSizeText = _T("");
//}}AFX_DATA_INIT
mParentDiskWiz = NULL;
// Exorcise the big help button.
m_psp.dwFlags &= ~PSP_HASHELP;
}
// The CDiskWizVolumeInfoPage destructor.
CDiskWizVolumeInfoPage::~CDiskWizVolumeInfoPage()
{
}
/////////////////////////////////////////////////////////
// CDiskWizVolumeInfoPage public default message handlers
/////////////////////////////////////////////////////////
// OnSetActive is called when this page is made active. We make sure the
// correct buttons are enabled/disabled.
BOOL
CDiskWizVolumeInfoPage::OnSetActive()
{
pgpAssertAddrValid(mParentDiskWiz, CDiskWizardSheet);
mParentDiskWiz->SetWizardButtons(PSWIZB_BACK | PSWIZB_NEXT);
return CPropertyPage::OnSetActive();
}
// OnWizardNext is called when the 'Next' button is pressed. We perform
// data validation.
LRESULT
CDiskWizVolumeInfoPage::OnWizardNext()
{
try
{
PGPBoolean failThis = FALSE;
PGPUInt32 kbDisk;
if (CPropertyPage::OnWizardNext() == -1)
return -1;
// Get the size value in kilobytes.
kbDisk = GetSizeValueInKb();
// Verify that the space being asked is not too big or small.
if (kbDisk < mLocalMinKbSize)
{
failThis = TRUE;
SetPGPdiskSize(mLocalMinKbSize);
ReportError(kPGDMajorError_PGPdiskTooSmall);
}
else if (kbDisk > App->mPlatformMaxKbSize)
{
failThis = TRUE;
SetPGPdiskSize(mLocalMaxKbSize);
ReportError(kPGDMajorError_PGPdiskTooBig);
}
else if (kbDisk > mLocalMaxKbSize)
{
failThis = TRUE;
SetPGPdiskSize(mLocalMaxKbSize);
ReportError(kPGDMajorError_NotEnoughDiskSpace);
}
// Handle special case where we can't be sure of the amount of free
// space on the host drive.
if (mAreWeFailingDiskFree && !failThis)
{
CString dir;
DualErr dummyErr;
PGPBoolean isEnoughSpace;
// Get the directory to test.
dummyErr = GetDirectory(mParentDiskWiz->mPath, &dir);
// Test if there really is enough space available. If we can't
// tell then don't fail.
if (dummyErr.IsntError())
{
dummyErr = App->BruteForceTestIfEnoughSpace(dir, kbDisk,
&isEnoughSpace);
}
if (dummyErr.IsntError())
{
if (!isEnoughSpace)
{
failThis = TRUE;
ReportError(kPGDMajorError_NotEnoughDiskSpace);
}
}
}
if (failThis)
{
CString text;
// Point out the incorrect size entered by the user.
mSizeEditBox.SetFocus();
mSizeEditBox.GetWindowText(text);
mSizeEditBox.SetSel(0, text.GetLength(), FALSE);
return -1;
}
else
{
// Remember disk size.
SetPGPdiskSizeInRegistry();
mBlocksDisk = ((PGPUInt64) kbDisk * kBytesPerKb) /
kDefaultBlockSize;
return 0;
}
}
catch (CMemoryException *ex)
{
ex->Delete();
return 0;
}
}
/////////////////////////////////////////////////////////////////////////////
// CDiskWizVolumeInfoPage protected custom functions and non-default handlers
/////////////////////////////////////////////////////////////////////////////
// ConvertControlsAux is a utility function for the 'ConvertControls'
// functions.
void
CDiskWizVolumeInfoPage::ConvertControlsAux(
PGPUInt32 nMin,
PGPUInt32 nMax,
PGPUInt32 kbPerUnit)
{
// If current size is out of range, change it.
UpdateData(TRUE);
if (mSizeValue < nMin)
{
mSizeValue = nMin;
}
else if (mSizeValue > nMax)
{
mSizeValue = nMax;
}
// Set ranges of controls.
mSizeSpin.SetRange(nMin, nMax);
UpdateData(FALSE);
}
// ConvertControlsToKb converts the dialog's controls to KB.
void
CDiskWizVolumeInfoPage::ConvertControlsToKb()
{
mSizeScale = kLCS_KbScale;
mKbButton.SetCheck(1);
mMbButton.SetCheck(0);
mGbButton.SetCheck(0);
ConvertControlsAux(mLocalMinKbSize, min(kKbPerMeg*2, mLocalMaxKbSize), 1);
}
// ConvertControlsToMb converts the dialog's controls to MB.
void
CDiskWizVolumeInfoPage::ConvertControlsToMb()
{
mSizeScale = kLCS_MbScale;
mKbButton.SetCheck(0);
mMbButton.SetCheck(1);
mGbButton.SetCheck(0);
// Round up if closer than 5%.
PGPUInt32 mbMax = mLocalMaxKbSize/kKbPerMeg;
if (mLocalMaxKbSize%kKbPerMeg > kSizeIsCloseRatio*kKbPerMeg)
mbMax++;
ConvertControlsAux(1, min(kMbPerGig*2, mbMax), kKbPerMeg);
}
// ConvertControlsToGb converts the dialog's controls to GB.
void
CDiskWizVolumeInfoPage::ConvertControlsToGb()
{
mSizeScale = kLCS_GbScale;
mKbButton.SetCheck(0);
mMbButton.SetCheck(0);
mGbButton.SetCheck(1);
// Round up if closer than 5%.
PGPUInt32 gbMax = mLocalMaxKbSize/kKbPerGig;
if (mLocalMaxKbSize%kKbPerGig > kSizeIsCloseRatio*kKbPerGig)
gbMax++;
ConvertControlsAux(1, gbMax, kKbPerGig);
}
// GetSizeValueInKb returns the current size entered in KB.
PGPUInt32
CDiskWizVolumeInfoPage::GetSizeValueInKb()
{
UpdateData(TRUE);
switch (mSizeScale)
{
case kLCS_KbScale:
return mSizeValue;
case kLCS_MbScale:
if ((mLocalMaxKbSize%kKbPerMeg > kSizeIsCloseRatio*kKbPerMeg) &&
(mSizeValue == mLocalMaxKbSize/kKbPerMeg + 1))
{
return mLocalMaxKbSize;
}
else
{
return mSizeValue*kKbPerMeg;
}
case kLCS_GbScale:
if ((mLocalMaxKbSize%kKbPerGig > kSizeIsCloseRatio*kKbPerGig) &&
(mSizeValue == mLocalMaxKbSize/kKbPerGig + 1))
{
return mLocalMaxKbSize;
}
else
{
return mSizeValue*kKbPerGig;
}
default:
pgpAssert(FALSE);
return 0;
}
}
// SetPGPdiskSize sets the size edit box and the slider to the given size.
void
CDiskWizVolumeInfoPage::SetPGPdiskSize(
PGPUInt32 kbSize,
PGPdiskCreateScale scale)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -