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.
715 lines
15 KiB
715 lines
15 KiB
/*++
|
|
|
|
Copyright (c) 1990-2003 Microsoft Corporation
|
|
|
|
|
|
Module Name:
|
|
|
|
regdata.c
|
|
|
|
|
|
Abstract:
|
|
|
|
This module contains all registry data save/retrieve function for the
|
|
printer properties
|
|
|
|
|
|
Author:
|
|
|
|
30-Nov-1993 Tue 00:17:47 created
|
|
|
|
|
|
[Environment:]
|
|
|
|
GDI Device Driver - Plotter.
|
|
|
|
|
|
[Notes:]
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
|
|
#define DBG_PLOTFILENAME DbgRegData
|
|
|
|
#define DBG_GETREGDATA 0x00000001
|
|
#define DBG_SETREGDATA 0x00000002
|
|
|
|
DEFINE_DBGVAR(0);
|
|
|
|
|
|
//
|
|
// Local definition
|
|
//
|
|
|
|
typedef struct _PLOTREGKEY {
|
|
LPWSTR pwKey;
|
|
DWORD Size;
|
|
} PLOTREGKEY, *PPLOTREGKEY;
|
|
|
|
PLOTREGKEY PlotRegKey[] = {
|
|
|
|
{ L"ColorInfo", sizeof(COLORINFO) },
|
|
{ L"DevPelsDPI", sizeof(DWORD) },
|
|
{ L"HTPatternSize", sizeof(DWORD) },
|
|
{ L"InstalledForm", sizeof(PAPERINFO) },
|
|
{ L"PtrPropData", sizeof(PPDATA) },
|
|
{ L"IndexPenData", sizeof(BYTE) },
|
|
{ L"PenData", sizeof(PENDATA) }
|
|
};
|
|
|
|
|
|
#define MAX_PEN_DIGITS 6
|
|
|
|
|
|
LPWSTR
|
|
GetPenDataKey(
|
|
LPWSTR pwBuf,
|
|
size_t cchBuf,
|
|
WORD PenNum
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This fucntion composed the PenData%ld string as wsprintf does
|
|
|
|
|
|
Arguments:
|
|
|
|
pwBuf - Where data to be stored
|
|
|
|
PenNum - Pen number to be appended
|
|
|
|
|
|
Return Value:
|
|
|
|
VOID
|
|
|
|
|
|
Author:
|
|
|
|
24-Oct-1995 Tue 15:06:17 created
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
{
|
|
LPWSTR pwSrc;
|
|
LPWSTR pwDst;
|
|
WCHAR wNumBuf[MAX_PEN_DIGITS + 1];
|
|
size_t cchDst;
|
|
|
|
//
|
|
// Fristable copy the string
|
|
//
|
|
|
|
pwSrc = PlotRegKey[PRKI_PENDATA1].pwKey;
|
|
pwDst = pwBuf;
|
|
|
|
//while (*pwDst++ = *pwSrc++);
|
|
if (SUCCEEDED(StringCchCopyW(pwDst, cchBuf, pwSrc)) &&
|
|
SUCCEEDED(StringCchLengthW(pwDst, cchBuf, &cchDst)))
|
|
{
|
|
pwDst += cchDst;
|
|
cchBuf -= cchDst;
|
|
}
|
|
else
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
//
|
|
// We need to back one, since we also copy the NULL
|
|
//
|
|
|
|
--pwDst;
|
|
++cchBuf;
|
|
|
|
//
|
|
// conver the number to string, remember the 0 case and always end with
|
|
// a NULL
|
|
//
|
|
|
|
pwSrc = &wNumBuf[MAX_PEN_DIGITS];
|
|
*pwSrc = (WCHAR)0;
|
|
|
|
do {
|
|
|
|
*(--pwSrc) = (WCHAR)((PenNum % 10) + L'0');
|
|
|
|
} while (PenNum /= 10);
|
|
|
|
//
|
|
// Copy the number string now
|
|
//
|
|
|
|
//while (*pwDst++ = *pwSrc++);
|
|
if (!SUCCEEDED(StringCchCopyW(pwDst, cchBuf, pwSrc)))
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
return(pwBuf);
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
GetPlotRegData(
|
|
HANDLE hPrinter,
|
|
LPBYTE pData,
|
|
DWORD RegIdx
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function retrieve from registry to the pData
|
|
|
|
Arguments:
|
|
|
|
hPrinter - Handle to the printer interested
|
|
|
|
pData - Pointer to the data area buffer, it must large enough
|
|
|
|
RegIdx - One of the PRKI_xxxx in LOWORD(Index), HIWORD(Index)
|
|
specified total count for the PENDATA set
|
|
|
|
|
|
Return Value:
|
|
|
|
TRUE if sucessful, FALSE if failed,
|
|
|
|
|
|
Author:
|
|
|
|
06-Dec-1993 Mon 22:22:47 created
|
|
|
|
10-Dec-1993 Fri 01:13:14 updated
|
|
Fixed nesty problem in spooler of GetPrinterData which if we passed
|
|
a pbData and cb but if it cannot get any data then it will clear all
|
|
our buffer, this is not we expected (we expected it just return error
|
|
rather clear our buffer). Now we do extended test before we really
|
|
go get the data. The other problem is, if we set pbData = NULL then
|
|
spooler always have excption happened even we pass &cb as NULL also.
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
{
|
|
PPLOTREGKEY pPRK;
|
|
LONG lRet;
|
|
DWORD cb;
|
|
DWORD Type;
|
|
WCHAR wBuf[32];
|
|
PLOTREGKEY PRK;
|
|
UINT Index;
|
|
|
|
|
|
Index = LOWORD(RegIdx);
|
|
|
|
PLOTASSERT(0, "GetPlotRegData: Invalid PRKI_xxx Index %ld",
|
|
Index <= PRKI_LAST, Index);
|
|
|
|
|
|
if (Index >= PRKI_PENDATA1) {
|
|
|
|
UINT cPenData;
|
|
|
|
if ((cPenData = (UINT)HIWORD(RegIdx)) >= MAX_PENPLOTTER_PENS) {
|
|
|
|
PLOTERR(("GetPlotRegData: cPenData too big %ld (Max=%ld)",
|
|
cPenData, MAX_PENPLOTTER_PENS));
|
|
|
|
cPenData = MAX_PENPLOTTER_PENS;
|
|
}
|
|
|
|
PRK.pwKey = GetPenDataKey(wBuf, CCHOF(wBuf), (WORD)(Index - PRKI_PENDATA1 + 1));
|
|
PRK.Size = (DWORD)sizeof(PENDATA) * (DWORD)cPenData;
|
|
pPRK = &PRK;
|
|
|
|
} else {
|
|
|
|
pPRK = (PPLOTREGKEY)&PlotRegKey[Index];
|
|
}
|
|
|
|
//
|
|
// We must do following sequence or if an error occurred then the pData
|
|
// will be filled with ZEROs
|
|
//
|
|
// 1. Set Type/cb to invalid value
|
|
// 1. query the type/size of the keyword, (if more data available)
|
|
// 2. and If size is exact as we want
|
|
// 3. and if the type is as we want (REG_BINARY)
|
|
// 4. assume data valid then query it
|
|
//
|
|
|
|
Type = 0xffffffff;
|
|
cb = 0;
|
|
|
|
if ((lRet = xGetPrinterData(hPrinter,
|
|
pPRK->pwKey,
|
|
&Type,
|
|
(LPBYTE)pData,
|
|
0,
|
|
&cb)) != ERROR_MORE_DATA) {
|
|
|
|
if (lRet == ERROR_FILE_NOT_FOUND) {
|
|
|
|
PLOTWARN(("GetPlotRegData: GetPrinterData(%ls) not found",
|
|
pPRK->pwKey));
|
|
|
|
} else {
|
|
|
|
PLOTERR(("GetPlotRegData: 1st GetPrinterData(%ls) failed, Error=%ld",
|
|
pPRK->pwKey, lRet));
|
|
}
|
|
|
|
} else if (cb != pPRK->Size) {
|
|
|
|
PLOTERR(("GetPlotRegData: GetPrinterData(%ls) Size != %ld (%ld)",
|
|
pPRK->pwKey, pPRK->Size, cb));
|
|
|
|
} else if (Type != REG_BINARY) {
|
|
|
|
PLOTERR(("GetPlotRegData: GetPrinterData(%ls) Type != REG_BINARY (%ld)",
|
|
pPRK->pwKey, Type));
|
|
|
|
} else if ((lRet = xGetPrinterData(hPrinter,
|
|
pPRK->pwKey,
|
|
&Type,
|
|
(LPBYTE)pData,
|
|
pPRK->Size,
|
|
&cb)) == NO_ERROR) {
|
|
|
|
PLOTDBG(DBG_GETREGDATA, ("READ '%ws' REG Data: Type=%ld, %ld bytes",
|
|
pPRK->pwKey, Type, cb));
|
|
return(TRUE);
|
|
|
|
} else {
|
|
|
|
PLOTERR(("GetPlotRegData: 2nd GetPrinterData(%ls) failed, Error=%ld",
|
|
pPRK->pwKey, lRet));
|
|
}
|
|
|
|
return(FALSE);
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
UpdateFromRegistry(
|
|
HANDLE hPrinter,
|
|
PCOLORINFO pColorInfo,
|
|
LPDWORD pDevPelsDPI,
|
|
LPDWORD pHTPatSize,
|
|
PPAPERINFO pCurPaper,
|
|
PPPDATA pPPData,
|
|
LPBYTE pIdxPlotData,
|
|
DWORD cPenData,
|
|
PPENDATA pPenData
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function take hPrinter and read the printer properties from the
|
|
registry, if sucessful then it update to the pointer supplied
|
|
|
|
Arguments:
|
|
|
|
hPrinter - The printer it interested
|
|
|
|
pColorInfo - Pointer to the COLORINFO data structure
|
|
|
|
pDevPelsDPI - Pointer to the DWORD for Device Pels per INCH
|
|
|
|
pHTPatSize - Poineer to the DWORD for halftone patterns size
|
|
|
|
pCurPaper - Pointer to the PAPERINFO data structure for update
|
|
|
|
pPPData - Pointer to the PPDATA data structure
|
|
|
|
pIdxPlotData - Pointer to the BYTE which have current PlotData index
|
|
|
|
cPenData - count of PENDATA to be updated
|
|
|
|
pPenData - Pointer to the PENDATA data structure
|
|
|
|
|
|
Return Value:
|
|
|
|
return TRUE if it read sucessful from the registry else FALSE, for each of
|
|
the data pointer passed it will try to read from registry, if a NULL
|
|
pointer is passed then that registry is skipped.
|
|
|
|
if falied, the pCurPaper will be set to default
|
|
|
|
Author:
|
|
|
|
30-Nov-1993 Tue 14:54:33 created
|
|
|
|
02-Feb-1994 Wed 01:40:07 updated
|
|
Fixed &pDevPelsDPI, &pHTPatSize typo to pDevPelsDPI, pHTPatSize.
|
|
|
|
19-May-1994 Thu 18:09:06 updated
|
|
Do not save back if something go wrong
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
{
|
|
BOOL Ok = TRUE;
|
|
BYTE bData;
|
|
|
|
|
|
//
|
|
// In turn get each of the data from registry, the GetPlotRegData will
|
|
// not update the data if read failed
|
|
//
|
|
|
|
if (pColorInfo) {
|
|
|
|
if (!GetPlotRegData(hPrinter, (LPBYTE)pColorInfo, PRKI_CI)) {
|
|
|
|
Ok = FALSE;
|
|
}
|
|
}
|
|
|
|
if (pDevPelsDPI) {
|
|
|
|
if (!GetPlotRegData(hPrinter, (LPBYTE)pDevPelsDPI, PRKI_DEVPELSDPI)) {
|
|
|
|
Ok = FALSE;
|
|
}
|
|
}
|
|
|
|
if (pHTPatSize) {
|
|
|
|
if (!GetPlotRegData(hPrinter, (LPBYTE)pHTPatSize, PRKI_HTPATSIZE)) {
|
|
|
|
Ok = FALSE;
|
|
}
|
|
}
|
|
|
|
if (pCurPaper) {
|
|
|
|
if (!GetPlotRegData(hPrinter, (LPBYTE)pCurPaper, PRKI_FORM)) {
|
|
|
|
Ok = FALSE;
|
|
}
|
|
}
|
|
|
|
if (pPPData) {
|
|
|
|
if (!GetPlotRegData(hPrinter, (LPBYTE)pPPData, PRKI_PPDATA)) {
|
|
|
|
Ok = FALSE;
|
|
}
|
|
|
|
pPPData->Flags &= PPF_ALL_BITS;
|
|
}
|
|
|
|
if (pIdxPlotData) {
|
|
|
|
if ((!GetPlotRegData(hPrinter, &bData, PRKI_PENDATA_IDX)) ||
|
|
(bData >= PRK_MAX_PENDATA_SET)) {
|
|
|
|
bData = 0;
|
|
Ok = FALSE;
|
|
}
|
|
|
|
*pIdxPlotData = bData;
|
|
}
|
|
|
|
if ((cPenData) && (pPenData)) {
|
|
|
|
WORD IdxPen;
|
|
|
|
//
|
|
// First is get the current pendata selection index
|
|
//
|
|
|
|
if ((IdxPen = LOWORD(cPenData)) >= PRK_MAX_PENDATA_SET) {
|
|
|
|
if (!pIdxPlotData) {
|
|
|
|
if ((!GetPlotRegData(hPrinter, &bData, PRKI_PENDATA_IDX)) ||
|
|
(bData >= PRK_MAX_PENDATA_SET)) {
|
|
|
|
bData = 0;
|
|
}
|
|
}
|
|
|
|
IdxPen = (WORD)bData;
|
|
}
|
|
|
|
cPenData = MAKELONG(IdxPen + PRKI_PENDATA1, HIWORD(cPenData));
|
|
|
|
if (!GetPlotRegData(hPrinter, (LPBYTE)pPenData, cPenData)) {
|
|
|
|
Ok = FALSE;
|
|
}
|
|
}
|
|
|
|
return(Ok);
|
|
}
|
|
|
|
|
|
#ifdef UMODE
|
|
|
|
|
|
BOOL
|
|
SetPlotRegData(
|
|
HANDLE hPrinter,
|
|
LPBYTE pData,
|
|
DWORD RegIdx
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function save pData to to the registry
|
|
|
|
Arguments:
|
|
|
|
hPrinter - Handle to the printer interested
|
|
|
|
pData - Pointer to the data area buffer, it must large enough
|
|
|
|
RegIdx - One of the PRKI_xxxx in LOWORD(Index), HIWORD(Index)
|
|
specified total count for the PENDATA set
|
|
|
|
Return Value:
|
|
|
|
TRUE if sucessful, FALSE if failed,
|
|
|
|
Author:
|
|
|
|
06-Dec-1993 Mon 22:25:55 created
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
{
|
|
PPLOTREGKEY pPRK;
|
|
WCHAR wBuf[32];
|
|
PLOTREGKEY PRK;
|
|
UINT Index;
|
|
|
|
|
|
Index = (UINT)LOWORD(RegIdx);
|
|
|
|
PLOTASSERT(0, "SetPlotRegData: Invalid PRKI_xxx Index %ld",
|
|
Index <= PRKI_LAST, Index);
|
|
|
|
if (Index >= PRKI_PENDATA1) {
|
|
|
|
UINT cPenData;
|
|
|
|
if ((cPenData = (UINT)HIWORD(RegIdx)) >= MAX_PENPLOTTER_PENS) {
|
|
|
|
PLOTERR(("GetPlotRegData: cPenData too big %ld (Max=%ld)",
|
|
cPenData, MAX_PENPLOTTER_PENS));
|
|
|
|
cPenData = MAX_PENPLOTTER_PENS;
|
|
}
|
|
|
|
PRK.pwKey = GetPenDataKey(wBuf, CCHOF(wBuf), (WORD)(Index - PRKI_PENDATA1 + 1));
|
|
PRK.Size = (DWORD)sizeof(PENDATA) * (DWORD)cPenData;
|
|
pPRK = &PRK;
|
|
|
|
} else {
|
|
|
|
pPRK = (PPLOTREGKEY)&PlotRegKey[Index];
|
|
}
|
|
|
|
if (xSetPrinterData(hPrinter,
|
|
pPRK->pwKey,
|
|
REG_BINARY,
|
|
pData,
|
|
pPRK->Size) != NO_ERROR) {
|
|
|
|
PLOTERR(("SetPlotRegData: SetPrinterData(%ls [%ld]) failed",
|
|
pPRK->pwKey, pPRK->Size));
|
|
return(FALSE);
|
|
|
|
} else {
|
|
|
|
PLOTDBG(DBG_SETREGDATA, ("SAVE '%ws' registry data", pPRK->pwKey));
|
|
return(TRUE);
|
|
}
|
|
}
|
|
|
|
|
|
BOOL
|
|
SaveToRegistry(
|
|
HANDLE hPrinter,
|
|
PCOLORINFO pColorInfo,
|
|
LPDWORD pDevPelsDPI,
|
|
LPDWORD pHTPatSize,
|
|
PPAPERINFO pCurPaper,
|
|
PPPDATA pPPData,
|
|
LPBYTE pIdxPlotData,
|
|
DWORD cPenData,
|
|
PPENDATA pPenData
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function take hPrinter and read the printer properties from the
|
|
registry, if sucessful then it update to the pointer supplied
|
|
|
|
Arguments:
|
|
|
|
hPrinter - The printer it interested
|
|
|
|
pColorInfo - Pointer to the COLORINFO data structure
|
|
|
|
pDevPelsDPI - Pointer to the DWORD for Device Pels per INCH
|
|
|
|
pHTPatSize - Poineer to the DWORD for halftone patterns size
|
|
|
|
pCurPaper - Pointer to the PAPERINFO data structure for update
|
|
|
|
pPPData - Pointer to the PPDATA data structure
|
|
|
|
pIdxPlotData - Pointer to the DWORD which have current PlotData index
|
|
|
|
cPenData - count of PENDATA to be updated
|
|
|
|
pPenData - Pointer to the PENDATA data structure
|
|
|
|
|
|
Return Value:
|
|
|
|
return TRUE if it read sucessful from the registry else FALSE, for each of
|
|
the data pointer passed it will try to read from registry, if a NULL
|
|
pointer is passed then that registry is skipped.
|
|
|
|
if falied, the pCurPaper will be set to default
|
|
|
|
Author:
|
|
|
|
30-Nov-1993 Tue 14:54:33 created
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
{
|
|
BOOL Ok = TRUE;
|
|
|
|
|
|
//
|
|
// In turn get each of the data from registry.
|
|
//
|
|
|
|
if (pColorInfo) {
|
|
|
|
if (!SetPlotRegData(hPrinter, (LPBYTE)pColorInfo, PRKI_CI)) {
|
|
|
|
Ok = FALSE;
|
|
}
|
|
}
|
|
|
|
if (pDevPelsDPI) {
|
|
|
|
if (!SetPlotRegData(hPrinter, (LPBYTE)pDevPelsDPI, PRKI_DEVPELSDPI)) {
|
|
|
|
Ok = FALSE;
|
|
}
|
|
}
|
|
|
|
if (pHTPatSize) {
|
|
|
|
if (!SetPlotRegData(hPrinter, (LPBYTE)pHTPatSize, PRKI_HTPATSIZE)) {
|
|
|
|
Ok = FALSE;
|
|
}
|
|
}
|
|
|
|
if (pCurPaper) {
|
|
|
|
if (!SetPlotRegData(hPrinter, (LPBYTE)pCurPaper, PRKI_FORM)) {
|
|
|
|
Ok = FALSE;
|
|
}
|
|
}
|
|
|
|
if (pPPData) {
|
|
|
|
pPPData->NotUsed = 0;
|
|
|
|
if (!SetPlotRegData(hPrinter, (LPBYTE)pPPData, PRKI_PPDATA)) {
|
|
|
|
Ok = FALSE;
|
|
}
|
|
}
|
|
|
|
if (pIdxPlotData) {
|
|
|
|
if (*pIdxPlotData >= PRK_MAX_PENDATA_SET) {
|
|
|
|
*pIdxPlotData = 0;
|
|
Ok = FALSE;
|
|
}
|
|
|
|
if (!SetPlotRegData(hPrinter, pIdxPlotData, PRKI_PENDATA_IDX)) {
|
|
|
|
Ok = FALSE;
|
|
}
|
|
}
|
|
|
|
if ((cPenData) && (pPenData)) {
|
|
|
|
WORD IdxPen;
|
|
|
|
//
|
|
// First is get the current pendata selection index
|
|
//
|
|
|
|
if ((IdxPen = LOWORD(cPenData)) >= PRK_MAX_PENDATA_SET) {
|
|
|
|
IdxPen = (WORD)((pIdxPlotData) ? *pIdxPlotData : 0);
|
|
}
|
|
|
|
cPenData = MAKELONG(IdxPen + PRKI_PENDATA1, HIWORD(cPenData));
|
|
|
|
if (!SetPlotRegData(hPrinter, (LPBYTE)pPenData, cPenData)) {
|
|
|
|
Ok = FALSE;
|
|
}
|
|
}
|
|
|
|
return(Ok);
|
|
}
|
|
|
|
|
|
#endif
|