mirror of https://github.com/lianthony/NT4.0
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.
208 lines
3.9 KiB
208 lines
3.9 KiB
/*++
|
|
|
|
Copyright (c) 1995 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
upgrade.c
|
|
|
|
Abstract:
|
|
|
|
Implementation of DrvUpgradePrinter entry point
|
|
|
|
Environment:
|
|
|
|
PCL-XL driver user interface
|
|
|
|
Revision History:
|
|
|
|
12/20/95 -davidx-
|
|
Created it.
|
|
|
|
mm/dd/yy -author-
|
|
description
|
|
|
|
--*/
|
|
|
|
#include "xlui.h"
|
|
|
|
|
|
// Driver upgrade information - This should be moved to winspool.h.
|
|
|
|
typedef struct {
|
|
LPWSTR pPrinterName; // Name of printer being upgraded
|
|
LPWSTR pOldDriverDirectory; // Path to old printer driver
|
|
} DRIVER_UPGRADE_INFO_1W, *PDRIVER_UPGRADE_INFO_1W;
|
|
|
|
|
|
BOOL AddDriverForms(HANDLE, PMPD);
|
|
|
|
|
|
|
|
BOOL
|
|
DrvUpgradePrinter(
|
|
DWORD dwLevel,
|
|
PDRIVER_UPGRADE_INFO_1W pUpgradeInfo
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Upgrade printer driver. This is called once for every printer
|
|
when a new driver is copied onto the system.
|
|
|
|
Arguments:
|
|
|
|
dwLevel Version number for pUpgradeInfo (currently always 1)
|
|
pUpgradeInfo Pointer to DRIVER_UPGRADE_INFO_1W structure
|
|
|
|
Return Value:
|
|
|
|
TRUE if successful. FALSE if an error occured.
|
|
|
|
Note:
|
|
|
|
We're assuming this is called when:
|
|
1. A new printer is created, or
|
|
2. A newer version driver is copied from the server
|
|
|
|
--*/
|
|
|
|
{
|
|
PRINTER_DEFAULTS PrinterDefault = {NULL, NULL, PRINTER_ALL_ACCESS};
|
|
HANDLE hPrinter = NULL;
|
|
BOOL result;
|
|
PMPD pmpd;
|
|
|
|
//
|
|
// Verify the validity of input parameters
|
|
//
|
|
|
|
Verbose(("Entering DrvUpgradePrinter...\n"));
|
|
|
|
if (dwLevel != 1 || pUpgradeInfo == NULL) {
|
|
|
|
Error(("Bad parameter passed to DrvUpgradePrinter\n"));
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
return FALSE;
|
|
}
|
|
|
|
if (!OpenPrinter(pUpgradeInfo->pPrinterName, &hPrinter, &PrinterDefault)) {
|
|
|
|
Error(("OpenPrinter failed\n"));
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// Load printer description data
|
|
//
|
|
|
|
if (! (pmpd = LoadMpdFile(hPrinter))) {
|
|
|
|
Error(("Couldn't load printer description data\n"));
|
|
ClosePrinter(hPrinter);
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// Perform the necessary upgrade work
|
|
//
|
|
|
|
result = AddDriverForms(hPrinter, pmpd);
|
|
|
|
//
|
|
// Clean up before returning to the caller
|
|
//
|
|
|
|
UnloadMpdFile(pmpd);
|
|
ClosePrinter(hPrinter);
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
AddDriverForms(
|
|
HANDLE hPrinter,
|
|
PMPD pmpd
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Add printer-specific forms to the global forms database
|
|
|
|
Arguments:
|
|
|
|
hPrinter - Identifies the printer being upgraded
|
|
pmpd - Points to printer description data
|
|
|
|
Return Value:
|
|
|
|
TRUE if successful, FALSE if there is an error
|
|
|
|
--*/
|
|
|
|
{
|
|
PFEATURE pFeature;
|
|
PPAPERSIZE pPaperSize;
|
|
WORD index;
|
|
DWORD type, value, cbNeeded;
|
|
FORM_INFO_1 formInfo;
|
|
|
|
//
|
|
// Check if we've added printer-specific forms already
|
|
//
|
|
|
|
if (GetPrinterData(hPrinter,
|
|
REGSTR_FORMSADDED,
|
|
&type,
|
|
(PBYTE) &value,
|
|
sizeof(value),
|
|
&cbNeeded) == ERROR_SUCCESS)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
Verbose(("Adding printer-specific forms\n"));
|
|
|
|
//
|
|
// Call AddForm for every printer specific form
|
|
//
|
|
|
|
formInfo.Flags = 0;
|
|
pFeature = MpdPaperSizes(pmpd);
|
|
|
|
for (index=0; index < pFeature->count; index++) {
|
|
|
|
pPaperSize = FindIndexedSelection(pFeature, index);
|
|
|
|
//
|
|
// Form name, size, and imageable area
|
|
//
|
|
|
|
formInfo.pName = GetXlatedName(pPaperSize);
|
|
formInfo.Size = pPaperSize->size;
|
|
|
|
formInfo.ImageableArea.left = formInfo.ImageableArea.top = 0;
|
|
formInfo.ImageableArea.right = formInfo.Size.cx;
|
|
formInfo.ImageableArea.bottom = formInfo.Size.cy;
|
|
|
|
AddForm(hPrinter, 1, (PBYTE) &formInfo);
|
|
}
|
|
|
|
//
|
|
// Indicate we have successfully added printer specific forms
|
|
//
|
|
|
|
value = 1;
|
|
SetPrinterData(hPrinter, REGSTR_FORMSADDED, REG_DWORD, (PBYTE) &value, sizeof(value));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|