00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00026
00027
00028
00029 #include <boost/io/ios_state.hpp>
00030 #include <senf/Utils/hexdump.hh>
00031 #include <senf/Utils/TypeInfo.hh>
00032 #include <senf/Utils/Format.hh>
00033
00034 #define prefix_
00035
00036
00037
00038
00039
00040 template <class Base>
00041 template <class Parser>
00042 prefix_ Parser senf::GenericTLVParserBase<Base>::init()
00043 {
00044 PacketParserBase::size_type oldSize (bytes() );
00045 PacketParserBase::size_type newParserSize ( senf::init_bytes<Parser>::value );
00046 this->resize( oldSize, newParserSize);
00047 std::fill(this->i(), boost::next(this->i(), newParserSize), 0u);
00048 Parser concreteParser = Parser(this->i(), this->state() );
00049 concreteParser.init();
00050
00051 return concreteParser;
00052 }
00053
00054 template <class Base>
00055 prefix_ void senf::GenericTLVParserBase<Base>::dump(std::ostream & os)
00056 const
00057 {
00058 if (Base::Registry::instance().isRegistered( *this)) {
00059 Base::Registry::instance().dump( *this, os);
00060 } else {
00061 boost::io::ios_all_saver ias(os);
00062 os << " GenericTLVParser<" << prettyName(typeid(Base)) << ">\n"
00063 << " type: " << format::dumpint(this->type()) << "\n"
00064 << " length: " << format::dumpint(this->length()) << "\n"
00065 << " value:\n";
00066 hexdump(value().begin(), value().end(), os);
00067 }
00068 }
00069
00070 template <class Base>
00071 prefix_ senf::PacketInterpreterBase::range senf::GenericTLVParserBase<Base>::value()
00072 const
00073 {
00074 PacketData::iterator begin ( boost::next(this->i(), senf::bytes( self())) );
00075 return PacketInterpreterBase::range(begin, boost::next( begin, this->length()) );
00076 }
00077
00078 template <class Base>
00079 template <class ForwardReadableRange>
00080 prefix_ void senf::GenericTLVParserBase<Base>::value_(ForwardReadableRange const &range)
00081 {
00082
00083 unsigned rangeSize ( boost::size(range));
00084 if ( rangeSize != this->length() )
00085 resize( bytes(), rangeSize + senf::bytes(self()) );
00086 std::copy( boost::begin(range), boost::end(range), boost::next(
00087 this->i(), senf::bytes( self())) );
00088 this->length_() = rangeSize;
00089 }
00090
00091
00092
00093
00094
00095 template <class BaseParser, class Keytype>
00096 template <typename Parser>
00097 prefix_ void senf::GenericTLVParserRegistry<BaseParser,Keytype>::registerParser()
00098 {
00099 Keytype key (Parser::typeId+0);
00100 typename Map::iterator i (map_.find( key ));
00101 if (i == map_.end() )
00102 map_.insert(key, new detail::GenericTLVParserRegistry_Entry<BaseParser, Parser>() );
00103 }
00104
00105
00106
00107 #if BOOST_VERSION < 103400
00108 #define PTRMAP_GET_CONTENTS(v) (v)
00109 #else
00110 #define PTRMAP_GET_CONTENTS(v) (*(v).second)
00111 #endif
00112
00113 template <class BaseParser, class Keytype>
00114 prefix_ void senf::GenericTLVParserRegistry<BaseParser,Keytype>::dump(
00115 GenericTLVParser const & parser, std::ostream & os)
00116 const
00117 {
00118 typename Map::const_iterator i (map_.find( parser.type()));
00119 if (i != map_.end())
00120 PTRMAP_GET_CONTENTS(*i).dump(parser, os);
00121 }
00122
00123 template <class BaseParser, class Keytype>
00124 prefix_ void senf::GenericTLVParserRegistry<BaseParser,Keytype>::dump(
00125 GenericTLVParser const & parser, Keytype const & key, std::ostream & os)
00126 const
00127 {
00128 typename Map::const_iterator i (map_.find( key));
00129 if (i != map_.end())
00130 PTRMAP_GET_CONTENTS(*i).dump(parser, os);
00131 }
00132
00133 template <class BaseParser, class Keytype>
00134 prefix_ senf::PacketParserBase::size_type senf::GenericTLVParserRegistry<BaseParser,Keytype>::bytes(
00135 GenericTLVParser const & parser)
00136 const
00137 {
00138 typename Map::const_iterator i (map_.find( parser.type()));
00139 if (i != map_.end())
00140 return PTRMAP_GET_CONTENTS(*i).bytes(parser);
00141 else
00142 throw TLVParserNotRegisteredException();
00143 }
00144
00145 template <class BaseParser, class Keytype>
00146 prefix_ senf::PacketParserBase::size_type senf::GenericTLVParserRegistry<BaseParser,Keytype>::bytes(
00147 GenericTLVParser const & parser, Keytype const & key)
00148 const
00149 {
00150 typename Map::const_iterator i (map_.find( key));
00151 if (i != map_.end())
00152 return PTRMAP_GET_CONTENTS(*i).bytes(parser);
00153 else
00154 throw TLVParserNotRegisteredException();
00155 }
00156
00157 #undef PTRMAP_GET_CONTENTS
00158
00159
00160 #undef prefix_
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171