📄 ceditorwindow.cpp
字号:
/*____________________________________________________________________________
Copyright (C) 2002 PGP Corporation
All rights reserved.
$Id: CEditorWindow.cpp,v 1.29 2002/11/05 02:10:53 wjb Exp $
____________________________________________________________________________*/
#include "pgpClassesConfig.h"
#include <stdlib.h>
#include "CFile.h"
#include "CBitmap.h"
#include "CButton.h"
#include "CDC.h"
#include "CEdit.h"
#include "CUTF8Edit.h"
#include "CFont.h"
#include "CMessageBox.h"
#include "CRect.h"
#include "CStatic.h"
#include "CUpDownControl.h"
#include "UModuleInstance.h"
#include "pgpClientLib.h"
#include "UCommonStrings.h"
#include "CPGPclPrefs.h"
#include "CPGPdata.h"
#include "CPGPdiskEngine.h"
#include "CPGPKey.h"
#include "CPGPKeyDB.h"
#include "CConfirmPassphraseDialog.h"
#include "CEditorWindow.h"
#include "CHelpShower.h"
#include "CNewUserWizard.h"
#include "CPassphraseDialog.h"
#include "CPGPdiskMounter.h"
#include "CPGPdiskUnmounter.h"
#include "CReEncryptWizard.h"
#include "UEditMount.h"
#include "ImageIDs.h"
#include "PGPdiskHelp.h"
#include "PGPdiskUIPriv.h"
#include "Resource.h"
#include "utf8edit.h"
_USING_PGP
_UNNAMED_BEGIN
// Constants
enum
{
kMountMenuPos = 0,
kTimerMs = 2000
};
const char *kEditorWindowClassName = "PGPdisk Editor Window Class";
DWORD DiskPropertiesDlgHelpIDs[] =
{
IDC_DISKSTATIC1, -1,
IDC_CURALGO_CAPTION, IDH_PGPDISKUI_DISKPROPSDLG_CURALGORITHM,
IDC_CURALGO_EDIT, IDH_PGPDISKUI_DISKPROPSDLG_CURALGORITHM,
IDC_REENCRYPT_BUTTON, IDH_PGPDISKUI_DISKPROPSDLG_REENCRYPT,
IDC_MOUNTSTART_CHECK, IDH_PGPDISKUI_DISKPROPSDLG_MOUNTSTART,
IDC_OVERRIDE_CHECK, IDH_PGPDISKUI_DISKPROPSDLG_OVERRIDE,
IDC_UNMOUNT_CHECK, IDH_PGPDISKUI_DISKPROPSDLG_AUTOUNMOUNT,
IDC_MINUTES_TEXT, IDH_PGPDISKUI_DISKPROPSDLG_AUTOUNMOUNT,
IDC_MINUTES_EDIT, IDH_PGPDISKUI_DISKPROPSDLG_MINUTES,
IDC_MINUTES_UDCTRL, IDH_PGPDISKUI_DISKPROPSDLG_MINUDCTRL,
IDOK, IDH_PGPDISKUI_DISKPROPSDLG_OK,
IDCANCEL, IDH_PGPDISKUI_DISKPROPSDLG_CANCEL,
0, 0
};
// Prefs constants.
enum
{
kDefaultPosX = 100,
kDefaultPosY = 100,
kDefaultWidth = 600,
kDefaultHeight = 400,
kDefaultDiskUserColumns =
CDiskUsersView::kUserNameColFlag |
CDiskUsersView::kReadOnlyColFlag |
CDiskUsersView::kKindColFlag,
kMinWidth = 400,
kMinHeight = 175
};
const PGPBoolean kDefaultShowToolbar = TRUE;
const PGPBoolean kDefaultLargeButtons = FALSE;
const PGPBoolean kDefaultShowText = TRUE;
const PGPBoolean kDefaultToolTips = TRUE;
// Toolbar constants.
enum
{
kXMarginRebar = 1,
kYMarginRebar = 1,
kXMarginDiskUsers = 1,
kYMarginDiskUsers = 1,
kYMarginToolbarDK = 2,
kYMarginDKStatusBar = 2,
kNumToolbarButtons = 5,
kXSmallImage = 16,
kYSmallImage = 16,
kXBigImage = 20,
kYBigImage = 20,
kMaxButtonWidth = 70
};
// Menu constants.
enum
{
kIndexFileMenu = 0,
kIndexUsersMenu = 1,
kIndexViewMenu = 2,
kIndexHelpMenu = 3
};
_UNNAMED_END
// Types
struct CEditorWindow::EditorWindowPrefs
{
PGPInt32 posX;
PGPInt32 posY;
PGPInt32 width;
PGPInt32 height;
PGPUInt32 diskUserColumns;
PGPBoolean showToolbar;
PGPBoolean largeButtons;
PGPBoolean showText;
PGPBoolean toolTips;
};
struct CEditorWindow::ToolbarButton :
public CListableObject<CEditorWindow::ToolbarButton>
{
TBBUTTON tbButton;
PGPInt32 index;
};
_UNNAMED_BEGIN
// Class CDiskProperties
class CDiskProperties : public CDialog
{
public:
CDiskProperties::CDiskProperties() : mPContext(NULL) { }
CDiskProperties::~CDiskProperties() { }
PGPBoolean WasReEncryptionBegun() const {return mReEncryptBegun;}
PGPBoolean WasReEncryptionCompleted() const {return mReEncryptCompleted;}
PGPUInt16 GetDialogId() const
{
return IDD_DISKPROPS_DLG;
}
void Display(const CPGPdiskContext *pContext, const char *path,
HWND parentWnd);
private:
CButton mReEncryptButton;
CButton mMountStartupCheck;
CButton mOverrideCheck;
CButton mAutoUnmountCheck;
CUTF8Edit mCurAlgoEdit;
CEdit mMinutesEdit;
CStatic mMinutesText;
CUpDownControl mMinutesUDCtrl;
const CPGPdiskContext *mPContext;
CPath mPath;
PGPBoolean mMountStartupValue;
PGPBoolean mOverrideValue;
PGPBoolean mAutoUnmountValue;
PGPUInt32 mMinutesValue;
PGPBoolean mReEncryptBegun;
PGPBoolean mReEncryptCompleted;
PGPBoolean mTreatAsRO;
void ImportValuesFromUI();
void ExportValuesToUI();
PGPBoolean FixWarnMinutes(PGPBoolean silently = FALSE);
void InitControls();
void OnAutoUnmountCheck();
void OnMountStartupCheck();
void OnOk();
void OnOverrideCheck();
void OnReEncryptButton();
void WriteChanges();
BOOL OnCommand(PGPUInt16 notifyCode, PGPUInt16 itemId, HWND ctrl);
void OnContextMenu(HWND menuWnd, CPoint coords);
void OnHelp(HELPINFO *pInfo);
BOOL OnInitDialog(HWND focusCtrl);
};
_UNNAMED_END
// Class CDiskProperties public member functions
void
CDiskProperties::Display(
const CPGPdiskContext *pContext,
const char *path,
HWND parentWnd)
{
pgpAssertAddrValid(pContext, CPGPdiskContext);
pgpAssertStrValid(path);
mPContext = pContext;
mPath = path;
mReEncryptBegun = FALSE;
mReEncryptCompleted = FALSE;
CreateModal(parentWnd);
}
void
CDiskProperties::ImportValuesFromUI()
{
mMountStartupValue = (mMountStartupCheck.GetCheck() == BST_CHECKED);
mOverrideValue = (mOverrideCheck.GetCheck() == BST_CHECKED);
mAutoUnmountValue = (mAutoUnmountCheck.GetCheck() == BST_CHECKED);
CString minutesText;
mMinutesEdit.GetWindowText(minutesText);
mMinutesValue = atoi(minutesText);
};
void
CDiskProperties::ExportValuesToUI()
{
mMountStartupCheck.SetCheck(mMountStartupValue ?
BST_CHECKED : BST_UNCHECKED);
mOverrideCheck.SetCheck(mOverrideValue ?
BST_CHECKED : BST_UNCHECKED);
mAutoUnmountCheck.SetCheck(mAutoUnmountValue ?
BST_CHECKED : BST_UNCHECKED);
CString minutesText;
_itoa(mMinutesValue, minutesText.GetBuffer(33), 10);
minutesText.ReleaseBuffer();
mMinutesEdit.SetWindowText(minutesText);
}
PGPBoolean
CDiskProperties::FixWarnMinutes(PGPBoolean silently)
{
using namespace UCommonStrings;
CommonString failString;
PGPBoolean failThis = FALSE;
PGPBoolean userWarned = FALSE;
ImportValuesFromUI();
// Verify that the minutes value is not too big or small.
if (!mAutoUnmountValue)
silently = TRUE;
if (mMinutesValue == 0)
{
failThis = TRUE;
mMinutesValue = 1;
failString = kPGPdiskOptionsMinutesTooSmall;
}
else if (mMinutesValue > kPGPdiskMaxMinutesTimeout)
{
failThis = TRUE;
mMinutesValue = kPGPdiskMaxMinutesTimeout;
failString = kPGPdiskOptionsMinutesTooLarge;
}
if (failThis)
{
if (!silently)
{
CMessageBox messageBox;
messageBox.Display(Get(failString),
Get(kPGPdiskOptionsMsgBoxTitle), Handle());
userWarned = TRUE;
}
ExportValuesToUI();
if (!silently)
{
// Point out the incorrect minutes entered by the user.
mMinutesEdit.SetFocus();
mMinutesEdit.SetSel(0, -1);
}
}
return userWarned;
}
void
CDiskProperties::InitControls()
{
using namespace UCommonStrings;
mTreatAsRO = CPGPdiskEngine::IsPathMountedPGPdisk(mPath) ||
!UEditMount::CheckWarnCanModifyDisk(*mPContext, mPath, Handle(),
Get(kEditorMsgBoxTitle));
CPGPdiskDisk disk;
disk.Open(*mPContext, mPath, TRUE);
CPGPclPrefs prefs(mPContext->PGPclPrefs());
// Display existing algorithm in static edit box.
CString curAlgoText;
CPGPdiskEngine::GetDiskAlgorithmIdString(disk.Algorithm(), curAlgoText);
mCurAlgoEdit.SetWindowText(curAlgoText);
// Display mount prefs.
mMountStartupValue = UEditMount::IsDiskMarkedForStartup(*mPContext,
mPath);
mMinutesUDCtrl.SetRange(1, kPGPdiskMaxMinutesTimeout);
PGPUInt32 customTimeout = disk.GetCustomTimeout();
mOverrideValue = disk.GetUsesCustomTimeout();
mAutoUnmountValue = (customTimeout > 0);
if (mAutoUnmountValue && (customTimeout > 0))
mMinutesValue = customTimeout;
else
mMinutesValue = prefs.GetNumber(kPGPPrefDiskAutoUnmountTimeout);
mMinutesEdit.EnableWindow(mAutoUnmountValue);
mMinutesUDCtrl.EnableWindow(mAutoUnmountValue);
mAutoUnmountCheck.EnableWindow(mOverrideValue);
mMinutesText.EnableWindow(mOverrideValue);
if (!mOverrideValue)
{
mMinutesEdit.EnableWindow(FALSE);
mMinutesUDCtrl.EnableWindow(FALSE);
}
// Disable controls if read-only.
if (mTreatAsRO)
{
mReEncryptButton.EnableWindow(FALSE);
mMountStartupCheck.EnableWindow(FALSE);
mOverrideCheck.EnableWindow(FALSE);
mAutoUnmountCheck.EnableWindow(FALSE);
mMinutesEdit.EnableWindow(FALSE);
mMinutesText.EnableWindow(FALSE);
mMinutesUDCtrl.EnableWindow(FALSE);
}
ExportValuesToUI();
FixWarnMinutes(TRUE);
}
void
CDiskProperties::OnAutoUnmountCheck()
{
ImportValuesFromUI();
mMinutesEdit.EnableWindow(mAutoUnmountValue);
mMinutesUDCtrl.EnableWindow(mAutoUnmountValue);
}
void
CDiskProperties::OnMountStartupCheck()
{
ImportValuesFromUI();
}
void
CDiskProperties::OnOk()
{
ImportValuesFromUI();
if (FixWarnMinutes())
return;
if (!mTreatAsRO)
WriteChanges();
CDialog::OnOk();
}
void
CDiskProperties::OnOverrideCheck()
{
ImportValuesFromUI();
mAutoUnmountCheck.EnableWindow(mOverrideValue);
mMinutesText.EnableWindow(mOverrideValue);
if (!mOverrideValue)
{
mMinutesEdit.EnableWindow(FALSE);
mMinutesUDCtrl.EnableWindow(FALSE);
}
else
{
mMinutesEdit.EnableWindow(mAutoUnmountValue);
mMinutesUDCtrl.EnableWindow(mAutoUnmountValue);
}
}
void
CDiskProperties::OnReEncryptButton()
{
try
{
using namespace UCommonStrings;
if (!UEditMount::CheckWarnCanModifyDisk(*mPContext, mPath, Handle(),
Get(kEditorMsgBoxTitle)))
{
THROW_PGPERROR(kPGPError_UserAbort);
}
ImportValuesFromUI();
if (FixWarnMinutes())
return;
WriteChanges();
CReEncryptWizard reEncryptWiz;
reEncryptWiz.Display(*mPContext, mPath, Handle(), &mReEncryptBegun);
mReEncryptCompleted = TRUE; // we finished successfully
InitControls();
}
catch (CComboError& error)
{
using namespace UCommonStrings;
ReportError(kTellDiskReEncryptFailed, kDiskPropertiesMsgBoxTitle,
error, Handle());
// Failed/interrupted conversions result in window close.
if (mReEncryptBegun && !mReEncryptCompleted)
CDialog::OnOk();
}
}
void
CDiskProperties::WriteChanges()
{
try
{
if (mMountStartupValue)
UEditMount::MarkDiskForStartup(*mPContext, mPath);
else
UEditMount::UnmarkDiskForStartup(*mPContext, mPath);
}
catch (CComboError&)
{
using namespace UCommonStrings;
CMessageBox messageBox;
messageBox.Display(Get(kTellCantMarkDiskFor),
Get(kPGPdiskOptionsMsgBoxTitle), Handle(),
CMessageBox::kWarningTone);
}
try
{
CPGPdiskDisk disk;
disk.Open(*mPContext, mPath);
disk.SetUsesCustomTimeout(mOverrideValue);
if (mAutoUnmountValue)
disk.SetCustomTimeout(mMinutesValue);
else
disk.SetCustomTimeout(0);
}
catch (CComboError&)
{
using namespace UCommonStrings;
CMessageBox messageBox;
messageBox.Display(Get(kTellCantSetCustomTimeout),
Get(kPGPdiskOptionsMsgBoxTitle), Handle(),
CMessageBox::kWarningTone);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -