/** -------------------------------------------------------------------- * @file mime.h * @brief Declaration of main mime parser components * @author Andreas Aardal Hanssen * @date Andreas Aardal Hanssen * ----------------------------------------------------------------- **/ #ifndef mime_h_included #define mime_h_included #include #include #include #include namespace Binc { //---------------------------------------------------------------------- class HeaderItem { private: mutable std::string key; mutable std::string value; public: inline const std::string &getKey(void) const { return key; } inline const std::string &getValue(void) const { return value; } //-- HeaderItem(void); HeaderItem(const std::string &key, const std::string &value); }; //---------------------------------------------------------------------- class Header { private: mutable std::vector content; public: bool getFirstHeader(const std::string &key, HeaderItem &dest) const; bool getAllHeaders(const std::string &key, std::vector &dest) const; void add(const std::string &name, const std::string &content); void clear(void) const; //-- Header(void); ~Header(void); }; //---------------------------------------------------------------------- class IODevice; class MimeDocument; class MimePart { protected: public: mutable bool multipart; mutable bool messagerfc822; mutable std::string subtype; mutable std::string boundary; mutable unsigned int headerstartoffsetcrlf; mutable unsigned int headerlength; mutable unsigned int bodystartoffsetcrlf; mutable unsigned int bodylength; mutable unsigned int nlines; mutable unsigned int nbodylines; mutable unsigned int size; public: enum FetchType { FetchBody, FetchHeader, FetchMime }; mutable Header h; mutable std::vector members; inline const std::string &getSubType(void) const { return subtype; } inline bool isMultipart(void) const { return multipart; } inline bool isMessageRFC822(void) const { return messagerfc822; } inline unsigned int getSize(void) const { return bodylength; } inline unsigned int getNofLines(void) const { return nlines; } inline unsigned int getNofBodyLines(void) const { return nbodylines; } inline unsigned int getBodyLength(void) const { return bodylength; } inline unsigned int getBodyStartOffset(void) const { return bodystartoffsetcrlf; } void printBody(int fd, Binc::IODevice &output, unsigned int startoffset, unsigned int length) const; void printHeader(int fd, Binc::IODevice &output, std::vector headers, bool includeheaders, unsigned int startoffset, unsigned int length, std::string &storage) const; void printDoc(int fd, Binc::IODevice &output, unsigned int startoffset, unsigned int length) const; virtual void clear(void) const; const MimePart *getPart(const std::string &findpart, std::string genpart, FetchType fetchType = FetchBody) const; virtual int parseOnlyHeader(const std::string &toboundary) const; virtual int parseFull(const std::string &toboundary, int &boundarysize) const; MimePart(void); virtual ~MimePart(void); }; //---------------------------------------------------------------------- class MimeDocument : public MimePart { private: mutable bool headerIsParsed; mutable bool allIsParsed; public: void parseOnlyHeader(int fd) const; void parseFull(int fd) const; void clear(void) const; inline bool isHeaderParsed(void) { return headerIsParsed; } inline bool isAllParsed(void) { return allIsParsed; } //-- MimeDocument(void); ~MimeDocument(void); }; }; #endif