Leaked source code of windows server 2003
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.
 
 
 
 
 
 

921 lines
36 KiB

/*++
Copyright (c) 1996-2002 Microsoft Corp. & Ricoh Co., Ltd. All rights reserved.
FILE: RIAFUI.CPP
Abstract: Main file for OEM UI plugin module.
Functions: OEMDocumentPropertySheets
OEMCommonUIProp
Environment: Windows NT Unidrv5 driver
Revision History:
02/25/2000 -Masatoshi Kubokura-
Began to modify for PCL5e/PScript plugin from RPDL code.
03/31/2000 -Masatoshi Kubokura-
SetWindowLong -> SetWindowLongPtr for 64bit build.
06/07/2000 -Masatoshi Kubokura-
V.1.11
08/02/2000 -Masatoshi Kubokura-
V.1.11 for NT4
11/29/2000 -Masatoshi Kubokura-
Last modified for XP inbox.
02/26/2002 -Masatoshi Kubokura-
Include strsafe.h.
Add FileNameBufSize as arg3 at RWFileData().
Use OemToCharBuff() instead of OemToChar().
03/29/2002 -Masatoshi Kubokura-
Eliminate "#if 0".
Use SecureZeroMemory() instead of memset(,0,)
04/03/2002 -Masatoshi Kubokura-
Use safe_strlenW() instead of lstrlen().
--*/
#include <minidrv.h>
#include "devmode.h"
#include "oem.h"
#include "resource.h"
#include <prsht.h>
#include <mbstring.h> // _ismbcdigit, _ismbcalnum
#ifndef WINNT_40
#include "strsafe.h" // @Feb/26/2002
#endif // !WINNT_40
////////////////////////////////////////////////////////
// GLOBALS
////////////////////////////////////////////////////////
HINSTANCE ghInstance = NULL;
////////////////////////////////////////////////////////
// INTERNAL MACROS and DEFINES
////////////////////////////////////////////////////////
// @Apr/04/2002 ->
#define RES_ID_MASK 0xffff
#define is_valid_ptr(p) (~RES_ID_MASK & (UINT_PTR)(p))
// @Apr/04/2002 <-
extern "C" {
////////////////////////////////////////////////////////
// EXTERNAL PROTOTYPES
////////////////////////////////////////////////////////
extern BOOL RWFileData(PFILEDATA pFileData, LPWSTR pwszFileName, LONG FileNameBufSize, LONG type);
////////////////////////////////////////////////////////
// INTERNAL PROTOTYPES
////////////////////////////////////////////////////////
INT_PTR CALLBACK JobPageProc(HWND, UINT, WPARAM, LPARAM);
//////////////////////////////////////////////////////////////////////////
// Function: safe_strlenW
//////////////////////////////////////////////////////////////////////////
INT safe_strlenW(wchar_t* psz, size_t cchMax)
{
#ifndef WINNT_40
HRESULT hr;
size_t cch = 0;
hr = StringCchLengthW(psz, cchMax, &cch);
VERBOSE(("** safe_strlenW: size(lstrlen)=%d **\n", lstrlen(psz)));
VERBOSE(("** safe_strlenW: size(StringCchLength)=%d **\n", cch));
if (SUCCEEDED(hr))
return cch;
else
return 0;
#else // WINNT_40
return lstrlenW(psz);
#endif // WINNT_40
} //*** safe_strlenW
//////////////////////////////////////////////////////////////////////////
// Function: DllMain
//////////////////////////////////////////////////////////////////////////
BOOL WINAPI DllMain(HINSTANCE hInst, WORD wReason, LPVOID lpReserved)
{
#if DBG
//giDebugLevel = DBG_VERBOSE;
////#define giDebugLevel DBG_VERBOSE // enable VERBOSE() in each file
#endif // DBG
VERBOSE((DLLTEXT("** enter DllMain **\n")));
switch(wReason)
{
case DLL_PROCESS_ATTACH:
VERBOSE((DLLTEXT("** Process attach. **\n")));
// Save DLL instance for use later.
ghInstance = hInst;
break;
case DLL_THREAD_ATTACH:
VERBOSE((DLLTEXT("Thread attach.\n")));
break;
case DLL_PROCESS_DETACH:
VERBOSE((DLLTEXT("Process detach.\n")));
break;
case DLL_THREAD_DETACH:
VERBOSE((DLLTEXT("Thread detach.\n")));
break;
}
return TRUE;
} //*** DllMain
//////////////////////////////////////////////////////////////////////////
// Function: OEMDocumentPropertySheets
//////////////////////////////////////////////////////////////////////////
LRESULT APIENTRY OEMDocumentPropertySheets(PPROPSHEETUI_INFO pPSUIInfo, LPARAM lParam)
{
LRESULT lResult = FALSE;
#if DBG
giDebugLevel = DBG_VERBOSE;
#endif // DBG
// Validate parameters.
if( (NULL == pPSUIInfo)
||
IsBadWritePtr(pPSUIInfo, pPSUIInfo->cbSize)
||
(PROPSHEETUI_INFO_VERSION != pPSUIInfo->Version)
||
( (PROPSHEETUI_REASON_INIT != pPSUIInfo->Reason)
&&
(PROPSHEETUI_REASON_GET_INFO_HEADER != pPSUIInfo->Reason)
&&
(PROPSHEETUI_REASON_GET_ICON != pPSUIInfo->Reason)
&&
(PROPSHEETUI_REASON_SET_RESULT != pPSUIInfo->Reason)
&&
(PROPSHEETUI_REASON_DESTROY != pPSUIInfo->Reason)
)
)
{
ERR((DLLTEXT("OEMDocumentPropertySheets() ERROR_INVALID_PARAMETER.\n")));
// Return invalid parameter error.
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
VERBOSE(("\n"));
VERBOSE((DLLTEXT("OEMDocumentPropertySheets() entry. Reason=%d\n"), pPSUIInfo->Reason));
// @Aug/29/2000 ->
#ifdef DISKLESSMODEL
{
DWORD dwError, dwType, dwNeeded;
BYTE ValueData;
POEMUIPSPARAM pOEMUIPSParam = (POEMUIPSPARAM)pPSUIInfo->lParamInit;
dwError = GetPrinterData(pOEMUIPSParam->hPrinter, REG_HARDDISK_INSTALLED, &dwType,
(PBYTE)&ValueData, sizeof(BYTE), &dwNeeded);
if (ERROR_SUCCESS != dwError)
{
VERBOSE((DLLTEXT(" CAN'T READ REGISTRY (%d).\n"), dwError));
return FALSE;
}
else if (!ValueData)
{
VERBOSE((DLLTEXT(" HARD DISK ISN'T INSTALLED.\n")));
return FALSE;
}
}
#endif // DISKLESSMODEL
// @Aug/29/2000 <-
// Do action.
switch(pPSUIInfo->Reason)
{
case PROPSHEETUI_REASON_INIT:
{
POEMUIPSPARAM pOEMUIPSParam = (POEMUIPSPARAM)pPSUIInfo->lParamInit;
POEMUD_EXTRADATA pOEMExtra = MINIPRIVATE_DM(pOEMUIPSParam);
#ifdef WINNT_40
VERBOSE((DLLTEXT("** dwFlags=%lx **\n"), pOEMUIPSParam->dwFlags));
if (pOEMUIPSParam->dwFlags & DM_NOPERMISSION)
BITSET32(pOEMExtra->fUiOption, UIPLUGIN_NOPERMISSION);
#endif // WINNT_40
pPSUIInfo->UserData = NULL;
if ((pPSUIInfo->UserData = (LPARAM)HeapAlloc(pOEMUIPSParam->hOEMHeap,
HEAP_ZERO_MEMORY,
sizeof(UIDATA))))
{
PROPSHEETPAGE Page;
PUIDATA pUiData = (PUIDATA)pPSUIInfo->UserData;
FILEDATA FileData; // <- pFileData (formerly use MemAllocZ) @2000/03/15
// read PRINT_DONE flag from data file
FileData.fUiOption = 0;
RWFileData(&FileData, pOEMExtra->SharedFileName, sizeof(pOEMExtra->SharedFileName), GENERIC_READ);
// set PRINT_DONE flag
if (BITTEST32(FileData.fUiOption, PRINT_DONE))
BITSET32(pOEMExtra->fUiOption, PRINT_DONE);
VERBOSE((DLLTEXT("** Flag=%lx,File Name=%ls **\n"),
pOEMExtra->fUiOption, pOEMExtra->SharedFileName));
pUiData->hComPropSheet = pPSUIInfo->hComPropSheet;
pUiData->pfnComPropSheet = pPSUIInfo->pfnComPropSheet;
pUiData->pOEMExtra = pOEMExtra;
// Init property page.
// Use SecureZeroMemory @Mar/29/2002 ->
#if defined(WINNT_40) || defined(RICOH_RELEASE)
memset(&Page, 0, sizeof(PROPSHEETPAGE));
#else
SecureZeroMemory(&Page, sizeof(PROPSHEETPAGE));
#endif
// Mar/29/2002 <-
Page.dwSize = sizeof(PROPSHEETPAGE);
Page.dwFlags = PSP_DEFAULT;
Page.hInstance = ghInstance;
Page.pszTemplate = MAKEINTRESOURCE(IDD_JOBMAIN);
Page.pfnDlgProc = JobPageProc;
Page.lParam = (LPARAM)pUiData;
// Add property sheets.
lResult = pPSUIInfo->pfnComPropSheet(pPSUIInfo->hComPropSheet,
CPSFUNC_ADD_PROPSHEETPAGE,
(LPARAM)&Page, 0);
pUiData->hPropPage = (HANDLE)lResult;
VERBOSE((DLLTEXT("** INIT: lResult=%x **\n"), lResult));
lResult = (lResult > 0)? TRUE : FALSE;
}
}
break;
case PROPSHEETUI_REASON_GET_INFO_HEADER:
lResult = TRUE;
break;
case PROPSHEETUI_REASON_GET_ICON:
// No icon
lResult = 0;
break;
case PROPSHEETUI_REASON_SET_RESULT:
{
PSETRESULT_INFO pInfo = (PSETRESULT_INFO) lParam;
lResult = pInfo->Result;
}
break;
case PROPSHEETUI_REASON_DESTROY:
lResult = TRUE;
if (pPSUIInfo->UserData)
{
POEMUIPSPARAM pOEMUIPSParam = (POEMUIPSPARAM)pPSUIInfo->lParamInit;
HeapFree(pOEMUIPSParam->hOEMHeap, 0, (void*)pPSUIInfo->UserData);
}
break;
}
pPSUIInfo->Result = lResult;
return lResult;
} //*** OEMDocumentPropertySheets
/***************************************************************************
Function Name : InitMainDlg
***************************************************************************/
VOID InitMainDlg(
HWND hDlg,
PUIDATA pUiData)
{
// initialize edit box
SetDlgItemText(hDlg, IDC_EDIT_JOBMAIN_USERID, pUiData->UserIdBuf);
SendDlgItemMessage(hDlg, IDC_EDIT_JOBMAIN_USERID, EM_LIMITTEXT, USERID_LEN, 0);
SetDlgItemText(hDlg, IDC_EDIT_JOBMAIN_PASSWORD, pUiData->PasswordBuf);
SendDlgItemMessage(hDlg, IDC_EDIT_JOBMAIN_PASSWORD, EM_LIMITTEXT, PASSWORD_LEN, 0);
SetDlgItemText(hDlg, IDC_EDIT_JOBMAIN_USERCODE, pUiData->UserCodeBuf);
SendDlgItemMessage(hDlg, IDC_EDIT_JOBMAIN_USERCODE, EM_LIMITTEXT, USERCODE_LEN, 0);
// initialize radio button
CheckRadioButton(hDlg, IDC_RADIO_JOB_NORMAL, IDC_RADIO_JOB_SECURE, pUiData->JobType);
CheckRadioButton(hDlg, IDC_RADIO_LOG_DISABLED, IDC_RADIO_LOG_ENABLED, pUiData->LogDisabled);
// initialize check box
SendDlgItemMessage(hDlg, IDC_CHECK_JOB_DEFAULT, BM_SETCHECK,
(BITTEST32(pUiData->fUiOption, HOLD_OPTIONS)? 0 : 1), 0);
if (1 <= safe_strlenW(pUiData->UserIdBuf, sizeof(pUiData->UserIdBuf)))
{
EnableWindow(GetDlgItem(hDlg, IDC_RADIO_JOB_SAMPLE), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_RADIO_JOB_SECURE), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_CHECK_JOB_DEFAULT), TRUE);
}
else
{
EnableWindow(GetDlgItem(hDlg, IDC_RADIO_JOB_SAMPLE), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_RADIO_JOB_SECURE), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_CHECK_JOB_DEFAULT), FALSE);
}
if (IDC_RADIO_JOB_SECURE == pUiData->JobType)
{
EnableWindow(GetDlgItem(hDlg, IDC_LABEL_JOBMAIN_PASSWORD), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_LABEL_JOBMAIN_PASSWORD2), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_JOBMAIN_PASSWORD), TRUE);
}
else
{
EnableWindow(GetDlgItem(hDlg, IDC_LABEL_JOBMAIN_PASSWORD), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_LABEL_JOBMAIN_PASSWORD2), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_JOBMAIN_PASSWORD), FALSE);
}
if (IDC_RADIO_LOG_ENABLED == pUiData->LogDisabled)
{
EnableWindow(GetDlgItem(hDlg, IDC_LABEL_JOBMAIN_USERCODE), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_LABEL_JOBMAIN_USERCODE2), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_JOBMAIN_USERCODE), TRUE);
}
else
{
EnableWindow(GetDlgItem(hDlg, IDC_LABEL_JOBMAIN_USERCODE), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_LABEL_JOBMAIN_USERCODE2), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_JOBMAIN_USERCODE), FALSE);
}
#ifdef WINNT_40
// Disable tab options when user has no permission.
if (BITTEST32(pUiData->fUiOption, UIPLUGIN_NOPERMISSION))
{
EnableWindow(GetDlgItem(hDlg, IDC_LABEL_JOBMAIN_USERID), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_LABEL_JOBMAIN_USERID2), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_LABEL_JOBMAIN_USERID3), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_LABEL_JOBMAIN_JOB), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_LABEL_JOBMAIN_PASSWORD), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_LABEL_JOBMAIN_PASSWORD2), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_LABEL_JOBMAIN_LOG), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_LABEL_JOBMAIN_USERCODE), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_LABEL_JOBMAIN_USERCODE2), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_JOBMAIN_USERID), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_JOBMAIN_PASSWORD), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_JOBMAIN_USERCODE), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_RADIO_JOB_NORMAL), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_RADIO_JOB_SAMPLE), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_RADIO_JOB_SECURE), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_RADIO_LOG_DISABLED), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_RADIO_LOG_ENABLED), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_CHECK_JOB_DEFAULT), FALSE);
}
#endif // WINNT_40
} //*** InitMainDlg
/***************************************************************************
Function Name : GetInfoFromOEMPdev
get data from private devmode
***************************************************************************/
VOID GetInfoFromOEMPdev(PUIDATA pUiData)
{
POEMUD_EXTRADATA pOEMExtra = pUiData->pOEMExtra;
VERBOSE((DLLTEXT("GetInfoFromOEMPdev: print done?(%d)\n"),
BITTEST32(pOEMExtra->fUiOption, PRINT_DONE)));
// if previous printing is finished and hold-options flag isn't valid,
// reset job setting.
if (BITTEST32(pOEMExtra->fUiOption, PRINT_DONE) &&
!BITTEST32(pOEMExtra->fUiOption, HOLD_OPTIONS))
{
pUiData->JobType = IDC_RADIO_JOB_NORMAL;
// Use SecureZeroMemory @Mar/26/2002 (MS), Mar/29/2002 ->
#if defined(WINNT_40) || defined(RICOH_RELEASE)
memset(pUiData->PasswordBuf, 0, sizeof(pUiData->PasswordBuf));
#else
SecureZeroMemory(pUiData->PasswordBuf, sizeof(pUiData->PasswordBuf));
#endif
// @Mar/26/2002, Mar/29/2002 <-
// do not clear PRINT_DONE flag here
}
else
{
pUiData->JobType = pOEMExtra->JobType;
// ascii to unicode
// @Feb/27/2002 ->
// OemToChar((LPSTR)pOEMExtra->PasswordBuf, pUiData->PasswordBuf);
OemToCharBuff((LPSTR)pOEMExtra->PasswordBuf, pUiData->PasswordBuf, PASSWORD_LEN);
// @Feb/27/2002 <-
}
pUiData->fUiOption = pOEMExtra->fUiOption;
pUiData->LogDisabled = pOEMExtra->LogDisabled;
// ascii to unicode
// @Feb/27/2002 ->
// OemToChar((LPSTR)pOEMExtra->UserIdBuf, pUiData->UserIdBuf);
// OemToChar((LPSTR)pOEMExtra->UserCodeBuf, pUiData->UserCodeBuf);
OemToCharBuff((LPSTR)pOEMExtra->UserIdBuf, pUiData->UserIdBuf, USERID_LEN);
OemToCharBuff((LPSTR)pOEMExtra->UserCodeBuf, pUiData->UserCodeBuf, USERCODE_LEN);
// @Feb/27/2002 <-
} //*** GetInfoFromOEMPdev
/***************************************************************************
Function Name : SetInfoToOEMPdev
set data to private devmode
***************************************************************************/
VOID SetInfoToOEMPdev(PUIDATA pUiData)
{
POEMUD_EXTRADATA pOEMExtra = pUiData->pOEMExtra;
// if only main dialog is changed
if (!BITTEST32(pUiData->fUiOption, JOBLOGDLG_UPDATED))
return;
// unicode to ascii
CharToOem(pUiData->UserIdBuf, (LPSTR)pOEMExtra->UserIdBuf);
CharToOem(pUiData->PasswordBuf, (LPSTR)pOEMExtra->PasswordBuf);
CharToOem(pUiData->UserCodeBuf, (LPSTR)pOEMExtra->UserCodeBuf);
pOEMExtra->fUiOption = pUiData->fUiOption & 0x00FF; // clear local bit
pOEMExtra->JobType = pUiData->JobType;
pOEMExtra->LogDisabled = pUiData->LogDisabled;
#if DBG
//DebugBreak();
#endif // DBG
return;
} //*** SetInfoToOEMPdev
/***************************************************************************
Function Name : JobPageProc
Parameters : HWND hDlg Handle of this Dialog
UINT uMessage
WPARAM wParam
LPARAM lParam
Modify Note : Modify. 03/01/2000 Masatoshi Kubokura
***************************************************************************/
INT_PTR CALLBACK JobPageProc(
HWND hDlg,
UINT uMessage,
WPARAM wParam,
LPARAM lParam)
{
PUIDATA pUiData;
WORD wOldVal, fModified = FALSE, fError = FALSE;
INT iOldLen, iNewLen, iCnt;
#if DBG
giDebugLevel = DBG_VERBOSE;
#endif // DBG
switch (uMessage)
{
case WM_INITDIALOG:
pUiData = (PUIDATA)((LPPROPSHEETPAGE)lParam)->lParam;
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)pUiData);
// get data from private devmode
GetInfoFromOEMPdev(pUiData);
InitMainDlg(hDlg, pUiData);
BITCLR32(pUiData->fUiOption, JOBLOGDLG_UPDATED);
break;
case WM_COMMAND:
pUiData = (PUIDATA)GetWindowLongPtr(hDlg, DWLP_USER);
switch(LOWORD(wParam))
{
case IDC_EDIT_JOBMAIN_USERID:
iOldLen = safe_strlenW(pUiData->UserIdBuf, sizeof(pUiData->UserIdBuf));
GetDlgItemText(hDlg, IDC_EDIT_JOBMAIN_USERID, pUiData->UserIdBuf,
sizeof(pUiData->UserIdBuf) / sizeof(WCHAR));
iNewLen = safe_strlenW(pUiData->UserIdBuf, sizeof(pUiData->UserIdBuf));
if (1 <= iNewLen)
{
if (IDC_RADIO_JOB_SECURE == pUiData->JobType)
{
EnableWindow(GetDlgItem(hDlg, IDC_LABEL_JOBMAIN_PASSWORD), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_LABEL_JOBMAIN_PASSWORD2), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_JOBMAIN_PASSWORD), TRUE);
}
EnableWindow(GetDlgItem(hDlg, IDC_RADIO_JOB_SAMPLE), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_RADIO_JOB_SECURE), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_CHECK_JOB_DEFAULT), TRUE);
}
// if UserID isn't set, disable Print Job setting.
else
{
CheckRadioButton(hDlg, IDC_RADIO_JOB_NORMAL, IDC_RADIO_JOB_SECURE,
(pUiData->JobType = IDC_RADIO_JOB_NORMAL));
EnableWindow(GetDlgItem(hDlg, IDC_RADIO_JOB_SAMPLE), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_RADIO_JOB_SECURE), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_CHECK_JOB_DEFAULT), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_LABEL_JOBMAIN_PASSWORD), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_LABEL_JOBMAIN_PASSWORD2), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_JOBMAIN_PASSWORD), FALSE);
}
if (iOldLen != iNewLen)
fModified = TRUE;
break;
case IDC_EDIT_JOBMAIN_PASSWORD:
iOldLen = safe_strlenW(pUiData->PasswordBuf, sizeof(pUiData->PasswordBuf));
GetDlgItemText(hDlg, IDC_EDIT_JOBMAIN_PASSWORD, pUiData->PasswordBuf,
sizeof(pUiData->PasswordBuf) / sizeof(WCHAR));
if (iOldLen != safe_strlenW(pUiData->PasswordBuf, sizeof(pUiData->PasswordBuf)))
fModified = TRUE;
break;
case IDC_EDIT_JOBMAIN_USERCODE:
iOldLen = safe_strlenW(pUiData->UserCodeBuf, sizeof(pUiData->UserCodeBuf));
GetDlgItemText(hDlg, IDC_EDIT_JOBMAIN_USERCODE, pUiData->UserCodeBuf,
sizeof(pUiData->UserCodeBuf) / sizeof(WCHAR));
if (iOldLen != safe_strlenW(pUiData->UserCodeBuf, sizeof(pUiData->UserCodeBuf)))
fModified = TRUE;
break;
case IDC_RADIO_JOB_NORMAL:
case IDC_RADIO_JOB_SAMPLE:
case IDC_RADIO_JOB_SECURE:
wOldVal = pUiData->JobType;
CheckRadioButton(hDlg, IDC_RADIO_JOB_NORMAL, IDC_RADIO_JOB_SECURE,
(pUiData->JobType = LOWORD(wParam)));
if (IDC_RADIO_JOB_SECURE == pUiData->JobType)
{
EnableWindow(GetDlgItem(hDlg, IDC_LABEL_JOBMAIN_PASSWORD), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_LABEL_JOBMAIN_PASSWORD2), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_JOBMAIN_PASSWORD), TRUE);
}
else
{
EnableWindow(GetDlgItem(hDlg, IDC_LABEL_JOBMAIN_PASSWORD), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_LABEL_JOBMAIN_PASSWORD2), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_JOBMAIN_PASSWORD), FALSE);
}
if (wOldVal != pUiData->JobType)
fModified = TRUE;
break;
case IDC_RADIO_LOG_DISABLED:
case IDC_RADIO_LOG_ENABLED:
wOldVal = pUiData->LogDisabled;
CheckRadioButton(hDlg, IDC_RADIO_LOG_DISABLED, IDC_RADIO_LOG_ENABLED,
(pUiData->LogDisabled = LOWORD(wParam)));
if (IDC_RADIO_LOG_ENABLED == pUiData->LogDisabled)
{
EnableWindow(GetDlgItem(hDlg, IDC_LABEL_JOBMAIN_USERCODE), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_LABEL_JOBMAIN_USERCODE2), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_JOBMAIN_USERCODE), TRUE);
}
else
{
EnableWindow(GetDlgItem(hDlg, IDC_LABEL_JOBMAIN_USERCODE), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_LABEL_JOBMAIN_USERCODE2), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_JOBMAIN_USERCODE), FALSE);
}
if (wOldVal != pUiData->LogDisabled)
fModified = TRUE;
break;
case IDC_CHECK_JOB_DEFAULT:
if (BITTEST32(pUiData->fUiOption, HOLD_OPTIONS))
BITCLR32(pUiData->fUiOption, HOLD_OPTIONS);
else
BITSET32(pUiData->fUiOption, HOLD_OPTIONS);
SendDlgItemMessage(hDlg, IDC_CHECK_JOB_DEFAULT, BM_SETCHECK,
(BITTEST32(pUiData->fUiOption, HOLD_OPTIONS)? 0 : 1), 0);
fModified = TRUE;
break;
default:
return FALSE;
}
break;
case WM_NOTIFY:
pUiData = (PUIDATA)GetWindowLongPtr(hDlg, DWLP_USER);
{
NMHDR FAR *lpnmhdr = (NMHDR FAR *)lParam;
switch (lpnmhdr->code)
{
case PSN_SETACTIVE:
break;
// In case of PSN_KILLACTIVE, return FALSE to get PSN_APPLY.
case PSN_KILLACTIVE: // this is when user pushs OK/APPLY button.(1)
VERBOSE((DLLTEXT("** JobPageProc: PSN_KILLACTIVE **\n")));
BITSET32(pUiData->fUiOption, JOBLOGDLG_UPDATED);
// Check User ID (Up to 8 alphanumeric characters)
iNewLen = safe_strlenW(pUiData->UserIdBuf, sizeof(pUiData->UserIdBuf));
for (iCnt = 0; iCnt < iNewLen; iCnt++)
{
// SBCS alphanumeric?
if (!_ismbcalnum(pUiData->UserIdBuf[iCnt]))
{
fError = TRUE;
break;
}
}
if (fError)
{
WCHAR wcTmp1[64], wcTmp2[64];
// set cursor to User ID edit box
SetFocus(GetDlgItem(hDlg, IDC_EDIT_JOBMAIN_USERID));
// Display warning dialog
// yasho's point-out @Nov/29/2000 ->
// LoadString(ghInstance, IDS_ERR_USERID_MSG, wcTmp1, sizeof(wcTmp1));
// LoadString(ghInstance, IDS_ERR_USERID_TITLE, wcTmp2, sizeof(wcTmp1));
LoadString(ghInstance, IDS_ERR_USERID_MSG, wcTmp1, sizeof(wcTmp1) / sizeof(*wcTmp1));
LoadString(ghInstance, IDS_ERR_USERID_TITLE, wcTmp2, sizeof(wcTmp2) / sizeof(*wcTmp2));
// @Nov/29/2000 <-
MessageBox(hDlg, wcTmp1, wcTmp2, MB_ICONEXCLAMATION|MB_OK);
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
// Do not close property sheets
return TRUE;
}
// Check Password (4 digits)
iNewLen = safe_strlenW(pUiData->PasswordBuf, sizeof(pUiData->PasswordBuf));
if (PASSWORD_LEN != iNewLen) // Password must be exactly 4 digits.
{
fError = TRUE;
}
else
{
for (iCnt = 0; iCnt < iNewLen; iCnt++)
{
// SBCS digit?
if (!_ismbcdigit(pUiData->PasswordBuf[iCnt]))
{
fError = TRUE;
break;
}
}
}
if (fError)
{
// if Secure Print is enabled
if (IDC_RADIO_JOB_SECURE == pUiData->JobType)
{
WCHAR wcTmp1[64], wcTmp2[64];
// set cursor to Password edit box
SetFocus(GetDlgItem(hDlg, IDC_EDIT_JOBMAIN_PASSWORD));
// Display warning dialog
LoadString(ghInstance, IDS_ERR_PASSWORD_MSG, wcTmp1, sizeof(wcTmp1) / sizeof(*wcTmp1));
LoadString(ghInstance, IDS_ERR_PASSWORD_TITLE, wcTmp2, sizeof(wcTmp2) / sizeof(*wcTmp2));
MessageBox(hDlg, wcTmp1, wcTmp2, MB_ICONEXCLAMATION|MB_OK);
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
// Do not close property sheets
return TRUE;
}
else
{
// Clear invalid Password
// Use SecureZeroMemory @Mar/26/2002 (MS), Mar/29/2002 ->
#if defined(WINNT_40) || defined(RICOH_RELEASE)
memset(pUiData->PasswordBuf, 0, sizeof(pUiData->PasswordBuf));
#else
SecureZeroMemory(pUiData->PasswordBuf, sizeof(pUiData->PasswordBuf));
#endif
// @Mar/26/2002, Mar/29/2002 <-
}
fError = FALSE;
}
// Check User Code (Up to 8 characters)
iNewLen = safe_strlenW(pUiData->UserCodeBuf, sizeof(pUiData->UserCodeBuf));
for (iCnt = 0; iCnt < iNewLen; iCnt++)
{
// SBCS digit?
if (!_ismbcdigit(pUiData->UserCodeBuf[iCnt]))
{
fError = TRUE;
break;
}
}
if (fError)
{
// if Log is enabled
if (IDC_RADIO_LOG_ENABLED == pUiData->LogDisabled)
{
WCHAR wcTmp1[64], wcTmp2[64];
// set cursor to User Code edit box
SetFocus(GetDlgItem(hDlg, IDC_EDIT_JOBMAIN_USERCODE));
// Display warning dialog
LoadString(ghInstance, IDS_ERR_USERCODE_MSG, wcTmp1, sizeof(wcTmp1) / sizeof(*wcTmp1));
LoadString(ghInstance, IDS_ERR_USERCODE_TITLE, wcTmp2, sizeof(wcTmp2) / sizeof(*wcTmp2));
MessageBox(hDlg, wcTmp1, wcTmp2, MB_ICONEXCLAMATION|MB_OK);
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
// Do not close property sheets
return TRUE;
}
else
{
// Clear invalid User Code
// Use SecureZeroMemory @Mar/29/2002 ->
#if defined(WINNT_40) || defined(RICOH_RELEASE)
memset(pUiData->UserCodeBuf, 0, sizeof(pUiData->UserCodeBuf));
#else
SecureZeroMemory(pUiData->UserCodeBuf, sizeof(pUiData->UserCodeBuf));
#endif
// Mar/29/2002 <-
}
fError = FALSE;
}
return FALSE;
case PSN_APPLY: // this is when user pushs OK/APPLY button.(2)
VERBOSE((DLLTEXT("** JobPageProc: PSN_APPLY **\n")));
// clear PRINT_DONE flag and delete file.
// BUGBUG: When printing document twice, printing job settings are cleared on app's print dialog
// in 2nd printing. @Sep/05/2000 ->
// if (BITTEST32(pUiData->pOEMExtra->fUiOption, PRINT_DONE))
// {
// BITCLR32(pUiData->pOEMExtra->fUiOption, PRINT_DONE);
// VERBOSE(("** Delete file: %ls **\n", pUiData->pOEMExtra->SharedFileName));
// DeleteFile(pUiData->pOEMExtra->SharedFileName);
// }
if (BITTEST32(pUiData->fUiOption, PRINT_DONE))
{
BITCLR32(pUiData->fUiOption, PRINT_DONE);
VERBOSE(("** Delete file: %ls **\n", pUiData->pOEMExtra->SharedFileName));
DeleteFile(pUiData->pOEMExtra->SharedFileName);
}
// @Sep/05/2000 <-
// set data to private devmode
SetInfoToOEMPdev(pUiData);
// update private devmode
pUiData->pfnComPropSheet(pUiData->hComPropSheet,
CPSFUNC_SET_RESULT,
(LPARAM)pUiData->hPropPage,
(LPARAM)CPSUI_OK);
VERBOSE((DLLTEXT("** PSN_APPLY fUiOption=%x **\n"), pUiData->fUiOption));
break;
case PSN_RESET: // this is when user pushs CANCEL button
VERBOSE((DLLTEXT("** JobPageProc: PSN_RESET **\n")));
break;
}
}
break;
default:
return FALSE;
}
// activate APPLY button
if (fModified)
PropSheet_Changed(GetParent(hDlg), hDlg);
return TRUE;
} //*** JobPageProc
} // End of extern "C"
// @Aug/29/2000 ->
#ifdef DISKLESSMODEL
LONG APIENTRY OEMUICallBack(PCPSUICBPARAM pCallbackParam, POEMCUIPPARAM pOEMUIParam)
{
LONG Action = CPSUICB_ACTION_NONE;
#if DBG
giDebugLevel = DBG_VERBOSE;
VERBOSE((DLLTEXT("OEMUICallBack() entry.\n")));
#endif // DBG
switch (pCallbackParam->Reason)
{
case CPSUICB_REASON_APPLYNOW:
Action = CPSUICB_ACTION_ITEMS_APPLIED;
{
POPTITEM pOptItem;
WCHAR wcHDName[128];
INT iCnt2;
INT iCnt = ITEM_HARDDISK_NAMES;
INT cOptItem = (INT)pOEMUIParam->cDrvOptItems;
UINT uID = IDS_ITEM_HARDDISK;
BYTE ValueData = 0; // We suppose Hard Disk isn't installed as default.
// Check item name with several candidate ("Hard Disk", "Memory / Hard Disk",...).
while (iCnt-- > 0)
{
LoadString(ghInstance, uID, wcHDName, sizeof(wcHDName) / sizeof(*wcHDName));
uID++;
pOptItem = pOEMUIParam->pDrvOptItems;
for (iCnt2 = 0; iCnt2 < cOptItem; iCnt2++, pOptItem++)
{
// @Apr/04/2002 ->
// if (lstrlen(pOptItem->pName))
if (is_valid_ptr(pOptItem->pName) && safe_strlenW(pOptItem->pName, 128))
// @Apr/04/2002 <-
{
VERBOSE((DLLTEXT("%d: %ls\n"), iCnt2, pOptItem->pName));
// Is item name same as "Hard Disk" or something like?
if (!lstrcmp(pOptItem->pName, wcHDName))
{
// if Hard Disk is installed, value will be 1
ValueData = (BYTE)(pOptItem->Sel % 2);
goto _CHECKNAME_FINISH;
}
}
}
}
_CHECKNAME_FINISH:
// Because pOEMUIParam->pOEMDM (pointer to private devmode) is NULL when
// DrvDevicePropertySheets calls this callback, we use registry.
SetPrinterData(pOEMUIParam->hPrinter, REG_HARDDISK_INSTALLED, REG_BINARY,
(PBYTE)&ValueData, sizeof(BYTE));
}
break;
}
return Action;
} //*** OEMUICallBack
extern "C" {
//////////////////////////////////////////////////////////////////////////
// Function: OEMCommonUIProp
//////////////////////////////////////////////////////////////////////////
BOOL APIENTRY OEMCommonUIProp(DWORD dwMode, POEMCUIPPARAM pOEMUIParam)
{
#if DBG
LPCSTR OEMCommonUIProp_Mode[] = {
"Bad Index",
"OEMCUIP_DOCPROP",
"OEMCUIP_PRNPROP",
};
giDebugLevel = DBG_VERBOSE;
#endif // DBG
if(NULL == pOEMUIParam->pOEMOptItems) // The first call
{
VERBOSE((DLLTEXT("OEMCommonUI(%s) entry 1st.\n"), OEMCommonUIProp_Mode[dwMode]));
if (OEMCUIP_PRNPROP == dwMode)
pOEMUIParam->cOEMOptItems = 1; // dummy item
else
pOEMUIParam->cOEMOptItems = 0;
}
else // The second call
{
VERBOSE((DLLTEXT("OEMCommonUI(%s) entry 2nd.\n"), OEMCommonUIProp_Mode[dwMode]));
if (OEMCUIP_PRNPROP == dwMode) // called from DrvDevicePropertySheets
{
POPTITEM pOptItem = pOEMUIParam->pOEMOptItems;
// fill out data for dummy item
pOptItem->cbSize = sizeof(OPTITEM);
pOptItem->Level = 2; // Level 2
pOptItem->pName = NULL;
pOptItem->pOptType = NULL;
pOptItem->DMPubID = DMPUB_NONE;
pOptItem->Flags = OPTIF_HIDE | OPTIF_CALLBACK; // invisible and with callback
pOEMUIParam->OEMCUIPCallback = OEMUICallBack;
}
#ifdef WINNT_40
else // called from DrvDocumentPropertySheets
{
INT iCnt;
INT cOptItem = (INT)pOEMUIParam->cDrvOptItems;
POPTITEM pOptItem = pOEMUIParam->pDrvOptItems;
// If collate check box exists (i.e. printer collate is available),
// set dmCollate.
// -- Search Copies&Collate item --
for (iCnt = 0; iCnt < cOptItem; iCnt++, pOptItem++)
{
if (DMPUB_COPIES_COLLATE == pOptItem->DMPubID)
{
if (pOptItem->pExtChkBox && pOEMUIParam->pPublicDM)
{
pOEMUIParam->pPublicDM->dmCollate = DMCOLLATE_TRUE;
pOEMUIParam->pPublicDM->dmFields |= DM_COLLATE;
}
break;
}
}
}
#endif // WINNT_40
}
return TRUE;
} //*** OEMCommonUIProp
} // End of extern "C"
#endif // DISKLESSMODEL
// @Aug/29/2000 <-