X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Socket%2FSocketHandle.cti;h=23997a832e88116d89788e6ceb51a65e232c6f32;hb=99822a43b5a79b68563b8ae09e1f36791ede66b1;hp=3df213cdb03ef328f3f67c04cc6e69622b4ed7ec;hpb=8421c3a8da7485cb8781045494ecaab3ed84f403;p=senf.git diff --git a/Socket/SocketHandle.cti b/Socket/SocketHandle.cti index 3df213c..23997a8 100644 --- a/Socket/SocketHandle.cti +++ b/Socket/SocketHandle.cti @@ -1,9 +1,9 @@ // $Id$ // // Copyright (C) 2006 -// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS) -// Kompetenzzentrum fuer Satelitenkommunikation (SatCom) -// Stefan Bund +// Fraunhofer Institute for Open Communication Systems (FOKUS) +// Competence Center NETwork research (NET), St. Augustin, GERMANY +// Stefan Bund // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -27,91 +27,94 @@ #include "SocketHandle.ih" // Custom includes +#include "../Utils/senfassert.hh" #include #include -#include "Utils/TypeInfo.hh" +#include "../Utils/TypeInfo.hh" #define prefix_ inline ///////////////////////////////cti.p/////////////////////////////////////// -template -prefix_ senf::SocketHandle::SocketHandle() +/////////////////////////////////////////////////////////////////////////// +// senf::SocketHandle + +template +prefix_ senf::SocketHandle::SocketHandle() {} -template +template template -prefix_ senf::SocketHandle::SocketHandle(SocketHandle other, +prefix_ senf::SocketHandle::SocketHandle(SocketHandle other, typename IsCompatible::type *) : FileHandle(other) {} -template +template template -prefix_ typename senf::SocketHandle::template IsCompatible::type const & -senf::SocketHandle::operator=(SocketHandle other) +prefix_ typename senf::SocketHandle::template IsCompatible::type const & +senf::SocketHandle::operator=(SocketHandle other) { assign(other); return *this; } -template +template prefix_ -senf::SocketHandle::SocketHandle(std::auto_ptr protocol, - bool isServer) - : FileHandle(std::auto_ptr(new SocketBody(protocol,isServer))) +senf::SocketHandle::SocketHandle(std::auto_ptr body) + : FileHandle(std::auto_ptr(body.release())) {} -template -prefix_ senf::SocketHandle::SocketHandle(FileHandle other, bool isChecked) +template +prefix_ senf::SocketHandle::SocketHandle(FileHandle other, bool isChecked) : FileHandle(other) { - BOOST_ASSERT( isChecked ); - BOOST_ASSERT( dynamic_cast(&FileHandle::body()) ); + SENF_ASSERT( isChecked ); + SENF_ASSERT( dynamic_cast(&FileHandle::body()) ); } -template -prefix_ senf::SocketBody & senf::SocketHandle::body() +template +prefix_ senf::SocketBody & senf::SocketHandle::body() { - BOOST_ASSERT( dynamic_cast(&FileHandle::body()) ); + SENF_ASSERT( dynamic_cast(&FileHandle::body()) ); return static_cast(FileHandle::body()); } -template -prefix_ senf::SocketBody const & senf::SocketHandle::body() +template +prefix_ senf::SocketBody const & senf::SocketHandle::body() const { - BOOST_ASSERT( dynamic_cast(&FileHandle::body()) ); + SENF_ASSERT( dynamic_cast(&FileHandle::body()) ); return static_cast(FileHandle::body()); } -template -prefix_ senf::SocketProtocol const & senf::SocketHandle::protocol() +template +prefix_ senf::SocketProtocol & senf::SocketHandle::protocol() const { return body().protocol(); } -template -prefix_ void senf::SocketHandle::assign(FileHandle other) +template +prefix_ void senf::SocketHandle::assign(FileHandle other) { FileHandle::operator=(other); } -template -prefix_ senf::SocketHandle -senf::SocketHandle::cast_static(FileHandle handle) +template +prefix_ senf::SocketHandle +senf::SocketHandle::cast_static(FileHandle handle) { return SocketHandle(handle,true); } -template -prefix_ senf::SocketHandle -senf::SocketHandle::cast_dynamic(FileHandle handle) +template +prefix_ senf::SocketHandle +senf::SocketHandle::cast_dynamic(FileHandle handle) { // throws bad_cast if the body is not a SocketBody SocketBody & body (dynamic_cast(FileHandle::body(handle))); - // throws bad_cast if the policy is not compatible - SocketPolicy::checkBaseOf(body.protocol().policy()); + // throws bad_cast if the policy is not compatible (already wrapped ...) + SPolicy::checkBaseOf(body.protocol().policy()); return cast_static(handle); } @@ -123,29 +126,32 @@ prefix_ Target senf::static_socket_cast(Source handle) boost::is_convertible::value && ( boost::is_convertible::value || boost::is_convertible::value ) )); - BOOST_ASSERT( check_socket_cast(handle) ); + SENF_ASSERT( check_socket_cast(handle) ); return Target::cast_static(handle); } template prefix_ Target senf::dynamic_socket_cast(Source handle) { - BOOST_STATIC_ASSERT(( - boost::is_convertible::value && - boost::is_convertible::value && - ( boost::is_convertible::value || - boost::is_convertible::value ) )); - return Target::cast_dynamic(handle); +// BOOST_STATIC_ASSERT(( +// boost::is_convertible::value && +// boost::is_convertible::value && +// ( boost::is_convertible::value || +// boost::is_convertible::value ) )); + try { + return Target::cast_dynamic(handle); + } + SENF_WRAP_EXC(std::bad_cast) } template prefix_ bool senf::check_socket_cast(Source handle) { - BOOST_STATIC_ASSERT(( - boost::is_convertible::value && - boost::is_convertible::value && - ( boost::is_convertible::value || - boost::is_convertible::value ) )); +// BOOST_STATIC_ASSERT(( +// boost::is_convertible::value && +// boost::is_convertible::value && +// ( boost::is_convertible::value || +// boost::is_convertible::value ) )); // we don't have a non-throwing variant of cast_dynamic // for two reasons: // a) since the handle is passed back by value, we cannot return @@ -161,34 +167,59 @@ prefix_ bool senf::check_socket_cast(Source handle) return true; } -template -prefix_ void senf::SocketHandle::state(SocketStateMap & map, unsigned lod) +template +prefix_ void senf::SocketHandle::state(SocketStateMap & map, unsigned lod) { // We use typeid here even though the type of *this is static // (SocketHandle is not polymorphic and has no vtable). This will // automatically include the SocketPolicy template parameter in // the type name and therefore show the \e static policy of the // socket handle. - map["handle"] = prettyName(typeid(*this)); + map["handle"] << prettyName(typeid(*this)); body().state(map,lod); } -template -prefix_ std::string senf::SocketHandle::dumpState(unsigned lod) +template +prefix_ std::string senf::SocketHandle::dumpState(unsigned lod) { SocketStateMap map; state(map,lod); return detail::dumpState(map); } +template +template +prefix_ Facet & senf::SocketHandle::facet() + +{ + try { + return dynamic_cast(protocol()); + } + SENF_WRAP_EXC(std::bad_cast) +} + /////////////////////////////////////////////////////////////////////////// -// senf::detail::ConvertibleString +// senf::ProtocolSocketBody -template -prefix_ senf::detail::ConvertibleString::ConvertibleString(T const & other) - : std::string(boost::lexical_cast(other)) +template +prefix_ senf::ProtocolSocketBody::ProtocolSocketBody(bool isServer) + : SocketBody(isServer) {} +template +prefix_ senf::ProtocolSocketBody::ProtocolSocketBody(bool isServer, int fd) + : SocketBody(isServer, fd) +{} + +/////////////////////////////////////////////////////////////////////////// + +template +prefix_ std::ostream & senf::operator<<(std::ostream & os, SocketHandle handle) +{ + os << handle.dumpState(); + return os; +} + ///////////////////////////////cti.e/////////////////////////////////////// #undef prefix_ @@ -199,4 +230,6 @@ prefix_ senf::detail::ConvertibleString::ConvertibleString(T const & other) // c-file-style: "senf" // indent-tabs-mode: nil // ispell-local-dictionary: "american" +// compile-command: "scons -u test" +// comment-column: 40 // End: