X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Socket%2FSocketHandle.cti;h=310dfddccb3cb7bd04274b358bf578d815625718;hb=fd3a0e8ac95d1158e9ea661ddf9187b67c70169f;hp=852cc3fc0bf84483af2eadd35a9c251f542ae1cb;hpb=51044eb18f034c1a059ffe2fb109a422c1cbe251;p=senf.git diff --git a/Socket/SocketHandle.cti b/Socket/SocketHandle.cti index 852cc3f..310dfdd 100644 --- a/Socket/SocketHandle.cti +++ b/Socket/SocketHandle.cti @@ -1,8 +1,8 @@ // $Id$ // // Copyright (C) 2006 -// Fraunhofer Institute for Open Communication Systems (FOKUS) -// Competence Center NETwork research (NET), St. Augustin, GERMANY +// 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 @@ -27,92 +27,93 @@ #include "SocketHandle.ih" // Custom includes -#include "../Utils/senfassert.hh" #include -#include +#include "../Utils/senfassert.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) { SENF_ASSERT( isChecked ); - SENF_ASSERT( dynamic_cast(&FileHandle::body()) ); + SENF_ASSERT( ! valid() || dynamic_cast(&FileHandle::body()) ); } -template -prefix_ senf::SocketBody & senf::SocketHandle::body() +template +prefix_ senf::SocketBody & senf::SocketHandle::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 { 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); } @@ -131,22 +132,25 @@ prefix_ Target senf::static_socket_cast(Source 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 @@ -162,8 +166,8 @@ 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 @@ -174,14 +178,47 @@ prefix_ void senf::SocketHandle::state(SocketStateMap & map, unsig 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::ProtocolSocketBody + +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_