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.
481 lines
9.9 KiB
481 lines
9.9 KiB
/*++
|
|
|
|
Copyright (c) 1990-2003 Microsoft Corporation
|
|
|
|
|
|
Module Name:
|
|
|
|
ptrInfo.c
|
|
|
|
|
|
Abstract:
|
|
|
|
This module contains functions to mappring a hPrinter to useful data, it
|
|
will also cached the printerinfo data
|
|
|
|
|
|
Author:
|
|
|
|
03-Dec-1993 Fri 00:16:37 created
|
|
|
|
|
|
[Environment:]
|
|
|
|
GDI Device Driver - Plotter.
|
|
|
|
|
|
[Notes:]
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
|
|
#define DBG_PLOTFILENAME DbgPtrInfo
|
|
|
|
|
|
#define DBG_MAPPRINTER 0x00000001
|
|
#define DBG_CACHE_DATA 0x00000002
|
|
|
|
|
|
DEFINE_DBGVAR(0);
|
|
|
|
|
|
|
|
|
|
PPRINTERINFO
|
|
MapPrinter(
|
|
HANDLE hPrinter,
|
|
PPLOTDEVMODE pPlotDMIn,
|
|
LPDWORD pdwErrIDS,
|
|
DWORD MPFlags
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function map a handle to the printer to useful information for the
|
|
plotter UI
|
|
|
|
|
|
Arguments:
|
|
|
|
hPrinter - Handle to the printer
|
|
|
|
pPlotDMIn - pointer to the PLOTDEVMODE pass in to be validate and merge
|
|
with default into pPI->PlotDM, if this pointer is NULL then
|
|
a default PLOTDEVMODE is set in the pPI
|
|
|
|
pdwErrIDS - pointer to a DWORD to store the error string ID if an error
|
|
occured.
|
|
|
|
MPFlags - MPF_xxxx flags for this function
|
|
|
|
|
|
Return Value:
|
|
|
|
return a pointer to the PRINTERINFO data structure, if NULL then it failed
|
|
|
|
when a pPI is returned then following fields are set and validated
|
|
|
|
hPrinter, pPlotGPC, CurPaper.
|
|
|
|
and following fields are set to NULL
|
|
|
|
Flags,
|
|
|
|
Author:
|
|
|
|
02-Dec-1993 Thu 23:04:18 created
|
|
|
|
29-Dec-1993 Wed 14:50:23 updated
|
|
NOT automatically select AUTO_ROTATE if roll feed device
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
{
|
|
HANDLE hHeap;
|
|
PPRINTERINFO pPI;
|
|
PPLOTGPC pPlotGPC;
|
|
WCHAR DeviceName[CCHDEVICENAME];
|
|
UINT cPenSet;
|
|
UINT MaxPens;
|
|
DWORD cbPen;
|
|
DWORD cb;
|
|
|
|
|
|
if (!(pPlotGPC = hPrinterToPlotGPC(hPrinter, DeviceName, CCHOF(DeviceName)))) {
|
|
|
|
if (pdwErrIDS) {
|
|
|
|
*pdwErrIDS = IDS_NO_MEMORY;
|
|
}
|
|
|
|
return(NULL);
|
|
}
|
|
|
|
cPenSet = 0;
|
|
|
|
if (pPlotGPC->Flags & PLOTF_RASTER) {
|
|
|
|
cb = sizeof(PRINTERINFO) +
|
|
((MPFlags & MPF_DEVICEDATA) ?
|
|
(sizeof(DEVHTADJDATA) + (sizeof(DEVHTINFO) * 2)) : 0);
|
|
|
|
} else {
|
|
|
|
MaxPens = (UINT)pPlotGPC->MaxPens;
|
|
cbPen = (DWORD)(sizeof(PENDATA) * MaxPens);
|
|
cPenSet = (MPFlags & MPF_DEVICEDATA) ? PRK_MAX_PENDATA_SET : 1;
|
|
cb = sizeof(PRINTERINFO) + (DWORD)(cbPen * cPenSet);
|
|
}
|
|
|
|
if (!(pPI = (PPRINTERINFO)LocalAlloc(LPTR,
|
|
cb + ((MPFlags & MPF_PCPSUI) ?
|
|
sizeof(COMPROPSHEETUI) : 0)))) {
|
|
|
|
UnGetCachedPlotGPC(pPlotGPC);
|
|
|
|
if (pdwErrIDS) {
|
|
|
|
*pdwErrIDS = IDS_NO_MEMORY;
|
|
}
|
|
|
|
return(NULL);
|
|
}
|
|
|
|
if (MPFlags & MPF_PCPSUI) {
|
|
|
|
pPI->pCPSUI = (PCOMPROPSHEETUI)((LPBYTE)pPI + cb);
|
|
}
|
|
|
|
pPI->hPrinter = hPrinter;
|
|
pPI->pPlotDMIn = pPlotDMIn;
|
|
pPI->PPData.Flags = PPF_AUTO_ROTATE |
|
|
PPF_SMALLER_FORM |
|
|
PPF_MANUAL_FEED_CX;
|
|
pPI->IdxPenSet = 0;
|
|
pPI->pPlotGPC = pPlotGPC;
|
|
pPI->dmErrBits = ValidateSetPLOTDM(hPrinter,
|
|
pPlotGPC,
|
|
DeviceName,
|
|
pPlotDMIn,
|
|
&(pPI->PlotDM),
|
|
NULL);
|
|
|
|
GetDefaultPlotterForm(pPlotGPC, &(pPI->CurPaper));
|
|
|
|
if (pPlotGPC->Flags & PLOTF_RASTER) {
|
|
|
|
//
|
|
// Get the raster plotter default and settings
|
|
//
|
|
|
|
if (MPFlags & MPF_DEVICEDATA) {
|
|
|
|
PDEVHTADJDATA pDHTAD;
|
|
PDEVHTINFO pDefHTInfo;
|
|
PDEVHTINFO pAdjHTInfo;
|
|
|
|
pAdjHTInfo = PI_PADJHTINFO(pPI);
|
|
pDHTAD = PI_PDEVHTADJDATA(pPI);
|
|
pDefHTInfo = (PDEVHTINFO)(pDHTAD + 1);
|
|
|
|
pDHTAD->DeviceFlags = (pPlotGPC->Flags & PLOTF_COLOR) ?
|
|
DEVHTADJF_COLOR_DEVICE : 0;
|
|
pDHTAD->DeviceXDPI = (DWORD)pPI->pPlotGPC->RasterXDPI;
|
|
pDHTAD->DeviceYDPI = (DWORD)pPI->pPlotGPC->RasterYDPI;
|
|
pDHTAD->pDefHTInfo = pDefHTInfo;
|
|
pDHTAD->pAdjHTInfo = pAdjHTInfo;
|
|
|
|
pDefHTInfo->HTFlags = HT_FLAG_HAS_BLACK_DYE;
|
|
pDefHTInfo->HTPatternSize = (DWORD)pPlotGPC->HTPatternSize;
|
|
pDefHTInfo->DevPelsDPI = (DWORD)pPlotGPC->DevicePelsDPI;
|
|
pDefHTInfo->ColorInfo = pPlotGPC->ci;
|
|
*pAdjHTInfo = *pDefHTInfo;
|
|
|
|
UpdateFromRegistry(hPrinter,
|
|
&(pAdjHTInfo->ColorInfo),
|
|
&(pAdjHTInfo->DevPelsDPI),
|
|
&(pAdjHTInfo->HTPatternSize),
|
|
&(pPI->CurPaper),
|
|
&(pPI->PPData),
|
|
NULL,
|
|
0,
|
|
NULL);
|
|
}
|
|
|
|
} else {
|
|
|
|
PPENDATA pPenData;
|
|
WORD IdxPenSet;
|
|
|
|
//
|
|
// Get the pen plotter default and settings
|
|
//
|
|
|
|
pPenData = PI_PPENDATA(pPI);
|
|
|
|
UpdateFromRegistry(hPrinter,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
&(pPI->CurPaper),
|
|
&(pPI->PPData),
|
|
&(pPI->IdxPenSet),
|
|
0,
|
|
NULL);
|
|
|
|
if (MPFlags & MPF_DEVICEDATA) {
|
|
|
|
IdxPenSet = 0;
|
|
|
|
} else {
|
|
|
|
IdxPenSet = (WORD)pPI->IdxPenSet;
|
|
}
|
|
|
|
//
|
|
// Set default pen set and get all the pen set back
|
|
//
|
|
|
|
while (cPenSet--) {
|
|
|
|
CopyMemory(pPenData, pPlotGPC->Pens.pData, cbPen);
|
|
|
|
UpdateFromRegistry(hPrinter,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
MAKELONG(IdxPenSet, MaxPens),
|
|
pPenData);
|
|
|
|
IdxPenSet++;
|
|
(LPBYTE)pPenData += cbPen;
|
|
}
|
|
}
|
|
|
|
if (MPFlags & MPF_HELPFILE) {
|
|
|
|
GetPlotHelpFile(pPI);
|
|
}
|
|
|
|
return(pPI);
|
|
}
|
|
|
|
|
|
|
|
|
|
VOID
|
|
UnMapPrinter(
|
|
PPRINTERINFO pPI
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
|
|
Return Value:
|
|
|
|
|
|
|
|
|
|
Author:
|
|
|
|
01-Nov-1995 Wed 19:05:40 created
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
{
|
|
if (pPI) {
|
|
|
|
if (pPI->pPlotGPC) {
|
|
|
|
UnGetCachedPlotGPC(pPI->pPlotGPC);
|
|
}
|
|
|
|
if (pPI->pFI1Base) {
|
|
|
|
LocalFree((HLOCAL)pPI->pFI1Base);
|
|
}
|
|
|
|
if (pPI->pHelpFile) {
|
|
|
|
LocalFree((HLOCAL)pPI->pHelpFile);
|
|
}
|
|
|
|
if (pPI->pOptItem) {
|
|
|
|
POPTITEM pOI = pPI->pOptItem;
|
|
UINT cOI = (UINT)pPI->cOptItem;
|
|
|
|
while (cOI--) {
|
|
|
|
if (pOI->UserData) {
|
|
|
|
LocalFree((HLOCAL)pOI->UserData);
|
|
}
|
|
|
|
pOI++;
|
|
}
|
|
|
|
LocalFree((HLOCAL)pPI->pOptItem);
|
|
}
|
|
|
|
LocalFree((HLOCAL)pPI);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
LPBYTE
|
|
GetPrinterInfo(
|
|
HANDLE hPrinter,
|
|
UINT PrinterInfoLevel
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function get the DRIVER_INFO_1 Pointer from a hPrinter
|
|
|
|
Arguments:
|
|
|
|
hPrinter - The handle to the printer interested
|
|
|
|
PrinterInfoLevel - It can be PRINTER_INFO_1, PRINTER_INFO_2,
|
|
PRINTER_INFO_3, PRINTER_4, PRINTER_INFO_5.
|
|
|
|
Return Value:
|
|
|
|
the return value is NULL if failed else a pointer to the PRINTER_INFO_X
|
|
where X is from 1 to 5. the caller must call LocalFree() to free the
|
|
memory object after using it.
|
|
|
|
|
|
Author:
|
|
|
|
16-Nov-1995 Thu 23:58:37 created
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
{
|
|
LPVOID pb;
|
|
DWORD cb;
|
|
|
|
//
|
|
// Find out total bytes required
|
|
//
|
|
|
|
GetPrinter(hPrinter, PrinterInfoLevel, NULL, 0, &cb);
|
|
|
|
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
|
|
|
|
PLOTERR(("GetPrinterInfo%d: GetPrinterPrinter(1st) error=%08lx",
|
|
PrinterInfoLevel, xGetLastError()));
|
|
|
|
} else if (!(pb = (LPBYTE)LocalAlloc(LMEM_FIXED, cb))) {
|
|
|
|
PLOTERR(("GetPrinterInfo%d: LocalAlloc(%ld) failed", PrinterInfoLevel, cb));
|
|
|
|
} else if (GetPrinter(hPrinter, PrinterInfoLevel, pb, cb, &cb)) {
|
|
|
|
//
|
|
// Got it allright, so return it
|
|
//
|
|
|
|
return(pb);
|
|
|
|
} else {
|
|
|
|
PLOTERR(("GetPrinterInfo%d: GetPrinterPrinter(2nd) error=%08lx",
|
|
PrinterInfoLevel, xGetLastError()));
|
|
LocalFree((HLOCAL)pb);
|
|
}
|
|
|
|
return(NULL);
|
|
}
|
|
|
|
|
|
|
|
|
|
DWORD
|
|
GetPlotterIconID(
|
|
PPRINTERINFO pPI
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
|
|
Return Value:
|
|
|
|
|
|
|
|
|
|
Author:
|
|
|
|
29-Nov-1995 Wed 19:32:00 created
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
{
|
|
DWORD Flags;
|
|
DWORD IconID;
|
|
|
|
|
|
if ((Flags = pPI->pPlotGPC->Flags) & PLOTF_RASTER) {
|
|
|
|
IconID = (Flags & PLOTF_ROLLFEED) ? IDI_RASTER_ROLLFEED :
|
|
IDI_RASTER_TRAYFEED;
|
|
|
|
} else {
|
|
|
|
IconID = (Flags & PLOTF_ROLLFEED) ? IDI_PEN_ROLLFEED :
|
|
IDI_PEN_TRAYFEED;
|
|
}
|
|
|
|
return(IconID);
|
|
}
|