/********************************************\ * * File : rendserv.h * Author : Kevin Gallo * Created: 9/22/93 * * Copyright (c) Microsoft Corp. 1993-1994 * * Overview: * * Revision History: \********************************************/ #ifndef _RENDSERV_H #define _RENDSERV_H // System includes #ifdef OLE2 #define INC_OLE2 1 #include #endif #include "ifaxos.h" #ifdef IFAX #include "awfile.h" #include "sosutil.h" #include "device.h" #endif #include "render.h" // Library Name #ifdef WIN32 #define LIB_RENDSERV "RNDSRV32.DLL" #else #define LIB_RENDSERV "RENDSERV.DLL" #endif // ================================================================= // Errors - // These occupy the lowest 6 bits of the error // ================================================================= #define RSMAKE_ERR(err) (ERR_FUNCTION_START+err) #define RSERR_GP_FAULT RSMAKE_ERR(0) // GP Fault #define RSERR_OPER_FAIL RSMAKE_ERR(1) // The desired operation failed. #define RSERR_BAD_OPER RSMAKE_ERR(2) // User tried to do something invalid #define RSERR_BAD_DATA RSMAKE_ERR(3) // Bad data was passed to a renderer. #define RSERR_DEV_FAIL RSMAKE_ERR(4) // Device failed. #define RSERR_PROP_FAIL RSMAKE_ERR(5) // Could not get a mapi property // ================================================================= // Methods in subsystems // These occupy bits 6-11 - 64 values // ================================================================= #define RSMAKE_METHOD(method) (method << 6) // ================================================================= // General methods // ================================================================= #define RSMETHOD_UNKNOWN RSMAKE_METHOD(0) #define RSMETHOD_OPEN RSMAKE_METHOD(1) #define RSMETHOD_CLOSE RSMAKE_METHOD(2) #define RSMETHOD_INIT RSMAKE_METHOD(3) #define RSMETHOD_READ RSMAKE_METHOD(4) #define RSMETHOD_WRITE RSMAKE_METHOD(5) #define RSMETHOD_RENDER RSMAKE_METHOD(6) #define RSMETHOD_ALLOC RSMAKE_METHOD(7) #define RSMETHOD_WINPROC RSMAKE_METHOD(8) #define RSMETHOD_START RSMAKE_METHOD(9) #define RSMETHOD_ERRREC RSMAKE_METHOD(10) // ================================================================= // // System specific - start at 32 // // ================================================================= #define RSMETHOD_CUSTOM_START (32) #define RSMETHOD_GETDEVICES RSMAKE_METHOD(RSMETHOD_CUSTOM_START) // ================================================================= // // Systems // These occupy bits 12-15 of the low WORD - 16 values // // ================================================================= #define RSMAKE_SYS(sys) (sys << 12) #define RSSYS_UNKNOWN RSMAKE_SYS(0) // Unknown #define RSSYS_SOS RSMAKE_SYS(1) // SOS subsystem #define RSSYS_FILESYS RSMAKE_SYS(2) // File System #define RSSYS_NETWORK RSMAKE_SYS(3) // Network #define RSSYS_RENDERER RSMAKE_SYS(4) // Renderers #define RSSYS_RENDSERV RSMAKE_SYS(5) // Rendering Server #define RSSYS_DEVICE RSMAKE_SYS(6) // Devices #define RSSYS_THREAD RSMAKE_SYS(7) // Threads // ================================================================= // // Error macros // // ================================================================= #define RSFormCustomError(sys,method,err) ((WORD) (sys | method | err)) #define RSFormIFError(sys,method,err) \ (IFErrAssemble(PROCID_NONE,MODID_REND_SERVER,0,RSFormCustomError(sys,method,err))) #define RSGetErrCode(err) (err & 0x003f) #define RSGetErrMethod(err) (err & 0x0fc0) #define RSGetErrSys(err) (err & 0xf000) // ================================================================= #ifdef __cplusplus extern "C" { #endif typedef LPVOID LPRENDSERVER ; typedef enum { RS_BEGINNING = 0, RS_CURRENT = 1, RS_END = 2, } RSOrigin_t ; #ifdef IFAX typedef enum { RSD_NULL = ATTACH_BY_NULL, RSD_FILE = ATTACH_BY_REF_RESOLVESOS, RSD_AWFILE = ATTACH_BY_SAVED_SECFILE, RSD_PIPE = ATTACH_BY_PIPE, RSD_SCANNER_PIPE = ATTACH_BY_SCANNER_PIPE, RSD_PRINTER_PIPE = ATTACH_BY_PRINTER_PIPE, RSD_METAFILE_PIPE = ATTACH_BY_METAFILE_PIPE, RSD_TRANSPORT_PIPE = ATTACH_BY_TRANSPORT_PIPE, RSD_LINEARIZER = ATTACH_BY_LINEARIZER, #ifdef OLE2 RSD_OLESTREAM, #endif RSD_DIRECT_COPY, } RSDeviceType_t ; #else typedef enum { RSD_NULL, RSD_FILE, RSD_AWG3_HANDLE, #ifdef OLE2 RSD_OLESTREAM, #endif } RSDeviceType_t ; #endif // Define Job Context typedef WORD HJC ; // // Macros for combining Device IDs // Used to store ID in PR_ATTACH_DEVID property. // (major is high word and minor is low word) #define MAKE_DEVID(major,minor) MAKEWORD(minor,major) #define GET_MINOR_DEVID(id) LOBYTE(id) #define GET_MAJOR_DEVID(id) HIBYTE(id) // Encoding structure for PR_ENCODING property // For now use the encoded values not the real values (match caps structure) // We may want to set width and height to be exact values typedef struct Encoding_t { WORD cbStruct ; // Size of the structure DWORD Resolution ; // The data resolution - see buffer.h for types (AWRES_xxx) DWORD Encoding ; // The data encoding format - see buffer.h for types (xxx_DATA) DWORD PageSize ; // The page size - see buffer.h for types (AWPAPER_xxx) DWORD LengthLimit ; // The page length - see buffer.h for types (AWLENGTH_xxx) } Encoding_t , FAR * lpEncoding_t ; // This is the topology data structure #ifdef IFAX #pragma warning (disable: 4200) typedef struct TopNode { WORD cbSize ; // Size of node char szRenderName[16] ; // Renderers modules name (cannot be more than 12 characters) LPCSTR RenderInfoProc ; // Must be the Ordinal Number of the getinfo call char RenderParam[] ; } TopNode, FAR * lpTopNode ; typedef struct Topology { WORD cbSize ; // Size of the struct itself without nodes (just the header) WORD cbTotalSize ; // Total size of data in struct WORD nRenderers ; // Number of renderers WORD uOffset[] ; // Offsets into this struct where TopNode's are. There are nRenderers // of these. } Topology , FAR * lpTopology ; #define GET_TOPNODE(Top,idx) ((lpTopNode) (((LPBYTE)Top) + Top->uOffset[idx])) #pragma warning (default: 4200) #else // A topology will be a linked list of TopNodes typedef struct TopNode FAR * lpTopNode ; #pragma warning (disable: 4200) typedef struct TopNode { WORD cbSize ; // Size of node LPTSTR szRenderName ; // Renderers modules name - (this is the dll) LPCSTR RenderInfoProc ; // Will be passed directly to getprocaddress (i.e. ordinal or name) lpTopNode lpNext ; // Used to create linked list topology char RenderParam[] ; } TopNode ; #pragma warning (default: 4200) typedef struct Topology { WORD nRenderers ; // Number of renderers lpTopNode lpHead ; // Pointer to first renderer lpTopNode lpTail ; // Pointer to last renderer } Topology , FAR * lpTopology ; #endif /**** @doc EXTERNAL RENDSERV @types RSProcessInfo_t | The Process Pipe information structure. @field HSESSION | hSession | Specifies the session handle for the device. @field DEVICESTR | szDeviceName | Specifies the name of the device to use. @field UCHAR | ucMajorDevId | Specifies the Major Id of the device. @field UCHAR | ucMinorDevId | Specifies the Minor Id of the device. @field LPVOID | lpMode | Specifies the mode structure to be passed to the device. @field UINT | cbMode | Specifies the size of mode structure. @comm There are other reserved fields in the structure which have not been mentioned here. @tagname RSProcessInfo_t ****/ #ifdef IFAX typedef struct RSProcessPipeInfo_t { HSESSION hSession ; DEVICESTR szDeviceName ; UCHAR ucMajorDevId ; UCHAR ucMinorDevId ; LPVOID lpMode ; UINT cbMode ; } RSProcessPipeInfo_t , FAR * lpRSProcessPipeInfo_t ; #endif typedef struct RSDeviceInfo_t { RSDeviceType_t DevType ; Encoding_t Encoding ; union { LPTSTR lpszFileName ; HANDLE hFile ; #ifdef OLE2 LPSTREAM lpstream ; #endif #ifdef IFAX hSecureFile SecFileName ; HPIPE hpipe ; LPMESSAGESOS lpMessage ; RSProcessPipeInfo_t ProcInfo ; #endif } ; } RSDeviceInfo_t ; typedef RSDeviceInfo_t FAR * lpRSDeviceInfo_t, FAR * FAR * lplpRSDeviceInfo_t ; typedef const RSDeviceInfo_t FAR * lpCRSDeviceInfo_t, FAR * FAR * lplpCRSDeviceInfo_t ; #ifdef IFAX #pragma warning (disable: 4200) typedef struct SOSProcessPipeInfo_t { HSESSION hSession ; DEVICESTR szDeviceName ; UCHAR ucMajorDevId ; UCHAR ucMinorDevId ; UINT cbMode ; BYTE Mode[] ; } SOSProcessPipeInfo_t , FAR * lpSOSProcessPipeInfo_t ; typedef struct SOSDeviceInfo_t { UINT cbSize ; RSDeviceType_t DevType ; Encoding_t Encoding ; union { char lpszFileName[] ; hSecureFile SecFileName ; HPIPE hpipe ; LPMESSAGESOS lpMessage ; SOSProcessPipeInfo_t ProcInfo ; } ; } SOSDeviceInfo_t , FAR * lpSOSDeviceInfo_t, FAR * FAR * lplpSOSDeviceInfo_t ; #pragma warning (default: 4200) #endif typedef void (WINAPI *LPFNACKPROC) (LPRENDSERVER lprs,WORD PageNum,WORD wValue,LPVOID lpvData) ; typedef void (WINAPI *LPFNSTATUSPROC) (LPRENDSERVER lprs,WORD PageNum,WORD kbytes,LPVOID lpvData) ; /******** @doc EXTERNAL RENDSERV @api LPRENDSERVER | RSAlloc | Allocates a Render Server. @rdesc Returns a pointer to the Rendering Server or NULL if there was not enough memory. ********/ EXPORT_DLL LPRENDSERVER WINAPI RSAlloc () ; EXPORT_DLL void WINAPI RSFree (LPRENDSERVER lprs) ; EXPORT_DLL BOOL WINAPI RSInit (LPRENDSERVER lprs,HJC hjc,HWND hwnd) ; EXPORT_DLL BOOL WINAPI RSOpen (LPRENDSERVER lprs, lpRSDeviceInfo_t lpSrcInfo,lpRSDeviceInfo_t lpTgtInfo, lpTopology lpTop,LPJOBINFO lpJobInfo) ; EXPORT_DLL BOOL WINAPI RSClose (LPRENDSERVER lprs) ; // Returns false if we did not process it EXPORT_DLL LRESULT WINAPI RSWndProc (LPRENDSERVER lprs,UINT msg,WPARAM wParam,LPARAM lParam) ; EXPORT_DLL BOOL WINAPI RSRender (LPRENDSERVER lprs,UINT nIterations) ; EXPORT_DLL BOOL WINAPI RSSetPage (LPRENDSERVER lprs,RSOrigin_t origin,int offset) ; // These will be called once a page or job ack // is received (indicating the target has confirmed them. // // The last page will call JobAck and not PageAck // - thus if these are 5 pages there will be 4 page acks and one job ack EXPORT_DLL void WINAPI RSSetPageAckCallback(LPRENDSERVER lprs,LPFNACKPROC lpfnAckProc,LPVOID lpvData) ; EXPORT_DLL void WINAPI RSSetJobAckCallback(LPRENDSERVER lprs,LPFNACKPROC lpfnAckProc,LPVOID lpvData) ; EXPORT_DLL void WINAPI RSSetStatusCallback(LPRENDSERVER lprs,LPFNSTATUSPROC lpfnStatusProc,LPVOID lpvData) ; EXPORT_DLL void WINAPI RSSetSrcJobAckCallback(LPRENDSERVER lprs,LPFNACKPROC lpfnAckProc,LPVOID lpvData) ; EXPORT_DLL void WINAPI RSPause (LPRENDSERVER lprs) ; EXPORT_DLL void WINAPI RSResume (LPRENDSERVER lprs) ; EXPORT_DLL void WINAPI RSAbort (LPRENDSERVER lprs) ; EXPORT_DLL BOOL WINAPI RSSpool (LPRENDSERVER lprs) ; EXPORT_DLL BOOL WINAPI RSIsBlocking(LPRENDSERVER lprs) ; EXPORT_DLL BOOL WINAPI RSIsPaused(LPRENDSERVER lprs) ; EXPORT_DLL BOOL WINAPI RSIsDone(LPRENDSERVER lprs) ; EXPORT_DLL BOOL WINAPI RSIsInit(LPRENDSERVER lprs) ; EXPORT_DLL BOOL WINAPI RSIsOpen(LPRENDSERVER lprs) ; // This will take the device structures and create a topology using format resolution // If this succeeds it will render the entire topology calling yield where appropriate // and then returning when complete or an error occurs // If this returns FALSE then this the function will fail and return FALSE typedef BOOL (WINAPI *LPFNYIELDPROC) (LPVOID lpvData) ; EXPORT_DLL BOOL WINAPI RSFormatAndRender (lpRSDeviceInfo_t lpSrcInfo, lpRSDeviceInfo_t lpTgtInfo, LPJOBINFO lpJobInfo, LPFNYIELDPROC lpfnYieldProc, LPVOID lpvData) ; #define ORD_RSFormatAndRender MAKEINTRESOURCE(100) // "RSFormatAndRender" typedef BOOL (* WINAPI LPFN_RSFormatAndRender) (lpRSDeviceInfo_t, lpRSDeviceInfo_t, LPJOBINFO, LPFNYIELDPROC, LPVOID); #ifdef IFAX typedef struct RSRInfo_t { DWORD dwIndex ; lpRSDeviceInfo_t lpSrcInfo ; lpRSDeviceInfo_t lpTgtInfo ; lpTopology lpTop ; LPJOBINFO lpJobInfo ; } RSRInfo_t ; /******** @doc EXTERNAL RENDERSERV @types RSReason_t | The callback function can be called for any of these reasons. @emem RSREASON_NONE | No specific reason - simply a test. @emem RSREASON_INIT | This is to initialize the structure. The callback function is responsible for setting the following fields of the Render_t structure: lpSrcInfo: The source device information structure. lpTgtInfo: The target device information structure. lpTop : The topology structure. lpJobInfo: The job information structure if required by renderers. hjc : The job context identifier. hwnd : The hwnd to have messages for pipe posted to. @emem RSREASON_START | Indicates that the rendering will begin. @emem RSREASON_DONE | Indicates that rendering is complete. @emem RSREASON_DEINIT | Indicates the job information should be freed. Anything allocated in RSREASON_INIT should be freed. This is guaranteed to be call if the callback returned TRUE from the RSREASON_INIT callback - even if an error occurs. @emem RSREASON_STATUS | If the status flag was passed in the RSRender call then this contains status information. Not defined yet! @emem RSREASON_YIELD | If the yield flag was specified then this gives the callback the opportunity to do other work - such as process the message queue. @emem RSREASON_ERROR | Indicates an error has occurred and rendering will be terminated. ********/ typedef enum { RSREASON_NONE = 0, RSREASON_INIT, RSREASON_START, RSREASON_DONE, RSREASON_DEINIT, RSREASON_STATUS, RSREASON_YIELD, RSREASON_ERROR, } RSReason_t ; typedef struct Render_t FAR * LPRender_t ; typedef BOOL (WINAPI *LPFNRENDSERVPROC) (LPVOID lpvData,DWORD fdwReason,LPRender_t lpRenderData) ; #define RSR_ASYNC_MODE 0x00000001 // The call will be asyncronous #define RSR_STATUS_MODE 0x00000002 // Callback will be done for status #define RSR_YIELD_MODE 0x00000004 // In sync mode yield will be called EXPORT_DLL BOOL WINAPI RSRenderData(DWORD fdwFlags, LPFNRENDSERVPROC lpfnRSProc, LPVOID lpvData) ; typedef struct Render_t { DWORD fdwFlags ; LPFNRENDSERVPROC lpfnRSProc ; LPVOID lpvData ; DWORD dwIndex ; lpRSDeviceInfo_t lpSrcInfo ; lpRSDeviceInfo_t lpTgtInfo ; lpTopology lpTop ; LPJOBINFO lpJobInfo ; HJC hjc ; HWND hwnd ; WORD wPageNum ; WORD wkbytes ; DWORD dwError ; LPRENDSERVER lprs ; } Render_t ; // // MAPI Specific calls // typedef LPVOID LPSOSREND ; LPSOSREND WINAPI SRSAlloc () ; void WINAPI SRSFree (LPSOSREND lprs) ; BOOL WINAPI SRSInit (LPSOSREND lprs) ; BOOL WINAPI SRSOpen (LPSOSREND lprs,ENTRYIDSOS src,ENTRYIDSOS tgt,HJC hjc,HWND hwnd) ; BOOL WINAPI SRSClose (LPSOSREND lprs) ; LRESULT WINAPI SRSWndProc (LPSOSREND lprs,UINT msg,WPARAM wParam,LPARAM lParam) ; // This will open the attachment BOOL WINAPI SRSSetCurAttachNum (LPSOSREND lprs,UINT num) ; // This will automatically advance to next attachment if autoadvance is TRUE (default) // If autoadvance is true - the job is done after the last attachent otherwise it // will be set to true after the current attachment is completed. // // If SetCurAttachNum is called the done flag will be reset to FALSE BOOL WINAPI SRSRender (LPSOSREND lprs,UINT nIterations) ; LPBUFFER WINAPI SRSGetBuf (LPSOSREND lprs) ; BOOL WINAPI SRSSetPage (LPSOSREND lprs,RSOrigin_t origin,int offset) ; BOOL WINAPI SRSGetAutoAdvance (LPSOSREND lprs) ; void WINAPI SRSSetAutoAdvance (LPSOSREND lprs,BOOL badv) ; ULONG WINAPI SRSGetNumAttach (LPSOSREND lprs) ; ULONG WINAPI SRSGetCurAttachNum (LPSOSREND lprs) ; void WINAPI SRSPause (LPSOSREND lprs) ; void WINAPI SRSResume (LPSOSREND lprs) ; void WINAPI SRSAbort (LPSOSREND lprs) ; BOOL WINAPI SRSSpool (LPSOSREND lprs) ; BOOL WINAPI SRSPartSave (LPSOSREND lprs) ; BOOL WINAPI SRSIsBlocking(LPSOSREND lprs) ; BOOL WINAPI SRSIsPaused(LPSOSREND lprs) ; BOOL WINAPI SRSIsDone(LPSOSREND lprs) ; BOOL WINAPI SRSIsInit(LPSOSREND lprs) ; BOOL WINAPI SRSIsOpen(LPSOSREND lprs) ; LPRENDSERVER WINAPI SRSGetRendServer(LPSOSREND lprs) ; BOOL WINAPI RSRecoverMsg (LPMESSAGESOS lpMsg) ; UINT WINAPI RSCalculatePageCount(lpRSDeviceInfo_t lpinfo) ; #endif #ifdef __cplusplus } // extern "C" #endif #endif // _RENDSERV_H