⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ceditorwindow.cpp

📁 PGP8.0源码 请认真阅读您的文件包然后写出其具体功能
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/*____________________________________________________________________________
		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 + -