289 lines
8.7 KiB
C
289 lines
8.7 KiB
C
/*
|
|
* R T F L I B . H
|
|
*
|
|
* Definitions for RTF library.
|
|
*
|
|
* Copyright 1986-1996 Microsoft Corporation. All Rights Reserved.
|
|
*/
|
|
|
|
#ifndef RTFLIB_H
|
|
#pragma option push -b -a8 -pc -A- /*P_O_Push*/
|
|
#define RTFLIB_H
|
|
|
|
#if defined (WIN32) && !defined (_WIN32)
|
|
#define _WIN32
|
|
#endif
|
|
|
|
#if defined (_WIN32)
|
|
#ifndef _OBJBASE_H_
|
|
#include <objbase.h>
|
|
#endif
|
|
#endif
|
|
|
|
#if defined (WIN16) || defined (DOS) || defined (DOS16)
|
|
#ifndef _COMPOBJ_H_
|
|
#include <compobj.h>
|
|
#endif
|
|
#endif
|
|
|
|
|
|
/*
|
|
* RTFLIB only looks at the first cchBodyTagMax characters of the body tag.
|
|
*/
|
|
#define cchBodyTagMax 100
|
|
|
|
typedef struct _RTFSYNCINFO
|
|
{
|
|
LONG lBodyCRC;
|
|
LONG lBodyCount;
|
|
LONG lPrefixCount;
|
|
LONG lTrailingCount;
|
|
char szBodyTag[cchBodyTagMax + 2];
|
|
} RTFSYNCINFO;
|
|
|
|
// header for compressed stream
|
|
typedef struct _lzfuhdr
|
|
{
|
|
ULONG cbSize; // total number of bytes following this field
|
|
ULONG cbRawSize; // size before compression
|
|
DWORD dwMagic; // identifies this as a compressed stream
|
|
DWORD dwCRC; // CRC-32 of the compressed data for error checking
|
|
} LZFUHDR;
|
|
|
|
// magic number that identifies the stream as a compressed stream
|
|
#define dwMagicCompressedRTF 0x75465a4c
|
|
|
|
// magic number that identifies the stream as a uncompressed stream
|
|
#define dwMagicUncompressedRTF 0x414c454d
|
|
|
|
// array used for CRC calculations
|
|
extern const DWORD rgdwCRC[];
|
|
|
|
/* IMPORTED FUNCTIONS */
|
|
|
|
/*
|
|
* LogInvalidCpid
|
|
*
|
|
* Imported callback function for logging code page conversion
|
|
* errors. A stub function is provided if a function is
|
|
* not provided by the project linking with RTFLIB
|
|
*
|
|
* The cpid parameter is the unsupported code page ID.
|
|
*
|
|
*/
|
|
|
|
STDAPI_(void) LogInvalidCpid( ULONG cpid );
|
|
|
|
|
|
/* MAIN RTF ROUTINES */
|
|
|
|
/*
|
|
* HrTextFromCompressedRTFStream
|
|
*
|
|
* Takes compressed RTF stream (pstmRTF) and returns a wrapper
|
|
* stream (*ppstmText) giving access to the plain text. The text
|
|
* stream supports Read and CopyTo methods.
|
|
*
|
|
* The pointer psi must be valid until *ppstmText is released.
|
|
* It is updated as *ppstmText is read and is not accurate until
|
|
* all of the text has been read.
|
|
*
|
|
* cpid is the code page for the text stream. It can be any code page
|
|
* INCLUDING unicode. cpid=0 means current system code page. If the
|
|
* requested code page is not supported, S_FALSE warning may be
|
|
* returned during Read or CopyTo operation.
|
|
*/
|
|
|
|
STDAPI_(HRESULT) HrTextFromCompressedRTFStream(LPSTREAM pstmCompressed,
|
|
LPSTREAM FAR *ppstmText, RTFSYNCINFO FAR *psi, ULONG cpid);
|
|
|
|
|
|
/*
|
|
* HrTextFromCompressedRTFStreamEx()
|
|
*
|
|
* Takes compressed RTF stream (pstmRTF) and returns a wrapper
|
|
* stream (*ppstmText) giving access to the plain text. The text
|
|
* stream supports Read and CopyTo methods.
|
|
*
|
|
* The pointer psi must be valid until *ppstmText is released.
|
|
* It is updated as *ppstmText is read and is not accurate until
|
|
* all of the text has been read.
|
|
*
|
|
* rgAttachPos is an array of attachment positions. It must be
|
|
* initialized to the current attachment positions before
|
|
* HrTextFromCompressedRTFStreamEx() is called.
|
|
*
|
|
* cAttach must contain the number of elements in rgAttachPos
|
|
*
|
|
* The pointer to rgAttachPos must be valid until *ppstmText is
|
|
* released. It is updated as *ppstmText is read with the new
|
|
* attachment positions and is not accurate until all of the text
|
|
* has been read.
|
|
*
|
|
* cpid is the code page for the text stream. It can be any code page
|
|
* INCLUDING unicode. cpid=0 means current system code page. If the
|
|
* requested code page is not supported, S_FALSE warning may be
|
|
* returned during Read or CopyTo operation.
|
|
*/
|
|
|
|
STDAPI_(HRESULT) HrTextFromCompressedRTFStreamEx( LPSTREAM pstmCompressed,
|
|
LPSTREAM FAR *ppstmText, RTFSYNCINFO FAR *psi, ULONG cpid,
|
|
ULONG cAttach, ULONG FAR *rgAttachPos );
|
|
|
|
/*
|
|
* HrRTFFromTextStream
|
|
*
|
|
* This function takes a text stream and returns a wrapper
|
|
* stream interface that converts the text to RTF. The
|
|
* stream wrapper is read only and only supports
|
|
* a minimum stream interface.
|
|
*
|
|
* The pointer to rgAttachPos must be valid until *ppstmRTF is
|
|
* released. This array is used to allow the insertion of
|
|
* attachment tags in the RTF.
|
|
*
|
|
* cpid is the code page for the text stream. It is used to
|
|
* set the charset and font in the RTF. No code page conversion
|
|
* is currently done inside this function.
|
|
*/
|
|
|
|
STDAPI_(HRESULT) HrRTFFromTextStream( LPSTREAM pstmText,
|
|
LPSTREAM *ppstmRTF,
|
|
ULONG cpid,
|
|
ULONG cAttach,
|
|
ULONG FAR *rgAttachPos );
|
|
|
|
/*
|
|
* WrapCompressedRTFStream
|
|
*
|
|
* Takes compressed RTF stream (pstmCompressed) and returns a wrapper
|
|
* stream (*ppstmRTF) giving access to uncompressed RTF. The RTF
|
|
* stream can support both Read and Write operations, but to get
|
|
* write access the flag ulFlags must have MAPI_MODIFY bit set.
|
|
*
|
|
* This function also supports reading and writing uncompressed
|
|
* RTF through the use of the STORE_UNCOMPRESSED_RTF flag. For reading,
|
|
* uncompressed RTF streams are detected automatically and thus the
|
|
* STORE_UNCOMPRESSED_RTF flag only has meaning if MAPI_MODIFY is set.
|
|
* If this flag is used, the data will be written in uncompressed form.
|
|
*/
|
|
|
|
STDAPI_(HRESULT) WrapCompressedRTFStream(LPSTREAM pstmCompressed,
|
|
ULONG ulFlags, LPSTREAM FAR *ppstmRTF);
|
|
|
|
/*
|
|
* RTFSync
|
|
* RTFSyncCpid
|
|
*
|
|
* Perforts body and RTF synchronization.
|
|
*
|
|
* If synchronization cannot be performed, RTF properties are removed.
|
|
* It is up to the caller to create new RTF from PR_BODY.
|
|
*
|
|
* cpid is the code page for the body property. It can be any code page
|
|
* EXCLUDING unicode. cpid=0 means current system code page. If the
|
|
* requested code page is not supported, S_FALSE warning is returned.
|
|
* RTFSync is the same as RTFSyncCpid(cpid=0).
|
|
*/
|
|
|
|
STDAPI_(HRESULT) RTFSync(LPMESSAGE lpMessage, ULONG ulFlags,
|
|
BOOL FAR *pfMessageUpdated);
|
|
|
|
STDAPI_(HRESULT) RTFSyncCpid(LPMESSAGE lpMessage, ULONG ulFlags,
|
|
BOOL FAR *pfMessageUpdated, ULONG cpid);
|
|
|
|
/* ulFlags for RTFSync */
|
|
#define RTF_SYNC_RTF_CHANGED ((ULONG) 0x00000001)
|
|
#define RTF_SYNC_BODY_CHANGED ((ULONG) 0x00000002)
|
|
|
|
/*
|
|
* ScUpdateRTFAux
|
|
*
|
|
* Calculates and updates RTF auxiliary properties.
|
|
*/
|
|
|
|
STDAPI_(SCODE) ScUpdateRTFAux(LPMESSAGE lpMessage,
|
|
BOOL FAR *lpfMessageUpdated);
|
|
|
|
STDAPI_(SCODE) ScUpdateRTFAuxCpid(LPMESSAGE lpMessage,
|
|
BOOL FAR *lpfMessageUpdated, ULONG cpid);
|
|
|
|
/*
|
|
* HrAppendTextToCompressedRTF
|
|
*
|
|
* Takes a text buffer (pbText, cchText) and appends it to the compressed
|
|
* RTF property of the message (lpMessage) appying default text formatting.
|
|
*
|
|
* The text can be added either at the beginning of the message
|
|
* (RTF_APPEND_BEGIN) or at the end (RTF_APPEND_END).
|
|
* The text can be treated as a plain text (RTF_APPEND_PLAIN_TEXT)
|
|
* or as a piece of text with some RTF formatting in it
|
|
* (RTF_APPEND_RTF_TEXT).
|
|
*
|
|
* If case of RTF text, cchText is the number of plain text characters.
|
|
*
|
|
* cpid is the code page for the text stream. It should be one of
|
|
* Windows code pages EXCLUDING unicode. cpid=0 means current system
|
|
* code page. If the requested code page is not supported,
|
|
* S_FALSE warning is returned.
|
|
*/
|
|
|
|
STDAPI_(HRESULT) HrAppendTextToCompressedRTF(LPMESSAGE lpMessage,
|
|
LPSTR strText, ULONG cchText, ULONG ulFlags, ULONG cpid);
|
|
|
|
/* ulFlags for HrAppendTextToCompressedRTF */
|
|
/* text properties (mutually exclusive) */
|
|
#define RTF_APPEND_RTF_TEXT ((ULONG) 0x00000001)
|
|
#define RTF_APPEND_PLAIN_TEXT ((ULONG) 0x00000000)
|
|
/* append position (mutually exclusive) */
|
|
#define RTF_APPEND_BEGIN ((ULONG) 0x00000002)
|
|
#define RTF_APPEND_END ((ULONG) 0x00000000)
|
|
|
|
/* ATTACHMENT TABLE HANDLING ROUTINES */
|
|
|
|
/*
|
|
* ScGetAttachTable()
|
|
*
|
|
* Takes a message and returns a pointer to the set of rows in
|
|
* the attachment table (ppRowSet), the number of attachments
|
|
* (pcAttach), and a pointer to an array of ULONGs containing
|
|
* the PR_RENDERING_POSITIONs for the attachments in sorted
|
|
* order.
|
|
*
|
|
*/
|
|
|
|
STDAPI_(SCODE) ScGetAttachTable(LPMESSAGE pmsg, LPSRowSet *ppRowSet,
|
|
UINT *pcAttach, ULONG **prgAttachPos);
|
|
|
|
/*
|
|
* ScUpdateAttachTable()
|
|
*
|
|
* Takes a message, a rowset for the attachment table, the
|
|
* number of attachments, and an array of rendering positions
|
|
* to update the attachment table with. This function is
|
|
* designed to be used in conjunction with ScGetAttachTable().
|
|
* The BOOLEAN pointed to by pfUpdated will be set to TRUE if
|
|
* the attachment table was modified.
|
|
*
|
|
*/
|
|
|
|
STDAPI_(SCODE) ScUpdateAttachTable(LPMESSAGE pmsg, LPSRowSet pRowSet,
|
|
UINT cAttach, ULONG *rgAttachPos, BOOL *pfUpdated);
|
|
|
|
|
|
/* CPID CONVERSION ROUTINES */
|
|
|
|
/*
|
|
* These functions are in a separate object file (cpmap.obj),
|
|
* since on the store side they are linked into a different DLL.
|
|
*/
|
|
|
|
STDAPI_(ULONG) WinCpidFromCpid (ULONG cpid);
|
|
STDAPI_(ULONG) CharsetFromCpid (ULONG cpid);
|
|
STDAPI_(ULONG) CpidFromCharset (ULONG charset);
|
|
STDAPI_(CHAR FAR*) SzDefFontFmtFromCpid (ULONG cpid);
|
|
|
|
|
|
#pragma option pop /*P_O_Pop*/
|
|
#endif /* RTFLIB_H */
|