#ifndef __MIME_H__
#define __MIME_H__
#define MAX_LENGTH_BOUNDARY 128
#define HTTP_HEADER_COMPLETE 0x01
#define HTTP_DATA_COMPLETE 0x02
enum CASC_MIME_ENCODING
{
MimeEncodingTextPlain,
MimeEncodingBase64,
MimeEncodingQuotedPrintable,
MimeEncodingMax
};
enum CASC_PRESENCE
{
FieldPresenceUnknown,
FieldPresencePresent,
FieldPresenceNotPresent
};
struct CASC_MIME_RESPONSE
{
CASC_MIME_RESPONSE()
{
header_offset = header_length = CASC_INVALID_SIZE_T;
content_offset = content_length = CASC_INVALID_SIZE_T;
http_code = CASC_INVALID_SIZE_T;
clength_presence = http_presence = FieldPresenceUnknown;
response_length = 0;
}
bool ParseResponse(const char * response, size_t length, bool final = false);
size_t response_length; size_t header_offset; size_t header_length; size_t content_offset; size_t content_length; size_t http_code; CASC_PRESENCE clength_presence; CASC_PRESENCE http_presence; };
struct CASC_MIME_BLOB
{
CASC_MIME_BLOB(char * mime_ptr, char * mime_end);
~CASC_MIME_BLOB();
char * GetNextLine();
char * ptr;
char * end;
};
class CASC_MIME_ELEMENT
{
public:
CASC_MIME_ELEMENT();
~CASC_MIME_ELEMENT();
DWORD GiveAway(CASC_BLOB & target);
DWORD LoadSingle(char * data, size_t data_length);
DWORD Load(char * mime_data_begin, char * mime_data_end, const char * boundary_ptr = NULL);
CASC_MIME_ELEMENT * GetChild() { return folder.pChild; }
#ifdef CASCLIB_DEBUG
void Print(size_t nLevel, size_t nIndex);
#endif
protected:
CASC_MIME_ELEMENT * AllocateAndLoadElement(char * a_mime_data, char * a_mime_data_end, const char * boundary_begin);
bool ExtractEncoding(const char * line, CASC_MIME_ENCODING & Encoding);
bool ExtractBoundary(const char * line);
DWORD DecodeTextPlain(char * content_begin, char * content_end, CASC_BLOB & output);
DWORD DecodeQuotedPrintable(char * content_begin, char * content_end, CASC_BLOB & output);
DWORD DecodeBase64(char * content_begin, char * content_end, CASC_BLOB & output);
struct
{
CASC_MIME_ELEMENT * pChild; CASC_MIME_ELEMENT * pNext; } folder;
CASC_BLOB data;
char boundary[MAX_LENGTH_BOUNDARY];
};
class CASC_MIME
{
public:
CASC_MIME();
~CASC_MIME();
DWORD GiveAway(CASC_BLOB & target);
DWORD Load(char * data, CASC_MIME_RESPONSE & MimeResponse);
#ifdef CASCLIB_DEBUG
void Print();
#endif
protected:
CASC_MIME_ELEMENT root;
};
#endif