4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 // Stefan Bund <g0dil@berlios.de>
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 2 of the License, or
11 // (at your option) any later version.
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 // GNU General Public License for more details.
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the
20 // Free Software Foundation, Inc.,
21 // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24 \brief PacketInterpreter non-inline template implementation */
26 //#include "PacketInterpreter.ih"
32 ///////////////////////////////ct.p////////////////////////////////////////
34 ///////////////////////////////////////////////////////////////////////////
35 // senf::PacketInterpreterBase
37 // Interpreter chain access
40 prefix_ typename senf::PacketInterpreter<Type>::ptr
41 senf::PacketInterpreterBase::parseNextAs()
43 optional_range r (nextPacketRange());
45 throw InvalidPacketChainException();
48 impl().truncateInterpreters(next().get());
50 typename PacketInterpreter<Type>::ptr pi
51 (PacketInterpreter<Type>::create(&impl(),r->begin(),r->end(),Append));
55 ///////////////////////////////////////////////////////////////////////////
56 // senf::PacketInterpreter<PacketType>
58 // Create completely new packet
60 template <class PacketType>
61 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
62 senf::PacketInterpreter<PacketType>::create(size_type size)
64 if (size < initSize())
65 throw TruncatedPacketException();
66 ptr pi (create(size,senf::noinit));
71 template <class PacketType>
72 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
73 senf::PacketInterpreter<PacketType>::create(size_type size, senf::NoInit_t)
75 detail::PacketImpl::Guard p (new detail::PacketImpl(size,0));
76 ptr pi (create(p.p,p.p->begin(),p.p->end(),Append));
80 // Create packet as new packet after a given packet
82 template <class PacketType>
83 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
84 senf::PacketInterpreter<PacketType>::createAfter(PacketInterpreterBase::ptr packet,
87 if (size < initSize())
88 throw TruncatedPacketException();
89 ptr pi (createAfter(packet,size,senf::noinit));
90 std::fill(pi->data().begin(), pi->data().end(),0);
95 template <class PacketType>
96 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
97 senf::PacketInterpreter<PacketType>::createAfter(PacketInterpreterBase::ptr packet,
98 size_type size, senf::NoInit_t)
100 optional_range r (packet->nextPacketRange());
102 throw InvalidPacketChainException();
105 packet->impl().truncateInterpreters(packet->next().get());
107 ptr pi (create(&packet->impl(),r->begin(),r->end(),Append));
108 pi->data().resize(size);
112 template <class PacketType>
113 template <class ForwardReadableRange>
114 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
115 senf::PacketInterpreter<PacketType>::createAfter(PacketInterpreterBase::ptr packet,
116 ForwardReadableRange const & range)
118 optional_range r (packet->nextPacketRange());
120 throw InvalidPacketChainException();
123 packet->impl().truncateInterpreters(packet->next().get());
125 ptr pi (create(&packet->impl(),r->begin(),r->end(),Append));
126 pi->data().resize(boost::size(range));
127 std::copy(boost::begin(range), boost::end(range), pi->data().begin());
131 // Create packet as new packet (header) before a given packet
133 template <class PacketType>
134 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
135 senf::PacketInterpreter<PacketType>::createBefore(PacketInterpreterBase::ptr packet)
137 ptr pi (createBefore(packet, senf::noinit));
138 pi->data().insert(pi->data().begin(),initHeadSize(),byte(0x00u));
139 pi->data().insert(pi->data().end(),initSize()-initHeadSize(),byte(0x00u));
144 template <class PacketType>
145 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
146 senf::PacketInterpreter<PacketType>::createBefore(PacketInterpreterBase::ptr packet, senf::NoInit_t)
149 packet->impl().truncateInterpretersBackwards(packet->prev().get());
151 return create(&packet->impl(),packet->data().begin(),packet->data().end(),Prepend);
154 ////////////////////////////////////////
159 template <class PacketType>
160 prefix_ typename senf::PacketInterpreter<PacketType>::optional_range
161 senf::PacketInterpreter<PacketType>::v_nextPacketRange()
163 return type::nextPacketRange(ConcretePacket<PacketType>(ptr(this)));
166 template <class PacketType>
167 prefix_ senf::PacketInterpreterBase::ptr
168 senf::PacketInterpreter<PacketType>::v_appendClone(detail::PacketImpl * impl, iterator base,
172 boost::next(new_base,std::distance(base,begin())),
173 boost::next(new_base,std::distance(base,end())),
177 template <class PacketType>
178 prefix_ senf::PacketInterpreterBase::ptr
179 senf::PacketInterpreter<PacketType>::v_appendClone(detail::PacketImpl * impl, range r)
181 return create(impl, r.begin(), r.end(), Append);
184 template <class PacketType>
185 prefix_ void senf::PacketInterpreter<PacketType>::v_finalize()
187 type::finalize(ConcretePacket<PacketType>(ptr(this)));
190 template <class PacketType>
191 prefix_ void senf::PacketInterpreter<PacketType>::v_dump(std::ostream & os)
193 type::dump(ConcretePacket<PacketType>(ptr(this)),os);
196 template <class PacketType>
197 prefix_ senf::TypeIdValue senf::PacketInterpreter<PacketType>::v_type()
199 return typeIdValue< ConcretePacket<PacketType> >();
202 template <class PacketType>
203 prefix_ typename senf::PacketInterpreter<PacketType>::factory_t
204 senf::PacketInterpreter<PacketType>::v_factory()
209 template <class PacketType>
210 prefix_ typename senf::PacketInterpreter<PacketType>::factory_t
211 senf::PacketInterpreter<PacketType>::v_nextPacketType()
213 return type::nextPacketType(ConcretePacket<PacketType>(ptr(this)));
217 ///////////////////////////////////////////////////////////////////////////
218 // senf::PacketInterpreterBase::Factory
220 template <class ForwardReadableRange>
221 prefix_ senf::PacketInterpreterBase::ptr
222 senf::PacketInterpreterBase::Factory::create(ForwardReadableRange const & range)
225 ptr pi (create(boost::size(range),senf::noinit));
226 std::copy(boost::begin(range), boost::end(range), pi->data().begin());
230 template <class ForwardReadableRange>
231 prefix_ senf::PacketInterpreterBase::ptr
232 senf::PacketInterpreterBase::Factory::createAfter(PacketInterpreterBase::ptr packet,
233 ForwardReadableRange const & range)
236 ptr pi (createAfter(packet,boost::size(range),senf::noinit));
237 std::copy(boost::begin(range), boost::end(range), pi->data().begin());
241 ///////////////////////////////////////////////////////////////////////////
242 // senf::PacketInterpreter<PacketType>::FactoryImpl
244 // Create completely new packet
246 template <class PacketType>
247 prefix_ typename senf::PacketInterpreterBase::ptr
248 senf::PacketInterpreter<PacketType>::FactoryImpl::create()
251 return senf::PacketInterpreter<PacketType>::create();
254 template <class PacketType>
255 prefix_ typename senf::PacketInterpreterBase::ptr
256 senf::PacketInterpreter<PacketType>::FactoryImpl::create(senf::NoInit_t)
259 return senf::PacketInterpreter<PacketType>::create(senf::noinit);
262 template <class PacketType>
263 prefix_ typename senf::PacketInterpreterBase::ptr
264 senf::PacketInterpreter<PacketType>::FactoryImpl::create(size_type size)
267 return senf::PacketInterpreter<PacketType>::create(size);
270 template <class PacketType>
271 prefix_ typename senf::PacketInterpreterBase::ptr
272 senf::PacketInterpreter<PacketType>::FactoryImpl::create(size_type size, senf::NoInit_t)
275 return senf::PacketInterpreter<PacketType>::create(size, senf::noinit);
278 // Create packet as new packet after a given packet
280 template <class PacketType>
281 prefix_ typename senf::PacketInterpreterBase::ptr
282 senf::PacketInterpreter<PacketType>::FactoryImpl::createAfter(PacketInterpreterBase::ptr packet)
285 return senf::PacketInterpreter<PacketType>::createAfter(packet);
288 template <class PacketType>
289 prefix_ typename senf::PacketInterpreterBase::ptr
290 senf::PacketInterpreter<PacketType>::FactoryImpl::createAfter(PacketInterpreterBase::ptr packet,
294 return senf::PacketInterpreter<PacketType>::createAfter(packet,senf::noinit);
297 template <class PacketType>
298 prefix_ typename senf::PacketInterpreterBase::ptr
299 senf::PacketInterpreter<PacketType>::FactoryImpl::createAfter(PacketInterpreterBase::ptr packet,
303 return senf::PacketInterpreter<PacketType>::createAfter(packet,size);
306 template <class PacketType>
307 prefix_ typename senf::PacketInterpreterBase::ptr
308 senf::PacketInterpreter<PacketType>::FactoryImpl::createAfter(PacketInterpreterBase::ptr packet,
309 size_type size, senf::NoInit_t)
312 return senf::PacketInterpreter<PacketType>::createAfter(packet,size,senf::noinit);
315 // Create packet as new packet (header) before a given packet
317 template <class PacketType>
318 prefix_ typename senf::PacketInterpreterBase::ptr
319 senf::PacketInterpreter<PacketType>::FactoryImpl::
320 createBefore(PacketInterpreterBase::ptr packet)
323 return senf::PacketInterpreter<PacketType>::createBefore(packet);
326 template <class PacketType>
327 prefix_ senf::PacketInterpreterBase::ptr
328 senf::PacketInterpreter<PacketType>::FactoryImpl::
329 createBefore(PacketInterpreterBase::ptr packet, senf::NoInit_t)
332 return senf::PacketInterpreter<PacketType>::createBefore(packet,senf::noinit);
335 // Parse next packet in chain
337 template <class PacketType>
338 prefix_ typename senf::PacketInterpreterBase::ptr
339 senf::PacketInterpreter<PacketType>::FactoryImpl::parseNext(PacketInterpreterBase::ptr packet)
342 optional_range r (packet->nextPacketRange());
344 throw InvalidPacketChainException();
347 packet->impl().truncateInterpreters(packet->next().get());
349 return senf::PacketInterpreter<PacketType>::create(&packet->impl(),r->begin(),r->end(),Append);
352 template <class PacketType>
353 const typename senf::PacketInterpreter<PacketType>::FactoryImpl
354 senf::PacketInterpreter<PacketType>::factory_;
356 ///////////////////////////////ct.e////////////////////////////////////////
363 // c-file-style: "senf"
364 // indent-tabs-mode: nil
365 // ispell-local-dictionary: "american"
366 // compile-command: "scons -u test"
367 // comment-column: 40