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.
 
 
 
 
 
 

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);
}