Windows NT 4.0 source code leak
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

/*++
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;
}