/*++ Copyright (c) 1996-1999 Microsoft Corporation Module Name: parser.h Abstract: Common header file for both PPD and GPD parsers Revision History: 12/03/96 -davidx- Check binary file date against all included source files. 10/14/96 -davidx- Add new interface function MapToDeviceOptIndex. 10/11/96 -davidx- Make CustomPageSize feature an option of PageSize. 09/25/96 -davidx- New helper function CheckFeatureOptionConflict. Overlow iMode parameter to ResolveUIConflicts. 08/30/96 -davidx- Coding style changes after code review. 8/15/96 -davidx- Define common parser interfaces. 7/22/96 -amandan- Modified it to include shared binary data structs and UI requirements 4/18/95 -davidx- Created it. --*/ #ifndef _PARSER_H_ #define _PARSER_H_ // // Parser version number is a DWORD. High-order WORD is the version number shared // by PPD and GPD parsers. Low-order WORD is the private version number specific // to PPD or GPD parser. // // When you make a change that affects both parsers, increment the shared parser // version number below. If your change only affects one of the parsers, then // increment the private parser version number in ppd.h or parsers\gpd\gpdparse.h. // also increment the shared version whenever a new OS version is released // for example Whistler or Blackcomb. // #define SHARED_PARSER_VERSION 0x0010 // // Printer feature selection information is stored in an array of OPTSELECT structures // (in DEVMODE as well as printer-sticky data in registry). Maximum number of entries // in the array is limited to MAX_PRINTER_OPTIONS. The parsers should make sure the // total number of printer features doesn't exceed this number. // // To accommodate PickMany printer features, the selected options for each feature form // a linked list. The selection list for printer feature N starts at the N'th element // of the array. // // For the last OPTSELECT structure in a list, ubNext field will be 0. // // If the option index in an OPTSELECT structure is 0xff, it means no option is // selected for the corresponding feature. // #define MAX_PRINTER_OPTIONS 256 #define MAX_COMBINED_OPTIONS (MAX_PRINTER_OPTIONS * 2) #define OPTION_INDEX_ANY 0xff #define GET_RESOURCE_FROM_DLL 0x80000000 #define USE_SYSTEM_NAME 0xFFFFFFFF #define KEYWORD_SIZE_EXTRA 32 #define RESERVED_STRINGID_START 10000 #define RESERVED_STRINGID_END 20000 typedef DWORD LISTINDEX; typedef enum _QUALITYSETTING { QS_BEST, QS_BETTER, QS_DRAFT, } QUALITYSETTING; typedef struct _OPTSELECT { BYTE ubCurOptIndex; // option index for the current selection BYTE ubNext; // link pointer to the next selection } OPTSELECT, *POPTSELECT; #define NULL_OPTSELECT 0 // // Macro for converting byte offsets to pointers. // NOTE: If the byte offset is zero, the resulting pointer is NULL. // #define OFFSET_TO_POINTER(pStart, offset) \ ((PVOID) ((offset) ? (PBYTE) (pStart) + (offset) : NULL)) #define POINTER_TO_OFFSET(pStart, pEnd) \ ( ((pEnd) ? (PVOID)((PBYTE) (pEnd) - (PBYTE)(pStart)) : NULL) ) // // Macro for getting the quality value, be it the resolution or the negative // quality value // #define GETQUALITY_X(pRes) \ (((INT)pRes->dwResolutionID >= DMRES_HIGH && (INT)pRes->dwResolutionID <= DMRES_DRAFT) ? (INT)pRes->dwResolutionID : pRes->iXdpi) #define GETQUALITY_Y(pRes) \ (((INT)pRes->dwResolutionID >= DMRES_HIGH && (INT)pRes->dwResolutionID <= DMRES_DRAFT) ? (INT)pRes->dwResolutionID : pRes->iYdpi) // // Pointers in the binary data are represented as byte offsets to the beginning // of the binary data. // typedef DWORD PTRREF; // // Resource reference type: // If the most significant bit is on, then it's a resource ID (without MSB) // otherwise, it's an offset from the beginning of the binary data // typedef DWORD RESREF; // // Data structure used to represent the format of loOffset when indicating resource Ids // typedef struct { WORD wResourceID ; // ResourceID BYTE bFeatureID ; // Feature index for the resource DLL feature. // If zero, we will use the name specified // in ResourceDLL BYTE bOptionID ; // Option index for the qualified resource dll name. } QUALNAMEEX, * PQUALNAMEEX ; // // Data structure used to represent an array in the binary data // It's also used to represent an invocation string in the binary data // // Note (Unidrv only): for all arrayrefs containing Strings the dwCount field // holds the number of bytes which the string contains. For Unicode strings // this is TWICE the number of Unicode characters. // typedef struct _ARRAYREF { DWORD dwCount; // number of elements in the array, // If using it as an INVOCATION, dwCount is // the number of bytes in the invocation string PTRREF loOffset; // byte-offset to the beginning of the array } ARRAYREF, *PARRAYREF, INVOCATION, *PINVOCATION; // // Data structure used to represent a job patch file in the binary data // typedef struct _JOBPATCHFILE { DWORD dwCount; // number of bytes in the patch string PTRREF loOffset; // byte-offset to the beginning of the string LONG lJobPatchNo; // number of the patch file as specified in the PPD-file } JOBPATCHFILE, *PJOBPATCHFILE; // // Data structure used to represent a conflict feature/option pair: // nFeatureIndex1/nOptionIndex1 specifies the higher priority feature/option pair // nFeatureIndex2/nOptionIndex2 specifies the lower priority feature/option pair // typedef struct _CONFLICTPAIR { DWORD dwFeatureIndex1; DWORD dwOptionIndex1; DWORD dwFeatureIndex2; DWORD dwOptionIndex2; } CONFLICTPAIR, *PCONFLICTPAIR; // // Raw binary printer description data // typedef struct _RAWBINARYDATA { DWORD dwFileSize; // size of binary data file DWORD dwParserSignature; // parser signature DWORD dwParserVersion; // parser version number DWORD dwChecksum32; // 32-bit CRC checksum of Feature/Option keywords DWORD dwSrcFileChecksum32; // 32-bit CRC checksum of printer description file DWORD dwDocumentFeatures; // number of doc-sticky features DWORD dwPrinterFeatures; // number of printer-sticky features ARRAYREF FileDateInfo; // date info about printer description files // // These fields are only filled out and used during runtime. // They should be zeroed out inside the binary data file. // PVOID pvReserved; // reserved, must be NULL for now PVOID pvPrivateData; // private data for parser use } RAWBINARYDATA, *PRAWBINARYDATA; // // Data structure for RAWBINARYDATA.FileDateInfo: // dwCount - number of source printer description files // loOffset - offset to an array of FILEDATEINFO structures, one per file // FILEDATEINFO.loFileName - offset to the filename (Unicode full pathname) // FILEDATEINFO.FileTime - timestamp on the file // typedef struct _FILEDATEINFO { PTRREF loFileName; FILETIME FileTime; } FILEDATEINFO, *PFILEDATEINFO; // // Instances of binary printer description data // typedef struct _INFOHEADER { RAWBINARYDATA RawData; // raw binary data header PTRREF loUIInfoOffset; // byte-offset to common UIINFO structure PTRREF loDriverOffset; // byte-offset to unique driver infoformation } INFOHEADER, *PINFOHEADER; // // Parser signatures for INFOHEADER.dwParserSignature field // #define PPD_PARSER_SIGNATURE 'PPD ' #define GPD_PARSER_SIGNATURE 'GPD ' // // Given a pointer to INFOHEADER, return a pointer to UIINFO or driver info structure // #define GET_UIINFO_FROM_INFOHEADER(pInfoHdr) \ ((PUIINFO) OFFSET_TO_POINTER(pInfoHdr, (pInfoHdr)->loUIInfoOffset)) #define GET_DRIVER_INFO_FROM_INFOHEADER(pInfoHdr) \ OFFSET_TO_POINTER(pInfoHdr, (pInfoHdr)->loDriverOffset) // // IDs used to reference the predefined printer features // #define GID_RESOLUTION 0 #define GID_PAGESIZE 1 #define GID_PAGEREGION 2 #define GID_DUPLEX 3 #define GID_INPUTSLOT 4 #define GID_MEDIATYPE 5 #define GID_MEMOPTION 6 #define GID_COLORMODE 7 #define GID_ORIENTATION 8 #define GID_PAGEPROTECTION 9 #define GID_COLLATE 10 #define GID_OUTPUTBIN 11 #define GID_HALFTONING 12 #define GID_LEADINGEDGE 13 #define GID_USEHWMARGINS 14 #define MAX_GID 15 #define GID_UNKNOWN 0xffff // // Common information provided by both GPD and PPD parsers and // used by the user-interface DLL. // typedef struct _UIINFO { DWORD dwSize; // size of this structure PTRREF loResourceName; // name of the resource DLL PTRREF loPersonality ; // printer's PDL language PTRREF loNickName; // printer model name DWORD dwSpecVersion; // printer description file format version DWORD dwTechnology; // see TECHNOLOGY enumeration DWORD dwDocumentFeatures; // number of doc-sticky features DWORD dwPrinterFeatures; // number of printer-sticky features PTRREF loFeatureList; // byte-offset to array of FEATUREs RESREF loFontSubstTable; // default font substitution table - these fields DWORD dwFontSubCount; // have different meanings for PPD and GPD parsers ARRAYREF UIConstraints; // array of UICONSTRAINTs ARRAYREF UIGroups; // array of UIGROUPs DWORD dwMaxCopies; // maximum copies allowed DWORD dwMinScale; // mimimum scale factor (percent) DWORD dwMaxScale; // maximum scale factor (percent) DWORD dwLangEncoding; // translation string language encoding DWORD dwLangLevel; // page description langauge level INVOCATION Password; // password invocation string INVOCATION ExitServer; // exitserver invocation string DWORD dwProtocols; // supported comm protocols DWORD dwJobTimeout; // default job timeout value DWORD dwWaitTimeout; // default wait timeout value DWORD dwTTRasterizer; // TrueType rasterizer option DWORD dwFreeMem; // free memory - global default DWORD dwPrintRate; // print speed DWORD dwPrintRateUnit; // print speed unit DWORD dwPrintRatePPM; // print speed in PPM equivalents FIX_24_8 fxScreenAngle; // screen angle - global default FIX_24_8 fxScreenFreq; // screen angle - global default DWORD dwFlags; // misc. flag bits DWORD dwCustomSizeOptIndex; // custom size option index if supported RESREF loPrinterIcon; // MUST BE ID, not OFFSET. Icon ID for printer // MUST BE LESS than IDI_CPSUI_ICONID_FIRST DWORD dwCartridgeSlotCount; // number of font cartridge slot ARRAYREF CartridgeSlot; // array of font cartridges names PTRREF loFontInstallerName; // PTRREF loHelpFileName; // name of custom help file, if 0 -> no custom help POINT ptMasterUnits; // master units per inch BOOL bChangeColorModeOnDoc ; // is driver allowed to switch colormodes on a per page // basis - within a single document , but not within a page? // Don't confuse with bChangeColorModeOnPage which is stored // in bChangeColorMode in GLOBALS. // these fields hold settings for driver to assume whenever // the user presses the associated button. LISTINDEX liDraftQualitySettings; // "DraftQualitySettings" LISTINDEX liBetterQualitySettings; // "BetterQualitySettings" LISTINDEX liBestQualitySettings; // "BestQualitySettings" QUALITYSETTING defaultQuality ; // "DefaultQuality" // // Byte-offsets to predefined printer features. // If a predefined printer feature is not supported, its // corresponding entry in the array should be 0. // PTRREF aloPredefinedFeatures[MAX_GID]; DWORD dwMaxDocKeywordSize; DWORD dwMaxPrnKeywordSize; DWORD dwReserved[6]; // // Pointer to the beginning of resource data. This is only used during runtime // and should be set to 0 inside the binary data file. // PBYTE pubResourceData; // // Pointer back to the INFOHEADER structure for convenience. // This is only used during runtime and should be set to 0 // inside the binary data file. // PINFOHEADER pInfoHeader; } UIINFO, *PUIINFO; // // Given a pointer to a UIINFO structure and a predefined feature ID, // return a pointer to the FEATURE structure corresponding to the specified // feature. If the specified feature is not supported on the printer, // a NULL is returned. // #define GET_PREDEFINED_FEATURE(pUIInfo, gid) \ OFFSET_TO_POINTER((pUIInfo)->pInfoHeader, (pUIInfo)->aloPredefinedFeatures[gid]) // // Given a pointer to UIINFO structure and a pointer to a FEATURE, // return the feature index of the specified feature. // #define GET_INDEX_FROM_FEATURE(pUIInfo, pFeature) \ ((DWORD)((((PBYTE) (pFeature) - (PBYTE) (pUIInfo)->pInfoHeader) - \ (pUIInfo)->loFeatureList) \ / sizeof(FEATURE))) // // Bit constants for UIINFO.dwFlags field // #define FLAG_RULESABLE 0x00000001 #define FLAG_FONT_DOWNLOADABLE 0x00000002 #define FLAG_ROTATE90 0x00000004 #define FLAG_COLOR_DEVICE 0x00000008 #define FLAG_ORIENT_SUPPORT 0x00000010 #define FLAG_CUSTOMSIZE_SUPPORT 0x00000020 #define FLAG_FONT_DEVICE 0x00000040 #define FLAG_STAPLE_SUPPORT 0x00000080 #define FLAG_REVERSE_PRINT 0x00000100 #define FLAG_LETTER_SIZE_EXISTS 0x00000200 #define FLAG_A4_SIZE_EXISTS 0x00000400 #define FLAG_ADD_EURO 0x00000800 #define FLAG_TRUE_GRAY 0x00001000 #define FLAG_REVERSE_BAND_ORDER 0x00002000 // // Macros for checking various flags bit in UIINFO.dwFlags // #define IS_COLOR_DEVICE(pUIInfo) ((pUIInfo)->dwFlags & FLAG_COLOR_DEVICE) #define SUPPORT_CUSTOMSIZE(pUIInfo) ((pUIInfo)->dwFlags & FLAG_CUSTOMSIZE_SUPPORT) // // Conversion from master units to microns: // N = master units to be converted // u = number of master units per inch // #define MICRONS_PER_INCH 25400 #define MASTER_UNIT_TO_MICRON(N, u) MulDiv(N, MICRONS_PER_INCH, u) // // Bit constants for UIINFO.dwProtocols field // #define PROTOCOL_ASCII 0x0000 #define PROTOCOL_PJL 0x0001 #define PROTOCOL_BCP 0x0002 #define PROTOCOL_TBCP 0x0004 #define PROTOCOL_SIC 0x0008 #define PROTOCOL_BINARY 0x0010 // // Constants for UIINFO.dwTTRasterizer field // #define TTRAS_NONE 0 #define TTRAS_ACCEPT68K 1 #define TTRAS_TYPE42 2 #define TTRAS_TRUEIMAGE 3 // // Constants for UIINFO.dwLangEncoding field // #define LANGENC_NONE 0 #define LANGENC_ISOLATIN1 1 #define LANGENC_UNICODE 2 #define LANGENC_JIS83_RKSJ 3 // // Data structure used to represent a constrained feature/option // For each feature and option, there is a linked-list of feature/options // that are constrained by this feature or option. // typedef struct _UICONSTRAINT { DWORD dwNextConstraint; // link pointer to the next constraint DWORD dwFeatureIndex; // index of the constrained feature DWORD dwOptionIndex; // index of the constrained option or OPTION_INDEX_ANY } UICONSTRAINT , *PUICONSTRAINT; // // Link pointer constant to indicate the end of the constraint list // #define NULL_CONSTRAINT 0xffffffff // // Data structure used to represent invalid feature/option combinations // the prefix tag shall be 'invc' // Note: both dwNextElement and dwNewCombo are terminated by END_OF_LIST. // typedef struct { DWORD dwFeature ; // the INVALIDCOMBO construct defines DWORD dwOption ; // a set of elements subject to the constraint DWORD dwNextElement ; // that all elements of the set cannot be DWORD dwNewCombo ; // selected at the same time. } INVALIDCOMBO , * PINVALIDCOMBO ; // // Data structure used to combine printer features into groups and subgroups // typedef struct _UIGROUP { PTRREF loKeywordName; // group keyword name RESREF loDisplayName; // display name DWORD dwFlags; // flag bits DWORD dwNextGroup; // index of the next group DWORD dwFirstSubGroup; // index of the first subgroup DWORD dwParentGroup; // index of the parent group DWORD dwFirstFeatureIndex; // index of the first feature belonging to the group DWORD dwFeatures; // number of features belonging to the group } UIGROUP, *PUIGROUP; // // Data structure used to present a printer feature // typedef struct _FEATURE { PTRREF loKeywordName; // feature keyword name RESREF loDisplayName; // display name DWORD dwFlags; // flag bits DWORD dwDefaultOptIndex; // default option index DWORD dwNoneFalseOptIndex; // None or False option index DWORD dwFeatureID; // predefined feature ID DWORD dwUIType; // UI type DWORD dwUIConstraintList; // index to the list of UIConstraints DWORD dwPriority; // priority used during conflict resolution DWORD dwFeatureType; // Type of feature, see FEATURETYPE defines DWORD dwOptionSize; // size of each option structure ARRAYREF Options; // array of option structures INVOCATION QueryInvocation; // query invocation string DWORD dwFirstOrderIndex; // Bidi DWORD dwEnumID; // Bidi DWORD dwEnumFormat; // Bidi DWORD dwCurrentID; // Bidi DWORD dwCurrentFormat; // Bidi RESREF loResourceIcon; // RESREF loHelpString; // RESREF loPromptMessage; // INT iHelpIndex; // Help Index for this feature, 0 for none // BOOL bConcealFromUI ; // don't display this feature in the UI. } FEATURE, *PFEATURE; // // Constants for FEATURE.uiType field - types of feature option list // #define UITYPE_PICKONE 0 #define UITYPE_PICKMANY 1 #define UITYPE_BOOLEAN 2 // // Defines for FEATURE.dwFeatureType // #define FEATURETYPE_DOCPROPERTY 0 #define FEATURETYPE_JOBPROPERTY 1 #define FEATURETYPE_PRINTERPROPERTY 2 // // Bit constants for FEATURE.dwFlags field // #define FEATURE_FLAG_NOUI 0x0001 // don't display in the UI #define FEATURE_FLAG_NOINVOCATION 0x0002 // don't emit invocation string #define FEATURE_FLAG_UPDATESNAPSHOT 0x0004 // Update the snapshot // whenever an option change has occurred for this feature. // // Constant to indicate that the help index is not available // #define HELP_INDEX_NONE 0 // // Data structure used to represent a printer feature option // typedef struct _OPTION { PTRREF loKeywordName; // option keyword name RESREF loDisplayName; // display name union { INVOCATION Invocation; // invocation string DWORD dwCmdIndex ; // for Unidrv the index into the CommandArray. } ; DWORD dwUIConstraintList; // index to the list of UIConstraints RESREF loResourceIcon; // RESREF loHelpString; // RESREF loPromptMessage; // DWORD dwPromptTime; PTRREF loRenderOffset; // INT iHelpIndex; // Help Index for this option, 0 for none LISTINDEX liDisabledFeatures; // *DisabledFeatures } OPTION, *POPTION; // // Data structures used to represent PageProtect feature option // typedef struct _PAGEPROTECT { OPTION GenericOption; DWORD dwPageProtectID; // id values are defined in gpd.h (PAGEPRO) } PAGEPROTECT, *PPAGEPROTECT; // // Data structures used to represent Collation feature option // typedef struct _COLLATE { OPTION GenericOption; // generic option information DWORD dwCollateID; // DEVMODE.dmMediaType index } COLLATE, *PCOLLATE; // // Data structure used to represent Resolution feature options // typedef struct _RESOLUTION { OPTION GenericOption; // generic option information INT iXdpi; // horizontal resolution in dpi INT iYdpi; // vertical resolution FIX_24_8 fxScreenAngle; // default screen angle and frequency FIX_24_8 fxScreenFreq; // for this particular resolution DWORD dwResolutionID; // DEVMODE.dmPrintQuality index // set to RES_ID_IGNORE if not explicitly set in GPD. // only values between DMRES_DRAFT and DMRES_HIGH are valid. } RESOLUTION , *PRESOLUTION; #define RES_ID_IGNORE (DWORD)(-5L) // // Data structure used to represent ColorMode feature options // Note: Extra fields in COLORMODE structure has been moved to // a GPD parser private data structure. We should probably // remove this definition here. // typedef struct _COLORMODE { OPTION GenericOption; // generic option information } COLORMODE, *PCOLORMODE; // // Data structure used to represent Halftoning feature options // typedef struct _HALFTONING { OPTION GenericOption; // generic option information DWORD dwHTID; // Halftone pattern ID DWORD dwRCpatternID ; // resource ID of custom halftone pattern POINT HalftonePatternSize; // Halftone pattern size INT iLuminance; // Luminance DWORD dwHTNumPatterns; // number of patterns (if different // patterns are used for each color plane DWORD dwHTCallbackID; // ID of pattern generation/decryption // function } HALFTONING, *PHALFTONING; // // Data structure used to represent Duplex feature options // typedef struct _DUPLEX { OPTION GenericOption; // generic option information DWORD dwDuplexID; // DEVMODE.dmDuplex index } DUPLEX, *PDUPLEX; // // Data structure used to represent Orientation feature options (GPD only) // typedef struct _ORIENTATION { OPTION GenericOption; DWORD dwRotationAngle; // Should be one of the following // enumeration: // ROTATE_NONE, ROTATE_90, ROTATE_270 } ORIENTATION, *PORIENTATION; enum { ROTATE_NONE = 0, ROTATE_90 = 90, ROTATE_270 = 270, }; // // Data structure used to represent PageSize feature options // typedef struct _PAGESIZE { OPTION GenericOption; // generic option information SIZE szPaperSize; // paper dimension RECT rcImgArea; // imageable area for the page size DWORD dwPaperSizeID; // DEVMODE.dmPaperSize index DWORD dwFlags; // flag bits DWORD dwPageProtectionMemory; // Page protection memory in bytes // for this paper size } PAGESIZE, *PPAGESIZE; // // Driver defined paper sizes have IDs starting at DRIVER_PAPERSIZE_ID // #define DRIVER_PAPERSIZE_ID 0x7f00 #define DMPAPER_CUSTOMSIZE 0x7fff // // Data structure used to represent InputSlot feature options // typedef struct _INPUTSLOT { OPTION GenericOption; // generic option information DWORD dwFlags; // flag bits DWORD dwPaperSourceID; // DEVMODE.dmDefaultSource index } INPUTSLOT, *PINPUTSLOT; #define INPUTSLOT_REQ_PAGERGN 0x0001 // requires PageRegion // // Data structure used to represent OutputBin feature options // typedef struct _OUTPUTBIN { OPTION GenericOption; // generic option information BOOL bOutputOrderReversed ; // when the document is finished printing do the // pages need to be sorted to order them first to last? } OUTPUTBIN, *POUTPUTBIN; // // Data structure used to represent MediaType feature options // typedef struct _MEDIATYPE { OPTION GenericOption; // generic option information DWORD dwMediaTypeID; // DEVMODE.dmMediaType index } MEDIATYPE, *PMEDIATYPE; // // Data structure used to represent InstalledMemory/VMOption options // // PS specific: dwInstalledMem field was never used by PPD parser/PS driver before, // since we don't care about the amount of installed memory, we only need to know // dwFreeMem and dwFreeFontMem. Now we are adding the support of new plugin helper // interface, whose function GetOptionAttribute() should return the original *VMOption // value specified in PPD. Because PPD parser may not store the original *VMOption // value into dwFreeMem (see function VPackPrinterFeatures(), case GID_MEMOPTION), // we now use field dwInstalledMem to store PPD's original *VMOption value. // (We don't add a new field since this strucutre is shared by GPD parser, and we // want to minimize the change.) // typedef struct _MEMOPTION { OPTION GenericOption; // generic option information DWORD dwInstalledMem; // amount of total installed memory DWORD dwFreeMem; // amount of usable memory DWORD dwFreeFontMem; // size of font cache memory } MEMOPTION, *PMEMOPTION; // // FONTCARTS // This structures contains the Font Cartridge information. This structure is // a same as that defined by the parser. The Parser will update the Portarit // and Landscape Font list so that they include common fonts. So each list // will be complete. Only applicable for GPD parser // typedef struct _FONTCART { DWORD dwRCCartNameID ; ARRAYREF strCartName ; DWORD dwFontLst ; // Index to list of Common FontIDs DWORD dwPortFontLst ; // List of Portrait Fons DWORD dwLandFontLst ; // List of Landscape Fonts. } FONTCART , * PFONTCART ; // the prefix tag shall be 'fc' // // struct to carry around parser information // typedef struct _PARSERINFO { PRAWBINARYDATA pRawData; PINFOHEADER pInfoHeader; } PARSERINFO, * PPARSERINFO; // // Filename suffix and magic header to differentiate between PPD and GPD files // #define PPD_FILENAME_EXT TEXT(".PPD") #define GPD_FILENAME_EXT TEXT(".GPD") // // Given a UIINFO structure and a feature index, return a pointer to // the FEATURE structure corresponding to the specified feature. // PFEATURE PGetIndexedFeature( PUIINFO pUIInfo, DWORD dwFeatureIndex ); // // Find the option whose keyword string matches the specified name // POPTION PGetNamedOption( PUIINFO pUIInfo, PFEATURE pFeature, PCSTR pstrOptionName, PDWORD pdwOptionIndex ); // // Find the feature whose keyword string matches the specified name // PFEATURE PGetNamedFeature( PUIINFO pUIInfo, PCSTR pstrFeatureName, PDWORD pdwFeatureIndex ); // // Given UIINFO and FEATURE structures and an option index, return a pointer to // the OPTION structure corresponding to the specified feature option // PVOID PGetIndexedOption( PUIINFO pUIInfo, PFEATURE pFeature, DWORD dwOptionIndex ); // // Given a UIINFO structure, a feature index, and an option index, // return a pointer to the OPTION structure corresponding to // the specified feature option // PVOID PGetIndexedFeatureOption( PUIINFO pUIInfo, DWORD dwFeatureIndex, DWORD dwOptionIndex ); // // Return a pointer to the PAGESIZE option structure which // contains custom page size information (e.g. max width and height) // PPAGESIZE PGetCustomPageSizeOption( PUIINFO pUIInfo ); // // Compute the 32-bit CRC checksum on a buffer of data // DWORD ComputeCrc32Checksum( IN PBYTE pbuf, IN DWORD dwCount, IN DWORD dwChecksum ); // // Copy the current option selections for a single feature from // the source OPTSELECT array to the destination OPTSELECT array // VOID VCopyOptionSelections( OUT POPTSELECT pDestOptions, IN INT iDestIndex, IN POPTSELECT pSrcOptions, IN INT iSrcIndex, IN OUT PINT piNext, IN INT iMaxOptions ); // // Check if the raw binary data is up-to-date // This function is only available in user-mode. // It always returns TRUE when called from kernel-mode. // BOOL BIsRawBinaryDataUpToDate( IN PRAWBINARYDATA pRawData ); #if defined(PSCRIPT) && !defined(KERNEL_MODE) // // delete the raw binary data file. This is only needed for the PPD parser, since // the GPD parser does not store parser-localized stuff in it's .bud // void DeleteRawBinaryData( IN PTSTR ptstrDataFilename ); #endif // // Common interface exported by both PPD and GPD parsers. Some of the complexity // here is not necessary for the PPD parser but it's needed by the GPD parser. // // // Routine Description: LoadRawBinaryData // // Load raw binary printer description data. // // Arguments: // // ptstrDataFilename - Specifies the name of the original printer description file // // Return Value: // // Pointer to raw binary printer description data // NULL if there is an error // PRAWBINARYDATA LoadRawBinaryData( IN PTSTR ptstrDataFilename ); // // Routine Description: UnloadRawBinaryData // // Unload raw binary printer description data previously loaded using LoadRawBinaryData // // Arguments: // // pRawData - Points to raw binary printer description data // // Return Value: // // NONE // VOID UnloadRawBinaryData( IN PRAWBINARYDATA pRawData ); // // Routine Description: InitBinaryData // // Initialize and return an instance of binary printer description data // // Arguments: // // pRawData - Points to raw binary printer description data // pInfoHdr - Points to an existing of binary data instance // pOptions - Specifies the options used to initialize the binary data instance // // Return Value: // // Pointer to an initialized binary data instance // // Note: // // If pInfoHdr parameter is NULL, the parser returns a new binary data instance // which should be freed by calling FreeBinaryData. If pInfoHdr parameter is not // NULL, the existing binary data instance is reinitialized. // // If pOption parameter is NULL, the parser should use the default option values // for generating the binary data instance. The parser may have special case // optimization to handle this case. // PINFOHEADER InitBinaryData( IN PRAWBINARYDATA pRawData, IN PINFOHEADER pInfoHdr, IN POPTSELECT pOptions ); // // Routine Description: FreeBinaryData // // Free an instance of the binary printer description data // // Arguments: // // pInfoHdr - Points to a binary data instance previously returned from an // InitBinaryData(pRawData, NULL, pOptions) call // // Return Value: // // NONE // VOID FreeBinaryData( IN PINFOHEADER pInfoHdr ); // // Routine Description: UpdateBinaryData // // Update an instance of binary printer description data // // Arguments: // // pRawData - Points to raw binary printer description data // pInfoHdr - Points to an existing of binary data instance // pOptions - Specifies the options used to update the binary data instance // // Return Value: // // Pointer to the updated binary data instance // NULL if there is an error // // Note: // // If this function fails for whatever reason, the parser should leave // the original instance of printer description data untouched and return NULL. // // Upon sucuessful return, it is assume that the parser has already disposed // of the original instance of printer description data. // PINFOHEADER UpdateBinaryData( IN PRAWBINARYDATA pRawData, IN PINFOHEADER pInfoHdr, IN POPTSELECT pOptions ); // // Routine Description: InitDefaultOptions // // Initialize the option array with default settings from the printer description file // // Arguments: // // pRawData - Points to raw binary printer description data // pOptions - Points to an array of OPTSELECT structures for storing the default settings // iMaxOptions - Max number of entries in pOptions array // iMode - Specifies what the caller is interested in: // MODE_DOCUMENT_STICKY // MODE_PRINTER_STICKY // MODE_DOCANDPRINTER_STICKY // // Return Value: // // FALSE if the input option array is not large enough to hold // all default option values, TRUE otherwise. // BOOL InitDefaultOptions( IN PRAWBINARYDATA pRawData, OUT POPTSELECT pOptions, IN INT iMaxOptions, IN INT iMode ); // // Routine Description: ValidateDocOptions // // Validate the devmode option array and correct any invalid option selections // // Arguments: // // pRawData - Points to raw binary printer description data // pOptions - Points to an array of OPTSELECT structures that need validation // iMaxOptions - Max number of entries in pOptions array // // Return Value: // // None // VOID ValidateDocOptions( IN PRAWBINARYDATA pRawData, IN OUT POPTSELECT pOptions, IN INT iMaxOptions ); // // Mode constants passed as iMode parameter to // InitDefaultOptions and ResolveUIConflicts // #define MODE_DOCUMENT_STICKY 0 #define MODE_PRINTER_STICKY 1 #define MODE_DOCANDPRINTER_STICKY 2 // // Routine Description: CheckFeatureOptionConflict // // Check if (dwFeature1, dwOption1) constrains (dwFeature2, dwOption2) // // Arguments: // // pRawData - Points to raw binary printer description data // dwFeature1, dwOption1 - Feature and option indices of the first feature/option pair // dwFeature2, dwOption2 - Feature and option indices of the second feature/option pair // // Return Value: // // TRUE if (dwFeature1, dwOption1) constrains (dwFeature2, dwOption2) // FALSE otherwise // BOOL CheckFeatureOptionConflict( IN PRAWBINARYDATA pRawData, IN DWORD dwFeature1, IN DWORD dwOption1, IN DWORD dwFeature2, IN DWORD dwOption2 ); // // Routine Description: ResolveUIConflicts // // Resolve any conflicts between printer feature option selections // // Arguments: // // pRawData - Points to raw binary printer description data // pOptions - Points to an array of OPTSELECT structures for storing the modified options // iMaxOptions - Max number of entries in pOptions array // iMode - Specifies how the conflicts should be resolved: // MODE_DOCUMENT_STICKY - only resolve conflicts between doc-sticky features // MODE_PRINTER_STICKY - only resolve conflicts between printer-sticky features // MODE_DOCANDPRINTER_STICKY - resolve conflicts all features // // If the most significant bit (DONT_RESOLVE_CONFLICT) of iMode is set, // then the caller is only interested in checking whether any conflicts // exist. Upon returning to the caller, the input options array will be // left untouched. // // Return Value: // // TRUE if there are no UI conflicts, otherwise FALSE if any // UI conflict is detected. // BOOL ResolveUIConflicts( IN PRAWBINARYDATA pRawData, IN OUT POPTSELECT pOptions, IN INT iMaxOptions, IN INT iMode ); // // Additional flag bit for iMode parameter of ResolveUIConflicts // #define DONT_RESOLVE_CONFLICT 0x80000000 // // Routine Description: EnumEnabledOptions // // Determine which options of the specified feature should be enabled // based on the current option selections of printer features // // Arguments: // // pRawData - Points to raw binary printer description data // pOptions - Points to the current feature option selections // dwFeatureIndex - Specifies the index of the feature in question // pbEnabledOptions - An array of BOOLs, each entry corresponds to an option // of the specified feature. On exit, if the entry is TRUE, the corresponding // option is enabled. Otherwise, the corresponding option should be disabled. // iMode - Specifies how the conflicts should be resolved: // MODE_DOCUMENT_STICKY - only resolve conflicts between doc-sticky features // MODE_PRINTER_STICKY - only resolve conflicts between printer-sticky features // MODE_DOCANDPRINTER_STICKY - resolve conflicts all features // // Return Value: // // TRUE if any option for the specified feature is enabled, // FALSE if all options of the specified feature are disabled // (i.e. the feature itself is disabled) // BOOL EnumEnabledOptions( IN PRAWBINARYDATA pRawData, IN POPTSELECT pOptions, IN DWORD dwFeatureIndex, OUT PBOOL pbEnabledOptions, IN INT iMode ); // // Routine Description: EnumNewUIConflict // // Check if there are any conflicts between the currently selected options // for the specified feature an other feature/option selections. // // Arguments: // // pRawData - Points to raw binary printer description data // pOptions - Points to the current feature/option selections // dwFeatureIndex - Specifies the index of the interested printer feature // pbSelectedOptions - Specifies which options for the specified feature are selected // pConflictPair - Return the conflicting pair of feature/option selections // // Return Value: // // TRUE if there is a conflict between the selected options for the specified feature // and other feature option selections. // // FALSE if the selected options for the specified feature is consistent with other // feature option selections. // BOOL EnumNewUIConflict( IN PRAWBINARYDATA pRawData, IN POPTSELECT pOptions, IN DWORD dwFeatureIndex, IN PBOOL pbSelectedOptions, OUT PCONFLICTPAIR pConflictPair ); // // Routine Description: EnumNewPickOneUIConflict // // Check if there are any conflicts between the currently selected option // for the specified feature an other feature/option selections. // // This is similar to EnumNewUIConflict above except that only one selected // option is allowed for the specified feature. // // Arguments: // // pRawData - Points to raw binary printer description data // pOptions - Points to the current feature/option selections // dwFeatureIndex - Specifies the index of the interested printer feature // dwOptionIndex - Specifies the selected option of the specified feature // pConflictPair - Return the conflicting pair of feature/option selections // // Return Value: // // TRUE if there is a conflict between the selected option for the specified feature // and other feature/option selections. // // FALSE if the selected option for the specified feature is consistent with other // feature/option selections. // BOOL EnumNewPickOneUIConflict( IN PRAWBINARYDATA pRawData, IN POPTSELECT pOptions, IN DWORD dwFeatureIndex, IN DWORD dwOptionIndex, OUT PCONFLICTPAIR pConflictPair ); // // Routine Description: ChangeOptionsViaID // // Modifies an option array using the information in public devmode fields // // Arguments: // // pInfoHdr - Points to an instance of binary printer description data // pOptions - Points to the option array to be modified // dwFeatureID - Specifies which field(s) of the input devmode should be used // pDevmode - Specifies the input devmode // // Return Value: // // TRUE if successful, FALSE if the specified feature ID is not supported // or there is an error // BOOL ChangeOptionsViaID( IN PINFOHEADER pInfoHdr, IN OUT POPTSELECT pOptions, IN DWORD dwFeatureID, IN PDEVMODE pDevmode ); // // Routine Description: MapToDeviceOptIndex // // Map logical values to device feature option index // // Arguments: // // pInfoHdr - Points to an instance of binary printer description data // dwFeatureID - Indicate which feature the logical values are related to // lParam1, lParam2 - Parameters depending on dwFeatureID // pdwOptionIndexes - if Not NULL, means fill this array with all indicies // which match the search criteria. In this case the return value // is the number of elements in the array initialized. Currently // we assume the array is large enough (256 elements). // // dwFeatureID = GID_PAGESIZE: // map logical paper specification to physical page size option // // lParam1 = paper width in microns // lParam2 = paper height in microns // // dwFeatureID = GID_RESOLUTION: // map logical resolution to physical resolution option // // lParam1 = x-resolution in dpi // lParam2 = y-resolution in dpi // // Return Value: // // Index of the feature option corresponding to the specified logical values; // OPTION_INDEX_ANY if the specified logical values cannot be mapped to // any feature option. // // if pdwOptionIndexes Not NULL, the return value is the number of elements // written to. Zero means the specified logical values cannot be mapped to // any feature option. // DWORD MapToDeviceOptIndex( IN PINFOHEADER pInfoHdr, IN DWORD dwFeatureID, IN LONG lParam1, IN LONG lParam2, OUT PDWORD pdwOptionIndexes ); // // Routine Description: CombineOptionArray // // Combine doc-sticky with printer-sticky option selections to form a single option array // // Arguments: // // pRawData - Points to raw binary printer description data // pCombinedOptions - Points to an array of OPTSELECTs for holding the combined options // iMaxOptions - Max number of entries in pCombinedOptions array // pDocOptions - Specifies the array of doc-sticky options // pPrinterOptions - Specifies the array of printer-sticky options // // Return Value: // // FALSE if the combined option array is not large enough to store // all the option values, TRUE otherwise. // // Note: // // Either pDocOptions or pPrinterOptions could be NULL but not both. If pDocOptions // is NULL, then in the combined option array, the options for document-sticky // features will be OPTION_INDEX_ANY. Same is true when pPrinterOptions is NULL. // BOOL CombineOptionArray( IN PRAWBINARYDATA pRawData, OUT POPTSELECT pCombinedOptions, IN INT iMaxOptions, IN POPTSELECT pDocOptions, IN POPTSELECT pPrinterOptions ); // // Routine Description: SeparateOptionArray // // Separate an option array into doc-sticky and for printer-sticky options // // Arguments: // // pRawData - Points to raw binary printer description data // pCombinedOptions - Points to the combined option array to be separated // pOptions - Points to an array of OPTSELECT structures // for storing the separated option array // iMaxOptions - Max number of entries in pOptions array // iMode - Whether the caller is interested in doc- or printer-sticky options: // MODE_DOCUMENT_STICKY // MODE_PRINTER_STICKY // // Return Value: // // FALSE if the destination option array is not large enough to hold // the separated option values, TRUE otherwise. // BOOL SeparateOptionArray( IN PRAWBINARYDATA pRawData, IN POPTSELECT pCombinedOptions, OUT POPTSELECT pOptions, IN INT iMaxOptions, IN INT iMode ); // // Routine Description: ReconstructOptionArray // // Modify an option array to change the selected options for the specified feature // // Arguments: // // pRawData - Points to raw binary printer description data // pOptions - Points to an array of OPTSELECT structures to be modified // iMaxOptions - Max number of entries in pOptions array // dwFeatureIndex - Specifies the index of printer feature in question // pbSelectedOptions - Which options of the specified feature is selected // // Return Value: // // FALSE if the input option array is not large enough to hold // all modified option values. TRUE otherwise. // // Note: // // Number of BOOLs in pSelectedOptions must match the number of options // for the specified feature. // // This function always leaves the option array in a compact format (i.e. // all unused entries are left at the end of the array). // BOOL ReconstructOptionArray( IN PRAWBINARYDATA pRawData, IN OUT POPTSELECT pOptions, IN INT iMaxOptions, IN DWORD dwFeatureIndex, IN PBOOL pbSelectedOptions ); #endif // !_PARSER_H_