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.
 
 
 
 
 
 

530 lines
14 KiB

/*++
Copyright (c) 1990-2003 Microsoft Corporation
Module Name:
formbox.c
Abstract:
This module contains functions to enumerate valid form and list on the
combo box
Author:
09-Dec-1993 Thu 14:31:44 created
[Environment:]
GDI Device Driver - Plotter.
[Notes:]
Revision History:
--*/
#include "precomp.h"
#pragma hdrstop
#define DBG_PLOTFILENAME DbgFormBox
#define DBG_FORMS 0x00000001
#define DBG_TRAY 0x00000002
#define DBG_PERMISSION 0x00000004
DEFINE_DBGVAR(0);
WCHAR wszModel[] = L"Model";
BOOL
GetFormSelect(
PPRINTERINFO pPI,
POPTITEM pOptItem
)
/*++
Routine Description:
This function retrieve the form selected by the user from the combo
box
Arguments:
pPI - Pointer to the PRINTERINFO
pOptItem - Pointer to the FORM's OPTITEM
Return Value:
TRUE if sucessful and pPI will be set correctly, FALSE if error occurred
Author:
09-Dec-1993 Thu 14:44:18 created
18-Dec-1993 Sat 03:55:30 updated
Changed dmFields setting for the PAPER, now we will only set the
DM_FORMNAME field, this way the returned document properties will be
always in known form even user defines many forms in spooler.
06-Nov-1995 Mon 12:56:00 updated
Re-write for the New UI
Revision History:
--*/
{
PAPERINFO CurPaper;
POPTPARAM pOptParam;
pOptParam = pOptItem->pOptType->pOptParam + pOptItem->Sel;
if (pOptParam->Style == FS_ROLLPAPER) {
PFORMSRC pFS;
//
// This was added from the GPC data for the roll feed
//
PLOTASSERT(0, "GetComboBoxSelForm: INTERNAL ERROR, ROLLPAPER In document properties",
!(pPI->Flags & PIF_DOCPROP), 0);
PLOTASSERT(0, "GetComboBoxSelForm: INTERNAL ERROR, device CANNOT have ROLLPAPER",
pPI->pPlotGPC->Flags & PLOTF_ROLLFEED, 0);
PLOTDBG(DBG_FORMS,
("Roll Feed Paper is selected, (%ld)", pOptParam->lParam));
if (pOptParam->lParam < (LONG)pPI->pPlotGPC->Forms.Count) {
pFS = (PFORMSRC)pPI->pPlotGPC->Forms.pData + pOptParam->lParam;
//
// Since the RollFeed paper has variable length, and the cy is set
// to zero at GPC data, we must take that into account
//
CurPaper.Size = pFS->Size;
CurPaper.ImageArea.left = pFS->Margin.left;
CurPaper.ImageArea.top = pFS->Margin.top;
CurPaper.ImageArea.right = CurPaper.Size.cx -
pFS->Margin.right;
CurPaper.ImageArea.bottom = pPI->pPlotGPC->DeviceSize.cy -
pFS->Margin.bottom;
str2Wstr(CurPaper.Name, CCHOF(CurPaper.Name), pFS->Name);
} else {
PLOTERR(("GetComboBoxSelForm: Internal Error, Invalid lParam=%ld",
pOptParam->lParam));
return(FALSE);
}
} else {
FORM_INFO_1 *pFI1;
DWORD cb;
//
// This form is in the form data base
//
pFI1 = pPI->pFI1Base + pOptParam->lParam;
CurPaper.Size = pFI1->Size;
CurPaper.ImageArea = pFI1->ImageableArea;
WCPYFIELDNAME(CurPaper.Name, pFI1->pName);
}
//
// Now we have current paper validated
//
if (pPI->Flags & PIF_DOCPROP) {
//
// Turn off first, then turn on paper fields as needed
//
pPI->PlotDM.dm.dmFields &= ~DM_PAPER_FIELDS;
pPI->PlotDM.dm.dmFields |= (DM_FORMNAME | DM_PAPERSIZE);
//
// Copy down the dmFormName, dmPaperSize and set dmPaperWidth/Length,
// the fields for PAPER will bb set to DM_FORMNAME so that we always
// can find the form also we may set DM_PAPERSIZE if index number is
// <= DMPAPER_LAST
//
WCPYFIELDNAME(pPI->PlotDM.dm.dmFormName, CurPaper.Name);
pPI->PlotDM.dm.dmPaperSize = (SHORT)(pOptParam->lParam +
DMPAPER_FIRST);
pPI->PlotDM.dm.dmPaperWidth = SPLTODM(CurPaper.Size.cx);
pPI->PlotDM.dm.dmPaperLength = SPLTODM(CurPaper.Size.cy);
#if DBG
*(PRECTL)&pPI->PlotDM.dm.dmBitsPerPel = CurPaper.ImageArea;
#endif
} else {
pPI->CurPaper = CurPaper;
}
PLOTDBG(DBG_FORMS, ("*** GetComboBoxSelForm from COMBO = '%s'", CurPaper.Name));
PLOTDBG(DBG_FORMS, ("Size=%ld x %ld", CurPaper.Size.cx, CurPaper.Size.cy));
PLOTDBG(DBG_FORMS, ("ImageArea=(%ld, %ld) - (%ld, %ld)",
CurPaper.ImageArea.left, CurPaper.ImageArea.top,
CurPaper.ImageArea.right, CurPaper.ImageArea.bottom));
return(TRUE);
}
UINT
CreateFormOI(
PPRINTERINFO pPI,
POPTITEM pOptItem,
POIDATA pOIData
)
/*++
Routine Description:
This function add the available forms to the combo box, it will optionally
add the roll feed type of form
Arguments:
pPI - Pointer to the PRINTERINFO data structure
pOptItem - Pointer to the FORM's OPTITEM
pOIData - Pointer to the OIDATA structure
Return Value:
The form selected, a netavie number means error
Author:
09-Dec-1993 Thu 14:35:59 created
06-Nov-1995 Mon 12:56:24 updated
Re-write for the New UI
Revision History:
--*/
{
LPWSTR pwSelName;
POPTPARAM pOptParam;
PFORM_INFO_1 pFI1;
PFORMSRC pFS;
ENUMFORMPARAM EFP;
DWORD i;
LONG Sel;
DWORD cRollPaper;
EXTRAINFO EI;
if (!pOptItem) {
return(1);
}
pwSelName = (LPWSTR)((pPI->Flags & PIF_DOCPROP) ?
pPI->PlotDM.dm.dmFormName : pPI->CurPaper.Name);
PLOTDBG(DBG_FORMS, ("Current Form: <%ws>", pwSelName));
EFP.pPlotDM = &(pPI->PlotDM);
EFP.pPlotGPC = pPI->pPlotGPC;
if (!PlotEnumForms(pPI->hPrinter, NULL, &EFP)) {
PLOTERR(("CreateFormOI: PlotEnumForms() failed"));
return(0);
}
cRollPaper = 0;
if ((!(pPI->Flags & PIF_DOCPROP)) &&
(pPI->pPlotGPC->Flags & PLOTF_ROLLFEED)) {
//
// Add device' roll paper to the combo box too.
//
PLOTDBG(DBG_FORMS, ("Device support ROLLFEED so add RollPaper if any"));
for (i= 0, pFS = (PFORMSRC)pPI->pPlotGPC->Forms.pData;
i < (DWORD)pPI->pPlotGPC->Forms.Count;
i++, pFS++) {
if (!pFS->Size.cy) {
++cRollPaper;
}
}
}
PLOTDBG(DBG_FORMS, ("Valid Count is %ld [%ld + %ld] out of %ld",
EFP.ValidCount + cRollPaper,
EFP.ValidCount, cRollPaper, EFP.Count));
EI.Size = (DWORD)(cRollPaper * (sizeof(WCHAR) * CCHFORMNAME));
if (!CreateOPTTYPE(pPI,
pOptItem,
pOIData,
EFP.ValidCount + cRollPaper,
&EI)) {
LocalFree((HLOCAL)EFP.pFI1Base);
return(0);
}
pPI->pFI1Base = EFP.pFI1Base;
pOptItem->pOptType->Style = OTS_LBCB_SORT;
pOptParam = pOptItem->pOptType->pOptParam;
for (i = 0, Sel = 0, pFI1 = EFP.pFI1Base; i < EFP.Count; i++, pFI1++) {
if (pFI1->Flags & FI1F_VALID_SIZE) {
pOptParam->cbSize = sizeof(OPTPARAM);
pOptParam->Style = (pPI->pPlotGPC->Flags & PLOTF_PAPERTRAY) ?
FS_TRAYPAPER : 0;
pOptParam->pData = pFI1->pName;
pOptParam->IconID = (pFI1->Flags & FI1F_ENVELOPE) ?
IDI_CPSUI_ENVELOPE : IDI_CPSUI_STD_FORM;
pOptParam->lParam = (LONG)i;
if (!lstrcmp(pwSelName, pOptParam->pData)) {
pOptItem->Sel = Sel;
}
pOptParam++;
Sel++;
}
}
if (cRollPaper) {
LPWSTR pwStr = (LPWSTR)EI.pData;
size_t cchpwStr = EI.Size / sizeof(WCHAR);
//
// Add device' roll paper to the combo box too.
//
for (i = 0, pFS = (PFORMSRC)pPI->pPlotGPC->Forms.pData;
i < (DWORD)pPI->pPlotGPC->Forms.Count;
i++, pFS++) {
if (!(pFS->Size.cy)) {
//
// Got one, we have to translated into the UNICODE first
//
pOptParam->cbSize = sizeof(OPTPARAM);
pOptParam->Style = FS_ROLLPAPER;
pOptParam->pData = (LPTSTR)pwStr;
pwStr += CCHFORMNAME;
cchpwStr -= CCHFORMNAME;
pOptParam->IconID = IDI_ROLLPAPER;
pOptParam->lParam = (LONG)i;
str2Wstr(pOptParam->pData, cchpwStr, pFS->Name);
if (!lstrcmp(pwSelName, pOptParam->pData)) {
pOptItem->Sel = Sel;
}
pOptParam++;
Sel++;
}
}
}
return(1);
}
BOOL
AddFormsToDataBase(
PPRINTERINFO pPI,
BOOL DeleteFirst
)
/*++
Routine Description:
This function add driver supports forms to the data base
Arguments:
pPI - Pointer to the PRINTERINFO
Return Value:
BOOLEAN
Author:
09-Dec-1993 Thu 22:38:27 created
27-Apr-1994 Wed 19:18:58 updated
Fixed bug# 13592 which printman/spooler did not call ptrprop first but
docprop so let us into unknown form database state,
Revision History:
--*/
{
WCHAR wName[CCHFORMNAME + 2];
BOOL bRet;
LONG i;
DWORD Type;
Type = REG_SZ;
if ((GetPrinterData(pPI->hPrinter,
wszModel,
&Type,
(LPBYTE)wName,
sizeof(wName),
&i) == ERROR_SUCCESS) &&
(wcscmp(pPI->PlotDM.dm.dmDeviceName, wName))) {
PLOTDBG(DBG_FORMS, ("Already added forms to the data base for %s",
pPI->PlotDM.dm.dmDeviceName));
return(TRUE);
}
//
// Find out if we have permission to do this
//
if (SetPrinterData(pPI->hPrinter,
wszModel,
REG_SZ,
(LPBYTE)pPI->PlotDM.dm.dmDeviceName,
(wcslen(pPI->PlotDM.dm.dmDeviceName) + 1) *
sizeof(WCHAR)) == ERROR_SUCCESS) {
PFORMSRC pFS;
FORM_INFO_1 FI1;
//
// We have permission to update the registry so do it now
//
pPI->Flags |= PIF_UPDATE_PERMISSION;
PLOTDBG(DBG_PERMISSION,
("!!! MODEL NAME: '%s' not Match, Re-installed Form Database",
pPI->PlotDM.dm.dmDeviceName));
//
// Add the driver supportes forms to the system spooler data base if
// not yet done so
//
FI1.pName = wName;
for (i = 0, pFS = (PFORMSRC)pPI->pPlotGPC->Forms.pData;
i < (LONG)pPI->pPlotGPC->Forms.Count;
i++, pFS++) {
//
// We will only add the non-roll paper forms
//
if (pFS->Size.cy) {
str2Wstr(wName, CCHOF(wName), pFS->Name);
//
// Firstable we will delete the same name form in the data
// base first, this will ensure we have our curent user defined
// form can be installed
//
if (DeleteFirst) {
DeleteForm(pPI->hPrinter, wName);
}
FI1.Size = pFS->Size;
FI1.ImageableArea.left = pFS->Margin.left;
FI1.ImageableArea.top = pFS->Margin.top;
FI1.ImageableArea.right = FI1.Size.cx - pFS->Margin.right;
FI1.ImageableArea.bottom = FI1.Size.cy - pFS->Margin.bottom;
PLOTDBG(DBG_FORMS, (
"AddForm: %s-[%ld x %ld] (%ld, %ld)-(%ld, %ld)",
FI1.pName, FI1.Size.cx, FI1.Size.cy,
FI1.ImageableArea.left, FI1.ImageableArea.top,
FI1.ImageableArea.right,FI1.ImageableArea.bottom));
FI1.Flags = FORM_PRINTER;
if ((!AddForm(pPI->hPrinter, 1, (LPBYTE)&FI1)) &&
(GetLastError() != ERROR_FILE_EXISTS) &&
(GetLastError() != ERROR_ALREADY_EXISTS)) {
bRet = FALSE;
PLOTERR(("AddFormsToDataBase: AddForm(%s) failed, [%ld]",
wName, GetLastError()));
}
}
}
return(TRUE);
} else {
pPI->Flags &= ~PIF_UPDATE_PERMISSION;
PLOTDBG(DBG_PERMISSION, ("AddFormsToDataBase(): NO UPDATE PERMISSION"));
return(FALSE);
}
}