windows-nt/Source/XPSP1/NT/printscan/ui/compstui/validate.c

1061 lines
25 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1990-1995 Microsoft Corporation
Module Name:
validate.c
Abstract:
This module contains the function to validate all optitem
Author:
05-Sep-1995 Tue 18:42:44 created -by- Daniel Chou (danielc)
[Environment:]
NT Windows - Common Printer Driver UI DLL
[Notes:]
Revision History:
--*/
#include "precomp.h"
#pragma hdrstop
#define DBG_CPSUIFILENAME DbgValidate
#define DBG_VALIDATE 0x00000001
#define DBGITEM_VALIDATE 0x00000002
#define DBG_CLEANUP 0x00000004
#define DBG_ALLOCEDIT 0x00000008
#define DBG_DMPUBHIDE 0x00000010
DEFINE_DBGVAR(0);
#if DBG
static const LPSTR pszDMPub[] = { "DMPUB_ORIENTATION",
"DMPUB_SCALE",
"DMPUB_COPIES_COLLATE",
"DMPUB_DEFSOURCE",
"DMPUB_PRINTQUALITY",
"DMPUB_COLOR",
"DMPUB_DUPLEX",
"DMPUB_TTOPTION",
"DMPUB_FORMNAME",
"DMPUB_ICMMETHOD",
"DMPUB_ICMINTENT",
"DMPUB_MEDIATYPE",
"DMPUB_DITHERTYPE",
"DMPUB_OUTPUTBIN",
"DMPUB_QUALITY",
"DMPUB_NUP",
"DMPUB_PAGEORDER"
};
#endif
extern HINSTANCE hInstDLL;
extern OPTTYPE OptTypeHdrPush;
LONG
ValidateChildrenItems(
PTVWND pTVWnd,
POPTITEM *ppItem,
DWORD DMPubHideBits,
DWORD ParentFlags
)
/*++
Routine Description:
Arguments:
Return Value:
Author:
05-Sep-1995 Tue 18:43:47 created -by- Daniel Chou (danielc)
Revision History:
--*/
{
POPTITEM pItem;
POPTITEM pNext;
POPTITEM pLastItem;
LONG cGroup = 1;
DWORD Flags;
BYTE DMPubID;
BYTE DlgPageIdx;
BYTE CurLevel;
pNext =
pItem = *ppItem;
CurLevel = pItem->Level;
pLastItem = pTVWnd->pLastItem;
Flags = (ParentFlags &= OPTIF_ITEM_HIDE);
while ((cGroup >= 0) &&
(pItem <= pLastItem) &&
(pItem->Level >= CurLevel)) {
CPSUIASSERT(0, "pItem != pNext", pItem == pNext, 0);
if (pItem->Level > CurLevel) {
cGroup = ValidateChildrenItems(pTVWnd, &pItem, DMPubHideBits, Flags);
pNext = pItem;
continue;
}
DlgPageIdx = pItem->DlgPageIdx;
DMPubID = pItem->DMPubID;
Flags = pItem->Flags;
if ((DMPubHideBits) &&
(DMPubID >= DMPUB_FIRST) &&
(DMPubID <= DMPUB_LAST) &&
(MAKE_DMPUB_HIDEBIT(DMPubID) & DMPubHideBits)) {
Flags |= OPTIF_INT_HIDE;
CPSUIDBG(DBG_DMPUBHIDE, ("Hide DMPUB_ID=%hs, Bits=%08lx (%08lx)",
pszDMPub[DMPubID - DMPUB_FIRST],
MAKE_DMPUB_HIDEBIT(DMPubID), DMPubHideBits));
} else {
Flags &= ~OPTIF_INT_HIDE;
}
{
POPTTYPE pOptType;
POPTPARAM pOptParam = NULL;
PEXTCHKBOX pECB;
INT Count;
INT IconCount;
INT cNotHide;
BYTE Mask;
BYTE HideBits;
LONG MinSel;
LONG MaxSel;
BYTE Type;
BOOL pDefSelIsMem;
Flags |= ParentFlags;
CPSUIOPTITEM(DBGITEM_VALIDATE, pTVWnd, "Validate", 2, pItem);
if (pItem->cbSize != sizeof(OPTITEM)) {
return(ERR_CPSUI_INVALID_OPTITEM_CBSIZE);
}
//
// clear the unused flags
//
pItem->Flags &= (OPTIF_MASK ^ OPTIF_ENTER_MASK);
if ((Flags & OPTIF_HIDE) && (!(pItem->Flags & OPTIF_HIDE))) {
return(ERR_CPSUI_SUBITEM_DIFF_OPTIF_HIDE);
}
if (Flags & OPTIF_INT_HIDE) {
pItem->Flags |= OPTIF_INT_HIDE;
}
if (!(pItem->Flags & OPTIF_ITEM_HIDE)) {
if (pOptType = pItem->pOptType) {
//
// Validate OPTTYPE
//
if (pOptType->cbSize != sizeof(OPTTYPE)) {
return(ERR_CPSUI_INVALID_OPTTYPE_CBSIZE);
}
IconCount = 1;
switch (Type = pOptType->Type) {
case TVOT_CHKBOX:
case TVOT_PUSHBUTTON:
Count = 1;
break;
case TVOT_2STATES:
IconCount = 2;
case TVOT_EDITBOX:
case TVOT_UDARROW:
Count = 2;
break;
case TVOT_3STATES:
IconCount = 3;
//
// Fall through
//
case TVOT_TRACKBAR:
case TVOT_SCROLLBAR:
Count = 3;
break;
case TVOT_LISTBOX:
case TVOT_COMBOBOX:
IconCount =
Count = (INT)pOptType->Count;
break;
default:
return(ERR_CPSUI_INVALID_TVOT_TYPE);
}
if (pOptType->Count != (WORD)Count) {
return(ERR_CPSUI_INVALID_OPTTYPE_COUNT);
}
//
// Validate OPTPARAM
//
if (pOptParam = pOptType->pOptParam) {
cNotHide = Count;
HideBits = 0;
Mask = 0x01;
while (Count--) {
if (pOptParam->cbSize != sizeof(OPTPARAM)) {
return(ERR_CPSUI_INVALID_OPTPARAM_CBSIZE);
}
if (pOptParam->Flags & OPTPF_HIDE) {
cNotHide--;
HideBits |= Mask;
}
Mask <<= 1;
pOptParam++;
}
} else {
return(ERR_CPSUI_NULL_POPTPARAM);
}
pOptParam = pOptType->pOptParam;
//
// for TVOT_2STATES, TVOT_3STATES, TVOT_LISTBOX and
// TVOT_COMBOBOX, if all selection are hided then we will
// hide this item
//
switch (Type) {
case TVOT_PUSHBUTTON:
switch (pOptParam->Style) {
case PUSHBUTTON_TYPE_HTSETUP:
_OI_HELPIDX(pItem) = IDH_HT_SETUP;
pOptType->Flags |= OTS_PUSH_ENABLE_ALWAYS;
break;
case PUSHBUTTON_TYPE_HTCLRADJ:
_OI_HELPIDX(pItem) = IDH_HT_CLRADJ;
pOptType->Flags |= OTS_PUSH_ENABLE_ALWAYS;
break;
case PUSHBUTTON_TYPE_DLGPROC:
case PUSHBUTTON_TYPE_CALLBACK:
break;
default:
return(ERR_CPSUI_INVALID_PUSHBUTTON_TYPE);
}
break;
case TVOT_3STATES:
case TVOT_2STATES:
_OT_FLAGS(pOptType) |= (WORD)HideBits;
CPSUIINT(("States Type=%d, HideBits=0x%02x",
(UINT)pOptType->Type, (UINT)HideBits));
case TVOT_LISTBOX:
case TVOT_COMBOBOX:
if (!cNotHide) {
CPSUIWARN(("Type=%ld, all OPTPARAMs are OPTPF_HIDE, hide the item"));
pItem->Flags |= OPTIF_INT_HIDE;
Flags |= OPTIF_INT_HIDE;
}
break;
default:
break;
}
//
// Validate pSel
//
// 19-May-1998 Tue 16:38:35 updated
// -by- Daniel Chou (danielc)
// We allocate (memory * 2) because for new IN PLACE
// treeview editing, we need to save another of undo
//
MinSel = 0;
MaxSel = -1;
pDefSelIsMem = FALSE;
_OI_CBPDEFSEL(pItem) = (WORD)0;
switch (Type) {
case TVOT_CHKBOX:
case TVOT_2STATES:
MaxSel = 1;
break;
case TVOT_UDARROW:
case TVOT_TRACKBAR:
case TVOT_SCROLLBAR:
MinSel = (LONG)((SHORT)pOptParam[1].IconID);
MaxSel = (LONG)((SHORT)pOptParam[1].lParam);
if (MinSel > MaxSel) {
pOptParam[1].IconID = MaxSel;
pOptParam[1].lParam = MinSel;
CPSUIWARN(("Type=%d, Swap select range (%d - %d)",
Type, MinSel, MaxSel));
MinSel = MaxSel;
MaxSel = (LONG)((SHORT)pOptParam[1].lParam);
}
if (Type != TVOT_UDARROW) {
//
// This is the multiple factor
//
if (!pOptParam[2].IconID) {
pOptParam[2].IconID = 1;
}
if (!pOptParam[2].lParam) {
pOptParam[2].lParam = 1;
}
}
break;
case TVOT_3STATES:
MaxSel = 2;
break;
case TVOT_LISTBOX:
case TVOT_COMBOBOX:
if (pOptType->Style & OTS_LBCB_INCL_ITEM_NONE) {
MinSel = -1;
if (pItem->Sel < 0) {
pItem->Sel = -1;
}
}
MaxSel = (LONG)((LONG)pOptType->Count - 1);
break;
case TVOT_PUSHBUTTON:
switch (pOptParam->Style) {
case PUSHBUTTON_TYPE_HTSETUP:
if (_OI_PDEFSEL(pItem) = (LPVOID)
LocalAlloc(LPTR,
sizeof(DEVHTINFO) * 2)) {
PDEVHTADJDATA pDevHTAdjData;
pDefSelIsMem = TRUE;
_OI_CBPDEFSEL(pItem) = (WORD)sizeof(DEVHTINFO);
pDevHTAdjData =
(PDEVHTADJDATA)(pOptParam->pData);
CopyMemory(_OI_PDEFSEL(pItem),
pDevHTAdjData->pAdjHTInfo,
sizeof(DEVHTINFO));
} else {
CPSUIERR(("LocalAlloc(HTSETUP/DEVHTINFO) failed"));
return(ERR_CPSUI_ALLOCMEM_FAILED);
}
break;
case PUSHBUTTON_TYPE_HTCLRADJ:
if (_OI_PDEFSEL(pItem) = (LPVOID)
LocalAlloc(LPTR,
sizeof(COLORADJUSTMENT) * 2)) {
pDefSelIsMem = TRUE;
_OI_CBPDEFSEL(pItem) =
(WORD)sizeof(COLORADJUSTMENT);
CopyMemory(_OI_PDEFSEL(pItem),
pOptParam->pData,
sizeof(COLORADJUSTMENT));
} else {
CPSUIERR(("LocalAlloc(HTCLRADJ/COLORADJUSTMENT) failed"));
return(ERR_CPSUI_ALLOCMEM_FAILED);
}
break;
}
break;
case TVOT_EDITBOX:
if ((!pItem->pSel) || (!VALID_PTR(pItem->pSel))) {
return(ERR_CPSUI_INVALID_EDITBOX_PSEL);
}
if ((MaxSel = (LONG)pOptParam[1].IconID) <= 1) {
return(ERR_CPSUI_INVALID_EDITBOX_BUF_SIZE);
} else {
--MaxSel;
if (pTVWnd->Flags & TWF_ANSI_CALL) {
MinSel = lstrlenA((LPSTR)pItem->pSel);
if (MinSel > MaxSel) {
((LPSTR)pItem->pSel)[MaxSel] = 0;
}
MaxSel++;
} else {
MinSel = lstrlenW((LPWSTR)pItem->pSel);
if (MinSel > MaxSel) {
((LPWSTR)pItem->pSel)[MaxSel] = 0;
}
MaxSel = (LONG)((DWORD)(MaxSel + 1) << 1);
}
if (_OI_PDEFSEL(pItem) =
(LPVOID)LocalAlloc(LPTR, MaxSel * 2)) {
pDefSelIsMem = TRUE;
_OI_CBPDEFSEL(pItem) = (WORD)MaxSel;
CopyMemory(_OI_PDEFSEL(pItem),
pItem->pSel,
MaxSel);
} else {
CPSUIERR(("LocalAlloc(EditBuf=%ld bytes) failed", MaxSel));
return(ERR_CPSUI_ALLOCMEM_FAILED);
}
}
//
// Fall through
//
default:
MinSel = 0;
MaxSel = -1;
break;
}
if ((MinSel < MaxSel) &&
((pItem->Sel < MinSel) ||
(pItem->Sel > MaxSel))) {
CPSUIWARN(("Sel=%ld (%08lx) Out of range (%ld - %ld)",
pItem->Sel, pItem->pSel, MinSel, MaxSel));
pItem->Flags |= OPTIF_CHANGED;
pItem->Sel = MinSel;
}
//
// Saved old selection
//
if (!pDefSelIsMem) {
_OI_PDEFSEL(pItem) = pItem->pSel;
}
_OI_DEF_OPTIF(pItem) = pItem->Flags;
//
// Validate pExtChkBox
//
if ((pECB = pItem->pExtChkBox) &&
(!(pItem->Flags & OPTIF_EXT_HIDE))) {
if (pItem->Flags & OPTIF_EXT_IS_EXTPUSH) {
PEXTPUSH pEP = (PEXTPUSH)pECB;
if (pEP->cbSize != sizeof(EXTPUSH)) {
return(ERR_CPSUI_INVALID_EXTPUSH_CBSIZE);
}
if (pEP->Flags & EPF_PUSH_TYPE_DLGPROC) {
if (!(pEP->DlgProc)) {
return(ERR_CPSUI_NULL_EXTPUSH_DLGPROC);
}
if (((pEP->Flags & EPF_USE_HDLGTEMPLATE) &&
(pEP->hDlgTemplate == NULL)) ||
(pEP->DlgTemplateID == 0)) {
return(ERR_CPSUI_NO_EXTPUSH_DLGTEMPLATEID);
}
} else {
if ((!(pEP->pfnCallBack)) &&
(!(pTVWnd->ComPropSheetUI.pfnCallBack))) {
return(ERR_CPSUI_NULL_EXTPUSH_CALLBACK);
}
}
} else {
CPSUIDBG(DBG_VALIDATE, ("ExtChkBox: cbSize=%u [%u]",
pECB->cbSize, sizeof(EXTCHKBOX)));
if (pECB->cbSize != sizeof(EXTCHKBOX)) {
return(ERR_CPSUI_INVALID_ECB_CBSIZE);
}
if (!(pECB->pTitle)) {
return(ERR_CPSUI_NULL_ECB_PTITLE);
}
if (!(pECB->pCheckedName)) {
return(ERR_CPSUI_NULL_ECB_PCHECKEDNAME);
}
}
}
}
//
// Validate DMPubID
//
if ((DMPubID < DMPUB_OEM_PAPER_ITEM) &&
(DMPubID != DMPUB_NONE) &&
(pItem->DMPubID != DMPubID)) {
return(ERR_CPSUI_INVALID_DMPUBID);
}
//
// Validate DlgPageIdx
//
if (pItem->DlgPageIdx != DlgPageIdx) {
return(ERR_CPSUI_SUBITEM_DIFF_DLGPAGEIDX);
}
if (DlgPageIdx >= pTVWnd->cMyDlgPage) {
return(ERR_CPSUI_INVALID_DLGPAGEIDX);
}
if (pItem->Flags & OPTIF_CHANGED) {
CPSUIOPTITEM(0,pTVWnd, "Validate: OPTIF_CHANGED", 2, pItem);
}
}
}
pNext = ++pItem;
}
CPSUIASSERT(0, "pItem != *ppItem", pItem != *ppItem, 0);
*ppItem = pItem;
return(cGroup);
}
LONG
ValidatepOptItem(
PTVWND pTVWnd,
DWORD DMPubHideBits
)
/*++
Routine Description:
Arguments:
Return Value:
Author:
05-Sep-1995 Tue 18:43:47 created -by- Daniel Chou (danielc)
Revision History:
--*/
{
POPTITEM pItem;
pItem = pTVWnd->ComPropSheetUI.pOptItem;
return(ValidateChildrenItems(pTVWnd, &pItem, DMPubHideBits, 0));
}
UINT
SetOptItemNewDef(
HWND hDlg,
PTVWND pTVWnd,
BOOL DoDef2
)
/*++
Routine Description:
This function set the new default for the OptItems
Arguments:
Return Value:
Author:
02-Feb-1996 Fri 22:07:59 created -by- Daniel Chou (danielc)
Revision History:
--*/
{
POPTITEM pItem;
POPTITEM pLastItem;
POPTTYPE pOptType;
LPVOID pvAlloc;
LPBYTE pDefSel;
UINT cSet = 0;
pItem = pTVWnd->ComPropSheetUI.pOptItem;
pLastItem = pTVWnd->pLastItem;
while (pItem <= pLastItem) {
if ((pOptType = pItem->pOptType) &&
(!(pItem->Flags & OPTIF_ITEM_HIDE)) &&
((DoDef2) || (pItem->Flags & (OPTIF_CHANGEONCE|OPTIF_CHANGED)))) {
PDEVHTADJDATA pDevHTAdjData;
++cSet;
pvAlloc = (LPVOID)(pDefSel = (LPBYTE)_OI_PDEFSEL(pItem));
if (DoDef2) {
pDefSel += _OI_CBPDEFSEL(pItem);
} else {
pItem->Flags |= OPTIF_CHANGED;
}
switch (pOptType->Type) {
case TVOT_EDITBOX:
if (!pvAlloc) {
CPSUIASSERT(0, "SetOptItemNewDef(EDITBOX:pvAlloc=NULL)", pvAlloc, 0);
break;
}
if (pTVWnd->Flags & TWF_ANSI_CALL) {
lstrcpyA((LPSTR)pDefSel, (LPSTR)pItem->pSel);
} else {
lstrcpy((LPWSTR)pDefSel, (LPWSTR)pItem->pSel);
}
break;
case TVOT_PUSHBUTTON:
switch (pOptType->pOptParam->Style) {
case PUSHBUTTON_TYPE_HTSETUP:
if (!pvAlloc) {
CPSUIASSERT(0, "SetOptItemNewDef(HTSETUP:pvAlloc=NULL)", pvAlloc, 0);
break;
}
pDevHTAdjData = (PDEVHTADJDATA)(pOptType->pOptParam->pData);
CopyMemory(pDefSel,
pDevHTAdjData->pAdjHTInfo,
sizeof(DEVHTINFO));
break;
case PUSHBUTTON_TYPE_HTCLRADJ:
if (!pvAlloc) {
CPSUIASSERT(0, "SetOptItemNewDef(HTCLRADJ:pvAlloc=NULL)", pvAlloc, 0);
break;
}
CopyMemory(pDefSel,
pOptType->pOptParam->pData,
sizeof(COLORADJUSTMENT));
break;
default:
if (DoDef2) {
_OI_PDEFSEL2(pItem) = pItem->pSel;
} else {
_OI_PDEFSEL(pItem) = pItem->pSel;
}
break;
}
break;
default:
if (DoDef2) {
_OI_PDEFSEL2(pItem) = pItem->pSel;
} else {
pItem->Flags &= ~OPTIF_CHANGEONCE;
_OI_PDEFSEL(pItem) = pItem->pSel;
}
break;
}
if (DoDef2) {
_OI_DEF_OPTIF2(pItem) = pItem->Flags;
} else {
_OI_DEF_OPTIF(pItem) = pItem->Flags;
}
}
pItem++;
}
if ((cSet) && (!DoDef2)) {
UpdateCallBackChanges(hDlg, pTVWnd, TRUE);
UpdateTreeViewItem(hDlg, pTVWnd, pTVWnd->pCurTVItem, TRUE);
}
return(cSet);
}
BOOL
CleanUpTVWND(
PTVWND pTVWnd
)
/*++
Routine Description:
Arguments:
Return Value:
Author:
05-Sep-1995 Tue 19:41:45 created -by- Daniel Chou (danielc)
Revision History:
--*/
{
PMYDLGPAGE pMyDP;
POPTITEM pItem;
UINT cItem;
pItem = pTVWnd->ComPropSheetUI.pOptItem;
cItem = (UINT)pTVWnd->ComPropSheetUI.cOptItem;
while (cItem--) {
POPTTYPE pOptType;
LPVOID pDefSel;
pItem->Flags &= (OPTIF_MASK ^ OPTIF_EXIT_MASK);
pDefSel = _OI_PDEFSEL(pItem);
pOptType = pItem->pOptType;
if (pOptType) {
switch (pOptType->Type) {
case TVOT_PUSHBUTTON:
switch (pOptType->pOptParam->Style) {
case PUSHBUTTON_TYPE_HTSETUP:
case PUSHBUTTON_TYPE_HTCLRADJ:
if (pDefSel) {
CPSUIOPTITEM(DBG_CLEANUP, pTVWnd, "Free Halftone pointer", 1, pItem);
LocalFree((HLOCAL)pDefSel);
}
}
break;
case TVOT_EDITBOX:
if (pDefSel) {
CPSUIOPTITEM(DBG_CLEANUP, pTVWnd, "Free EditBuf", 1, pItem);
LocalFree((HLOCAL)pDefSel);
}
break;
}
ZeroMemory(&pOptType->wReserved[0],
sizeof(OPTTYPE) - FIELD_OFFSET(OPTTYPE, wReserved));
}
pItem->wReserved = 0;
ZeroMemory(&pItem->dwReserved[0],
sizeof(OPTITEM) - FIELD_OFFSET(OPTITEM, dwReserved));
pItem++;
}
if (pMyDP = pTVWnd->pMyDlgPage) {
UINT cMyDP = pTVWnd->cMyDlgPage;
while (cMyDP--) {
if (pMyDP->hIcon) {
DestroyIcon(pMyDP->hIcon);
}
pMyDP++;
}
LocalFree((HLOCAL)pTVWnd->pMyDlgPage);
pTVWnd->pMyDlgPage = NULL;
}
if (pTVWnd->pIcon16ID) {
LocalFree((HLOCAL)pTVWnd->pIcon16ID);
pTVWnd->pIcon16ID = NULL;
}
if (pTVWnd->himi) {
ImageList_Destroy(pTVWnd->himi);
pTVWnd->himi = NULL;
}
#if 0
if (pTVWnd->hbrGray) {
DeleteObject(pTVWnd->hbrGray);
pTVWnd->hbrGray = NULL;
}
if (pTVWnd->hbmGray) {
DeleteObject(pTVWnd->hbmGray);
pTVWnd->hbmGray = NULL;
}
#endif
return(TRUE);
}