Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

197 lines
6.0 KiB

// rtfparser.h
// Define parser class
#ifndef _RTFPARSER_H_
#define _RTFPARSER_H_
// Error Code
#define ecOK 0 // Everything's fine!
#define ecStackUnderflow 1 // Unmatched '}'
#define ecStackOverflow 2 // Too many '{' -- memory exhausted
#define ecUnmatchedBrace 3 // RTF ended during an open group.
#define ecInvalidHex 4 // invalid hex character found in data
#define ecBadTable 5 // RTF table (sym or prop) invalid
#define ecAssertion 6 // Assertion failure
#define ecEndOfFile 7 // End of file reached while reading RTF
#define ecOutOfMemory 8 // Memery allocate failed...
#define ecBufTooSmall 9 // Write buffer too small
// Rtf Destination State
typedef enum { rdsNorm, rdsSkip } RDS;
// Rtf Internal State
typedef enum { risNorm, risBin, risHex } RIS;
// special process
typedef enum { ipfnBin, ipfnHex, ipfnSkipDest } IPFN;
typedef enum { idestPict, idestSkip } IDEST;
// keyword type
typedef enum { kwdChar, kwdDest, kwdProp, kwdSpec } KWD;
// save buffer status
typedef enum { bsDefault, bsText, bsHex } BSTATUS;
// keyword table
typedef struct tagSymbol
{
char *szKeyword; // RTF keyword
KWD kwd; // base action to take
int idx; // index into property table if kwd == kwdProp
// index into destination table if kwd == kwdDest
// character to print if kwd == kwdChar
} SYM;
// save stack
typedef struct tagSave // property save structure
{
struct tagSave *pNext; // next save
RDS rds;
RIS ris;
} SAVE;
typedef struct tagKeyword
{
WORD wStatus;
char szKeyword[30];
char szParameter[20];
} SKeyword;
// tagKeyword status
enum { KW_ENABLE = 0x0001, // enable searching
KW_PARAM = 0x0002, // found keyword, if have parameter
KW_FOUND = 0x0004 // if found keyword
};
// parser class def
class CRtfParser
{
public:
// ctor
CRtfParser(BYTE* pchInput, UINT cchInput,
BYTE* pchOutput, UINT cchOutput);
// dtor
~CRtfParser() {};
// Check signature
BOOL fRTFFile();
// Get RTF version
int GetVersion(PDWORD pdwMajor);
// Get codepage
int GetCodepage(PDWORD pdwCodepage);
// start
int Do();
// return result buffer size
int GetResult(PDWORD pdwSize) {
*pdwSize = m_uOutPos;
return ecOK;
}
private:
// clear internal status
void Reset(void);
// PushRtfState
// Save relevant info on a linked list of SAVE structures.
int PushRtfState(void);
// PopRtfState
int PopRtfState(void);
// ReleaseRtfState
int ReleaseRtfState(void);
// ParseChar
// Route the character to the appropriate destination stream.
int ParseChar(BYTE ch, BSTATUS bsStatus);
// ParseRtfKeyword
// get a control word (and its associated value) and
// call TranslateKeyword to dispatch the control.
int ParseRtfKeyword();
// TranslateKeyword.
int TranslateKeyword(char *szKeyword, char* szParameter);
// ParseSpecialKeyword
// Evaluate an RTF control that needs special processing.
int ParseSpecialKeyword(IPFN ipfn, char* szParameter);
// ChangeDest
// Change to the destination specified by idest.
// There's usually more to do here than this...
int ChangeDest(IDEST idest);
// Buffer funcs
// GetByte
// Get one char from input buffer
int GetByte(BYTE* pch);
// unGetByte
// adjust the cursor, return one char
int unGetByte(BYTE ch);
// SaveByte
// Save one char to output buffer
int SaveByte(BYTE ch);
// SetStatus
// set the buffer status, if buffer status changed then start convert
int SetStatus(BSTATUS bsStatus);
// Hex2Char
// convert hex string to char string
int Hex2Char(BYTE* pchSrc, UINT cchSrc, BYTE* pchDes, UINT cchDes, UINT* pcchLen);
// Char2Hex
// convert char string to hex string
int Char2Hex(BYTE* pchSrc, UINT cchSrc, BYTE* pchDes, UINT cchDes, UINT* pcchLen);
// GetUnicodeDestination
// convert unicode string to unicode destination in RTF
int GetUnicodeDestination(BYTE* pchUniDes, LPWSTR pwchStr, UINT wchLen, UINT* pcchLen);
// WideCharToKeyword
// map one wide char to \u keyword
int WideCharToKeyword(WCHAR wch, BYTE* pch, UINT* pcchLen);
private:
//
BOOL m_fInit;
// member for parser
INT m_cGroup; // count of '{' and '}' pair
UINT m_cbBin; // length of data block if \BIN
RIS m_ris; // internal status
RDS m_rds; // destination status
BOOL m_fSkipDestIfUnk; // indicate how to process "\*"
SAVE* m_psave; // status stack
// member for IO buffer
BYTE* m_pchInput; // input buffer
UINT m_cchInput;
UINT m_uCursor; // current position when read buffer
BYTE* m_pchOutput; // output buffer
UINT m_cchOutput; // output buffer size
UINT m_uOutPos; // current position of write buffer
BSTATUS m_bsStatus; // buffer status to control conversion
UINT m_uConvStart; // start point of buffer when convert
UINT m_cchConvLen; // length of buffer to convert
// member when get specific keyword
SKeyword m_sKeyword;
};
#endif // _RTFPARSER_H_