File: mailheaders

package info (click to toggle)
bobcat 2.08.01-1
  • links: PTS
  • area: main
  • in suites: squeeze
  • size: 5,668 kB
  • ctags: 953
  • sloc: cpp: 10,403; makefile: 9,042; perl: 401; sh: 195
file content (141 lines) | stat: -rw-r--r-- 4,293 bytes parent folder | download
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