#ifndef __IMFHeader_h__ # define __IMFHeader_h__ # include "Parser.h" # include "MString.h" # include namespace coreutils { /// /// IMFHeader parses a full block of IMF/MIME-style headers (RFC 5322 /// "name: value" pairs, one per line, with folded continuation lines - /// any line starting with a space or tab is appended to the previous /// field's value) from the shared StreamReader, stopping at the blank /// line that terminates the header block. Resumable across any number of /// StreamReader::feed() calls - partially-read names/values accumulate /// in the name/field members rather than being discarded between calls. /// class IMFHeader : public Parser { public: IMFHeader(StreamReader &reader); /// /// Valid once doParse() has returned Status::COMPLETE - every header /// field parsed, keyed by field name. /// std::map &getHeaders(); protected: Status parse() override; private: enum State { NAME, SKIP_SPACE, FIELD, FOLD_CHECK } state = NAME; MString name; MString field; std::map headers; void commitField(); }; } #endif