/** * @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() const { return key; } inline const std::string &getValue() const { return value; } HeaderItem(); 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() const; Header(); ~Header(); }; 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() const { return subtype; } inline bool isMultipart() const { return multipart; } inline bool isMessageRFC822() const { return messagerfc822; } inline unsigned int getSize() const { return bodylength; } inline unsigned int getNofLines() const { return nlines; } inline unsigned int getNofBodyLines() const { return nbodylines; } inline unsigned int getBodyLength() const { return bodylength; } inline unsigned int getBodyStartOffset() 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() 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(); virtual ~MimePart(); }; class MimeDocument : public MimePart { private: mutable bool headerIsParsed; mutable bool allIsParsed; public: void parseOnlyHeader(int fd) const; void parseFull(int fd) const; void clear() const; inline bool isHeaderParsed() { return headerIsParsed; } inline bool isAllParsed() { return allIsParsed; } MimeDocument(); ~MimeDocument(); }; }; #endif