1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
#ifndef INCLUDED_BOBCAT__MAILHEADERS_
#define INCLUDED_BOBCAT_MAILHEADERS_
#include <istream>
#include <string>
#include <vector>
#include <bobcat/string>
#include <bobcat/errno>
namespace FBB
{
class MailHeaders: public std::vector<std::string>
{
public:
enum Mode
{
DONT_READ,
READ
};
enum Match
{
FAIL,
INITIAL,
PARTIAL,
FULL,
caseInsensitive,
CASE_INITIAL = caseInsensitive,
CASE_PARTIAL,
CASE_FULL,
lastMatch = CASE_FULL
};
private:
enum Size
{
SIZEOFMATCH = lastMatch + 1,
};
std::istream &d_in;
std::string d_hdr;
Match d_match;
class const_hdr_iterator:
public std::iterator<std::input_iterator_tag,
std::string const>
{
friend class MailHeaders;
typedef bool(*Comparator)(std::string const &header,
std::string const &key);
MailHeaders const *d_mh;
std::string d_key;
Comparator d_comparator;
const_iterator d_current;
static Comparator s_comparator[];
const_hdr_iterator(MailHeaders const *mailHeaders,
const_iterator begin);
const_iterator lookup(const_iterator const &old) const;
const_iterator lookdown(const_iterator const &old) const;
static bool fail(std::string const &hdr,
std::string const &key);
static bool initial(std::string const &hdr,
std::string const &key);
static bool partial(std::string const &hdr,
std::string const &key);
static bool full(std::string const &hdr,
std::string const &key);
static bool caseInitial(std::string const &hdr,
std::string const &key);
static bool casePartial(std::string const &hdr,
std::string const &key);
static bool caseFull(std::string const &hdr,
std::string const &key);
public:
const_hdr_iterator &operator++();
const_hdr_iterator &operator--();
const_hdr_iterator const operator++(int);
const_hdr_iterator const operator--(int);
bool operator==(const_hdr_iterator const &other) const;
bool operator!=(const_hdr_iterator const &other) const;
std::string const &operator*() const;
std::string const *operator->() const;
};
public:
typedef std::reverse_iterator<const_hdr_iterator>
const_reverse_hdr_iterator;
explicit MailHeaders(std::istream &in, Mode mode = READ);
void read();
void setHeaderIterator(char const *header, Match match = FULL);
const_hdr_iterator beginh() const;
const_hdr_iterator endh() const;
const_reverse_hdr_iterator rbeginh() const;
const_reverse_hdr_iterator rendh() const;
};
inline void MailHeaders::setHeaderIterator(char const *header, Match match)
{
d_hdr = header;
d_match = match;
}
inline MailHeaders::const_hdr_iterator MailHeaders::beginh() const
{
return const_hdr_iterator(this, begin());
// returns iterator over all headers
// matching d_hdr by the d_match type
}
inline MailHeaders::const_hdr_iterator MailHeaders::endh() const
{
// returns address of the sentinel
return const_hdr_iterator(this, end());
}
inline MailHeaders::const_reverse_hdr_iterator MailHeaders::rbeginh() const
{
return const_reverse_hdr_iterator(endh());
}
inline MailHeaders::const_reverse_hdr_iterator MailHeaders::rendh() const
{
return const_reverse_hdr_iterator(beginh());
}
} // FBB
#endif
|