X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPackets%2FListOptionTypeParser.cti;h=819f15e32cfa808365e117fbc0f7dc8dafb63faf;hb=8c6873a925c79e6bb640f82895b31f4cbd84ef30;hp=125921dee60132bcf3113fc94b136e9a10166f66;hpb=25976ed67c66d30811fa0a01043e50347e9d1e69;p=senf.git diff --git a/senf/Packets/ListOptionTypeParser.cti b/senf/Packets/ListOptionTypeParser.cti index 125921d..819f15e 100644 --- a/senf/Packets/ListOptionTypeParser.cti +++ b/senf/Packets/ListOptionTypeParser.cti @@ -33,32 +33,50 @@ /////////////////////////////////////////////////////////////////////////// // senf::detail::ListOptionTypeParser_Policy -template -prefix_ senf::detail::ListOptionTypeParser_Policy::ListOptionTypeParser_Policy() { -} +template +prefix_ +senf::detail::ListOptionTypeParser_Policy:: +ListOptionTypeParser_Policy() +{} -template -template -prefix_ senf::detail::ListOptionTypeParser_Policy::ListOptionTypeParser_Policy(Arg const & arg) :AuxPolicy(arg) { -} +template +template +prefix_ +senf::detail::ListOptionTypeParser_Policy:: +ListOptionTypeParser_Policy(Arg const & arg) + : AuxPolicy(arg) +{} -template +template prefix_ typename senf::detail::ListOptionTypeParser_Policy::size_type -senf::detail::ListOptionTypeParser_Policy::bytes(data_iterator i, state_type s) const { - return AuxPolicy::aux(i, s) + AuxPolicy::aux_bytes; +senf::detail::ListOptionTypeParser_Policy::bytes(data_iterator i, + state_type s) + const +{ + return ((AuxPolicy::aux(i, s) * 8 + 6) + AuxPolicy::aux_bytes); } -template +template prefix_ typename senf::detail::ListOptionTypeParser_Policy::size_type -senf::detail::ListOptionTypeParser_Policy::size(data_iterator i, state_type s) const { +senf::detail::ListOptionTypeParser_Policy::size(data_iterator i, + state_type s) + const +{ parser_type p(*this, i, s); container_type c(p); return std::distance(c.begin(), c.end()); } -template +template prefix_ void -senf::detail::ListOptionTypeParser_Policy::init(data_iterator i, state_type s) const { +senf::detail::ListOptionTypeParser_Policy::init(data_iterator i, + state_type s) + const +{ + i[0] = 1u; + i[1] = 4u; + for (unsigned int n = 2;n < 6; ++n) + i[n] = 0u; AuxPolicy::aux(0, i, s); } @@ -66,152 +84,197 @@ senf::detail::ListOptionTypeParser_Policy::init(data_i // senf::detail::ListOptionTypeParser_Policy //constructor -template -prefix_ senf::detail::ListOptionTypeParser_Policy::container_policy::container_policy(parser_policy const & p) : - AuxPolicy(p) { -} +template +prefix_ +senf::detail::ListOptionTypeParser_Policy::container_policy:: +container_policy(parser_policy const & p) + : AuxPolicy(p) +{} //destructor -template -prefix_ senf::detail::ListOptionTypeParser_Policy::container_policy::~container_policy() +template +prefix_ +senf::detail::ListOptionTypeParser_Policy::container_policy:: +~container_policy() {} //construct method -template +template prefix_ void -senf::detail::ListOptionTypeParser_Policy::container_policy::construct(container_type & c) { - data_iterator i = c.i(); +senf::detail::ListOptionTypeParser_Policy::container_policy:: +construct(container_type & c) +{ + safe_data_iterator i (c.data(), c.i()) ; realAux_ = (AuxPolicy::aux(i, c.state()) * 8) + 6; - data_iterator e = i + realAux_; - for (n_ = 0; i != e; ++n_) { + safe_data_iterator e = i + realAux_; + for (n_ = 0; i != e;) { unsigned int elByte = senf::bytes(ElementParser(i, c.state())); - if (((i + elByte) == e) && (i[0] == 0u || i[0] == 1u)) { //check wether last element is padding or not + if (((i + elByte) == e) && (i[0] == 0u || i[0] == 1u)) { //check weather last element is padding or not realAux_ -= std::distance(i, e); c.data().erase(i, e); //delete padding e = i; //set end iterator - } else + } else{ + ++n_; std::advance(i, elByte); + } } - // container_size_ = std::distance(i,e); container_size_ = c.data().size(); //set actual size without padding } //destruct method -template +template prefix_ void -senf::detail::ListOptionTypeParser_Policy::container_policy::destruct(container_type & c) { +senf::detail::ListOptionTypeParser_Policy::container_policy:: +destruct(container_type & c) +{ // data_iterator i (AuxPolicy::adjust(parser_type::get(p).i(), parser_type::get(p).state())); - data_iterator i = c.i(); - data_iterator const e = i + realAux_; - unsigned int padBytes = (realAux_ % 8); - c.data().insert(e, padBytes, 0u); + safe_data_iterator i (c.data(), c.i()) ; + safe_data_iterator e = i + realAux_; + unsigned int padBytes = 0; + if (realAux_ == 0) //if list is empty, 6 padding bytes required! + padBytes = 6; + else{ + padBytes = ( (realAux_+2) % 8); + if (padBytes != 0) + padBytes = 8 - padBytes; + } if (padBytes > 0) { + c.data().insert(e, padBytes, 0u); if (padBytes > 1) { - e[0] = 1; + e[0] = 1u; e[1] = padBytes - 2; } else e[0] = 0; container_size_ += padBytes; + realAux_ += padBytes; ++n_; } - AuxPolicy::aux((realAux_ / 8 - 1), i, c.state()); + AuxPolicy::aux(( (realAux_ + 2)/ 8 - 1), i, c.state()); } //bytes() -template -prefix_ typename senf::detail::ListOptionTypeParser_Policy::container_policy::size_type -senf::detail::ListOptionTypeParser_Policy::container_policy::bytes(data_iterator i,state_type s) const { - return (realAux_ + 2); +template +prefix_ typename senf::detail::ListOptionTypeParser_Policy< + ElementParser,AuxPolicy>::container_policy::size_type +senf::detail::ListOptionTypeParser_Policy::container_policy:: +bytes(data_iterator i, state_type s) + const +{ + return (realAux_ ); } //size() -template -prefix_ typename senf::detail::ListOptionTypeParser_Policy::container_policy::size_type -senf::detail::ListOptionTypeParser_Policy::container_policy::size(data_iterator i,state_type s) const { +template +prefix_ typename senf::detail::ListOptionTypeParser_Policy< + ElementParser,AuxPolicy>::container_policy::size_type +senf::detail::ListOptionTypeParser_Policy::container_policy:: +size(data_iterator i, state_type s) + const +{ return n_; } //init() -template +template prefix_ void -senf::detail::ListOptionTypeParser_Policy::container_policy::init(data_iterator i, state_type s) { +senf::detail::ListOptionTypeParser_Policy::container_policy:: +init(data_iterator i, state_type s) +{ + realAux_ = 0; n_ = 0; container_size_ = s->size(); AuxPolicy::aux(0, i, s); } //erase() -template +template prefix_ void -senf::detail::ListOptionTypeParser_Policy::container_policy::erase(container_type & c, data_iterator p) { - size_type b(senf::bytes(ElementParser(p, c.state()))); //length of parser - // AuxPolicy::aux( - // AuxPolicy::aux( c.i(), c.state()) -b, - // c.i(), - // c.state()); +senf::detail::ListOptionTypeParser_Policy::container_policy:: +erase(container_type & c, data_iterator p) +{ + size_type b(senf::bytes(ElementParser(p, c.state()))); realAux_ -= b; --n_; - // The container will be reduced by b bytes directly after this call container_size_ = c.data().size() - b; } //insert() -template +template prefix_ void -senf::detail::ListOptionTypeParser_Policy::container_policy::insert(container_type & c, data_iterator p) { +senf::detail::ListOptionTypeParser_Policy::container_policy:: +insert(container_type & c, data_iterator p) +{ size_type b(senf::bytes(ElementParser(p, c.state()))); - // AuxPolicy::aux( AuxPolicy::aux(c.i(), c.state())+b, c.i(), c.state()); realAux_ += b; ++n_; container_size_ = c.data().size(); } //update() -template +template prefix_ void -senf::detail::ListOptionTypeParser_Policy::container_policy::update(container_type const & c) const { +senf::detail::ListOptionTypeParser_Policy::container_policy:: +update(container_type const & c) + const +{ if (container_size_ == c.data().size()) return; data_iterator i(AuxPolicy::adjust(c.i(), c.state())); data_iterator j(i); for (size_type n(n_); n; --n, std::advance(j, senf::bytes(ElementParser(j,c.state())))); realAux_ = std::distance(i, j); - // aux( std::distance(i,j), c.i(), c.state() ); container_size_ = c.data().size(); } //setbegin() -template -prefix_ typename senf::detail::ListOptionTypeParser_Policy::container_policy::data_iterator -senf::detail::ListOptionTypeParser_Policy::container_policy::setBegin(container_type const & c, iterator_data & d) const { +template +prefix_ typename senf::detail::ListOptionTypeParser_Policy< + ElementParser,AuxPolicy>::container_policy::data_iterator +senf::detail::ListOptionTypeParser_Policy::container_policy:: +setBegin(container_type const & c, iterator_data & d) + const +{ return c.i(); - // return AuxPolicy::adjust(c.i(), c.state()); } //setEnd() -template -prefix_ typename senf::detail::ListOptionTypeParser_Policy::container_policy::data_iterator -senf::detail::ListOptionTypeParser_Policy::container_policy::setEnd(container_type const & c, iterator_data & d) const { //wtf?? - return boost::next(AuxPolicy::adjust(c.i(), c.state()), aux(c.i(),c.state())); +template +prefix_ typename senf::detail::ListOptionTypeParser_Policy< + ElementParser,AuxPolicy>::container_policy::data_iterator +senf::detail::ListOptionTypeParser_Policy::container_policy:: +setEnd(container_type const & c, iterator_data & d) + const +{ + return boost::next(c.i(),realAux_); } //setFromPosition() -template +template prefix_ void -senf::detail::ListOptionTypeParser_Policy::container_policy::setFromPosition(container_type const & c, iterator_data & d, data_iterator p) const { -} +senf::detail::ListOptionTypeParser_Policy::container_policy:: +setFromPosition(container_type const & c, iterator_data & d, data_iterator p) + const +{} //next() -template -prefix_ typename senf::detail::ListOptionTypeParser_Policy::container_policy::data_iterator -senf::detail::ListOptionTypeParser_Policy::container_policy::next(container_type const & c, iterator_data & d) const { +template +prefix_ typename senf::detail::ListOptionTypeParser_Policy< + ElementParser,AuxPolicy>::container_policy::data_iterator +senf::detail::ListOptionTypeParser_Policy::container_policy:: +next(container_type const & c, iterator_data & d) + const +{ return boost::next(container_type::iterator::get(d).i(), senf::bytes(ElementParser(container_type::iterator::get(d).i(), c.state()))); } //raw() -template -prefix_ typename senf::detail::ListOptionTypeParser_Policy::container_policy::data_iterator -senf::detail::ListOptionTypeParser_Policy::container_policy::raw(container_type const & c, iterator_data const & d) const { +template +prefix_ typename senf::detail::ListOptionTypeParser_Policy< + ElementParser,AuxPolicy>::container_policy::data_iterator +senf::detail::ListOptionTypeParser_Policy::container_policy:: +raw(container_type const & c, iterator_data const & d) + const +{ return container_type::iterator::get(d).i(); }