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