Utils/Logger: Complete unit testing
[senf.git] / Packets / PacketParser.cci
1 // Copyright (C) 2007 
2 // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
3 // Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
4 //     Stefan Bund <g0dil@berlios.de>
5 //
6 // This program is free software; you can redistribute it and/or modify
7 // it under the terms of the GNU General Public License as published by
8 // the Free Software Foundation; either version 2 of the License, or
9 // (at your option) any later version.
10 //
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 // GNU General Public License for more details.
15 //
16 // You should have received a copy of the GNU General Public License
17 // along with this program; if not, write to the
18 // Free Software Foundation, Inc.,
19 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
20
21 /** \file
22     \brief PacketParser inline non-template implementation */
23
24 // Custom includes
25 #include <iterator>
26 #include "PacketData.hh"
27
28 #define prefix_ inline
29 ///////////////////////////////cci.p///////////////////////////////////////
30
31 ///////////////////////////////////////////////////////////////////////////
32 // senf::PacketParserBase
33
34 prefix_ senf::PacketParserBase::data_iterator senf::PacketParserBase::i()
35     const
36 {
37     return i_;
38 }
39
40 prefix_ senf::PacketParserBase::state_type senf::PacketParserBase::state()
41     const
42 {
43     return data_;
44 }
45
46 prefix_ senf::PacketData & senf::PacketParserBase::data()
47     const
48 {
49     return * data_;
50 }
51
52 prefix_ void senf::PacketParserBase::init()
53     const
54 {}
55
56 prefix_ void senf::PacketParserBase::defaultInit()
57     const
58 {}
59
60 prefix_ senf::Packet senf::PacketParserBase::packet()
61     const
62 {
63     // OUCH ... I hate this but for some awkward packet types, access to the packet
64     // from the parser is really needed (e.g. UDP when building the pseudo-header
65     // for calculating the checksum).
66     return Packet(PacketInterpreterBase::ptr(static_cast<PacketInterpreterBase*>(&data())));
67 }
68
69 ////////////////////////////////////////
70 // protected members
71
72 prefix_ senf::PacketParserBase::PacketParserBase(data_iterator i, state_type s)
73     : i_ (i), data_ (s)
74 {}
75
76 prefix_ senf::PacketParserBase::PacketParserBase(data_iterator i, state_type s, 
77                                                  size_type size)
78     : i_ (i), data_ (s)
79 {
80     validate(size);
81 }
82
83 prefix_ bool senf::PacketParserBase::check(size_type size)
84     const
85 {
86     return size <= size_type(std::distance(i(),end()));
87 }
88
89 prefix_ void senf::PacketParserBase::validate(size_type size)
90     const
91 {
92     if (! check(size))
93         throw TruncatedPacketException();
94 }
95
96 ////////////////////////////////////////
97 // private members
98
99 prefix_ senf::PacketParserBase::data_iterator senf::PacketParserBase::end()
100     const
101 {
102     return data_->end();
103 }
104
105 ///////////////////////////////cci.e///////////////////////////////////////
106 #undef prefix_
107
108 \f
109 // Local Variables:
110 // mode: c++
111 // fill-column: 100
112 // c-file-style: "senf"
113 // indent-tabs-mode: nil
114 // ispell-local-dictionary: "american"
115 // compile-command: "scons -u test"
116 // comment-column: 40
117 // End: