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.
131 lines
3.7 KiB
131 lines
3.7 KiB
//
|
|
// Microsoft Corporation - Copyright 1997
|
|
//
|
|
|
|
//
|
|
// MULTPARS.H - Multipart parser (CMultipartParse) header
|
|
//
|
|
|
|
|
|
// Turn this on to compile a file saving version
|
|
// #define FILE_SAVE
|
|
|
|
#ifndef _MULTPARS_H_
|
|
#define _MULTPARS_H_
|
|
|
|
enum LEXICON {
|
|
LEX_UNKNOWN,
|
|
LEX_SPACE,
|
|
LEX_CRLF,
|
|
LEX_BEGIN_COMMENT,
|
|
LEX_END_COMMENT,
|
|
LEX_QUOTE,
|
|
LEX_SEMICOLON,
|
|
LEX_SLASH,
|
|
// Body keywords
|
|
LEX_CONTENTDISP,
|
|
LEX_CONTENTTYPE,
|
|
// Field IDs
|
|
LEX_NAMEFIELD,
|
|
LEX_FILENAMEFIELD,
|
|
// MIME types
|
|
LEX_MULTIPART,
|
|
LEX_TEXT,
|
|
LEX_APPLICATION,
|
|
LEX_AUDIO,
|
|
LEX_IMAGE,
|
|
LEX_MESSAGE,
|
|
LEX_VIDEO,
|
|
LEX_MIMEEXTENSION,
|
|
// MIME subtypes
|
|
LEX_FORMDATA,
|
|
LEX_ATTACHMENT,
|
|
LEX_MIXED,
|
|
LEX_PLAIN,
|
|
LEX_XMSDOWNLOAD,
|
|
LEX_OCTETSTREAM,
|
|
LEX_BINARY,
|
|
// Boundary
|
|
LEX_BOUNDARY, // "CR/LF" ended boundary string
|
|
LEX_EOT, // double-dashed ended boundary string
|
|
LEX_STARTBOUNDARY // boundary string missing first CR/LF
|
|
};
|
|
|
|
typedef struct {
|
|
LPSTR lpszName; // token name
|
|
LEXICON eLex; // token value
|
|
DWORD cLength; // length of lpszName, filled in at runtime,
|
|
// should be ZERO in table def
|
|
DWORD dwColor; // debugging color to be used
|
|
LPSTR lpszComment; // debugging comment to be displayed
|
|
} PARSETABLE, *LPPARSETABLE;
|
|
|
|
typedef struct {
|
|
LEXICON eContentDisposition;
|
|
LPSTR lpszNameField;
|
|
LPSTR lpszFilenameField;
|
|
LPSTR lpszBodyContents;
|
|
DWORD dwContentType;
|
|
DWORD dwContentSubtype;
|
|
} BODYHEADERINFO, *LPBODYHEADERINFO;
|
|
|
|
#define LPBHI LPBODYHEADERINFO
|
|
|
|
|
|
class CMultipartParse : public CBase
|
|
{
|
|
public:
|
|
CMultipartParse( LPECB lpEcb, LPSTR *lppszOut, LPSTR *lppszDebug, LPDUMPTABLE lpDT );
|
|
~CMultipartParse( );
|
|
|
|
// Starts parsing data using infomation from server headers
|
|
BOOL PreParse( LPBYTE lpbData, LPDWORD lpdwParsed );
|
|
|
|
private:
|
|
LPBYTE _lpbData; // Memory containing send data
|
|
LPBYTE _lpbParse; // Current parse location into _lpbData
|
|
LPBYTE _lpbLastParse; // Last location of Lex parsing
|
|
|
|
LPSTR _lpszBoundary; // Boundary string
|
|
DWORD _cbBoundary; // Boundary string length
|
|
|
|
// Debugging Data dump
|
|
DWORD _cbDT; // Counter
|
|
|
|
// Lex
|
|
LEXICON Lex( ); // finds next Lex
|
|
BOOL BackupLex( LEXICON dwLex ); // moves back one Lex
|
|
LPSTR FindTokenName( LEXICON dwLex ); // finds Lex's name
|
|
BOOL GetToken( ); // moves post a token of valid
|
|
// header characters
|
|
|
|
// states
|
|
BOOL ParseBody( ); // initial state
|
|
BOOL BodyHeader( );
|
|
BOOL ContentDisposition( LPBODYHEADERINFO lpBHI );
|
|
BOOL ContentType( LPBODYHEADERINFO lpBHI );
|
|
BOOL BodyContent( LPBODYHEADERINFO lpBHI );
|
|
|
|
// utilities
|
|
BOOL GetBoundaryString( LPBYTE lpbData );
|
|
BOOL GetQuotedString( LPSTR *lppszBuf );
|
|
BOOL HandleComments( );
|
|
#ifndef FILE_SAVE
|
|
BOOL MemoryCompare( LPBYTE lpbSrc1, LPBYTE lpbSrc2, DWORD dwSize );
|
|
#endif
|
|
BOOL FindNextBoundary( LPDWORD lpdwSize );
|
|
|
|
// files
|
|
BOOL HandleFile( LPSTR lpszFilename );
|
|
#ifndef FILE_SAVE
|
|
BOOL FileCompare( LPBYTE lpbStart, LPSTR lpszFilename, DWORD dwSize );
|
|
#else // FILE_SAVE
|
|
BOOL FileSave( LPBYTE lpbStart, LPSTR lpszFilename, DWORD dwSize );
|
|
#endif // FILE_SAVE
|
|
BOOL FixFilename( LPSTR lpszFilename, LPSTR *lppszNewFilename );
|
|
|
|
CMultipartParse( );
|
|
|
|
}; // CMultipartParse
|
|
|
|
#endif // _MULTPARS_H_
|