|
|
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Microsoft Windows, Copyright (C) Microsoft Corporation, 2000
File: DialogUI.CPP
Content: UI dialogs.
History: 11-15-99 dsie created
------------------------------------------------------------------------------*/
#include "StdAfx.h"
#include "CAPICOM.h"
#include "Certificate.h"
#include "Settings.h"
////////////////////////////////////////////////////////////////////////////////
//
// typedefs.
//
typedef struct _CAPICOM_DIALOG_DATA { DWORD dwDlgId; WCHAR wszDomainName[INTERNET_MAX_URL_LENGTH]; BOOL bWasApproved; BOOL bDoNotShowWasChecked; } CAPICOM_DIALOG_DATA, * PCAPICOM_DIALOG_DATA;
static CAPICOM_DIALOG_DATA g_DialogData[] = { {IDD_STORE_OPEN_SECURITY_ALERT_DLG, '\0', FALSE, FALSE}, {IDD_STORE_ADD_SECURITY_ALERT_DLG, '\0', FALSE, FALSE}, {IDD_STORE_REMOVE_SECURITY_ALERT_DLG, '\0', FALSE, FALSE}, {IDD_SIGN_SECURITY_ALERT_DLG, '\0', FALSE, FALSE}, {IDD_DECRYPT_SECURITY_ALERT_DLG, '\0', FALSE, FALSE}, };
#define g_NumDialogs (ARRAYSIZE(g_DialogData))
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function : CenterWindow
Synopsis : Certer the window to the screen.
Parameter: HWND hwnd - Window handle.
Remark :
------------------------------------------------------------------------------*/
static void CenterWindow (HWND hwnd) { RECT rect;
//
// Sanity check.
//
ATLASSERT(hwnd);
//
// Get dimension of window.
//
if (::GetWindowRect(hwnd, &rect)) { //
// Calculate center point.
//
int wx = (::GetSystemMetrics(SM_CXSCREEN) - (rect.right - rect.left)) / 2; int wy = (::GetSystemMetrics(SM_CYSCREEN) - (rect.bottom - rect.top)) / 2; //
// Position it.
//
if (wx > 0 && wy > 0) { ::SetWindowPos(hwnd, NULL, wx, wy, 0, 0, SWP_NOSIZE | SWP_NOZORDER); } }
return; }
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function : UserApprovedOperationDlgProc
Synopsis : UserApprovedOperation dialog proc.
Remark :
------------------------------------------------------------------------------*/
INT_PTR CALLBACK UserApprovedOperationDlgProc (HWND hDlg, // Handle to dialog box
UINT uMsg, // Message
WPARAM wParam, // First message parameter
LPARAM lParam) // Second message parameter
{ PCAPICOM_DIALOG_DATA pDialogData = NULL;
switch (uMsg) { case WM_INITDIALOG: { if (lParam) { ::SetWindowLongPtr(hDlg, GWLP_USERDATA, (LONG_PTR) lParam); }
CenterWindow(hDlg);
SetFocus(GetDlgItem(hDlg, IDNO));
return TRUE; } case WM_COMMAND: { if (BN_CLICKED == HIWORD(wParam)) { switch(LOWORD(wParam)) { case IDYES: case IDNO: case IDCANCEL: { EndDialog(hDlg, LOWORD(wParam)); return TRUE; }
case IDC_DLG_NO_SHOW_AGAIN: { if (pDialogData = (PCAPICOM_DIALOG_DATA) ::GetWindowLongPtr(hDlg, GWLP_USERDATA)) { if (BST_CHECKED == ::IsDlgButtonChecked(hDlg, IDC_DLG_NO_SHOW_AGAIN)) { pDialogData->bDoNotShowWasChecked = TRUE; } else { pDialogData->bDoNotShowWasChecked = FALSE; }
}
return TRUE; } } }
break; }
case WM_CLOSE: { EndDialog(hDlg, IDNO); return 0; } }
return FALSE; }
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function : UserApprovedOperation
Synopsis : Pop UI to prompt user to approve an operation.
Parameter: DWORD iddDialog - Dialog ID.
LPWSTR pwszDomain - DNS name.
Remark :
------------------------------------------------------------------------------*/
HRESULT UserApprovedOperation (DWORD iddDialog, LPWSTR pwszDomain) { HRESULT hr = S_OK; INT_PTR iDlgRet = 0; PCAPICOM_DIALOG_DATA pDialogData = NULL;
DebugTrace("Entering UserApprovedOperation().\n");
//
// Sanity check.
//
ATLASSERT(iddDialog); ATLASSERT(pwszDomain);
//
// Determine dialog box.
//
for (DWORD i = 0; i < g_NumDialogs; i++) { if (iddDialog == g_DialogData[i].dwDlgId) { break; } } if (i == g_NumDialogs) { hr = CAPICOM_E_INTERNAL;
DebugTrace("Error [%#x]: Unknown dialog ID (iddDialog = %#x).\n", hr, iddDialog); goto ErrorExit; }
//
// Point to the dialog data.
//
pDialogData = &g_DialogData[i];
//
// Had the domain changed?
//
if (0 != _wcsicmp(pDialogData->wszDomainName, pwszDomain)) { //
// Reset stickiness.
//
pDialogData->bWasApproved = FALSE; pDialogData->bDoNotShowWasChecked = FALSE; wcsncpy(pDialogData->wszDomainName, pwszDomain, INTERNET_MAX_URL_LENGTH); pDialogData->wszDomainName[INTERNET_MAX_URL_LENGTH - 1] = '\0'; }
//
// Pop if necessary.
//
if (pDialogData->bDoNotShowWasChecked) { //
// The "Do not show..." had been previously checked, so we will
// only allow the operation if it was previously allowed.
//
if (!pDialogData->bWasApproved) { hr = CAPICOM_E_CANCELLED;
DebugTrace("Info: operation presumed cancelled since \"Do not show...\" was checked and the last response wasn't YES.\n"); } } else { //
// The "Do not show..." had not been checked previously, so pop.
//
if (-1 == (iDlgRet = ::DialogBoxParamA(_Module.GetResourceInstance(), (LPSTR) MAKEINTRESOURCE(iddDialog), NULL, UserApprovedOperationDlgProc, (LPARAM) pDialogData))) { hr = HRESULT_FROM_WIN32(::GetLastError());
DebugTrace("Error [%#x]: DialogBoxParam() failed.\n"); goto ErrorExit; }
//
// Check result.
//
if (IDYES == iDlgRet) { //
// For Store.Open dialog, we always force the "Do not show..." condition.
//
if (IDD_STORE_OPEN_SECURITY_ALERT_DLG == iddDialog) { pDialogData->bDoNotShowWasChecked = TRUE; }
pDialogData->bWasApproved = TRUE; } else { pDialogData->bWasApproved = FALSE;
hr = CAPICOM_E_CANCELLED; DebugTrace("Info: operation has been cancelled by user.\n"); } }
CommonExit:
DebugTrace("Leaving UserApprovedOperation().\n");
return hr;
ErrorExit: //
// Sanity check.
//
ATLASSERT(FAILED(hr));
goto CommonExit; }
|