|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1999 - 1999
//
// File: scalert.cpp
//
//--------------------------------------------------------------------------
// SCAlert.cpp : Defines the class behaviors for the application.
//
#include "stdafx.h"
#include "SCAlert.h"
#include "miscdef.h"
#include "cmnstat.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
LPTSTR szAlertOptionsValue = TEXT("AlertOptions"); LPTSTR szScRemoveOptionsValue = TEXT("ScRemoveOption"); LPTSTR szScLogonReaderValue = TEXT("ScLogonReader");
/////////////////////////////////////////////////////////////////////////////
// CSCStatusApp
BEGIN_MESSAGE_MAP(CSCStatusApp, CWinApp) //{{AFX_MSG_MAP(CSCStatusApp)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// The one and only CSCStatusApp object
CSCStatusApp theApp;
/////////////////////////////////////////////////////////////////////////////
// CSCStatusApp construction
CSCStatusApp::CSCStatusApp() { m_strLogonReader.Empty(); m_strRemovalText.Empty(); }
/////////////////////////////////////////////////////////////////////////////
// CSCStatusApp initialization
BOOL CSCStatusApp::InitInstance() { // Locals
BOOL fReturn = TRUE; DWORD dwStatus = 0; CNotifyWin* pNotifyWin = NULL; CString sWindowName;
try { // set params
m_hSCardContext = NULL; m_pMainWnd = NULL; m_dwState = k_State_Unknown;
SetAlertOptions(); SetRemovalOptions();
// Enable ActiveX control usage
AfxEnableControlContainer();
// Enable 3D Contols
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
// Load the icons
m_hIconCard = LoadIcon(MAKEINTRESOURCE(IDI_SC_READERLOADED_V2)); m_hIconCalaisDown = LoadIcon(MAKEINTRESOURCE(IDI_SC_READERERR)); m_hIconRdrEmpty = LoadIcon(MAKEINTRESOURCE(IDI_SC_READEREMPTY_V2)); m_hIconCardInfo = LoadIcon(MAKEINTRESOURCE(IDI_SC_INFO));
// Create the "main" window for this app
m_pMainWnd = (CWnd*)new(CNotifyWin); if (m_pMainWnd == NULL) throw (FALSE);
// Get pointer to CNotifyWin class
pNotifyWin = (CNotifyWin*)m_pMainWnd;
if (!pNotifyWin->FinalConstruct()) { delete pNotifyWin; m_pMainWnd = NULL; throw (FALSE); }
// Get the window name
fReturn = sWindowName.LoadString(IDS_NOTIFY_WIN_NAME); if (!fReturn) throw (fReturn);
// Create the window
fReturn = m_pMainWnd->CreateEx( 0, pNotifyWin->m_sClassName, sWindowName, 0, 0,0,0,0, NULL, NULL, NULL); if (!fReturn) throw (fReturn);
} catch (...) { fReturn = FALSE; TRACE_CATCH_UNKNOWN(_T("CSCStatusApp::InitInstance")); }
return fReturn; }
/*++
void SetAlertOptions:
Set User's alert options according to regkey settings (or default)
Arguments: Return Value:
None.
Author:
Amanda Matlosz 5/13/99
--*/ void CSCStatusApp::SetAlertOptions(bool fRead) { long lSts = ERROR_SUCCESS; HKEY hKey = NULL;
// Either read the AlertOptions from the registry...
if (fRead) { DWORD dwOption = -1; DWORD dwSize = sizeof(DWORD); DWORD dwType = 0;
lSts = RegOpenKeyEx( HKEY_CURRENT_USER, szAlertOptionsKey, 0, KEY_READ, &hKey);
if (ERROR_SUCCESS == lSts) {
lSts = RegQueryValueEx( hKey, szAlertOptionsValue, 0, &dwType, (PBYTE)&dwOption, &dwSize ); }
if (k_AlertOption_IconMsg < dwOption) { // default value is "IconSoundMessage"
m_dwAlertOption = k_AlertOption_IconSoundMsg; } else { m_dwAlertOption = dwOption; }
} // Or set the value of the registry "AlertOptions"
else { DWORD dw = 0; // don't really care about this param
lSts = RegCreateKeyEx( HKEY_CURRENT_USER, szAlertOptionsKey, 0, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &dw);
if (ERROR_SUCCESS == lSts) { RegSetValueEx( hKey, szAlertOptionsValue, 0, REG_DWORD, (PBYTE)&m_dwAlertOption, sizeof(DWORD) ); }
}
// cleanup
if (NULL != hKey) { RegCloseKey(hKey); } }
/*++
void SetRemovalOptions:
Determine if user has set ScremoveOption for smart card logon, and set behavior for ScAlert accordingly. Arguments: Return Value:
None. Author:
Amanda Matlosz 6/02/99
--*/ void CSCStatusApp::SetRemovalOptions() { long lSts = ERROR_SUCCESS; HKEY hKey = NULL; DWORD dwType = 0; DWORD dwSize = 2*sizeof(TCHAR);
TCHAR szRemoveOption[2]; lSts = RegOpenKeyEx( HKEY_LOCAL_MACHINE, szScRemoveOptionKey, 0, KEY_READ, &hKey);
if (ERROR_SUCCESS == lSts) { // this value must be either '0', '1', '2', or nonexistent.
lSts = RegQueryValueEx( hKey, szScRemoveOptionsValue, 0, &dwType, (PBYTE)szRemoveOption, &dwSize ); }
if (ERROR_SUCCESS == lSts) { // if '1' or '2' find out what reader was used for logon, if any.
if('1' == *szRemoveOption) { m_strRemovalText.LoadString(IDS_SC_REMOVAL_LOCK); } else if ('2' == *szRemoveOption) { m_strRemovalText.LoadString(IDS_SC_REMOVAL_LOGOFF); } }
if (!m_strRemovalText.IsEmpty()) { dwSize = 0; LPTSTR szLogonReader = NULL;
lSts = RegQueryValueEx( hKey, szScLogonReaderValue, 0, &dwType, NULL, &dwSize );
if (ERROR_SUCCESS == lSts) { szLogonReader = m_strLogonReader.GetBuffer(dwSize);
lSts = RegQueryValueEx( hKey, szScLogonReaderValue, 0, &dwType, (PBYTE)szLogonReader, &dwSize ); m_strLogonReader.ReleaseBuffer(); } }
// cleanup
if (NULL != hKey) { RegCloseKey(hKey); } }
/*++
void ExitInstance:
Does instance uninitialization
Arguments:
None.
Return Value:
Win32 error codes. 0 indicates no error occured.
Author:
Chris Dudley 7/30/1997
Note:
--*/
int CSCStatusApp::ExitInstance() { // save the alert options
SetAlertOptions(false);
// Release calais if required
if (m_hSCardContext != NULL) { SCardReleaseContext(m_hSCardContext); }
// Make sure the window is deleted
if (m_pMainWnd != NULL) { delete m_pMainWnd; }
return CWinApp::ExitInstance(); }
|