|
|
/********************************************\
* * 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 <objbase.h>
#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
|