You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
217 lines
9.2 KiB
217 lines
9.2 KiB
/*
|
|
|
|
SHEET1.CPP
|
|
|
|
Implements the property sheet page's behaviors.
|
|
|
|
*/
|
|
|
|
#include <nt.h>
|
|
#include <ntrtl.h>
|
|
#include <nturtl.h>
|
|
|
|
#include <windows.h>
|
|
#include <commdlg.h>
|
|
#include <commctrl.h>
|
|
#include <ole2.h>
|
|
#include <stdio.h>
|
|
|
|
#include "support.h"
|
|
#include "helpers.h"
|
|
#include "res.h"
|
|
#include "utils.h"
|
|
|
|
extern BOOL fUnblockActive;
|
|
extern INT iCurrent;
|
|
|
|
extern HINSTANCE ghInstance;
|
|
extern HWND hwndContainer;
|
|
void HelpHandler(LPARAM lp);
|
|
|
|
/* ---------------------------------------------------------------------
|
|
|
|
PageProc1
|
|
|
|
Page procedure for the first page, the PIN change page.
|
|
|
|
--------------------------------------------------------------------- */
|
|
|
|
INT_PTR CALLBACK PageProc1(
|
|
HWND hwnd,
|
|
UINT msg,
|
|
WPARAM wparam,
|
|
LPARAM lparam)
|
|
{
|
|
|
|
INT_PTR ret;
|
|
HWND hwndCred = NULL;
|
|
BOOL gfSuccess = FALSE;
|
|
|
|
switch (msg)
|
|
{
|
|
case WM_HELP:
|
|
{
|
|
HelpHandler(lparam);
|
|
break;
|
|
};
|
|
case WM_NOTIFY:
|
|
{
|
|
NMHDR *pHdr = (NMHDR *)lparam;
|
|
switch (pHdr->code)
|
|
{
|
|
case PSN_SETACTIVE:
|
|
// A good place to capture the hwnd of the enclosing property sheet
|
|
iCurrent = 1;
|
|
if (NULL == hwndContainer)
|
|
{
|
|
hwndContainer = pHdr->hwndFrom;
|
|
ASSERT(hwndContainer);
|
|
}
|
|
if (fUnblockActive)
|
|
{
|
|
// If sheet 2 still active force the UI back there.
|
|
SetWindowLongPtr(hwnd,DWLP_MSGRESULT,IDD_PAGE2);
|
|
return TRUE;
|
|
}
|
|
|
|
// return 0 to permit activation to proceed on this page.
|
|
return 0;
|
|
break;
|
|
|
|
case PSN_KILLACTIVE:
|
|
//User hit OK, or switched to another page
|
|
//do validation, return FALSE if ok to lose focus, else TRUE
|
|
return FALSE;
|
|
break;
|
|
|
|
case PSN_QUERYCANCEL:
|
|
// Return TRUE to prevent cancel, FALSE to allow it.
|
|
return FALSE;
|
|
|
|
case PSN_APPLY:
|
|
// Only process an apply for this page if it is the active page
|
|
// Only process an apply for this page if sheet 2 is active
|
|
// This will entail getting the two copies of the PIN, making sure they are
|
|
// identical, and
|
|
if (iCurrent != 1)
|
|
{
|
|
// If the user was looking at the other sheet when he hit OK, do
|
|
// nothing with the page.
|
|
SetWindowLongPtr(hwnd,DWLP_MSGRESULT,PSNRET_NOERROR);
|
|
return TRUE;
|
|
}
|
|
// buffers for old pin and 2 copies of new pin
|
|
WCHAR szOld[100];
|
|
WCHAR sz[100];
|
|
WCHAR sz2[100];
|
|
// SetWindowLong(DWL_MSGRESULT = PSNRET_INVALID if unable
|
|
// PSN_INVALID_NOCHANGEPAGE looks the same
|
|
// PSNRET_NOERROR - OK, page can be destroyed if OK
|
|
SetWindowLongPtr(hwnd,DWLP_MSGRESULT,PSNRET_NOERROR);
|
|
GetWindowText(GetDlgItem(hwnd,IDC_OLDPIN),szOld,100);
|
|
GetWindowText(GetDlgItem(hwnd,IDC_NEWPIN1),sz,100);
|
|
GetWindowText(GetDlgItem(hwnd,IDC_NEWPIN2),sz2,100);
|
|
|
|
|
|
// Do not process pin change unless the two copies entered by the user were the same
|
|
if (0 != wcscmp(sz,sz2))
|
|
{
|
|
PresentModalMessageBox(hwnd, IDS_NOTSAME,MB_ICONHAND);
|
|
SetWindowLongPtr(hwnd,DWLP_MSGRESULT,PSNRET_INVALID);
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
// Do not process an attempt to change the pin to a blank pin
|
|
if (wcslen(sz) == 0)
|
|
{
|
|
PresentModalMessageBox(hwnd, IDS_BADPIN,MB_ICONHAND);
|
|
SetWindowLongPtr(hwnd,DWLP_MSGRESULT,PSNRET_INVALID);
|
|
return TRUE;
|
|
}
|
|
|
|
DWORD dwRet = DoChangePin(szOld,sz);
|
|
if (0 == dwRet)
|
|
{
|
|
PresentModalMessageBox(hwnd,IDS_PINCHANGEOK,MB_OK);
|
|
}
|
|
else
|
|
{
|
|
switch(dwRet)
|
|
{
|
|
case SCARD_F_INTERNAL_ERROR:
|
|
PresentModalMessageBox(hwnd, IDS_INTERROR ,MB_ICONHAND);
|
|
break;
|
|
case SCARD_E_CANCELLED:
|
|
PresentModalMessageBox(hwnd, IDS_CANCELLED,MB_ICONHAND);
|
|
break;
|
|
case SCARD_E_NO_SERVICE:
|
|
PresentModalMessageBox(hwnd, IDS_NOSERVICE,MB_ICONHAND);
|
|
break;
|
|
case SCARD_E_SERVICE_STOPPED:
|
|
PresentModalMessageBox(hwnd, IDS_STOPPED,MB_ICONHAND);
|
|
break;
|
|
case SCARD_E_UNSUPPORTED_FEATURE:
|
|
PresentModalMessageBox(hwnd, IDS_UNSUPPORTED,MB_ICONHAND);
|
|
break;
|
|
case SCARD_E_FILE_NOT_FOUND:
|
|
PresentModalMessageBox(hwnd, IDS_NOTFOUND,MB_ICONHAND);
|
|
break;
|
|
case SCARD_E_WRITE_TOO_MANY:
|
|
PresentModalMessageBox(hwnd, IDS_TOOMANY,MB_ICONHAND);
|
|
break;
|
|
case SCARD_E_INVALID_CHV:
|
|
// !!! Note the mapping of invalid to wrong.
|
|
// consult public\sdk\inc\scarderr.h @ 562
|
|
PresentModalMessageBox(hwnd, IDS_WRONGCHV,MB_ICONHAND);
|
|
break;
|
|
case SCARD_W_UNSUPPORTED_CARD:
|
|
PresentModalMessageBox(hwnd, IDS_UNSUPPORTED,MB_ICONHAND);
|
|
break;
|
|
case SCARD_W_UNRESPONSIVE_CARD:
|
|
PresentModalMessageBox(hwnd, IDS_UNRESP ,MB_ICONHAND);
|
|
break;
|
|
case SCARD_W_REMOVED_CARD:
|
|
PresentModalMessageBox(hwnd, IDS_REMOVED ,MB_ICONHAND);
|
|
break;
|
|
case SCARD_W_WRONG_CHV:
|
|
PresentModalMessageBox(hwnd, IDS_WRONGCHV,MB_ICONHAND);
|
|
break;
|
|
case SCARD_W_CHV_BLOCKED:
|
|
PresentModalMessageBox(hwnd, IDS_BLOCKEDCHV,MB_ICONHAND);
|
|
break;
|
|
default:
|
|
PresentModalMessageBox(hwnd, IDS_PINCHANGEFAIL,MB_ICONHAND);
|
|
break;
|
|
}
|
|
SetWindowLongPtr(hwnd,DWLP_MSGRESULT,PSNRET_INVALID);
|
|
return TRUE;
|
|
}
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
break;
|
|
case WM_COMMAND:
|
|
// Button clicks.
|
|
switch(LOWORD(wparam))
|
|
{
|
|
case IDBUTTON1:
|
|
if (HIWORD(wparam) == BN_CLICKED)
|
|
{
|
|
SendMessage(hwndContainer,PSM_CHANGED,(WPARAM)hwnd,(LPARAM)0);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|