#ifndef _INCLUDED_BOBCAT__MAILHEADERS_
#define _INCLUDED_BOBCAT_MAILHEADERS_

#include <istream>
#include <string>
#include <vector>

namespace FBB
{
    class MailHeaders: public std::vector<std::string>
    {
        public:
            typedef std::vector<size_t>       HdrLine;
            typedef std::vector<HdrLine>        Hdr;
            typedef std::pair<std::string, Hdr> HdrPair;

            typedef Hdr::const_iterator         const_iterator;
            typedef std::reverse_iterator<const_iterator>
                                                const_reverse_iterator; 
            enum Mode
            {
                DONT_READ,
                READ
            };
            enum Match
            {
                FAIL,
                INITIAL,
                PARTIAL,
                FULL
            };

        private:
            std::vector<HdrPair>    d_index;
            std::istream            &d_in;
            std::string             d_hdr;
            Match                   d_match;
        
            enum Where
            {
                BEGIN,
                END,
            };

        public:
            MailHeaders(std::istream &in, Mode mode = READ);
            void read();
            void setHeaderIterator(char const *header, Match match = FULL)
            {
                d_hdr = header;
                d_match = match;
            }
            const_iterator beginh() const
            {
                return getIterator(BEGIN);

            }
            const_iterator endh() const
            {
                return getIterator(END);
            }
            const_reverse_iterator rbeginh() const
            {
                return const_reverse_iterator(endh());
            }
            const_reverse_iterator rendh() const
            {
                return const_reverse_iterator(beginh());
            }

        private:
            void continueHeader(std::string const &line, HdrLine *hdrLine);
            HdrLine *startHeader(std::string const &line);
            std::string::size_type lookup(char const *header, Match type) 
                                                                    const;
            const_iterator getIterator(Where where) const;
            
    };
}
        
#endif


