|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1997 - 1999
//
// File: ccertbmp.cpp
//
//--------------------------------------------------------------------------
#include "global.hxx"
#include <dbgdef.h>
#define SELPALMODE TRUE
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
CCertificateBmp::CCertificateBmp() { m_fInitialized = FALSE; m_hpal = NULL; m_hbmpMiniCertOK = NULL; m_hbmpMiniCertNotOK = NULL; m_hbmbMiniCertExclamation = NULL; m_hbmbPKey = NULL; m_hWnd = NULL; m_hInst = NULL; m_pCertContext = NULL; m_dwChainError = 0; m_hWindowTextColorBrush = NULL; m_hWindowColorBrush = NULL; m_h3DLight = NULL; m_h3DHighLight = NULL; m_h3DLightShadow = NULL; m_h3DDarkShadow = NULL; m_fNoUsages = FALSE; }
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
CCertificateBmp::~CCertificateBmp() { if (m_hpal != NULL) { ::DeleteObject(m_hpal); }
if (m_hbmpMiniCertOK != NULL) { ::DeleteObject(m_hbmpMiniCertOK); }
if (m_hbmpMiniCertNotOK != NULL) { ::DeleteObject(m_hbmpMiniCertNotOK); }
if (m_hbmbMiniCertExclamation != NULL) { ::DeleteObject(m_hbmbMiniCertExclamation); }
if (m_hbmbPKey != NULL) { ::DeleteObject(m_hbmbPKey); } }
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
/*BOOL CCertificateBmp::IsTrueErrorString(DWORD dwError)
{ BOOL fRet;
switch (dwError) { case CERT_E_CHAINING: case TRUST_E_BASIC_CONSTRAINTS: case CERT_E_PURPOSE: case CERT_E_WRONG_USAGE: fRet = FALSE; break;
default: fRet = TRUE; break; } return fRet; }*/
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
void CCertificateBmp::SetChainError(DWORD dwError, BOOL fTrueError, BOOL fNoUsages) { m_dwChainError = dwError; m_fTrueError = fTrueError; //IsTrueErrorString(dwError);
m_fNoUsages = fNoUsages; }
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
void CCertificateBmp::SetHinst(HINSTANCE hInst) { m_hInst = hInst; }
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
HINSTANCE CCertificateBmp::Hinst() { return m_hInst; }
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
void CCertificateBmp::SetWindow(HWND hWnd) { m_hWnd = hWnd; }
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
HWND CCertificateBmp::GetMyWindow() { return m_hWnd; }
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
LRESULT APIENTRY CCertificateBmpProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { CCertificateBmp* This = (CCertificateBmp*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
switch (uMsg) { case WM_PAINT: CallWindowProc((WNDPROC)(This->m_prevProc), hwnd, uMsg, wParam, lParam); This->OnPaint(); break;
default: return CallWindowProc((WNDPROC)(This->m_prevProc), hwnd, uMsg, wParam, lParam); } return 0; }
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
void CCertificateBmp::DoSubclass() { SetWindowLongPtr(GetMyWindow(), GWLP_USERDATA, (LONG_PTR)this);
//
// hook the window proc so we can get first stab at the messages
//
m_prevProc = (WNDPROC)SetWindowLongPtr(GetMyWindow(), GWLP_WNDPROC, (LONG_PTR)CCertificateBmpProc); //
// Set 'no class cursor' so that SetCursor will work.
//
m_hPrevCursor = (HCURSOR)SetClassLongPtr(GetMyWindow(), GCLP_HCURSOR, NULL); }
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
void CCertificateBmp::DoUnSubclass() { if (m_prevProc) { SetWindowLongPtr(GetMyWindow(), GWLP_WNDPROC, (LONG_PTR)m_prevProc); SetWindowLongPtr(GetMyWindow(), GCLP_HCURSOR, (LONG_PTR)m_hPrevCursor); m_prevProc = NULL; } }
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
void CCertificateBmp::SetRevoked(BOOL fRevoked) { m_fRevoked = fRevoked; }
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
BOOL CCertificateBmp::GetRevoked() { return m_fRevoked; }
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
void CCertificateBmp::SetCertContext(PCCERT_CONTEXT pCertContext, BOOL fHasPrivateKey) { m_pCertContext = pCertContext; m_fHasPrivateKey = fHasPrivateKey; }
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
PCCERT_CONTEXT CCertificateBmp::GetCertContext() { return m_pCertContext; }
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
void CCertificateBmp::InitializeBmp() { m_hbmpMiniCertNotOK = LoadResourceBitmap(Hinst(), MAKEINTRESOURCE(IDB_REVOKED_MINICERT), NULL); m_hbmpMiniCertOK = LoadResourceBitmap(Hinst(), MAKEINTRESOURCE(IDB_MINICERT), NULL); m_hbmbMiniCertExclamation = LoadResourceBitmap(Hinst(), MAKEINTRESOURCE(IDB_EXCLAMATION_MINICERT), NULL); m_hbmbPKey = LoadResourceBitmap(Hinst(), MAKEINTRESOURCE(IDB_PRIVATEKEY), NULL); }
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
void CCertificateBmp::Initialize() { if (!m_fInitialized) { WCHAR szDisplayText[CRYPTUI_MAX_STRING_SIZE]; WCHAR szURLText[CRYPTUI_MAX_STRING_SIZE];
InitCommonControls(); InitializeBmp(); m_fInitialized = TRUE;
m_hWindowTextColorBrush = GetSysColorBrush(COLOR_WINDOWTEXT); m_hWindowColorBrush = GetSysColorBrush(COLOR_WINDOW); m_h3DLight= GetSysColorBrush(COLOR_3DLIGHT); m_h3DHighLight = GetSysColorBrush(COLOR_3DHILIGHT); m_h3DLightShadow = GetSysColorBrush(COLOR_3DSHADOW); m_h3DDarkShadow = GetSysColorBrush(COLOR_3DDKSHADOW); } }
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
/*
int CCertificateBmp::OnQueryNewPalette() { HDC hDC = GetDC(GetMyWindow());
HPALETTE hOldPal = SelectPalette(hDC, m_hpal, SELPALMODE); int iTemp = RealizePalette(hDC); // Realize drawing palette.
SelectPalette(hDC, hOldPal, TRUE); RealizePalette(hDC);
ReleaseDC(GetMyWindow(), hDC);
//
// Did the realization change?
//
if (iTemp) { InvalidateRect(GetMyWindow(), NULL, FALSE); } return(iTemp); } */
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
void CCertificateBmp::OnPaint() { Initialize();
BITMAP bmMiniCert; BITMAP bmPKey; LONG miniCertXY; RECT rect; RECT disclaimerButtonRect; RECT frameRect; RECT mainWindowRect; RECT borderRect; RECT goodForRect; LONG borderSpacing;
//PAINTSTRUCT ps;
HDC hdc = GetDC(GetMyWindow());//BeginPaint(GetMyWindow(), &ps);
if (hdc == NULL) { return; }
//
// get the mini bitmap first thing so it can be used to do sizing
//
memset(&bmMiniCert, 0, sizeof(bmMiniCert)); if ((m_dwChainError != 0) && m_fTrueError) { ::GetObject(m_hbmpMiniCertNotOK, sizeof(BITMAP), (LPSTR)&bmMiniCert); } else if ((m_dwChainError != 0) || m_fNoUsages) { ::GetObject(m_hbmbMiniCertExclamation, sizeof(BITMAP), (LPSTR)&bmMiniCert); } else { ::GetObject(m_hbmpMiniCertOK, sizeof(BITMAP), (LPSTR)&bmMiniCert); }
//
// calculate where the minicert bmp should be and where the lines should
// be based on where other controls are
//
GetWindowRect(GetDlgItem(m_hWnd, IDC_CERT_GENERAL_HEADER), &rect); MapWindowPoints(HWND_DESKTOP, m_hWnd, (LPPOINT) &rect, 2); miniCertXY = rect.bottom - bmMiniCert.bmHeight;
GetWindowRect(m_hWnd, &mainWindowRect); MapWindowPoints(HWND_DESKTOP, m_hWnd, (LPPOINT) &mainWindowRect, 2);
GetWindowRect(GetDlgItem(m_hWnd, IDC_DISCLAIMER_BUTTON), &disclaimerButtonRect); MapWindowPoints(HWND_DESKTOP, m_hWnd, (LPPOINT) &disclaimerButtonRect, 2);
//borderSpacing = mainWindowRect.right - disclaimerButtonRect.right;
if ((mainWindowRect.right - disclaimerButtonRect.right) < (miniCertXY - 7)) { borderSpacing = mainWindowRect.right - disclaimerButtonRect.right; } else { borderSpacing = miniCertXY - 7; }
//
// draw the background by drawing four rectangels. these rectangels
// border the "what this cert is good for" edit control or the error edit
// control if there is an error.
// we have to do this due to a bug in richedit where if you
// invalidate the entire rect of the control sometimes the scroll
// bars do not get redrawn.
//
if ((m_dwChainError != 0) || m_fNoUsages) { GetWindowRect(GetDlgItem(m_hWnd, IDC_CERT_GENERAL_ERROR_EDIT), &goodForRect); } else { GetWindowRect(GetDlgItem(m_hWnd, IDC_GOODFOR_EDIT), &goodForRect); } MapWindowPoints(HWND_DESKTOP, m_hWnd, (LPPOINT) &goodForRect, 2); rect.left = mainWindowRect.left + borderSpacing; rect.right = mainWindowRect.right - borderSpacing; rect.bottom = goodForRect.top; rect.top = mainWindowRect.top + borderSpacing; ::FillRect(hdc, &rect, m_hWindowColorBrush); rect.bottom = disclaimerButtonRect.top - borderSpacing; rect.top = goodForRect.bottom; ::FillRect(hdc, &rect, m_hWindowColorBrush); rect.top = goodForRect.top; rect.bottom = goodForRect.bottom; rect.left = mainWindowRect.left + borderSpacing; rect.right = goodForRect.left; ::FillRect(hdc, &rect, m_hWindowColorBrush);
rect.left = goodForRect.right; rect.right = mainWindowRect.right - borderSpacing; ::FillRect(hdc, &rect, m_hWindowColorBrush); //
// draw the frame
//
frameRect.left = mainWindowRect.left + borderSpacing; frameRect.right = mainWindowRect.right - borderSpacing; frameRect.bottom = disclaimerButtonRect.top - borderSpacing; frameRect.top = mainWindowRect.top + borderSpacing; borderRect.left = frameRect.left; borderRect.right = frameRect.right - 1; borderRect.top = frameRect.top; borderRect.bottom = frameRect.top + 1; ::FillRect(hdc, &borderRect, m_h3DLightShadow); borderRect.left = frameRect.left; borderRect.right = frameRect.left + 1; borderRect.top = frameRect.top; borderRect.bottom = frameRect.bottom - 1; ::FillRect(hdc, &borderRect, m_h3DLightShadow);
borderRect.left = frameRect.left + 1; borderRect.right = frameRect.right - 2; borderRect.top = frameRect.top + 1; borderRect.bottom = frameRect.top + 2; ::FillRect(hdc, &borderRect, m_h3DDarkShadow); borderRect.left = frameRect.left + 1; borderRect.right = frameRect.left + 2; borderRect.top = frameRect.top + 1; borderRect.bottom = frameRect.bottom - 2; ::FillRect(hdc, &borderRect, m_h3DDarkShadow);
borderRect.left = frameRect.left; borderRect.right = frameRect.right; borderRect.top = frameRect.bottom - 1; borderRect.bottom = frameRect.bottom; ::FillRect(hdc, &borderRect, m_h3DHighLight); borderRect.left = frameRect.right - 1; borderRect.right = frameRect.right; borderRect.top = frameRect.top; borderRect.bottom = frameRect.bottom; ::FillRect(hdc, &borderRect, m_h3DHighLight);
borderRect.left = frameRect.left + 1; borderRect.right = frameRect.right - 1; borderRect.top = frameRect.bottom - 2; borderRect.bottom = frameRect.bottom - 1; ::FillRect(hdc, &borderRect, m_h3DLight); borderRect.left = frameRect.right - 2; borderRect.right = frameRect.right - 1; borderRect.top = frameRect.top + 1; borderRect.bottom = frameRect.bottom - 1; ::FillRect(hdc, &borderRect, m_h3DLight); //
// draw the lines with the proper foreground color
//
GetWindowRect(GetDlgItem(m_hWnd, IDC_CERT_GENERAL_HEADER), &rect); MapWindowPoints(HWND_DESKTOP, m_hWnd, (LPPOINT) &rect, 2); rect.left = mainWindowRect.left + miniCertXY; rect.right = mainWindowRect.right - miniCertXY; rect.top = rect.bottom + 6; rect.bottom = rect.top + 1; ::FillRect(hdc, &rect, m_hWindowTextColorBrush);
GetWindowRect(GetDlgItem(m_hWnd, IDC_SUBJECT_EDIT), &rect); MapWindowPoints(HWND_DESKTOP, m_hWnd, (LPPOINT) &rect, 2); rect.left = mainWindowRect.left + miniCertXY; rect.right = mainWindowRect.right - miniCertXY; rect.top -= 10; rect.bottom = rect.top + 1; ::FillRect(hdc, &rect, m_hWindowTextColorBrush); //
// Draw the mini cert bitmap
//
if ((m_dwChainError != 0) && m_fTrueError) { MaskBlt(m_hbmpMiniCertNotOK, m_hpal, hdc, miniCertXY, miniCertXY, bmMiniCert.bmWidth, bmMiniCert.bmHeight); } else if ((m_dwChainError != 0) || m_fNoUsages) { MaskBlt(m_hbmbMiniCertExclamation, m_hpal, hdc, miniCertXY, miniCertXY, bmMiniCert.bmWidth, bmMiniCert.bmHeight); } else { MaskBlt(m_hbmpMiniCertOK, m_hpal, hdc, miniCertXY, miniCertXY, bmMiniCert.bmWidth, bmMiniCert.bmHeight); }
//
// if there is a private key then draw the bitmap
//
if (m_fHasPrivateKey) { GetWindowRect(GetDlgItem(m_hWnd, IDC_CERT_PRIVATE_KEY_EDIT), &rect); MapWindowPoints(HWND_DESKTOP, m_hWnd, (LPPOINT) &rect, 2);
memset(&bmPKey, 0, sizeof(bmPKey)); ::GetObject(m_hbmbPKey, sizeof(BITMAP), (LPSTR)&bmPKey); MaskBlt(m_hbmbPKey, m_hpal, hdc, rect.left - bmPKey.bmWidth - 4, rect.top - 2, bmPKey.bmWidth, bmPKey.bmHeight); }
ReleaseDC(GetMyWindow(), hdc);//::EndPaint(GetMyWindow(), &ps);
InvalidateRect(GetDlgItem(m_hWnd, IDC_SUBJECT_EDIT), NULL, TRUE); InvalidateRect(GetDlgItem(m_hWnd, IDC_ISSUER_EDIT), NULL, TRUE); InvalidateRect(GetDlgItem(m_hWnd, IDC_CERT_GENERAL_HEADER), NULL, TRUE); InvalidateRect(GetDlgItem(m_hWnd, IDC_CERT_GENERAL_GOODFOR_HEADER), NULL, TRUE); InvalidateRect(GetDlgItem(m_hWnd, IDC_CERT_GENERAL_ISSUEDTO_HEADER), NULL, TRUE); InvalidateRect(GetDlgItem(m_hWnd, IDC_CERT_GENERAL_ISSUEDBY_HEADER), NULL, TRUE); InvalidateRect(GetDlgItem(m_hWnd, IDC_CERT_GENERAL_VALID_EDIT), NULL, TRUE); InvalidateRect(GetDlgItem(m_hWnd, IDC_CERT_GENERAL_ERROR_EDIT), NULL, TRUE); InvalidateRect(GetDlgItem(m_hWnd, IDC_CERT_ISSUER_WARNING_EDIT), NULL, TRUE); InvalidateRect(GetDlgItem(m_hWnd, IDC_CERT_PRIVATE_KEY_EDIT), NULL, TRUE);
}
|