Search:

SENF Extensible Network Framework

  • Home
  • Download
  • Wiki
  • BerliOS
  • ChangeLog
  • Browse SVN
  • Bug Tracker
  • Overview
  • Examples
  • HowTos
  • Glossary
  • PPI
  • Packets
  • Scheduler
  • Socket
  • Utils
  • Console
  • Daemon
  • Logger
  • Termlib
  • Main Page
  • Related Pages
  • Modules
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

Packet.cti

Go to the documentation of this file.
00001 // $Id: Packet.cti 1772 2011-03-10 12:45:21Z tho $
00002 //
00003 // Copyright (C) 2007
00004 // Fraunhofer (FOKUS)
00005 // Competence Center NETwork research (NET), St. Augustin, GERMANY
00006 //     Stefan Bund <g0dil@berlios.de>
00007 //
00008 // This program is free software; you can redistribute it and/or modify
00009 // it under the terms of the GNU General Public License as published by
00010 // the Free Software Foundation; either version 2 of the License, or
00011 // (at your option) any later version.
00012 //
00013 // This program is distributed in the hope that it will be useful,
00014 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00015 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016 // GNU General Public License for more details.
00017 //
00018 // You should have received a copy of the GNU General Public License
00019 // along with this program; if not, write to the
00020 // Free Software Foundation, Inc.,
00021 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00022 
00026 //#include "Packet.ih"
00027 
00028 // Custom includes
00029 #include <senf/Utils/Exception.hh>
00030 
00031 #define prefix_ inline
00032 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00033 
00034 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00035 // senf::Packet
00036 
00037 // conversion constructors
00038 
00039 template <class PacketType>
00040 prefix_ senf::Packet::Packet(ConcretePacket<PacketType> const & packet)
00041     : packet_(packet.ptr())
00042 {}
00043 
00044 // interpreter chain access
00045 
00046 template <class OtherPacket>
00047 prefix_ OtherPacket senf::Packet::parseNextAs()
00048     const
00049 {
00050     return OtherPacket(ptr()->parseNextAs<typename OtherPacket::type>());
00051 }
00052 
00053 template <class OtherPacket>
00054 prefix_ bool senf::Packet::is()
00055     const
00056 {
00057     return valid() && ptr()->is<typename OtherPacket::type>();
00058 }
00059 
00060 template <class OtherPacket>
00061 prefix_ OtherPacket senf::Packet::as()
00062     const
00063 {
00064     if (!is<OtherPacket>())
00065         throw WrapException<std::bad_cast>(std::bad_cast())
00066             << ": called packet::as() with wrong PacketType: "
00067             << (valid() ? typeId().prettyName() : "invalid packet")
00068             << " != " << prettyName(typeid(OtherPacket));
00069     return OtherPacket(ptr()->as<typename OtherPacket::type>());
00070 }
00071 
00072 template <class OtherPacket>
00073 prefix_ OtherPacket senf::Packet::as(NoThrow_t)
00074     const
00075 {
00076     SENF_ASSERT( is<OtherPacket>(), "Bad cast, called packet::as(nothrow) with wrong PacketType");
00077     return OtherPacket(ptr()->as<typename OtherPacket::type>());
00078 }
00079 
00080 template <class OtherPacket>
00081 prefix_ OtherPacket senf::Packet::next()
00082     const
00083 {
00084     return next().as<OtherPacket>();
00085 }
00086 
00087 template <class OtherPacket>
00088 prefix_ OtherPacket senf::Packet::next(NoThrow_t)
00089     const
00090 {
00091     Packet p (next(nothrow));
00092     return p && p.is<OtherPacket>() ?
00093             OtherPacket(p.ptr()->as<typename OtherPacket::type>()) : OtherPacket();
00094 }
00095 
00096 template <class OtherPacket>
00097 prefix_ OtherPacket senf::Packet::find()
00098     const
00099 {
00100     OtherPacket p (find<OtherPacket>(nothrow));
00101     if (!p) throw InvalidPacketChainException();
00102     return p;
00103 }
00104 
00105 template <class OtherPacket>
00106 prefix_ OtherPacket senf::Packet::prev()
00107     const
00108 {
00109     return prev().as<OtherPacket>();
00110 }
00111 
00112 template <class OtherPacket>
00113 prefix_ OtherPacket senf::Packet::prev(NoThrow_t)
00114     const
00115 {
00116     Packet p (prev(nothrow));
00117     return p && p.is<OtherPacket>() ?
00118             OtherPacket(p.ptr()->as<typename OtherPacket::type>()) : OtherPacket();
00119 }
00120 
00121 template <class OtherPacket>
00122 prefix_ OtherPacket senf::Packet::rfind()
00123     const
00124 {
00125     OtherPacket p (rfind<OtherPacket>(nothrow));
00126     if (!p) throw InvalidPacketChainException();
00127     return p;
00128 }
00129 
00130 template <class OtherPacket>
00131 prefix_ OtherPacket senf::Packet::last()
00132     const
00133 {
00134     return last().as<OtherPacket>();
00135 }
00136 
00137 template <class OtherPacket>
00138 prefix_ OtherPacket senf::Packet::first()
00139     const
00140 {
00141     return first().as<OtherPacket>();
00142 }
00143 
00144 template <class Other>
00145 prefix_ void senf::Packet::finalizeTo()
00146 {
00147     Packet p (find<Other>(nothrow));
00148     ptr()->finalizeTo(p ? p.ptr() : last().ptr());
00149 }
00150 
00151 template <class Annotation>
00152 prefix_ Annotation & senf::Packet::annotation()
00153 {
00154     return ptr()->annotation<Annotation>();
00155 }
00156 
00157 template <class Annotation>
00158 prefix_ Annotation const & senf::Packet::annotation()
00159     const
00160 {
00161     return ptr()->annotation<Annotation>();
00162 }
00163 
00164 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00165 // senf::ConcretePacket<PacketType>
00166 
00167 // structors and default members
00168 
00169 template <class PacketType>
00170 prefix_ senf::ConcretePacket<PacketType>::ConcretePacket()
00171 {}
00172 
00173 template <class PacketType>
00174 prefix_ typename senf::ConcretePacket<PacketType>::factory_t
00175 senf::ConcretePacket<PacketType>::factory()
00176 {
00177     return interpreter::factory();
00178 }
00179 
00180 // Create completely new packet
00181 
00182 template <class PacketType>
00183 prefix_ senf::ConcretePacket<PacketType>
00184 senf::ConcretePacket<PacketType>::create()
00185 {
00186     return ConcretePacket(interpreter::create());
00187 }
00188 
00189 template <class PacketType>
00190 prefix_ senf::ConcretePacket<PacketType>
00191 senf::ConcretePacket<PacketType>::create(senf::NoInit_t)
00192 {
00193     return ConcretePacket(interpreter::create(senf::noinit));
00194 }
00195 
00196 template <class PacketType>
00197 prefix_ senf::ConcretePacket<PacketType>
00198 senf::ConcretePacket<PacketType>::create(size_type size)
00199 {
00200     return ConcretePacket(interpreter::create(size));
00201 }
00202 
00203 template <class PacketType>
00204 prefix_ senf::ConcretePacket<PacketType>
00205 senf::ConcretePacket<PacketType>::create(size_type size, senf::NoInit_t)
00206 {
00207     return ConcretePacket(interpreter::create(size,senf::noinit));
00208 }
00209 
00210 #ifndef DOXYGEN
00211 
00212 template <class PacketType>
00213 template <class ForwardReadableRange>
00214 prefix_ senf::ConcretePacket<PacketType> senf::ConcretePacket<PacketType>::
00215 create(ForwardReadableRange const & range,
00216        typename boost::disable_if< boost::is_integral<ForwardReadableRange> >::type *)
00217 {
00218     return ConcretePacket(interpreter::create(range));
00219 }
00220 
00221 #endif
00222 
00223 // Create packet as new packet after a given packet
00224 
00225 template <class PacketType>
00226 prefix_ senf::ConcretePacket<PacketType>
00227 senf::ConcretePacket<PacketType>::createAfter(Packet const & packet)
00228 {
00229     return ConcretePacket(interpreter::createAfter(packet.ptr()));
00230 }
00231 
00232 template <class PacketType>
00233 prefix_ senf::ConcretePacket<PacketType>
00234 senf::ConcretePacket<PacketType>::createAfter(Packet const & packet, senf::NoInit_t)
00235 {
00236     return ConcretePacket(interpreter::createAfter(packet.ptr(),senf::noinit));
00237 }
00238 
00239 template <class PacketType>
00240 prefix_ senf::ConcretePacket<PacketType>
00241 senf::ConcretePacket<PacketType>::createAfter(Packet const & packet, size_type size)
00242 {
00243     return ConcretePacket(interpreter::createAfter(packet.ptr(), size));
00244 }
00245 
00246 template <class PacketType>
00247 prefix_ senf::ConcretePacket<PacketType>
00248 senf::ConcretePacket<PacketType>::createAfter(Packet const & packet, size_type size,
00249                                               senf::NoInit_t)
00250 {
00251     return ConcretePacket(interpreter::createAfter(packet.ptr(), size, senf::noinit));
00252 }
00253 
00254 #ifndef DOXYGEN
00255 
00256 template <class PacketType>
00257 template <class ForwardReadableRange>
00258 prefix_ senf::ConcretePacket<PacketType> senf::ConcretePacket<PacketType>::
00259 createAfter(Packet const & packet, ForwardReadableRange const & range,
00260             typename boost::disable_if< boost::is_integral<ForwardReadableRange> >::type *)
00261 {
00262     return ConcretePacket(interpreter::createAfter(packet.ptr(), range));
00263 }
00264 
00265 #endif
00266 
00267 // Create packet as new packet (header) before a given packet
00268 
00269 template <class PacketType>
00270 prefix_ senf::ConcretePacket<PacketType>
00271 senf::ConcretePacket<PacketType>::createBefore(Packet const & packet)
00272 {
00273     return ConcretePacket(interpreter::createBefore(packet.ptr()));
00274 }
00275 
00276 template <class PacketType>
00277 prefix_ senf::ConcretePacket<PacketType>
00278 senf::ConcretePacket<PacketType>::createBefore(Packet const & packet, senf::NoInit_t)
00279 {
00280     return ConcretePacket(interpreter::createBefore(packet.ptr(), senf::noinit));
00281 }
00282 
00283 template <class PacketType>
00284 prefix_ senf::ConcretePacket<PacketType>
00285 senf::ConcretePacket<PacketType>::createInsertBefore(Packet const & packet)
00286 {
00287     return ConcretePacket(interpreter::createInsertBefore(packet.ptr()));
00288 }
00289 
00290 template <class PacketType>
00291 prefix_ senf::ConcretePacket<PacketType>
00292 senf::ConcretePacket<PacketType>::createInsertBefore(Packet const & packet, senf::NoInit_t)
00293 {
00294     return ConcretePacket(interpreter::createInsertBefore(packet.ptr(), senf::noinit));
00295 }
00296 
00297 // Create a clone of the current packet
00298 
00299 template <class PacketType>
00300 prefix_ senf::ConcretePacket<PacketType>
00301 senf::ConcretePacket<PacketType>::clone()
00302     const
00303 {
00304     return ConcretePacket(ptr()->clone());
00305 }
00306 
00307 // Field access
00308 
00309 template <class PacketType>
00310 prefix_ typename senf::ConcretePacket<PacketType>::Parser
00311 senf::ConcretePacket<PacketType>::parser()
00312     const
00313 {
00314     return ptr()->fields();
00315 }
00316 
00317 template <class PacketType>
00318 prefix_ typename senf::ConcretePacket<PacketType>::ParserProxy
00319 senf::ConcretePacket<PacketType>::operator->()
00320     const
00321 {
00322     return ParserProxy(parser());
00323 }
00324 
00325 // private members
00326 
00327 template <class PacketType>
00328 prefix_ senf::ConcretePacket<PacketType>::ConcretePacket(typename interpreter::ptr const & packet_)
00329     : Packet(packet_)
00330 {}
00331 
00332 template <class PacketType>
00333 prefix_ typename senf::ConcretePacket<PacketType>::interpreter * senf::ConcretePacket<PacketType>::ptr()
00334     const
00335 {
00336     return static_cast< PacketInterpreter<PacketType> *>( Packet::ptr().get());
00337 }
00338 
00339 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00340 #undef prefix_
00341 
00342 
00343 // Local Variables:
00344 // mode: c++
00345 // fill-column: 100
00346 // c-file-style: "senf"
00347 // indent-tabs-mode: nil
00348 // ispell-local-dictionary: "american"
00349 // compile-command: "scons -u test"
00350 // comment-column: 40
00351 // End:

Contact: senf-dev@lists.berlios.de | © 2006-2010 Fraunhofer Institute for Open Communication Systems, Network Research