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 return create(p.p,p.p->begin(),p.p->end(),Append);
84 // Create packet as new packet after a given packet
86 template <class PacketType>
87 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
88 senf::PacketInterpreter<PacketType>::createAfter(PacketInterpreterBase::ptr const & packet,
91 if (size < initSize())
92 throw TruncatedPacketException();
93 ptr pi (createAfter(packet,size,senf::noinit));
94 std::fill(pi->data().begin(), pi->data().end(),0);
99 template <class PacketType>
100 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
101 senf::PacketInterpreter<PacketType>::createAfter(PacketInterpreterBase::ptr const & packet,
102 size_type size, senf::NoInit_t)
104 optional_range r (packet->nextPacketRange());
106 throw InvalidPacketChainException();
109 packet->impl().truncateInterpreters(packet->next().get());
111 ptr pi (create(&packet->impl(),r->begin(),r->end(),Append));
112 pi->data().resize(size);
116 template <class PacketType>
117 template <class ForwardReadableRange>
118 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
119 senf::PacketInterpreter<PacketType>::createAfter(PacketInterpreterBase::ptr const & packet,
120 ForwardReadableRange const & range)
122 optional_range r (packet->nextPacketRange());
124 throw InvalidPacketChainException();
127 packet->impl().truncateInterpreters(packet->next().get());
129 ptr pi (create(&packet->impl(),r->begin(),r->end(),Append));
130 pi->data().resize(boost::size(range));
131 std::copy(boost::begin(range), boost::end(range), pi->data().begin());
135 // Create packet as new packet (header) before a given packet
137 template <class PacketType>
138 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
139 senf::PacketInterpreter<PacketType>::createBefore(PacketInterpreterBase::ptr const & packet)
141 ptr pi (createBefore(packet, senf::noinit));
142 pi->data().insert(pi->data().begin(),initHeadSize(),byte(0x00u));
143 pi->data().insert(pi->data().end(),initSize()-initHeadSize(),byte(0x00u));
148 template <class PacketType>
149 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
150 senf::PacketInterpreter<PacketType>::createBefore(PacketInterpreterBase::ptr const & packet, senf::NoInit_t)
153 packet->impl().truncateInterpretersBackwards(packet->prev().get());
155 return create(&packet->impl(),packet->data().begin(),packet->data().end(),Prepend);
158 template <class PacketType>
159 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
160 senf::PacketInterpreter<PacketType>::createInsertBefore(PacketInterpreterBase::ptr const & packet)
162 ptr pi (createInsertBefore(packet, senf::noinit));
163 pi->data().insert(pi->data().begin(),initHeadSize(),byte(0x00u));
164 pi->data().insert(pi->data().end(),initSize()-initHeadSize(),byte(0x00u));
169 template <class PacketType>
170 prefix_ typename senf::PacketInterpreter<PacketType>::ptr
171 senf::PacketInterpreter<PacketType>::createInsertBefore(PacketInterpreterBase::ptr const & packet,
174 return create(&packet->impl(),packet->data().begin(),packet->data().end(),packet);
177 //-/////////////////////////////////////////////////////////////////////////////////////////////////
182 template <class PacketType>
183 prefix_ senf::PacketInterpreterBase::optional_range
184 senf::PacketInterpreter<PacketType>::v_nextPacketRange()
186 return type::nextPacketRange(ConcretePacket<PacketType>(ptr(this)));
189 template <class PacketType>
190 prefix_ senf::PacketInterpreterBase::ptr
191 senf::PacketInterpreter<PacketType>::v_appendClone(detail::PacketImpl * impl, iterator base,
195 boost::next(new_base,std::distance(base,begin())),
196 boost::next(new_base,std::distance(base,end())),
200 template <class PacketType>
201 prefix_ senf::PacketInterpreterBase::ptr
202 senf::PacketInterpreter<PacketType>::v_appendClone(detail::PacketImpl * impl, range r)
204 return create(impl, r.begin(), r.end(), Append);
207 template <class PacketType>
208 prefix_ void senf::PacketInterpreter<PacketType>::v_finalize()
210 type::finalize(ConcretePacket<PacketType>(ptr(this)));
213 template <class PacketType>
214 prefix_ void senf::PacketInterpreter<PacketType>::v_dump(std::ostream & os)
216 type::dump(ConcretePacket<PacketType>(ptr(this)),os);
219 template <class PacketType>
220 prefix_ senf::TypeIdValue senf::PacketInterpreter<PacketType>::v_type()
222 return typeIdValue< ConcretePacket<PacketType> >();
225 template <class PacketType>
226 prefix_ senf::PacketInterpreterBase::factory_t
227 senf::PacketInterpreter<PacketType>::v_factory()
232 template <class PacketType>
233 prefix_ senf::PacketInterpreterBase::factory_t
234 senf::PacketInterpreter<PacketType>::v_nextPacketType()
236 return type::nextPacketType(ConcretePacket<PacketType>(ptr(this)));
240 //-/////////////////////////////////////////////////////////////////////////////////////////////////
241 // senf::PacketInterpreterBase::Factory
243 template <class ForwardReadableRange>
244 prefix_ senf::PacketInterpreterBase::ptr
245 senf::PacketInterpreterBase::Factory::create(ForwardReadableRange const & range)
248 ptr pi (create(boost::size(range),senf::noinit));
249 std::copy(boost::begin(range), boost::end(range), pi->data().begin());
253 template <class ForwardReadableRange>
254 prefix_ senf::PacketInterpreterBase::ptr
255 senf::PacketInterpreterBase::Factory::createAfter(PacketInterpreterBase::ptr const & packet,
256 ForwardReadableRange const & range)
259 ptr pi (createAfter(packet,boost::size(range),senf::noinit));
260 std::copy(boost::begin(range), boost::end(range), pi->data().begin());
264 //-/////////////////////////////////////////////////////////////////////////////////////////////////
265 // senf::PacketInterpreter<PacketType>::FactoryImpl
267 // Create completely new packet
269 template <class PacketType>
270 prefix_ typename senf::PacketInterpreterBase::ptr
271 senf::PacketInterpreter<PacketType>::FactoryImpl::create()
274 return senf::PacketInterpreter<PacketType>::create();
277 template <class PacketType>
278 prefix_ typename senf::PacketInterpreterBase::ptr
279 senf::PacketInterpreter<PacketType>::FactoryImpl::create(senf::NoInit_t)
282 return senf::PacketInterpreter<PacketType>::create(senf::noinit);
285 template <class PacketType>
286 prefix_ typename senf::PacketInterpreterBase::ptr
287 senf::PacketInterpreter<PacketType>::FactoryImpl::create(size_type size)
290 return senf::PacketInterpreter<PacketType>::create(size);
293 template <class PacketType>
294 prefix_ typename senf::PacketInterpreterBase::ptr
295 senf::PacketInterpreter<PacketType>::FactoryImpl::create(size_type size, senf::NoInit_t)
298 return senf::PacketInterpreter<PacketType>::create(size, senf::noinit);
301 // Create packet as new packet after a given packet
303 template <class PacketType>
304 prefix_ typename senf::PacketInterpreterBase::ptr
305 senf::PacketInterpreter<PacketType>::FactoryImpl::createAfter(PacketInterpreterBase::ptr const & packet)
308 return senf::PacketInterpreter<PacketType>::createAfter(packet);
311 template <class PacketType>
312 prefix_ typename senf::PacketInterpreterBase::ptr
313 senf::PacketInterpreter<PacketType>::FactoryImpl::createAfter(PacketInterpreterBase::ptr const & packet,
317 return senf::PacketInterpreter<PacketType>::createAfter(packet,senf::noinit);
320 template <class PacketType>
321 prefix_ typename senf::PacketInterpreterBase::ptr
322 senf::PacketInterpreter<PacketType>::FactoryImpl::createAfter(PacketInterpreterBase::ptr const & packet,
326 return senf::PacketInterpreter<PacketType>::createAfter(packet,size);
329 template <class PacketType>
330 prefix_ typename senf::PacketInterpreterBase::ptr
331 senf::PacketInterpreter<PacketType>::FactoryImpl::createAfter(PacketInterpreterBase::ptr const & packet,
332 size_type size, senf::NoInit_t)
335 return senf::PacketInterpreter<PacketType>::createAfter(packet,size,senf::noinit);
338 // Create packet as new packet (header) before a given packet
340 template <class PacketType>
341 prefix_ typename senf::PacketInterpreterBase::ptr
342 senf::PacketInterpreter<PacketType>::FactoryImpl::
343 createBefore(PacketInterpreterBase::ptr const & packet)
346 return senf::PacketInterpreter<PacketType>::createBefore(packet);
349 template <class PacketType>
350 prefix_ senf::PacketInterpreterBase::ptr
351 senf::PacketInterpreter<PacketType>::FactoryImpl::
352 createBefore(PacketInterpreterBase::ptr const & packet, senf::NoInit_t)
355 return senf::PacketInterpreter<PacketType>::createBefore(packet,senf::noinit);
358 template <class PacketType>
359 prefix_ senf::PacketInterpreterBase::ptr
360 senf::PacketInterpreter<PacketType>::FactoryImpl::
361 createInsertBefore(PacketInterpreterBase::ptr const & packet)
364 return senf::PacketInterpreter<PacketType>::createInsertBefore(packet);
367 template <class PacketType>
368 prefix_ senf::PacketInterpreterBase::ptr
369 senf::PacketInterpreter<PacketType>::FactoryImpl::
370 createInsertBefore(PacketInterpreterBase::ptr const & packet, senf::NoInit_t)
373 return senf::PacketInterpreter<PacketType>::createInsertBefore(packet,senf::noinit);
376 // Parse next packet in chain
378 template <class PacketType>
379 prefix_ typename senf::PacketInterpreterBase::ptr
380 senf::PacketInterpreter<PacketType>::FactoryImpl::parseNext(PacketInterpreterBase::ptr const & packet, PacketInterpreterBase::optional_range const & range)
384 throw InvalidPacketChainException();
387 packet->impl().truncateInterpreters(packet->next().get());
389 return senf::PacketInterpreter<PacketType>::create(&packet->impl(),range->begin(),range->end(),Append);
392 template <class PacketType>
393 const typename senf::PacketInterpreter<PacketType>::FactoryImpl
394 senf::PacketInterpreter<PacketType>::factory_;
396 //-/////////////////////////////////////////////////////////////////////////////////////////////////
403 // c-file-style: "senf"
404 // indent-tabs-mode: nil
405 // ispell-local-dictionary: "american"
406 // compile-command: "scons -u test"
407 // comment-column: 40