2 // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
3 // Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
4 // Stefan Bund <g0dil@berlios.de>
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.
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.
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.
22 \brief PacketInterpreter non-inline template implementation */
24 //#include "PacketInterpreter.ih"
30 ///////////////////////////////ct.p////////////////////////////////////////
32 ///////////////////////////////////////////////////////////////////////////
33 // senf::PacketInterpreterBase
35 // Interpreter chain access
38 prefix_ typename senf::PacketInterpreter<Type>::ptr
39 senf::PacketInterpreterBase::parseNextAs()
41 optional_range r (nextPacketRange());
43 throw InvalidPacketChainException();
46 impl().truncateInterpreters(next().get());
48 typename PacketInterpreter<Type>::ptr pi
49 (PacketInterpreter<Type>::create(&impl(),r->begin(),r->end(),Append));
53 ///////////////////////////////////////////////////////////////////////////
54 // senf::PacketInterpreter<PacketType>
56 // Create completely new packet
58 template <class PacketType>
59 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
60 senf::PacketInterpreter<PacketType>::create(size_type size)
62 if (size < initSize())
63 throw TruncatedPacketException();
64 ptr pi (create(size,noinit));
69 template <class PacketType>
70 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
71 senf::PacketInterpreter<PacketType>::create(size_type size, NoInit_t)
73 detail::PacketImpl::Guard p (new detail::PacketImpl(size,0));
74 ptr pi (create(p.p,p.p->begin(),p.p->end(),Append));
78 // Create packet as new packet after a given packet
80 template <class PacketType>
81 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
82 senf::PacketInterpreter<PacketType>::createAfter(PacketInterpreterBase::ptr packet,
85 if (size < initSize())
86 throw TruncatedPacketException();
87 ptr pi (createAfter(packet,size,noinit));
88 std::fill(pi->data().begin(), pi->data().end(),0);
93 template <class PacketType>
94 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
95 senf::PacketInterpreter<PacketType>::createAfter(PacketInterpreterBase::ptr packet,
96 size_type size, NoInit_t)
98 optional_range r (packet->nextPacketRange());
100 throw InvalidPacketChainException();
103 packet->impl().truncateInterpreters(packet->next().get());
105 ptr pi (create(&packet->impl(),r->begin(),r->end(),Append));
106 pi->data().resize(size);
110 template <class PacketType>
111 template <class ForwardReadableRange>
112 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
113 senf::PacketInterpreter<PacketType>::createAfter(PacketInterpreterBase::ptr packet,
114 ForwardReadableRange const & range)
116 optional_range r (packet->nextPacketRange());
118 throw InvalidPacketChainException();
121 packet->impl().truncateInterpreters(packet->next().get());
123 ptr pi (create(&packet->impl(),r->begin(),r->end(),Append));
124 pi->data().resize(boost::size(range));
125 std::copy(boost::begin(range), boost::end(range), pi->data().begin());
129 // Create packet as new packet (header) before a given packet
131 template <class PacketType>
132 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
133 senf::PacketInterpreter<PacketType>::createBefore(PacketInterpreterBase::ptr packet)
135 ptr pi (createBefore(packet, noinit));
136 pi->data().insert(pi->data().begin(),initHeadSize(),byte(0x00u));
137 pi->data().insert(pi->data().end(),initSize()-initHeadSize(),byte(0x00u));
142 template <class PacketType>
143 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
144 senf::PacketInterpreter<PacketType>::createBefore(PacketInterpreterBase::ptr packet, NoInit_t)
147 packet->impl().truncateInterpretersBackwards(packet->prev().get());
149 return create(&packet->impl(),packet->data().begin(),packet->data().end(),Prepend);
152 ////////////////////////////////////////
157 template <class PacketType>
158 prefix_ typename senf::PacketInterpreter<PacketType>::optional_range
159 senf::PacketInterpreter<PacketType>::v_nextPacketRange()
161 return type::nextPacketRange(ConcretePacket<PacketType>(ptr(this)));
164 template <class PacketType>
165 prefix_ senf::PacketInterpreterBase::ptr
166 senf::PacketInterpreter<PacketType>::v_appendClone(detail::PacketImpl * impl, iterator base,
170 boost::next(new_base,std::distance(base,begin())),
171 boost::next(new_base,std::distance(base,end())),
175 template <class PacketType>
176 prefix_ senf::PacketInterpreterBase::ptr
177 senf::PacketInterpreter<PacketType>::v_appendClone(detail::PacketImpl * impl, range r)
179 return create(impl, r.begin(), r.end(), Append);
182 template <class PacketType>
183 prefix_ void senf::PacketInterpreter<PacketType>::v_finalize()
185 type::finalize(ConcretePacket<PacketType>(ptr(this)));
188 template <class PacketType>
189 prefix_ void senf::PacketInterpreter<PacketType>::v_dump(std::ostream & os)
191 type::dump(ConcretePacket<PacketType>(ptr(this)),os);
194 template <class PacketType>
195 prefix_ senf::TypeIdValue senf::PacketInterpreter<PacketType>::v_type()
197 return typeIdValue< ConcretePacket<PacketType> >();
200 template <class PacketType>
201 prefix_ typename senf::PacketInterpreter<PacketType>::factory_t
202 senf::PacketInterpreter<PacketType>::v_factory()
207 template <class PacketType>
208 prefix_ typename senf::PacketInterpreter<PacketType>::factory_t
209 senf::PacketInterpreter<PacketType>::v_nextPacketType()
211 return type::nextPacketType(ConcretePacket<PacketType>(ptr(this)));
215 ///////////////////////////////////////////////////////////////////////////
216 // senf::PacketInterpreterBase::Factory
218 template <class ForwardReadableRange>
219 prefix_ senf::PacketInterpreterBase::ptr
220 senf::PacketInterpreterBase::Factory::create(ForwardReadableRange const & range)
223 ptr pi (create(boost::size(range),noinit));
224 std::copy(boost::begin(range), boost::end(range), pi->data().begin());
228 template <class ForwardReadableRange>
229 prefix_ senf::PacketInterpreterBase::ptr
230 senf::PacketInterpreterBase::Factory::createAfter(PacketInterpreterBase::ptr packet,
231 ForwardReadableRange const & range)
234 ptr pi (createAfter(packet,boost::size(range),noinit));
235 std::copy(boost::begin(range), boost::end(range), pi->data().begin());
239 ///////////////////////////////////////////////////////////////////////////
240 // senf::PacketInterpreter<PacketType>::FactoryImpl
242 // Create completely new packet
244 template <class PacketType>
245 prefix_ typename senf::PacketInterpreterBase::ptr
246 senf::PacketInterpreter<PacketType>::FactoryImpl::create()
249 return senf::PacketInterpreter<PacketType>::create();
252 template <class PacketType>
253 prefix_ typename senf::PacketInterpreterBase::ptr
254 senf::PacketInterpreter<PacketType>::FactoryImpl::create(NoInit_t)
257 return senf::PacketInterpreter<PacketType>::create(noinit);
260 template <class PacketType>
261 prefix_ typename senf::PacketInterpreterBase::ptr
262 senf::PacketInterpreter<PacketType>::FactoryImpl::create(size_type size)
265 return senf::PacketInterpreter<PacketType>::create(size);
268 template <class PacketType>
269 prefix_ typename senf::PacketInterpreterBase::ptr
270 senf::PacketInterpreter<PacketType>::FactoryImpl::create(size_type size, NoInit_t)
273 return senf::PacketInterpreter<PacketType>::create(size, noinit);
276 // Create packet as new packet after a given packet
278 template <class PacketType>
279 prefix_ typename senf::PacketInterpreterBase::ptr
280 senf::PacketInterpreter<PacketType>::FactoryImpl::createAfter(PacketInterpreterBase::ptr packet)
283 return senf::PacketInterpreter<PacketType>::createAfter(packet);
286 template <class PacketType>
287 prefix_ typename senf::PacketInterpreterBase::ptr
288 senf::PacketInterpreter<PacketType>::FactoryImpl::createAfter(PacketInterpreterBase::ptr packet,
292 return senf::PacketInterpreter<PacketType>::createAfter(packet,noinit);
295 template <class PacketType>
296 prefix_ typename senf::PacketInterpreterBase::ptr
297 senf::PacketInterpreter<PacketType>::FactoryImpl::createAfter(PacketInterpreterBase::ptr packet,
301 return senf::PacketInterpreter<PacketType>::createAfter(packet,size);
304 template <class PacketType>
305 prefix_ typename senf::PacketInterpreterBase::ptr
306 senf::PacketInterpreter<PacketType>::FactoryImpl::createAfter(PacketInterpreterBase::ptr packet,
307 size_type size, NoInit_t)
310 return senf::PacketInterpreter<PacketType>::createAfter(packet,size,noinit);
313 // Create packet as new packet (header) before a given packet
315 template <class PacketType>
316 prefix_ typename senf::PacketInterpreterBase::ptr
317 senf::PacketInterpreter<PacketType>::FactoryImpl::
318 createBefore(PacketInterpreterBase::ptr packet)
321 return senf::PacketInterpreter<PacketType>::createBefore(packet);
324 template <class PacketType>
325 prefix_ senf::PacketInterpreterBase::ptr
326 senf::PacketInterpreter<PacketType>::FactoryImpl::
327 createBefore(PacketInterpreterBase::ptr packet, NoInit_t)
330 return senf::PacketInterpreter<PacketType>::createBefore(packet,noinit);
333 // Parse next packet in chain
335 template <class PacketType>
336 prefix_ typename senf::PacketInterpreterBase::ptr
337 senf::PacketInterpreter<PacketType>::FactoryImpl::parseNext(PacketInterpreterBase::ptr packet)
340 optional_range r (packet->nextPacketRange());
342 throw InvalidPacketChainException();
345 packet->impl().truncateInterpreters(packet->next().get());
347 return senf::PacketInterpreter<PacketType>::create(&packet->impl(),r->begin(),r->end(),Append);
350 template <class PacketType>
351 const typename senf::PacketInterpreter<PacketType>::FactoryImpl
352 senf::PacketInterpreter<PacketType>::factory_;
354 ///////////////////////////////ct.e////////////////////////////////////////
361 // c-file-style: "senf"
362 // indent-tabs-mode: nil
363 // ispell-local-dictionary: "american"
364 // compile-command: "scons -u test"
365 // comment-column: 40