/*
     File:       PMPrinterModule.h
 
     Contains:   Mac OS X Printing Manager Printer Module Interfaces.
 
     Version:    QuickTime 7.1
 
     Copyright:  © 2006 © 1999-2001 by Apple Computer, Inc., all rights reserved
 
     Bugs?:      For bug reports, consult the following page on
                 the World Wide Web:
 
                     http://developer.apple.com/bugreporter/
 
*/
#ifndef __CFSTRING__
#include <CFString.h>
#endif

#ifndef __PMTICKET__
#include <PMTicket.h>
#endif

#ifndef __PMPLUGINHEADER__
#include <PMPluginHeader.h>
#endif

#ifndef __PMERRORS__
#include <PMErrors.h>
#endif

#ifndef __PMRASTER__
#include <PMRaster.h>
#endif


/* context ID for PM Modules */


#if PRAGMA_ONCE
#pragma once
#endif

#ifdef __cplusplus
extern "C" {
#endif

#if PRAGMA_IMPORT
#pragma import on
#endif

#if PRAGMA_STRUCT_ALIGN
    #pragma options align=mac68k
#elif PRAGMA_STRUCT_PACKPUSH
    #pragma pack(push, 2)
#elif PRAGMA_STRUCT_PACK
    #pragma pack(2)
#endif

typedef struct OpaquePMContext*         PMContext;
/* Opaque types for image access: */
typedef struct OpaquePMDrawingCtx*      PMDrawingCtx;
typedef struct OpaquePMImageRef*        PMImageRef;
/* Type ID, interface ID for the IOM CFPlugin */
#define kPModuleTypeIDStr               "5D69ED5E-D5B5-11D3-9EFF-00050209D9C1"
#define kPModuleIntfIDStr               "5EDEC4FA-D5B5-11D3-AAF2-00050209D9C1"
/* PM API version numbers (see PMPluginHeader.h for the meaning of these defintions) */
enum {
  kPMBuildVersionMajor          = 1,
  kPMBuildVersionMinor          = 0,
  kPMBaseVersionMajor           = 1,
  kPMBaseVersionMinor           = 0
};

/*
Keys for the printer browser specification dictionary. This CFDictionary,
created by the printer module, provides a printer browser module with the 
information it needs to browse for a given type of printer over its 
connection type, and to display it in PrintCenter's Browser Window.

kPMPrinterBrowserKindKey corresponds to a CFStringRef to a human-readable 
printer type string that can be displayed in the browser view. For a printer 
driven by Apple's PostScript printer module over an AppleTalk connection, 
this would be the string "PostScript printer".

kPMPrinterBrowserInfoKey corresponds to a CFTypeRef to connection-specific 
information used to look up a particular kind of printer over a given IO 
connection. A PostScript printer module supporting AppleTalk might specify 
the NBP lookup string "LaserWriter".

kPMPrinterBrowserIconKey corresponds to a CFDataRef to the icon family data 
for the printer icon to be displayed in the browser view. The family data 
are entirely contained within the CFDataRef; i.e., it is *not* a handle.

kPMPrinterBrowserDeviceIDKey corresponds to a CFStringRef to a USB/Firewire
IEEE-1284 DeviceID string. e.g., "COMMAND SET: PostScript;" or 
"MFG: Hewlett-Packard; MDL: DeskJet 935C;"
*/
#define kPMPrinterBrowserKindKey        CFSTR("Printer Browser Kind")
#define kPMPrinterBrowserInfoKey        CFSTR("Printer Browser Info")
#define kPMPrinterBrowserIconsKey       CFSTR("Printer Browser Icons")
#define kPMPrinterBrowserDeviceIDKey    CFSTR("Printer Browser DeviceID")
enum {
  kPMBrowserInfoNumValues       = 4
};


/* Status and Error notification: */

/*
 *  PMNotificationProcPtr
 *  
 *  Discussion:
 *    A callback routine used for reporting printing status and errors
 *    during a print job Event is constructed with known keys defined
 *    below and passed to the printing manager in notificationDict
 *    notificationReplyDict is used for blocking recoverable errors to
 *    indicate user action
 */
typedef CALLBACK_API_C( OSStatus , PMNotificationProcPtr )(const void *jobContext, CFDictionaryRef notificationDict, CFDictionaryRef *notificationReplyDict);

/*
 *  Discussion:
 *    Status and error event codes and keys reported by the printer
 *    module (used in PMNotificationProc)
 */
enum {

  /*
   * non-error printer status
   */
  kPMEventPrinterStatus         = 4000,

  /*
   * a fatal printing error has occurred.  The Printer Module MUST stop
   * printing and return immediately after sending this event.
   */
  kPMEventErrorOccurred         = 4001,

  /*
   * an auto-recoverable error occurred.  The PM SHOULD keep trying to
   * print the job without waiting for any user action. If the PM
   * detects that the condition is cleared, it MUST send a
   * kPMEventRecoverableErrorCleared event, otherwise the condition
   * alert will not get cleared
   */
  kPMEventRecoverableErrorOccurred = 4002,

  /*
   * auto-recoverable error has been cleared, the job is continued
   * automatically and without user intervention.  This event causes
   * the condition alert to close and the job state to change to
   * "printing".
   */
  kPMEventRecoverableErrorCleared = 4003
};


/* Event keys used in notification dictionaries */
#define kPMEventCodeKey                 CFSTR("com.apple.printing.EventCode")
/* CFNumber (SInt32) containing the event code (above) */
#define kPMErrorCodeKey                 CFSTR("com.apple.printing.ErrorCode")
/* CFNumber (SInt32) containing the error code (i.e., OSStatus) */
#define kPMErrorExplanationKey          CFSTR("com.apple.printing.ErrorExplanation")
/* CFString containing the text that shows up as bold text in the error/status alert */
#define kPMErrorTextKey                 CFSTR("com.apple.printing.ErrorText")
/* CFString containing the text that shows up as regular text in the error/status alert */
#define kPMEventContextKey              CFSTR("com.apple.printing.EventContext")
/* CFNumber (SInt32) containing a context value. Used primarily to match a "cleared error" event with a prior "recoverable error" event */
/* prototypes for callback routines used for accessing print data */
typedef CALLBACK_API_C( OSStatus , PMJobStreamOpenProcPtr )(const void * jobContext);
typedef CALLBACK_API_C( OSStatus , PMJobStreamReadWriteProcPtr )(const void *jobContext, void *buffPtr, UInt32 *size);
typedef CALLBACK_API_C( OSStatus , PMJobStreamGetPosProcPtr )(const void *jobContext, UInt32 *markerPos);
typedef CALLBACK_API_C( OSStatus , PMJobStreamSetPosProcPtr )(const void *jobContext, SInt16 posMode, UInt32 markerPos);
typedef CALLBACK_API_C( OSStatus , PMJobStreamGetNextBandProcPtr )(const void *jobContext, PMRasterBand *pmRasterBand);
/* the printing manager maintains this struct of callback procs for printer module data access */
struct PMJobStreamProcs {
  CFIndex             version;

  PMJobStreamOpenProcPtr  PMJobStreamOpenProc;
  PMJobStreamReadWriteProcPtr  PMJobStreamReadProc;
  PMJobStreamReadWriteProcPtr  PMJobStreamWriteProc;
  PMJobStreamGetPosProcPtr  PMJobStreamGetPosProc;
  PMJobStreamSetPosProcPtr  PMJobStreamSetPosProc;
  PMJobStreamGetPosProcPtr  PMJobStreamGetEOFProc;
};
typedef struct PMJobStreamProcs         PMJobStreamProcs;
/* prototypes for callback routines used for communication with the device/connection */
typedef CALLBACK_API_C( OSStatus , GetConnInfoProcPtr )(const void *jobContext, CFStringRef *connectionType, CFStringRef *pbmPath);
typedef CALLBACK_API_C( OSStatus , PMIOOpenProcPtr )(const void * jobContext);
typedef CALLBACK_API_C( OSStatus , PMIOReadProcPtr )(const void *jobContext, Ptr buffer, UInt32 *size, Boolean *eoj);
typedef CALLBACK_API_C( OSStatus , PMIOWriteProcPtr )(const void *jobContext, Ptr buffer, UInt32 *size, Boolean eoj);
typedef CALLBACK_API_C( OSStatus , PMIOStatusProcPtr )(const void *jobContext, CFStringRef *status);
typedef CALLBACK_API_C( OSStatus , PMIOGetAttributeProcPtr )(const void *jobContext, CFStringRef attribute, CFTypeRef *result);
typedef CALLBACK_API_C( OSStatus , PMIOSetAttributeProcPtr )(const void *jobContext, CFStringRef attribute, CFTypeRef data);
typedef CALLBACK_API_C( OSStatus , PMIOCloseProcPtr )(const void * jobContext);

/*
 *  PMIOProcs
 *  
 *  Discussion:
 *    The printing manager maintains this struct of callback procs for
 *    printer module communication with the device
 */
struct PMIOProcs {
  CFIndex             version;

  /*
   * Get connection type string and Printer Browser Module path
   */
  GetConnInfoProcPtr  GetConnInfoProc;

  /*
   * Open connection with target printer
   */
  PMIOOpenProcPtr     PMIOOpenProc;

  /*
   * Read data from printer
   */
  PMIOReadProcPtr     PMIOReadProc;

  /*
   * Write data to printer.  Data is not buffered no matter how small
   * the buffer is. Therefore, it is recommended that the PM do its own
   * buffering before this call is made.
   */
  PMIOWriteProcPtr    PMIOWriteProc;

  /*
   * Get status from the printer if any
   */
  PMIOStatusProcPtr   PMIOStatusProc;

  /*
   * Get the value for a particular IOM attribute (see PMIOModule.h for
   * a list of attributes)
   */
  PMIOGetAttributeProcPtr  PMIOGetAttributeProc;

  /*
   * Set a value for a particular IOM attribute (see PMIOModule.h for a
   * list of attributes)
   */
  PMIOSetAttributeProcPtr  PMIOSetAttributeProc;

  /*
   * Close connection with printer.
   */
  PMIOCloseProcPtr    PMIOCloseProc;
};
typedef struct PMIOProcs                PMIOProcs;
typedef CALLBACK_API_C( OSStatus , PMCreatePrinterBrowserModuleInfoProcPtr )(CFStringRef connectionType, CFArrayRef *printerBrowserInfo);
typedef CALLBACK_API_C( OSStatus , PMInitializeProcPtr )(CFDataRef printerAddress, const void *jobContext, const PMIOProcs *pmIOProcs, PMNotificationProcPtr pmNotificationProc, PMContext *printerModuleContext);
typedef CALLBACK_API_C( OSStatus , PMCreatePrintingDialogExtensionsPathsProcPtr )(PMContext printerModuleContext, CFArrayRef *pdePaths);
typedef CALLBACK_API_C( OSStatus , PMCreatePrinterTicketsProcPtr )(PMContext printerModuleContext, PMTicketRef *printerInfo, PMTemplateRef *jobTemplate);
typedef CALLBACK_API_C( OSStatus , PMBeginJobProcPtr )(PMContext printerModuleContext, const void *jobContext, PMTicketRef jobTicket, PMTicketRef *converterSetup);
typedef CALLBACK_API_C( OSStatus , PMPrintJobProcPtr )(PMContext printerModuleContext, const void *jobContext, PMTicketRef jobTicket, const PMJobStreamProcs *inDataProcs);
typedef CALLBACK_API_C( OSStatus , PMPrintPageProcPtr )(PMContext printerModuleContext, const void *jobContext, PMTicketRef jobTicket, PMJobStreamGetNextBandProcPtr pmJobStreamGetNextBandProc);
typedef CALLBACK_API_C( OSStatus , PMImageAccessProcPtr )(PMContext printerModuleContext, const void *jobContext, CFStringRef grafBase, PMDrawingCtx drawingCtx, PMImageRef imageRef, PMImageRef *outImageRefPtr);
typedef CALLBACK_API_C( OSStatus , PMCancelJobProcPtr )(PMContext printerModuleContext, const void *jobContext);
typedef CALLBACK_API_C( OSStatus , PMEndJobProcPtr )(PMContext printerModuleContext, const void *jobContext);
typedef CALLBACK_API_C( OSStatus , PMTerminateProcPtr )(PMContext *printerModuleContext, const void *jobContext);

/*
 *  PMProcs
 *  
 *  Discussion:
 *    Contains the function pointers required to be exported by a
 *    Printer Module.
 */
struct PMProcs {

  /*
   * The plugin header is required with all plugins and must proceed
   * object's layout.
   */
  PMPlugInHeader      pluginHeader;

  /*
   * For a given connection type in 'connectionType', returns a ticket
   * containing printer browser information about the supported
   * printers that can be browsed for on that connection. If the
   * connection is not supported by the Printer Module,
   * kPMUnsupportedConnection error is returned.
   */
  PMCreatePrinterBrowserModuleInfoProcPtr  CreatePrinterBrowserModuleInfo;

  /*
   * Create a new instance of the Printer Module and place it's
   * reference in 'printerModuleContext'. Few input parameters are
   * passed via this API that the PM should store in its local context
   * block for use during the session; such as: printerAddress,
   * jobContext (used in callbacks), pmIOProcs (used for communicating
   * with the device, and pmNotificationProc (used for reporting status
   * and errors).
   */
  PMInitializeProcPtr  Initialize;

  /*
   * Return one or more paths of this Printer Module's Print Dialog
   * Extension(s) relative to base path /Library/Printers/
   */
  PMCreatePrintingDialogExtensionsPathsProcPtr  CreatePrintingDialogExtensionsPaths;

  /*
   * Returns printer module's template and printerinfo tickets to the
   * caller. A PrinterInfo ticket holds capability and product ID
   * information whereas a Template holds range and default information
   * about various print settings
   */
  PMCreatePrinterTicketsProcPtr  CreatePrinterTickets;

  /*
   * Called by the Printing Manager to initiate a job. This function is
   * intended as a "setup" function, so all the information needed to
   * set up for printing is supplied: jobTicket has the control
   * parameters for this job, as defined by the application and user;
   * converterSetp allows the PM to setup a converter via standard
   * ticket tags.
   */
  PMBeginJobProcPtr   BeginJob;

  /*
   * Begin sending print data to the printer. The Printing Manager
   * calls this API when page boundaries in the job can not be
   * determined (i.e PM specific format).  inDataProcs contains
   * callbacks to access the print data; see PMJobStreamProcs
   * definitions above for more info on the callback routines.
   */
  PMPrintJobProcPtr   PrintJob;

  /*
   * Send only a specific page to the printer.  The PM needs to process
   * the data and make it ready for the printer hardware. 
   * PMJobStreamGetNextBandProc is a callback to get the next available
   * band data.
   */
  PMPrintPageProcPtr  PrintPage;

  /*
   * This API is called when an image is encountered during conversion.
   *  This allows the Printer Module to access and modify the image
   * data (imageRef) and drawing context before the image is rasterized
   * into the page bands.  Modified image should be returned in
   * outImageRefPtr.
   */
  PMImageAccessProcPtr  ImageAccess;

  /*
   * Cancel the currently printing job.  This function may be called
   * while the PM is executing code in PrintJob or PrintPage.
   */
  PMCancelJobProcPtr  CancelJob;

  /*
   * Finish up the previously printed job.
   */
  PMEndJobProcPtr     EndJob;

  /*
   * Dispose of the current PM session data allocated in Initialize.
   */
  PMTerminateProcPtr  Terminate;
};
typedef struct PMProcs                  PMProcs;
/* PM interface is an object containing addresses to the module's entry points: */
struct PMInterface {
  const PMProcs *     vtable;
};
typedef struct PMInterface              PMInterface;
typedef const PMInterface *             PMInterfaceRef;
/*
   Paper names must all be ISO or PPD standard names, so we've defined constants here for 
   developers to use in their code, mostly to make things more readable.
*/

#define USExecutiveEnvelope             CFSTR("Executive")
#define Envelope9                       CFSTR("na-number-9-envelope")
#define Envelope10                      CFSTR("na-number-10-envelope")
#define Envelope10x15                   CFSTR("na-10x15-envelope")
#define EnvelopeB4                      CFSTR("iso-b4-envelope")
#define EnvelopeB5                      CFSTR("iso-b5-envelope")
#define EnvelopeC3                      CFSTR("iso-c3-envelope")
#define EnvelopeC4                      CFSTR("iso-c4-envelope")
#define EnvelopeC5                      CFSTR("iso-c5-envelope")
#define EnvelopeC6                      CFSTR("iso-c6-envelope")
#define Envelope6x9                     CFSTR("na-6x9-envelope")
#define Envelope7x9                     CFSTR("na-7x9-envelope")
#define Envelope9x11                    CFSTR("na-9x11-envelope")
#define Envelope9x12                    CFSTR("na-9x12-envelope")
#define Envelope10x13                   CFSTR("na-10x13-envelope")
#define Envelope10x14                   CFSTR("na-10x14-envelope")
#define EnvelopeMonarch                 CFSTR("monarch-envelope")
#define EnvelopeLong                    CFSTR("iso-designated-long-envelope")
#define Invoice                         CFSTR("invoice")
#define USLetter                        CFSTR("na-letter")
#define USLegal                         CFSTR("na-legal")
#define Ledger                          CFSTR("ledger")
#define Folio                           CFSTR("folio")
#define Quarto                          CFSTR("quarto")
#define A0                              CFSTR("iso-a0")
#define A1                              CFSTR("iso-a1")
#define A2                              CFSTR("iso-a2")
#define A3                              CFSTR("iso-a3")
#define A4                              CFSTR("iso-a4")
#define A5                              CFSTR("iso-a5")
#define A6                              CFSTR("iso-a6")
#define A7                              CFSTR("iso-a7")
#define A8                              CFSTR("iso-a8")
#define A9                              CFSTR("iso-a9")
#define B0                              CFSTR("iso-b0")
#define B1                              CFSTR("iso-b1")
#define B2                              CFSTR("iso-b2")
#define B3                              CFSTR("iso-b3")
#define B4                              CFSTR("iso-b4")
#define B5                              CFSTR("iso-b5")
#define B6                              CFSTR("iso-b6")
#define B7                              CFSTR("iso-b7")
#define B8                              CFSTR("iso-b8")
#define B9                              CFSTR("iso-b9")
#define B10                             CFSTR("iso-b10")
#define JISB0                           CFSTR("jis-b0")
#define JISB1                           CFSTR("jis-b1")
#define JISB2                           CFSTR("jis-b2")
#define JISB3                           CFSTR("jis-b3")
#define JISB4                           CFSTR("jis-b4")
#define JISB5                           CFSTR("jis-b5")
#define JISB7                           CFSTR("jis-b7")
#define JISB8                           CFSTR("jis-b8")
#define JISB9                           CFSTR("jis-b9")
#define JISB10                          CFSTR("jis-b10")
#define ASize                           CFSTR("a")
#define BSize                           CFSTR("b")
#define CSize                           CFSTR("c")
#define DSize                           CFSTR("d")
#define ESize                           CFSTR("e")
#define iso10                           CFSTR("iso-10")
/* A string to define the default paper name. See sample code for usage.*/

#define DefaultPaper                    CFSTR("DefaultPaperSize")


#if PRAGMA_STRUCT_ALIGN
    #pragma options align=reset
#elif PRAGMA_STRUCT_PACKPUSH
    #pragma pack(pop)
#elif PRAGMA_STRUCT_PACK
    #pragma pack()
#endif

#ifdef PRAGMA_IMPORT_OFF
#pragma import off
#elif PRAGMA_IMPORT
#pragma import reset
#endif

#ifdef __cplusplus
}
#endif
