345 lines
8.2 KiB
C
345 lines
8.2 KiB
C
/*++
|
||
|
||
Copyright (c) 1996 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
faxdm.c
|
||
|
||
Abstract:
|
||
|
||
Functions for dealing with devmodes
|
||
|
||
Environment:
|
||
|
||
Fax driver, user and kernel mode
|
||
|
||
Revision History:
|
||
|
||
01/09/96 -davidx-
|
||
Created it.
|
||
|
||
mm/dd/yy -author-
|
||
description
|
||
|
||
--*/
|
||
|
||
#include "faxlib.h"
|
||
|
||
|
||
|
||
VOID
|
||
DriverDefaultDevmode(
|
||
PDRVDEVMODE pdm,
|
||
LPTSTR pDeviceName,
|
||
HANDLE hPrinter
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Return the driver's default devmode
|
||
|
||
Arguments:
|
||
|
||
pdm - Specifies a buffer for storing driver default devmode
|
||
pDeviceName - Points to device name string
|
||
hPrinter - Handle to the printer object
|
||
|
||
Return Value:
|
||
|
||
NONE
|
||
|
||
--*/
|
||
|
||
{
|
||
#ifndef KERNEL_MODE
|
||
PDMPRIVATE dmPrivate;
|
||
PDRVDEVMODE dmSource;
|
||
#endif
|
||
|
||
|
||
//
|
||
// Default value for public devmode fields
|
||
//
|
||
|
||
memset(pdm, 0, sizeof(DRVDEVMODE));
|
||
|
||
if (pDeviceName == NULL)
|
||
pDeviceName = DRIVER_NAME;
|
||
|
||
CopyString(pdm->dmPublic.dmDeviceName, pDeviceName, CCHDEVICENAME);
|
||
|
||
pdm->dmPublic.dmDriverVersion = DRIVER_VERSION;
|
||
pdm->dmPublic.dmSpecVersion = DM_SPECVERSION;
|
||
pdm->dmPublic.dmSize = sizeof(DEVMODE);
|
||
pdm->dmPublic.dmDriverExtra = sizeof(DMPRIVATE);
|
||
|
||
pdm->dmPublic.dmFields = DM_ORIENTATION |
|
||
DM_PAPERSIZE |
|
||
DM_FORMNAME |
|
||
DM_COPIES |
|
||
DM_PRINTQUALITY |
|
||
DM_YRESOLUTION |
|
||
DM_DEFAULTSOURCE;
|
||
|
||
pdm->dmPublic.dmOrientation = DMORIENT_PORTRAIT;
|
||
pdm->dmPublic.dmCopies = 1;
|
||
pdm->dmPublic.dmScale = 100;
|
||
pdm->dmPublic.dmPrintQuality = FAXRES_HORIZONTAL;
|
||
pdm->dmPublic.dmYResolution = FAXRES_VERTICAL;
|
||
pdm->dmPublic.dmDuplex = DMDUP_SIMPLEX;
|
||
pdm->dmPublic.dmCollate = DMCOLLATE_FALSE;
|
||
pdm->dmPublic.dmTTOption = DMTT_BITMAP;
|
||
pdm->dmPublic.dmColor = DMCOLOR_MONOCHROME;
|
||
pdm->dmPublic.dmDefaultSource = DMBIN_ONLYONE;
|
||
|
||
if (hPrinter && GetPrinterDataDWord(hPrinter, PRNDATA_ISMETRIC, 0)) {
|
||
|
||
pdm->dmPublic.dmPaperSize = DMPAPER_A4;
|
||
CopyString(pdm->dmPublic.dmFormName, FORMNAME_A4, CCHFORMNAME);
|
||
|
||
} else {
|
||
|
||
pdm->dmPublic.dmPaperSize = DMPAPER_LETTER;
|
||
CopyString(pdm->dmPublic.dmFormName, FORMNAME_LETTER, CCHFORMNAME);
|
||
}
|
||
|
||
//
|
||
// Private devmode fields
|
||
//
|
||
#ifdef KERNEL_MODE
|
||
pdm->dmPrivate.signature = DRIVER_SIGNATURE;
|
||
pdm->dmPrivate.flags = 0;
|
||
pdm->dmPrivate.sendCoverPage = TRUE;
|
||
pdm->dmPrivate.whenToSend = SENDFAX_ASAP;
|
||
#else
|
||
dmSource = (PDRVDEVMODE) GetPerUserDevmode(NULL);
|
||
if (!dmSource) {
|
||
//
|
||
// default values
|
||
//
|
||
pdm->dmPrivate.signature = DRIVER_SIGNATURE;
|
||
pdm->dmPrivate.flags = 0;
|
||
pdm->dmPrivate.sendCoverPage = TRUE;
|
||
pdm->dmPrivate.whenToSend = SENDFAX_ASAP;
|
||
} else {
|
||
dmPrivate = &dmSource->dmPrivate;
|
||
pdm->dmPrivate.signature = dmPrivate->signature;//DRIVER_SIGNATURE;
|
||
pdm->dmPrivate.flags = dmPrivate->flags;// 0;
|
||
pdm->dmPrivate.sendCoverPage = dmPrivate->sendCoverPage; //TRUE;
|
||
pdm->dmPrivate.whenToSend = dmPrivate->whenToSend;//SENDFAX_ASAP;
|
||
pdm->dmPrivate.sendAtTime = dmPrivate->sendAtTime;
|
||
CopyString(pdm->dmPrivate.billingCode,dmPrivate->billingCode,MAX_BILLING_CODE);
|
||
CopyString(pdm->dmPrivate.emailAddress,dmPrivate->emailAddress,MAX_EMAIL_ADDRESS);
|
||
MemFree(dmSource);
|
||
}
|
||
|
||
#endif
|
||
}
|
||
|
||
|
||
|
||
BOOL
|
||
MergeDevmode(
|
||
PDRVDEVMODE pdmDest,
|
||
PDEVMODE pdmSrc,
|
||
BOOL publicOnly
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Merge the source devmode into the destination devmode
|
||
|
||
Arguments:
|
||
|
||
pdmDest - Specifies the destination devmode
|
||
pdmSrc - Specifies the source devmode
|
||
publicOnly - Only merge public portion of the devmode
|
||
|
||
Return Value:
|
||
|
||
TRUE if successful, FALSE if the source devmode is invalid
|
||
|
||
[Note:]
|
||
|
||
pdmDest must point to a valid current-version devmode
|
||
|
||
--*/
|
||
|
||
#define BadDevmode(reason) { Error(("Invalid DEVMODE: %s\n", reason)); valid = FALSE; }
|
||
|
||
{
|
||
PDEVMODE pdmIn, pdmOut, pdmAlloced = NULL;
|
||
PDMPRIVATE pdmPrivate;
|
||
BOOL valid = TRUE;
|
||
|
||
//
|
||
// If there is no source devmode, levae destination devmode untouched
|
||
//
|
||
|
||
if ((pdmIn = pdmSrc) == NULL)
|
||
return TRUE;
|
||
|
||
//
|
||
// Convert source devmode to current version if necessary
|
||
//
|
||
|
||
if (! CurrentVersionDevmode(pdmIn)) {
|
||
|
||
Warning(("Converting non-current version DEVMODE ...\n"));
|
||
|
||
if (! (pdmIn = pdmAlloced = MemAlloc(sizeof(DRVDEVMODE)))) {
|
||
|
||
Error(("Memory allocation failed\n"));
|
||
return FALSE;
|
||
}
|
||
|
||
Assert(pdmDest->dmPublic.dmSize == sizeof(DEVMODE) &&
|
||
pdmDest->dmPublic.dmDriverExtra == sizeof(DMPRIVATE));
|
||
|
||
memcpy(pdmIn, pdmDest, sizeof(DRVDEVMODE));
|
||
|
||
if (ConvertDevmode(pdmSrc, pdmIn) <= 0) {
|
||
|
||
Error(("ConvertDevmode failed\n"));
|
||
MemFree(pdmAlloced);
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
//
|
||
// If the input devmode is the same as the driver default,
|
||
// there is no need to merge it.
|
||
//
|
||
|
||
pdmPrivate = &((PDRVDEVMODE) pdmIn)->dmPrivate;
|
||
|
||
if (pdmPrivate->signature == DRIVER_SIGNATURE &&
|
||
(pdmPrivate->flags & FAXDM_DRIVER_DEFAULT))
|
||
{
|
||
Verbose(("Merging driver default devmode.\n"));
|
||
}
|
||
else
|
||
{
|
||
|
||
//
|
||
// Merge source devmode into destination devmode
|
||
//
|
||
|
||
pdmOut = &pdmDest->dmPublic;
|
||
|
||
//
|
||
// Device name: Always the same as printer name
|
||
//
|
||
|
||
// CopyString(pdmOut->dmDeviceName, pdmIn->dmDeviceName, CCHDEVICENAME);
|
||
|
||
//
|
||
// Orientation
|
||
//
|
||
|
||
if (pdmIn->dmFields & DM_ORIENTATION) {
|
||
|
||
if (pdmIn->dmOrientation == DMORIENT_PORTRAIT ||
|
||
pdmIn->dmOrientation == DMORIENT_LANDSCAPE)
|
||
{
|
||
pdmOut->dmFields |= DM_ORIENTATION;
|
||
pdmOut->dmOrientation = pdmIn->dmOrientation;
|
||
|
||
} else
|
||
BadDevmode("orientation");
|
||
}
|
||
|
||
//
|
||
// Form selection
|
||
//
|
||
|
||
if (pdmIn->dmFields & DM_PAPERSIZE) {
|
||
|
||
if (pdmIn->dmPaperSize >= DMPAPER_FIRST) {
|
||
|
||
pdmOut->dmFields |= DM_PAPERSIZE;
|
||
pdmOut->dmFields &= ~DM_FORMNAME;
|
||
pdmOut->dmPaperSize = pdmIn->dmPaperSize;
|
||
CopyString(pdmOut->dmFormName, pdmIn->dmFormName, CCHFORMNAME);
|
||
|
||
} else
|
||
BadDevmode("paper size");
|
||
|
||
} else if (pdmIn->dmFields & DM_FORMNAME) {
|
||
|
||
pdmOut->dmFields |= DM_FORMNAME;
|
||
pdmOut->dmFields &= ~DM_PAPERSIZE;
|
||
CopyString(pdmOut->dmFormName, pdmIn->dmFormName, CCHFORMNAME);
|
||
}
|
||
|
||
//
|
||
// Copies
|
||
//
|
||
|
||
if (pdmIn->dmFields & DM_COPIES) {
|
||
|
||
if (pdmIn->dmCopies > 0)
|
||
pdmOut->dmCopies = pdmIn->dmCopies;
|
||
else
|
||
BadDevmode("copy count");
|
||
}
|
||
|
||
//
|
||
// Paper source
|
||
//
|
||
|
||
if (pdmIn->dmFields & DM_DEFAULTSOURCE) {
|
||
|
||
if (pdmIn->dmDefaultSource == DMBIN_ONLYONE) {
|
||
|
||
pdmOut->dmFields |= DM_DEFAULTSOURCE;
|
||
pdmOut->dmDefaultSource = pdmIn->dmDefaultSource;
|
||
|
||
} else
|
||
BadDevmode("paper source");
|
||
}
|
||
|
||
//
|
||
// Print quality
|
||
//
|
||
|
||
if ((pdmIn->dmFields & DM_PRINTQUALITY) &&
|
||
(pdmIn->dmPrintQuality != FAXRES_HORIZONTAL))
|
||
{
|
||
BadDevmode("print quality");
|
||
}
|
||
|
||
if (pdmIn->dmFields & DM_YRESOLUTION)
|
||
{
|
||
if (pdmIn->dmYResolution <= FAXRES_VERTDRAFT)
|
||
pdmOut->dmYResolution = FAXRES_VERTDRAFT;
|
||
else
|
||
pdmOut->dmYResolution = FAXRES_VERTICAL;
|
||
}
|
||
|
||
//
|
||
// Private devmode fields
|
||
//
|
||
|
||
Assert(pdmDest->dmPrivate.signature == DRIVER_SIGNATURE);
|
||
|
||
if (pdmPrivate->signature == DRIVER_SIGNATURE) {
|
||
|
||
if (! publicOnly)
|
||
memcpy(&pdmDest->dmPrivate, pdmPrivate, sizeof(DMPRIVATE));
|
||
|
||
} else
|
||
BadDevmode("bad signature");
|
||
}
|
||
|
||
pdmDest->dmPrivate.flags &= ~FAXDM_DRIVER_DEFAULT;
|
||
MemFree(pdmAlloced);
|
||
return valid;
|
||
}
|
||
|