4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
6 // The contents of this file are subject to the Fraunhofer FOKUS Public License
7 // Version 1.0 (the "License"); you may not use this file except in compliance
8 // with the License. You may obtain a copy of the License at
9 // http://senf.berlios.de/license.html
11 // The Fraunhofer FOKUS Public License Version 1.0 is based on,
12 // but modifies the Mozilla Public License Version 1.1.
13 // See the full license text for the amendments.
15 // Software distributed under the License is distributed on an "AS IS" basis,
16 // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
17 // for the specific language governing rights and limitations under the License.
19 // The Original Code is Fraunhofer FOKUS code.
21 // The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V.
22 // (registered association), Hansastraße 27 c, 80686 Munich, Germany.
23 // All Rights Reserved.
26 // Stefan Bund <g0dil@berlios.de>
29 \brief PacketInterpreter non-inline template implementation */
31 //#include "PacketInterpreter.ih"
37 //-/////////////////////////////////////////////////////////////////////////////////////////////////
39 //-/////////////////////////////////////////////////////////////////////////////////////////////////
40 // senf::PacketInterpreterBase
42 // Interpreter chain access
45 prefix_ typename senf::PacketInterpreter<Type>::ptr
46 senf::PacketInterpreterBase::parseNextAs()
48 optional_range r (nextPacketRange());
50 throw InvalidPacketChainException();
53 impl().truncateInterpreters(next().get());
55 typename PacketInterpreter<Type>::ptr pi
56 (PacketInterpreter<Type>::create(&impl(),r->begin(),r->end(),Append));
60 //-/////////////////////////////////////////////////////////////////////////////////////////////////
61 // senf::PacketInterpreter<PacketType>
63 // Create completely new packet
65 template <class PacketType>
66 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
67 senf::PacketInterpreter<PacketType>::create(size_type size)
69 if (size < initSize())
70 throw TruncatedPacketException();
71 ptr pi (create(size,senf::noinit));
76 template <class PacketType>
77 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
78 senf::PacketInterpreter<PacketType>::create(size_type size, senf::NoInit_t)
80 detail::PacketImpl::Guard p (new detail::PacketImpl(size,0));
81 ptr pi (create(p.p,p.p->begin(),p.p->end(),Append));
85 // Create packet as new packet after a given packet
87 template <class PacketType>
88 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
89 senf::PacketInterpreter<PacketType>::createAfter(PacketInterpreterBase::ptr packet,
92 if (size < initSize())
93 throw TruncatedPacketException();
94 ptr pi (createAfter(packet,size,senf::noinit));
95 std::fill(pi->data().begin(), pi->data().end(),0);
100 template <class PacketType>
101 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
102 senf::PacketInterpreter<PacketType>::createAfter(PacketInterpreterBase::ptr packet,
103 size_type size, senf::NoInit_t)
105 optional_range r (packet->nextPacketRange());
107 throw InvalidPacketChainException();
110 packet->impl().truncateInterpreters(packet->next().get());
112 ptr pi (create(&packet->impl(),r->begin(),r->end(),Append));
113 pi->data().resize(size);
117 template <class PacketType>
118 template <class ForwardReadableRange>
119 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
120 senf::PacketInterpreter<PacketType>::createAfter(PacketInterpreterBase::ptr packet,
121 ForwardReadableRange const & range)
123 optional_range r (packet->nextPacketRange());
125 throw InvalidPacketChainException();
128 packet->impl().truncateInterpreters(packet->next().get());
130 ptr pi (create(&packet->impl(),r->begin(),r->end(),Append));
131 pi->data().resize(boost::size(range));
132 std::copy(boost::begin(range), boost::end(range), pi->data().begin());
136 // Create packet as new packet (header) before a given packet
138 template <class PacketType>
139 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
140 senf::PacketInterpreter<PacketType>::createBefore(PacketInterpreterBase::ptr packet)
142 ptr pi (createBefore(packet, senf::noinit));
143 pi->data().insert(pi->data().begin(),initHeadSize(),byte(0x00u));
144 pi->data().insert(pi->data().end(),initSize()-initHeadSize(),byte(0x00u));
149 template <class PacketType>
150 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
151 senf::PacketInterpreter<PacketType>::createBefore(PacketInterpreterBase::ptr packet, senf::NoInit_t)
154 packet->impl().truncateInterpretersBackwards(packet->prev().get());
156 return create(&packet->impl(),packet->data().begin(),packet->data().end(),Prepend);
159 template <class PacketType>
160 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
161 senf::PacketInterpreter<PacketType>::createInsertBefore(PacketInterpreterBase::ptr packet)
163 ptr pi (createInsertBefore(packet, senf::noinit));
164 pi->data().insert(pi->data().begin(),initHeadSize(),byte(0x00u));
165 pi->data().insert(pi->data().end(),initSize()-initHeadSize(),byte(0x00u));
170 template <class PacketType>
171 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
172 senf::PacketInterpreter<PacketType>::createInsertBefore(PacketInterpreterBase::ptr packet,
175 return create(&packet->impl(),packet->data().begin(),packet->data().end(),packet);
178 //-/////////////////////////////////////////////////////////////////////////////////////////////////
183 template <class PacketType>
184 prefix_ typename senf::PacketInterpreter<PacketType>::optional_range
185 senf::PacketInterpreter<PacketType>::v_nextPacketRange()
187 return type::nextPacketRange(ConcretePacket<PacketType>(ptr(this)));
190 template <class PacketType>
191 prefix_ senf::PacketInterpreterBase::ptr
192 senf::PacketInterpreter<PacketType>::v_appendClone(detail::PacketImpl * impl, iterator base,
196 boost::next(new_base,std::distance(base,begin())),
197 boost::next(new_base,std::distance(base,end())),
201 template <class PacketType>
202 prefix_ senf::PacketInterpreterBase::ptr
203 senf::PacketInterpreter<PacketType>::v_appendClone(detail::PacketImpl * impl, range r)
205 return create(impl, r.begin(), r.end(), Append);
208 template <class PacketType>
209 prefix_ void senf::PacketInterpreter<PacketType>::v_finalize()
211 type::finalize(ConcretePacket<PacketType>(ptr(this)));
214 template <class PacketType>
215 prefix_ void senf::PacketInterpreter<PacketType>::v_dump(std::ostream & os)
217 type::dump(ConcretePacket<PacketType>(ptr(this)),os);
220 template <class PacketType>
221 prefix_ senf::TypeIdValue senf::PacketInterpreter<PacketType>::v_type()
223 return typeIdValue< ConcretePacket<PacketType> >();
226 template <class PacketType>
227 prefix_ typename senf::PacketInterpreter<PacketType>::factory_t
228 senf::PacketInterpreter<PacketType>::v_factory()
233 template <class PacketType>
234 prefix_ typename senf::PacketInterpreter<PacketType>::factory_t
235 senf::PacketInterpreter<PacketType>::v_nextPacketType()
237 return type::nextPacketType(ConcretePacket<PacketType>(ptr(this)));
241 //-/////////////////////////////////////////////////////////////////////////////////////////////////
242 // senf::PacketInterpreterBase::Factory
244 template <class ForwardReadableRange>
245 prefix_ senf::PacketInterpreterBase::ptr
246 senf::PacketInterpreterBase::Factory::create(ForwardReadableRange const & range)
249 ptr pi (create(boost::size(range),senf::noinit));
250 std::copy(boost::begin(range), boost::end(range), pi->data().begin());
254 template <class ForwardReadableRange>
255 prefix_ senf::PacketInterpreterBase::ptr
256 senf::PacketInterpreterBase::Factory::createAfter(PacketInterpreterBase::ptr packet,
257 ForwardReadableRange const & range)
260 ptr pi (createAfter(packet,boost::size(range),senf::noinit));
261 std::copy(boost::begin(range), boost::end(range), pi->data().begin());
265 //-/////////////////////////////////////////////////////////////////////////////////////////////////
266 // senf::PacketInterpreter<PacketType>::FactoryImpl
268 // Create completely new packet
270 template <class PacketType>
271 prefix_ typename senf::PacketInterpreterBase::ptr
272 senf::PacketInterpreter<PacketType>::FactoryImpl::create()
275 return senf::PacketInterpreter<PacketType>::create();
278 template <class PacketType>
279 prefix_ typename senf::PacketInterpreterBase::ptr
280 senf::PacketInterpreter<PacketType>::FactoryImpl::create(senf::NoInit_t)
283 return senf::PacketInterpreter<PacketType>::create(senf::noinit);
286 template <class PacketType>
287 prefix_ typename senf::PacketInterpreterBase::ptr
288 senf::PacketInterpreter<PacketType>::FactoryImpl::create(size_type size)
291 return senf::PacketInterpreter<PacketType>::create(size);
294 template <class PacketType>
295 prefix_ typename senf::PacketInterpreterBase::ptr
296 senf::PacketInterpreter<PacketType>::FactoryImpl::create(size_type size, senf::NoInit_t)
299 return senf::PacketInterpreter<PacketType>::create(size, senf::noinit);
302 // Create packet as new packet after a given packet
304 template <class PacketType>
305 prefix_ typename senf::PacketInterpreterBase::ptr
306 senf::PacketInterpreter<PacketType>::FactoryImpl::createAfter(PacketInterpreterBase::ptr packet)
309 return senf::PacketInterpreter<PacketType>::createAfter(packet);
312 template <class PacketType>
313 prefix_ typename senf::PacketInterpreterBase::ptr
314 senf::PacketInterpreter<PacketType>::FactoryImpl::createAfter(PacketInterpreterBase::ptr packet,
318 return senf::PacketInterpreter<PacketType>::createAfter(packet,senf::noinit);
321 template <class PacketType>
322 prefix_ typename senf::PacketInterpreterBase::ptr
323 senf::PacketInterpreter<PacketType>::FactoryImpl::createAfter(PacketInterpreterBase::ptr packet,
327 return senf::PacketInterpreter<PacketType>::createAfter(packet,size);
330 template <class PacketType>
331 prefix_ typename senf::PacketInterpreterBase::ptr
332 senf::PacketInterpreter<PacketType>::FactoryImpl::createAfter(PacketInterpreterBase::ptr packet,
333 size_type size, senf::NoInit_t)
336 return senf::PacketInterpreter<PacketType>::createAfter(packet,size,senf::noinit);
339 // Create packet as new packet (header) before a given packet
341 template <class PacketType>
342 prefix_ typename senf::PacketInterpreterBase::ptr
343 senf::PacketInterpreter<PacketType>::FactoryImpl::
344 createBefore(PacketInterpreterBase::ptr packet)
347 return senf::PacketInterpreter<PacketType>::createBefore(packet);
350 template <class PacketType>
351 prefix_ senf::PacketInterpreterBase::ptr
352 senf::PacketInterpreter<PacketType>::FactoryImpl::
353 createBefore(PacketInterpreterBase::ptr packet, senf::NoInit_t)
356 return senf::PacketInterpreter<PacketType>::createBefore(packet,senf::noinit);
359 template <class PacketType>
360 prefix_ senf::PacketInterpreterBase::ptr
361 senf::PacketInterpreter<PacketType>::FactoryImpl::
362 createInsertBefore(PacketInterpreterBase::ptr packet)
365 return senf::PacketInterpreter<PacketType>::createInsertBefore(packet);
368 template <class PacketType>
369 prefix_ senf::PacketInterpreterBase::ptr
370 senf::PacketInterpreter<PacketType>::FactoryImpl::
371 createInsertBefore(PacketInterpreterBase::ptr packet, senf::NoInit_t)
374 return senf::PacketInterpreter<PacketType>::createInsertBefore(packet,senf::noinit);
377 // Parse next packet in chain
379 template <class PacketType>
380 prefix_ typename senf::PacketInterpreterBase::ptr
381 senf::PacketInterpreter<PacketType>::FactoryImpl::parseNext(PacketInterpreterBase::ptr packet)
384 optional_range r (packet->nextPacketRange());
386 throw InvalidPacketChainException();
389 packet->impl().truncateInterpreters(packet->next().get());
391 return senf::PacketInterpreter<PacketType>::create(&packet->impl(),r->begin(),r->end(),Append);
394 template <class PacketType>
395 const typename senf::PacketInterpreter<PacketType>::FactoryImpl
396 senf::PacketInterpreter<PacketType>::factory_;
398 //-/////////////////////////////////////////////////////////////////////////////////////////////////
405 // c-file-style: "senf"
406 // indent-tabs-mode: nil
407 // ispell-local-dictionary: "american"
408 // compile-command: "scons -u test"
409 // comment-column: 40