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 template <class PacketType>
155 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
156 senf::PacketInterpreter<PacketType>::createInsertBefore(PacketInterpreterBase::ptr packet)
158 ptr pi (createInsertBefore(packet, senf::noinit));
159 pi->data().insert(pi->data().begin(),initHeadSize(),byte(0x00u));
160 pi->data().insert(pi->data().end(),initSize()-initHeadSize(),byte(0x00u));
165 template <class PacketType>
166 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
167 senf::PacketInterpreter<PacketType>::createInsertBefore(PacketInterpreterBase::ptr packet,
170 return create(&packet->impl(),packet->data().begin(),packet->data().end(),packet);
173 ////////////////////////////////////////
178 template <class PacketType>
179 prefix_ typename senf::PacketInterpreter<PacketType>::optional_range
180 senf::PacketInterpreter<PacketType>::v_nextPacketRange()
182 return type::nextPacketRange(ConcretePacket<PacketType>(ptr(this)));
185 template <class PacketType>
186 prefix_ senf::PacketInterpreterBase::ptr
187 senf::PacketInterpreter<PacketType>::v_appendClone(detail::PacketImpl * impl, iterator base,
191 boost::next(new_base,std::distance(base,begin())),
192 boost::next(new_base,std::distance(base,end())),
196 template <class PacketType>
197 prefix_ senf::PacketInterpreterBase::ptr
198 senf::PacketInterpreter<PacketType>::v_appendClone(detail::PacketImpl * impl, range r)
200 return create(impl, r.begin(), r.end(), Append);
203 template <class PacketType>
204 prefix_ void senf::PacketInterpreter<PacketType>::v_finalize()
206 type::finalize(ConcretePacket<PacketType>(ptr(this)));
209 template <class PacketType>
210 prefix_ void senf::PacketInterpreter<PacketType>::v_dump(std::ostream & os)
212 type::dump(ConcretePacket<PacketType>(ptr(this)),os);
215 template <class PacketType>
216 prefix_ senf::TypeIdValue senf::PacketInterpreter<PacketType>::v_type()
218 return typeIdValue< ConcretePacket<PacketType> >();
221 template <class PacketType>
222 prefix_ typename senf::PacketInterpreter<PacketType>::factory_t
223 senf::PacketInterpreter<PacketType>::v_factory()
228 template <class PacketType>
229 prefix_ typename senf::PacketInterpreter<PacketType>::factory_t
230 senf::PacketInterpreter<PacketType>::v_nextPacketType()
232 return type::nextPacketType(ConcretePacket<PacketType>(ptr(this)));
236 ///////////////////////////////////////////////////////////////////////////
237 // senf::PacketInterpreterBase::Factory
239 template <class ForwardReadableRange>
240 prefix_ senf::PacketInterpreterBase::ptr
241 senf::PacketInterpreterBase::Factory::create(ForwardReadableRange const & range)
244 ptr pi (create(boost::size(range),senf::noinit));
245 std::copy(boost::begin(range), boost::end(range), pi->data().begin());
249 template <class ForwardReadableRange>
250 prefix_ senf::PacketInterpreterBase::ptr
251 senf::PacketInterpreterBase::Factory::createAfter(PacketInterpreterBase::ptr packet,
252 ForwardReadableRange const & range)
255 ptr pi (createAfter(packet,boost::size(range),senf::noinit));
256 std::copy(boost::begin(range), boost::end(range), pi->data().begin());
260 ///////////////////////////////////////////////////////////////////////////
261 // senf::PacketInterpreter<PacketType>::FactoryImpl
263 // Create completely new packet
265 template <class PacketType>
266 prefix_ typename senf::PacketInterpreterBase::ptr
267 senf::PacketInterpreter<PacketType>::FactoryImpl::create()
270 return senf::PacketInterpreter<PacketType>::create();
273 template <class PacketType>
274 prefix_ typename senf::PacketInterpreterBase::ptr
275 senf::PacketInterpreter<PacketType>::FactoryImpl::create(senf::NoInit_t)
278 return senf::PacketInterpreter<PacketType>::create(senf::noinit);
281 template <class PacketType>
282 prefix_ typename senf::PacketInterpreterBase::ptr
283 senf::PacketInterpreter<PacketType>::FactoryImpl::create(size_type size)
286 return senf::PacketInterpreter<PacketType>::create(size);
289 template <class PacketType>
290 prefix_ typename senf::PacketInterpreterBase::ptr
291 senf::PacketInterpreter<PacketType>::FactoryImpl::create(size_type size, senf::NoInit_t)
294 return senf::PacketInterpreter<PacketType>::create(size, senf::noinit);
297 // Create packet as new packet after a given packet
299 template <class PacketType>
300 prefix_ typename senf::PacketInterpreterBase::ptr
301 senf::PacketInterpreter<PacketType>::FactoryImpl::createAfter(PacketInterpreterBase::ptr packet)
304 return senf::PacketInterpreter<PacketType>::createAfter(packet);
307 template <class PacketType>
308 prefix_ typename senf::PacketInterpreterBase::ptr
309 senf::PacketInterpreter<PacketType>::FactoryImpl::createAfter(PacketInterpreterBase::ptr packet,
313 return senf::PacketInterpreter<PacketType>::createAfter(packet,senf::noinit);
316 template <class PacketType>
317 prefix_ typename senf::PacketInterpreterBase::ptr
318 senf::PacketInterpreter<PacketType>::FactoryImpl::createAfter(PacketInterpreterBase::ptr packet,
322 return senf::PacketInterpreter<PacketType>::createAfter(packet,size);
325 template <class PacketType>
326 prefix_ typename senf::PacketInterpreterBase::ptr
327 senf::PacketInterpreter<PacketType>::FactoryImpl::createAfter(PacketInterpreterBase::ptr packet,
328 size_type size, senf::NoInit_t)
331 return senf::PacketInterpreter<PacketType>::createAfter(packet,size,senf::noinit);
334 // Create packet as new packet (header) before a given packet
336 template <class PacketType>
337 prefix_ typename senf::PacketInterpreterBase::ptr
338 senf::PacketInterpreter<PacketType>::FactoryImpl::
339 createBefore(PacketInterpreterBase::ptr packet)
342 return senf::PacketInterpreter<PacketType>::createBefore(packet);
345 template <class PacketType>
346 prefix_ senf::PacketInterpreterBase::ptr
347 senf::PacketInterpreter<PacketType>::FactoryImpl::
348 createBefore(PacketInterpreterBase::ptr packet, senf::NoInit_t)
351 return senf::PacketInterpreter<PacketType>::createBefore(packet,senf::noinit);
354 template <class PacketType>
355 prefix_ senf::PacketInterpreterBase::ptr
356 senf::PacketInterpreter<PacketType>::FactoryImpl::
357 createInsertBefore(PacketInterpreterBase::ptr packet)
360 return senf::PacketInterpreter<PacketType>::createInsertBefore(packet);
363 template <class PacketType>
364 prefix_ senf::PacketInterpreterBase::ptr
365 senf::PacketInterpreter<PacketType>::FactoryImpl::
366 createInsertBefore(PacketInterpreterBase::ptr packet, senf::NoInit_t)
369 return senf::PacketInterpreter<PacketType>::createInsertBefore(packet,senf::noinit);
372 // Parse next packet in chain
374 template <class PacketType>
375 prefix_ typename senf::PacketInterpreterBase::ptr
376 senf::PacketInterpreter<PacketType>::FactoryImpl::parseNext(PacketInterpreterBase::ptr packet)
379 optional_range r (packet->nextPacketRange());
381 throw InvalidPacketChainException();
384 packet->impl().truncateInterpreters(packet->next().get());
386 return senf::PacketInterpreter<PacketType>::create(&packet->impl(),r->begin(),r->end(),Append);
389 template <class PacketType>
390 const typename senf::PacketInterpreter<PacketType>::FactoryImpl
391 senf::PacketInterpreter<PacketType>::factory_;
393 ///////////////////////////////ct.e////////////////////////////////////////
400 // c-file-style: "senf"
401 // indent-tabs-mode: nil
402 // ispell-local-dictionary: "american"
403 // compile-command: "scons -u test"
404 // comment-column: 40