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.
 
 
 
 
 
 

1128 lines
23 KiB

/*++
Copyright (c) 1990-2003 Microsoft Corporation
Module Name:
ptrprop.c
Abstract:
This module contains PrinterProperties() API entry and it's related
functions
Author:
06-Dec-1993 Mon 10:30:43 created
[Environment:]
GDI Device Driver - Plotter.
[Notes:]
Revision History:
--*/
#include "precomp.h"
#pragma hdrstop
#define DBG_PLOTFILENAME DbgPtrProp
extern HMODULE hPlotUIModule;
#define DBG_DEVHTINFO 0x00000001
#define DBG_PP_FORM 0x00000002
#define DBG_EXTRA_DATA 0x00000004
#define DBG_CHK_PENSET_BUTTON 0x00000008
DEFINE_DBGVAR(0);
//
// Form To Tray Assignment:
// Roll Paper Feeder: <XYZ>
// Manual Feed Method:
// Print Form Options:
// [] Auto. Rotate To Save Roll Paper:
// [] Print Smaller Paper Size:
// Halftone Setup...
// Installed Pen Set: Pen Set #1
// Pen Setup:
// Installed: Pen Set #1
// Pen Set #1:
// Pen Number 1:
// Pen Number 2:
// Pen Number 3:
// Pen Number 4:
// Pen Number 5:
// Pen Number 6:
// Pen Number 7:
// Pen Number 8:
// Pen Number 9:
// Pen Number 10:
// Pen Number 11:
// Pen Set #2;
// Pen Set #3:
// Pen Set #4: <Currently Installed>
// Pen Set #5:
// Pen Set #6:
// Pen Set #7:
// Pen Set #8:
//
OPDATA OPPenSet = { 0, IDS_PENSET_FIRST, IDI_PENSET, 0, 0, 0 };
OPDATA OPAutoRotate[] = {
{ 0, IDS_CPSUI_NO, IDI_AUTO_ROTATE_NO, 0, 0, 0 },
{ 0, IDS_CPSUI_YES, IDI_AUTO_ROTATE_YES, 0, 0, 0 }
};
OPDATA OPPrintSmallerPaper[] = {
{ 0, IDS_CPSUI_NO, IDI_PRINT_SMALLER_PAPER_NO, 0, 0, 0 },
{ 0, IDS_CPSUI_YES, IDI_PRINT_SMALLER_PAPER_YES, 0, 0, 0 }
};
OPDATA OPManualFeed[] = {
{ 0, IDS_MANUAL_CX, IDI_MANUAL_CX, 0, 0, 0 },
{ 0, IDS_MANUAL_CY, IDI_MANUAL_CY, 0, 0, 0 }
};
OPDATA OPHTSetup = {
0,
PI_OFF(ExtraData) + sizeof(DEVHTINFO),
IDI_CPSUI_HALFTONE_SETUP,
PUSHBUTTON_TYPE_HTSETUP,
0,
0
};
OIDATA PPOIData[] = {
{
ODF_PEN_RASTER,
0,
OI_LEVEL_1,
PP_FORMTRAY_ASSIGN,
TVOT_NONE,
IDS_CPSUI_FORMTRAYASSIGN,
IDI_CPSUI_FORMTRAYASSIGN,
IDH_FORMTRAYASSIGN,
0,
NULL
},
{
ODF_RASTER | ODF_ROLLFEED | ODF_CALLBACK | ODF_CALLCREATEOI,
0,
OI_LEVEL_2,
PP_INSTALLED_FORM,
TVOT_LISTBOX,
IDS_ROLLFEED,
OTS_LBCB_SORT,
IDH_FORM_ROLL_FEEDER,
0,
(POPDATA)CreateFormOI
},
{
ODF_RASTER | ODF_MANUAL_FEED | ODF_CALLBACK | ODF_CALLCREATEOI,
0,
OI_LEVEL_2,
PP_INSTALLED_FORM,
TVOT_LISTBOX,
IDS_MANUAL_FEEDER,
OTS_LBCB_SORT,
IDH_FORM_MANUAL_FEEDER,
0,
(POPDATA)CreateFormOI
},
{
ODF_PEN | ODF_CALLBACK | ODF_CALLCREATEOI,
0,
OI_LEVEL_2,
PP_INSTALLED_FORM,
TVOT_LISTBOX,
IDS_MAINFEED,
OTS_LBCB_SORT,
IDH_FORM_MAIN_FEEDER,
0,
(POPDATA)CreateFormOI
},
{
ODF_PEN_RASTER | ODF_CALLBACK | ODF_NO_PAPERTRAY,
0,
OI_LEVEL_3,
PP_MANUAL_FEED_METHOD,
TVOT_2STATES,
IDS_MANUAL_FEED_METHOD,
0,
IDH_MANUAL_FEED_METHOD,
COUNT_ARRAY(OPManualFeed),
OPManualFeed
},
{
ODF_PEN_RASTER,
0,
OI_LEVEL_1,
PP_PRINT_FORM_OPTIONS,
TVOT_NONE,
IDS_PRINT_FORM_OPTIONS,
IDI_CPSUI_GENERIC_OPTION,
IDH_PRINT_FORM_OPTIONS,
0,
NULL
},
{
ODF_PEN_RASTER | ODF_ROLLFEED,
0,
OI_LEVEL_2,
PP_AUTO_ROTATE,
TVOT_2STATES,
IDS_AUTO_ROTATE,
0,
IDH_AUTO_ROTATE,
2,
OPAutoRotate
},
{
ODF_PEN_RASTER,
0,
OI_LEVEL_2,
PP_PRINT_SMALLER_PAPER,
TVOT_2STATES,
IDS_PRINT_SAMLLER_PAPER,
0,
IDH_PRINT_SMALLER_PAPER,
2,
OPPrintSmallerPaper
},
{
ODF_RASTER,
0,
OI_LEVEL_1,
PP_HT_SETUP,
TVOT_PUSHBUTTON,
IDS_CPSUI_HALFTONE_SETUP,
0,
IDH_HALFTONE_SETUP,
1,
&OPHTSetup
},
{
ODF_PEN | ODF_INC_IDSNAME | ODF_NO_INC_POPDATA,
0,
OI_LEVEL_1,
PP_INSTALLED_PENSET,
TVOT_LISTBOX,
IDS_INSTALLED_PENSET,
OTS_LBCB_SORT,
IDH_INSTALLED_PENSET,
PRK_MAX_PENDATA_SET,
&OPPenSet
},
{
ODF_PEN | ODF_COLLAPSE | ODF_CALLCREATEOI,
0,
OI_LEVEL_1,
PP_PEN_SETUP,
TVOT_NONE,
IDS_PEN_SETUP,
IDI_PEN_SETUP,
IDH_PEN_SETUP,
1,
(POPDATA)CreatePenSetupOI
}
};
DWORD
CheckPenSetButton(
PPRINTERINFO pPI,
DWORD Action
)
/*++
Routine Description:
Arguments:
Return Value:
Author:
30-Nov-1995 Thu 16:41:05 created
Revision History:
--*/
{
POPTITEM pOptItem = pPI->pOptItem;
POPTITEM pEndItem = pOptItem + pPI->cOptItem;
PLOTDBG(DBG_CHK_PENSET_BUTTON,
("CheckPenSetButton: pFirst=%08lx, pLast=%08lx, Count=%ld",
pOptItem, pEndItem, pPI->cOptItem));
while (pOptItem < pEndItem) {
if (pOptItem->DMPubID == PP_PENSET) {
PPENDATA pPD;
POPTITEM pOI;
DWORD Flags;
UINT i;
pOI = pOptItem + 1;
pPD = (PPENDATA)pPI->pPlotGPC->Pens.pData;
i = (UINT)pPI->pPlotGPC->MaxPens;
Flags = (OPTIF_EXT_DISABLED | OPTIF_EXT_HIDE);
while (i--) {
if (pOI->Sel != pPD->ColorIdx) {
Flags &= ~(OPTIF_EXT_DISABLED | OPTIF_EXT_HIDE);
}
pOI++;
pPD++;
}
if ((Flags & (OPTIF_EXT_DISABLED | OPTIF_EXT_HIDE)) !=
(pOptItem->Flags & (OPTIF_EXT_DISABLED | OPTIF_EXT_HIDE))) {
Action = CPSUICB_ACTION_REINIT_ITEMS;
pOptItem->Flags &= ~(OPTIF_EXT_DISABLED | OPTIF_EXT_HIDE);
pOptItem->Flags |= (Flags | OPTIF_CHANGED);
}
pOptItem = pOI;
} else {
pOptItem++;
}
}
return(Action);
}
DWORD
CheckInstalledForm(
PPRINTERINFO pPI,
DWORD Action
)
/*++
Routine Description:
Arguments:
Return Value:
Author:
30-May-1996 Thu 12:34:00 created
Revision History:
--*/
{
POPTITEM pOIForm;
POPTITEM pOIFeed;
POPTITEM pOITemp;
POPTPARAM pOP;
FORM_INFO_1 *pFI1;
DWORD MFFlags;
DWORD PSPFlags;
DWORD ARFlags;
if ((pOIForm = FindOptItem(pPI->pOptItem,
pPI->cOptItem,
PP_INSTALLED_FORM)) &&
(pOIFeed = FindOptItem(pPI->pOptItem,
pPI->cOptItem,
PP_MANUAL_FEED_METHOD))) {
pOP = pOIForm->pOptType->pOptParam + pOIForm->Sel;
switch (pOP->Style) {
case FS_ROLLPAPER:
case FS_TRAYPAPER:
MFFlags = OPTIF_DISABLED;
break;
default:
pFI1 = pPI->pFI1Base + pOP->lParam;
if ((pFI1->Size.cx > pPI->pPlotGPC->DeviceSize.cx) ||
(pFI1->Size.cy > pPI->pPlotGPC->DeviceSize.cx)) {
MFFlags = (OPTIF_OVERLAY_STOP_ICON | OPTIF_DISABLED);
} else {
MFFlags = 0;
}
break;
}
if ((pOIFeed->Flags & (OPTIF_OVERLAY_STOP_ICON |
OPTIF_DISABLED)) != MFFlags) {
pOIFeed->Flags &= ~(OPTIF_OVERLAY_STOP_ICON | OPTIF_DISABLED);
pOIFeed->Flags |= (MFFlags | OPTIF_CHANGED);
Action = CPSUICB_ACTION_OPTIF_CHANGED;
}
if (pOP->Style & FS_ROLLPAPER) {
ARFlags = 0;
PSPFlags = OPTIF_DISABLED;
} else {
ARFlags = OPTIF_DISABLED;
PSPFlags = 0;
}
if ((pOITemp = FindOptItem(pPI->pOptItem,
pPI->cOptItem,
PP_PRINT_SMALLER_PAPER)) &&
((pOITemp->Flags & OPTIF_DISABLED) != PSPFlags)) {
pOITemp->Flags &= ~OPTIF_DISABLED;
pOITemp->Flags |= (PSPFlags | OPTIF_CHANGED);
Action = CPSUICB_ACTION_OPTIF_CHANGED;
}
if ((pOITemp = FindOptItem(pPI->pOptItem,
pPI->cOptItem,
PP_AUTO_ROTATE)) &&
((pOITemp->Flags & OPTIF_DISABLED) != ARFlags)) {
pOITemp->Flags &= ~OPTIF_DISABLED;
pOITemp->Flags |= (ARFlags | OPTIF_CHANGED);
Action = CPSUICB_ACTION_OPTIF_CHANGED;
}
}
return(Action);
}
UINT
SetupPPOptItems(
PPRINTERINFO pPI
)
/*++
Routine Description:
Arguments:
Return Value:
Author:
16-Nov-1995 Thu 14:15:25 created
Revision History:
--*/
{
POPTITEM pOIForm;
POPTITEM pOptItem;
POPTITEM pOI;
POIDATA pOIData;
WORD PPFlags;
DWORD Flags;
DWORD ODFlags;
UINT i;
pOI =
pOptItem = pPI->pOptItem;
pOIData = PPOIData;
i = (UINT)COUNT_ARRAY(PPOIData);
Flags = pPI->pPlotGPC->Flags;
PPFlags = pPI->PPData.Flags;
ODFlags = (Flags & PLOTF_RASTER) ? ODF_RASTER : ODF_PEN;
while (i--) {
DWORD OIFlags = pOIData->Flags;
if ((!(OIFlags & ODFlags)) ||
((OIFlags & ODF_MANUAL_FEED) &&
(Flags & (PLOTF_ROLLFEED | PLOTF_PAPERTRAY))) ||
((OIFlags & ODF_ROLLFEED) && (!(Flags & PLOTF_ROLLFEED))) ||
((OIFlags & ODF_NO_PAPERTRAY) && (Flags & PLOTF_PAPERTRAY)) ||
((OIFlags & ODF_COLOR) && (!(Flags & PLOTF_COLOR)))) {
//
// Nothing to do here
//
NULL;
} else if (OIFlags & ODF_CALLCREATEOI) {
pOI += pOIData->pfnCreateOI(pPI,
(LPVOID)((pOptItem) ? pOI : NULL),
pOIData);
} else if (pOptItem) {
if (CreateOPTTYPE(pPI, pOI, pOIData, pOIData->cOPData, NULL)) {
switch (pOI->DMPubID) {
case PP_MANUAL_FEED_METHOD:
pOI->Sel = (LONG)((PPFlags & PPF_MANUAL_FEED_CX) ? 0 : 1);
break;
case PP_AUTO_ROTATE:
pOI->Sel = (LONG)((PPFlags & PPF_AUTO_ROTATE) ? 1 : 0);
break;
case PP_PRINT_SMALLER_PAPER:
pOI->Sel = (LONG)((PPFlags & PPF_SMALLER_FORM) ? 1 : 0);
break;
case PP_INSTALLED_PENSET:
pOI->Sel = (LONG)pPI->IdxPenSet;
break;
}
pOI++;
}
} else {
pOI++;
}
pOIData++;
}
if ((i = (UINT)(pOI - pOptItem)) && (!pOptItem)) {
if (pPI->pOptItem = (POPTITEM)LocalAlloc(LPTR, sizeof(OPTITEM) * i)) {
pPI->cOptItem = (WORD)i;
//
// Call myself second time to really create it
//
SetupPPOptItems(pPI);
CheckInstalledForm(pPI, 0);
CheckPenSetButton(pPI, 0);
} else {
i = 0;
PLOTERR(("GetPPpOptItem(): LocalAlloc(%ld) failed",
sizeof(OPTITEM) * i));
}
}
return(i);
}
VOID
SavePPOptItems(
PPRINTERINFO pPI
)
/*++
Routine Description:
This function save all the device options back to registry if one changed
and has a update permission
Arguments:
pPI - Pointer to the PRINTERINFO
Return Value:
VOID
Author:
06-Nov-1995 Mon 18:05:16 created
Revision History:
--*/
{
POPTITEM pOptItem;
POPTITEM pLastItem;
PDEVHTINFO pAdjHTInfo;
PCOLORINFO pCI;
LPDWORD pHTPatSize;
LPDWORD pDevPelsDPI;
PPAPERINFO pCurPaper;
LPBYTE pIdxPen;
WORD PPFlags;
BYTE DMPubID;
pCI = NULL;
pHTPatSize = NULL;
pDevPelsDPI = NULL;
pCurPaper = NULL;
pIdxPen = NULL;
if (!(pPI->Flags & PIF_UPDATE_PERMISSION)) {
return;
}
pOptItem = pPI->pOptItem;
pLastItem = pOptItem + pPI->cOptItem - 1;
while (pOptItem <= pLastItem) {
if ((DMPubID = pOptItem->DMPubID) == PP_PEN_SETUP) {
pOptItem = SavePenSet(pPI, pOptItem);
} else {
if (pOptItem->Flags & OPTIF_CHANGEONCE) {
switch (DMPubID) {
case PP_INSTALLED_FORM:
if (GetFormSelect(pPI, pOptItem)) {
pCurPaper = &(pPI->CurPaper);
}
break;
case PP_MANUAL_FEED_METHOD:
if (pOptItem->Sel) {
pPI->PPData.Flags &= ~PPF_MANUAL_FEED_CX;
} else {
pPI->PPData.Flags |= PPF_MANUAL_FEED_CX;
}
break;
case PP_AUTO_ROTATE:
if (pOptItem->Sel) {
pPI->PPData.Flags |= PPF_AUTO_ROTATE;
} else {
pPI->PPData.Flags &= ~PPF_AUTO_ROTATE;
}
break;
case PP_PRINT_SMALLER_PAPER:
if (pOptItem->Sel) {
pPI->PPData.Flags |= PPF_SMALLER_FORM;
} else {
pPI->PPData.Flags &= ~PPF_SMALLER_FORM;
}
break;
case PP_HT_SETUP:
pAdjHTInfo = PI_PADJHTINFO(pPI);
pCI = &(pAdjHTInfo->ColorInfo);
pDevPelsDPI = &(pAdjHTInfo->DevPelsDPI);
pHTPatSize = &(pAdjHTInfo->HTPatternSize);
break;
case PP_INSTALLED_PENSET:
pPI->IdxPenSet = (BYTE)pOptItem->Sel;
pIdxPen = (LPBYTE)&(pPI->IdxPenSet);
break;
}
}
pOptItem++;
}
}
if (!SaveToRegistry(pPI->hPrinter,
pCI,
pDevPelsDPI,
pHTPatSize,
pCurPaper,
&(pPI->PPData),
pIdxPen,
0,
NULL)) {
PlotUIMsgBox(NULL, IDS_PP_NO_SAVE, MB_ICONSTOP | MB_OK);
}
}
CPSUICALLBACK
PPCallBack(
PCPSUICBPARAM pCPSUICBParam
)
/*++
Routine Description:
This is the callback function from the common property sheet UI
Arguments:
pCPSUICBParam - Pointer to the CPSUICBPARAM data structure to describe
the nature of the callback
Return Value:
LONG
Author:
07-Nov-1995 Tue 15:15:02 created
Revision History:
--*/
{
POPTITEM pCurItem = pCPSUICBParam->pCurItem;
POPTITEM pItem;
PPRINTERINFO pPI = (PPRINTERINFO)pCPSUICBParam->UserData;
POPTPARAM pOP;
DWORD Flags;
UINT i;
WORD Reason = pCPSUICBParam->Reason;
LONG Action = CPSUICB_ACTION_NONE;
if (Reason == CPSUICB_REASON_APPLYNOW) {
PRINTER_INFO_7 PI7;
SavePPOptItems(pPI);
pCPSUICBParam->Result = CPSUI_OK;
Action = CPSUICB_ACTION_ITEMS_APPLIED;
PI7.pszObjectGUID = NULL;
PI7.dwAction = DSPRINT_UPDATE;
SetPrinter(pPI->hPrinter, 7, (LPBYTE)&PI7, 0);
} else if (Reason == CPSUICB_REASON_ITEMS_REVERTED) {
Action = CheckInstalledForm(pPI, Action);
Action = CheckPenSetButton(pPI, Action);
} else {
switch (pCurItem->DMPubID) {
case PP_PENSET:
if ((Reason == CPSUICB_REASON_EXTPUSH) ||
(Reason == CPSUICB_REASON_OPTITEM_SETFOCUS)) {
PPENDATA pPD;
pPI = (PPRINTERINFO)pCPSUICBParam->UserData;
pPD = (PPENDATA)pPI->pPlotGPC->Pens.pData;
i = (UINT)pPI->pPlotGPC->MaxPens;
pItem = pCurItem++;
if (Reason == CPSUICB_REASON_EXTPUSH) {
while (i--) {
pCurItem->Sel = pPD->ColorIdx;
pCurItem->Flags |= OPTIF_CHANGED;
pCurItem++;
pPD++;
}
pItem->Flags |= (OPTIF_EXT_DISABLED |
OPTIF_EXT_HIDE |
OPTIF_CHANGED);
Action = CPSUICB_ACTION_REINIT_ITEMS;
} else {
Action = CheckPenSetButton(pPI, Action);
}
}
break;
case PP_INSTALLED_FORM:
if ((Reason == CPSUICB_REASON_SEL_CHANGED) ||
(Reason == CPSUICB_REASON_OPTITEM_SETFOCUS)) {
Action = CheckInstalledForm(pPI, Action);
}
break;
default:
break;
}
}
return(Action);
}
LONG
DrvDevicePropertySheets(
PPROPSHEETUI_INFO pPSUIInfo,
LPARAM lParam
)
/*++
Routine Description:
Show document property dialog box and update the output DEVMODE
Arguments:
pPSUIInfo - Pointer to the PROPSHEETUI_INFO data structure
lParam - LPARAM for this call, it is a pointer to the
DEVICEPROPERTYHEADER
Return Value:
LONG, 1=successful, 0=failed.
Author:
02-Feb-1996 Fri 10:47:42 created
Revision History:
--*/
{
PDEVICEPROPERTYHEADER pDPHdr;
PPRINTERINFO pPI;
LONG_PTR Result = -1;
//
// The MapPrinter will allocate memory, set default devmode, reading and
// validating the GPC then update from current pritner registry, it also
// will cached the pPI.
if ((!pPSUIInfo) ||
(!(pDPHdr = (PDEVICEPROPERTYHEADER)pPSUIInfo->lParamInit))) {
SetLastError(ERROR_INVALID_DATA);
return(ERR_CPSUI_GETLASTERROR);
}
if (pPSUIInfo->Reason == PROPSHEETUI_REASON_INIT) {
if (!(pPI = MapPrinter(pDPHdr->hPrinter,
NULL,
NULL,
MPF_HELPFILE | MPF_DEVICEDATA | MPF_PCPSUI))) {
PLOTRIP(("DrvDevicePropertySheets: MapPrinter() failed"));
SetLastError(ERROR_INVALID_DATA);
return(ERR_CPSUI_GETLASTERROR);
}
pPI->Flags = (pDPHdr->Flags & DPS_NOPERMISSION) ?
0 : PIF_UPDATE_PERMISSION;
pPI->pCPSUI->Flags = 0;
pPI->pCPSUI->pfnCallBack = PPCallBack;
pPI->pCPSUI->pDlgPage = CPSUI_PDLGPAGE_PRINTERPROP;
//
// Add form to the database and find out if we can update
//
// Move to DrvPrinterEven()
//
//
// AddFormsToDataBase(pPI, TRUE);
//
Result = (LONG_PTR)SetupPPOptItems(pPI);
} else {
pPI = (PPRINTERINFO)pPSUIInfo->UserData;
Result = (LONG_PTR)pDPHdr->pszPrinterName;
}
return(DefCommonUIFunc(pPSUIInfo, lParam, pPI, Result));
}
BOOL
PrinterProperties(
HWND hWnd,
HANDLE hPrinter
)
/*++
Routine Description:
This function first retrieves and displays the current set of printer
properties for the printer. The user is allowed to change the current
printer properties from the displayed dialog box.
Arguments:
hWnd - Handle to the caller's window (parent window)
hPrinter - Handle to the pritner interested
Return Value:
TRUE if function sucessful FALSE if failed
Author:
06-Dec-1993 Mon 11:21:28 created
Revision History:
--*/
{
PRINTER_INFO_4 *pPI4;
DEVICEPROPERTYHEADER DPHdr;
LONG Result = CPSUI_CANCEL;
pPI4 = (PRINTER_INFO_4 *)GetPrinterInfo(hPrinter, 4);
DPHdr.cbSize = sizeof(DPHdr);
DPHdr.Flags = 0;
DPHdr.hPrinter = hPrinter;
DPHdr.pszPrinterName = (pPI4) ? pPI4->pPrinterName : NULL;
CallCommonPropertySheetUI(hWnd,
DrvDevicePropertySheets,
(LPARAM)&DPHdr,
(LPDWORD)&Result);
if (pPI4) {
LocalFree((HLOCAL)pPI4);
}
return(Result == CPSUI_OK);
}
BOOL
DrvPrinterEvent(
LPWSTR pPrinterName,
INT Event,
DWORD Flags,
LPARAM lParam
)
/*++
Routine Description:
Arguments:
Return Value:
Author:
08-May-1996 Wed 17:38:34 created
Revision History:
04-Jun-1996 Tue 14:51:25 updated
Matched a ClosePrinter() to OpenPrinter()
--*/
{
PRINTER_DEFAULTS PrinterDef = { NULL, NULL, PRINTER_ALL_ACCESS };
HANDLE hPrinter;
BOOL bRet = TRUE;
switch (Event) {
case PRINTER_EVENT_INITIALIZE:
if (OpenPrinter(pPrinterName, &hPrinter, &PrinterDef)) {
PPRINTERINFO pPI;
if (pPI = MapPrinter(hPrinter, NULL, NULL, MPF_DEVICEDATA)) {
bRet = AddFormsToDataBase(pPI, FALSE);
UnMapPrinter(pPI);
}
ClosePrinter(hPrinter);
}
break;
default:
break;
}
return(bRet);
}