diff --git a/Socket/ClientSocketHandle.cti b/Socket/ClientSocketHandle.cti index 1e311213388e885ea8781fc1a67073dadbc3237a..eec7cf7e7be1665496415d01564f46b42a24bc74 100644 --- a/Socket/ClientSocketHandle.cti +++ b/Socket/ClientSocketHandle.cti @@ -197,6 +197,21 @@ satcom::lib::ClientSocketHandle<Policy>::cast_dynamic(FileHandle handle) return cast_static(handle); } +template <class Policy> +prefix_ void satcom::lib::ClientSocketHandle<Policy>::state(SocketStateMap & map, unsigned lod) +{ + map["handle"] = prettyName(typeid(*this)); + this->body().state(map,lod); +} + +template <class Policy> +prefix_ std::string satcom::lib::ClientSocketHandle<Policy>::dumpState(unsigned lod) +{ + SocketStateMap map; + state(map,lod); + return detail::dumpState(map); +} + ///////////////////////////////cti.e/////////////////////////////////////// #undef prefix_ diff --git a/Socket/ClientSocketHandle.hh b/Socket/ClientSocketHandle.hh index 3b5b8b57165c1ba5561dcd9f1600e11f4bbc1957..0e670ab45e57de1446dd2b3be426c129fcd25cb1 100644 --- a/Socket/ClientSocketHandle.hh +++ b/Socket/ClientSocketHandle.hh @@ -125,7 +125,11 @@ namespace lib { static ClientSocketHandle cast_static(FileHandle handle); static ClientSocketHandle cast_dynamic(FileHandle handle); - + + // we need to override both since SocketHandle is *not* polymorphic + void state(SocketStateMap & map, unsigned lod=0); + std::string dumpState(unsigned lod=0); + protected: ClientSocketHandle(FileHandle other, bool isChecked); explicit ClientSocketHandle(std::auto_ptr<SocketProtocol> protocol, diff --git a/Socket/ProtocolClientSocketHandle.cti b/Socket/ProtocolClientSocketHandle.cti index d33f3e13d9df9fceeacd02f0396eee114df94a00..0f01b8899db8c68c0f303d29a442b5c6f9a3e68e 100644 --- a/Socket/ProtocolClientSocketHandle.cti +++ b/Socket/ProtocolClientSocketHandle.cti @@ -74,6 +74,24 @@ satcom::lib::ProtocolClientSocketHandle<SocketProtocol>::cast_dynamic(FileHandle return cast_static(handle); } +template <class SocketProtocol> +prefix_ void +satcom::lib::ProtocolClientSocketHandle<SocketProtocol>::state(SocketStateMap & map, + unsigned lod) +{ + map["handle"] = prettyName(typeid(*this)); + this->body().state(map,lod); +} + +template <class SocketProtocol> +prefix_ std::string +satcom::lib::ProtocolClientSocketHandle<SocketProtocol>::dumpState(unsigned lod) +{ + SocketStateMap map; + state(map,lod); + return detail::dumpState(map); +} + ///////////////////////////////cti.e/////////////////////////////////////// #undef prefix_ diff --git a/Socket/ProtocolClientSocketHandle.hh b/Socket/ProtocolClientSocketHandle.hh index cf7ccc136666ae29d09d6d3453542e14371eb0f7..eeca1e7622ec7084a680c5c883d8f549be216327 100644 --- a/Socket/ProtocolClientSocketHandle.hh +++ b/Socket/ProtocolClientSocketHandle.hh @@ -63,6 +63,9 @@ namespace lib { static ProtocolClientSocketHandle cast_static(FileHandle handle); static ProtocolClientSocketHandle cast_dynamic(FileHandle handle); + void state(SocketStateMap & map, unsigned lod=0); + std::string dumpState(unsigned lod=0); + protected: ProtocolClientSocketHandle(FileHandle other, bool isChecked); diff --git a/Socket/ProtocolServerSocketHandle.cti b/Socket/ProtocolServerSocketHandle.cti index 157bc5665110486ac7f0bbf2427dcc4b68b73338..76bb2423708cc7b0709e853f7d0908ffeb23e694 100644 --- a/Socket/ProtocolServerSocketHandle.cti +++ b/Socket/ProtocolServerSocketHandle.cti @@ -75,6 +75,24 @@ satcom::lib::ProtocolServerSocketHandle<SocketProtocol>::cast_dynamic(FileHandle return cast_static(handle); } +template <class SocketProtocol> +prefix_ void +satcom::lib::ProtocolServerSocketHandle<SocketProtocol>::state(SocketStateMap & map, + unsigned lod) +{ + map["handle"] = prettyName(typeid(*this)); + this->body().state(map,lod); +} + +template <class SocketProtocol> +prefix_ std::string +satcom::lib::ProtocolServerSocketHandle<SocketProtocol>::dumpState(unsigned lod) +{ + SocketStateMap map; + state(map,lod); + return detail::dumpState(map); +} + template <class SocketProtocol> prefix_ satcom::lib::ProtocolServerSocketHandle<SocketProtocol>:: ProtocolServerSocketHandle(FileHandle other, bool isChecked) diff --git a/Socket/ProtocolServerSocketHandle.hh b/Socket/ProtocolServerSocketHandle.hh index a14ecf22ab2e3b1979b2bb9b00bc0d44d7f4624b..c42ee11abc09e9222b8f005ec9f0ae900ba81ce5 100644 --- a/Socket/ProtocolServerSocketHandle.hh +++ b/Socket/ProtocolServerSocketHandle.hh @@ -65,6 +65,9 @@ namespace lib { static ProtocolServerSocketHandle cast_static(FileHandle handle); static ProtocolServerSocketHandle cast_dynamic(FileHandle handle); + void state(SocketStateMap & map, unsigned lod=0); + std::string dumpState(unsigned lod=0); + protected: ProtocolServerSocketHandle(FileHandle other, bool isChecked); diff --git a/Socket/ProtocolServerSocketHandle.test.cc b/Socket/ProtocolServerSocketHandle.test.cc index eb56abc118640c13d1e793219b08b4312e1de82f..22b6cb4a589792c896fb9ac6929e283598aed8d9 100644 --- a/Socket/ProtocolServerSocketHandle.test.cc +++ b/Socket/ProtocolServerSocketHandle.test.cc @@ -64,6 +64,15 @@ BOOST_AUTO_UNIT_TEST(protocolServerSocketHandle) MySocketHandle::ClientSocketHandle client = h.accept(); BOOST_CHECK_EQUAL( client.fd(), -1 ); + + BOOST_CHECK_EQUAL( h.dumpState(), + "handle: satcom::lib::ProtocolServerSocketHandle<(anonymous namespace)::MyProtocol>\n" + "file.handle: -1\n" + "file.refcount: 2\n" + "socket.policy: satcom::lib::SocketPolicy<satcom::lib::test::SomeAddressingPolicy, satcom::lib::test::SomeFramingPolicy, satcom::lib::test::SomeCommunicationPolicy, satcom::lib::test::SomeReadPolicy, satcom::lib::test::SomeWritePolicy, satcom::lib::test::SomeBufferingPolicy>\n" + "socket.protocol: (anonymous namespace)::MyProtocol\n" + "socket.server: true\n" ); + } { diff --git a/Socket/ServerSocketHandle.cti b/Socket/ServerSocketHandle.cti index 17caf770eca62e3b2ed16841c63bd82d9ce078cd..0887c90b573a21335c9d271e81056e61176f97d1 100644 --- a/Socket/ServerSocketHandle.cti +++ b/Socket/ServerSocketHandle.cti @@ -135,6 +135,21 @@ satcom::lib::ServerSocketHandle<Policy>::cast_dynamic(FileHandle handle) return cast_static(handle); } +template <class Policy> +prefix_ void satcom::lib::ServerSocketHandle<Policy>::state(SocketStateMap & map, unsigned lod) +{ + map["handle"] = prettyName(typeid(*this)); + this->body().state(map,lod); +} + +template <class Policy> +prefix_ std::string satcom::lib::ServerSocketHandle<Policy>::dumpState(unsigned lod) +{ + SocketStateMap map; + state(map,lod); + return detail::dumpState(map); +} + ///////////////////////////////cti.e/////////////////////////////////////// #undef prefix_ diff --git a/Socket/ServerSocketHandle.hh b/Socket/ServerSocketHandle.hh index 013d63fa1d4148478ac4f9b5722294c201304595..42a6bae39b6c0df5415670657ef6c071adedfd2b 100644 --- a/Socket/ServerSocketHandle.hh +++ b/Socket/ServerSocketHandle.hh @@ -98,6 +98,10 @@ namespace lib { static ServerSocketHandle cast_static(FileHandle handle); static ServerSocketHandle cast_dynamic(FileHandle handle); + // we need to override both since SocketHandle is *not* polymorphic + void state(SocketStateMap & map, unsigned lod=0); + std::string dumpState(unsigned lod=0); + protected: ServerSocketHandle(FileHandle other, bool isChecked); explicit ServerSocketHandle(std::auto_ptr<SocketProtocol> protocol); diff --git a/Socket/SocketHandle.cc b/Socket/SocketHandle.cc index 401b8028b14b05ba56dc075d3315fdeaa17729d4..186953aa2988386cfc37d3991541d965c9adfc82 100644 --- a/Socket/SocketHandle.cc +++ b/Socket/SocketHandle.cc @@ -28,6 +28,7 @@ // Custom includes #include <sstream> #include <sys/socket.h> +#include "Utils/TypeInfo.hh" //#include "SocketHandle.mpp" #define prefix_ @@ -63,8 +64,11 @@ prefix_ bool satcom::lib::SocketBody::v_eof() prefix_ void satcom::lib::SocketBody::state(SocketStateMap & map, unsigned lod) { - map["handle.server"] = isServer() ? "true" : "false"; - map["handle.protocol"] = typeid(protocol()).name(); + map["file.handle"] = fd(); + map["file.refcount"] = refcount(); + map["socket.server"] = isServer(); + map["socket.protocol"] = prettyName(typeid(protocol())); + map["socket.policy"] = prettyName(typeid(protocol().policy())); protocol().state(map,lod); } diff --git a/Socket/SocketHandle.cci b/Socket/SocketHandle.cci index dc16cab379126fdcd121ef7eb369e1386fb6dca2..f036df15ea99047b6e8995255b9e70070e5ec05f 100644 --- a/Socket/SocketHandle.cci +++ b/Socket/SocketHandle.cci @@ -58,6 +58,16 @@ prefix_ bool satcom::lib::SocketBody::isServer() return isServer_; } +/////////////////////////////////////////////////////////////////////////// +// satcom::lib::detail::ConvertibleString + +prefix_ satcom::lib::detail::ConvertibleString::ConvertibleString() +{} + +prefix_ satcom::lib::detail::ConvertibleString::ConvertibleString(bool v) + : std::string(v ? "true" : "false") +{} + ///////////////////////////////cci.e/////////////////////////////////////// #undef prefix_ diff --git a/Socket/SocketHandle.ct b/Socket/SocketHandle.ct new file mode 100644 index 0000000000000000000000000000000000000000..9a90bd8f87996143f4ca422707822fc8f39e0cfd --- /dev/null +++ b/Socket/SocketHandle.ct @@ -0,0 +1,50 @@ +// $Id$ +// +// Copyright (C) 2006 +// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS) +// Kompetenzzentrum fuer Satelitenkommunikation (SatCom) +// Stefan Bund <stefan.bund@fokus.fraunhofer.de> +// +// 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 +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +// Definition of non-inline template functions + +#include "SocketHandle.ih" + +// Custom includes +#include <boost/lexical_cast.hpp> + +#define prefix_ +///////////////////////////////ct.p//////////////////////////////////////// + +template <class T> +prefix_ satcom::lib::detail::ConvertibleString & +satcom::lib::detail::ConvertibleString::operator+=(ConvertibleString const & other) +{ + if (!empty()) + this->std::string::operator+=(", "); + this->std::string::operator+=(other); + return *this; +} + +///////////////////////////////ct.e//////////////////////////////////////// +#undef prefix_ + + +// Local Variables: +// mode: c++ +// c-file-style: "satcom" +// End: diff --git a/Socket/SocketHandle.cti b/Socket/SocketHandle.cti index 6e3f6a8e793a6b4defd4d5be50e7ffb88308870d..dde5bf78fd8c63176fefb93bbb6cb47e905f0d17 100644 --- a/Socket/SocketHandle.cti +++ b/Socket/SocketHandle.cti @@ -26,6 +26,8 @@ // Custom includes #include <typeinfo> +#include <boost/lexical_cast.hpp> +#include "Utils/TypeInfo.hh" #define prefix_ inline ///////////////////////////////cti.p/////////////////////////////////////// @@ -156,6 +158,7 @@ prefix_ bool satcom::lib::check_socket_cast(Source handle) template <class SocketPolicy> prefix_ void satcom::lib::SocketHandle<SocketPolicy>::state(SocketStateMap & map, unsigned lod) { + map["handle"] = prettyName(typeid(*this)); body().state(map,lod); } @@ -167,6 +170,13 @@ prefix_ std::string satcom::lib::SocketHandle<SocketPolicy>::dumpState(unsigned return detail::dumpState(map); } +/////////////////////////////////////////////////////////////////////////// +// satcom::lib::detail::ConvertibleString + +template <class T> +prefix_ satcom::lib::detail::ConvertibleString::ConvertibleString(T const & other) + : std::string(boost::lexical_cast<std::string>(other)) +{} ///////////////////////////////cti.e/////////////////////////////////////// #undef prefix_ diff --git a/Socket/SocketHandle.hh b/Socket/SocketHandle.hh index 66999db1fdf7f2abbaa96c1d6bac607975d5f7c3..f56e7d486b216f32341a51c8a9329aad62d5dbde 100644 --- a/Socket/SocketHandle.hh +++ b/Socket/SocketHandle.hh @@ -20,6 +20,9 @@ // Free Software Foundation, Inc., // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// TODO: Create a SocketHandleBase class and move some non-Policy +// dependent code there + #ifndef HH_SocketHandle_ #define HH_SocketHandle_ 1 @@ -76,8 +79,8 @@ namespace lib { static SocketHandle cast_static(FileHandle handle); static SocketHandle cast_dynamic(FileHandle handle); - void state(SocketStateMap & map, unsigned lod); - std::string dumpState(unsigned lod); + void state(SocketStateMap & map, unsigned lod=0); + std::string dumpState(unsigned lod=0); protected: explicit SocketHandle(std::auto_ptr<SocketProtocol> protocol, bool isServer); @@ -108,7 +111,7 @@ namespace lib { ///////////////////////////////hh.e//////////////////////////////////////// #include "SocketHandle.cci" -//#include "SocketHandle.ct" +#include "SocketHandle.ct" #include "SocketHandle.cti" #endif diff --git a/Socket/SocketHandle.ih b/Socket/SocketHandle.ih index 9cd96a296f8dd86fbcaf3496bc9d584b42ad8748..f2e2a328d5ed46df8be96e1f3ed3b56657e98ecf 100644 --- a/Socket/SocketHandle.ih +++ b/Socket/SocketHandle.ih @@ -37,6 +37,17 @@ namespace lib { class SocketProtocol; namespace detail { + + class ConvertibleString : public std::string + { + public: + ConvertibleString(); + ConvertibleString(bool v); + template <class T> + ConvertibleString(T const & other); + template <class T> + ConvertibleString & operator+= (ConvertibleString const & other); + }; struct StateMapOrdering : public std::binary_function<std::string,std::string,bool> @@ -46,7 +57,7 @@ namespace lib { } - typedef std::map< std::string, std::string, detail::StateMapOrdering > SocketStateMap; + typedef std::map< std::string, detail::ConvertibleString, detail::StateMapOrdering > SocketStateMap; namespace detail { std::string dumpState(SocketStateMap const & map); diff --git a/Socket/SocketHandle.test.cc b/Socket/SocketHandle.test.cc index c0e40cfd512ed03adf2c6ec388600d6707682989..cc2def83c1ea8f4a9b34ebd9adad3ba93152131d 100644 --- a/Socket/SocketHandle.test.cc +++ b/Socket/SocketHandle.test.cc @@ -86,6 +86,15 @@ BOOST_AUTO_UNIT_TEST(socketHandle) BOOST_CHECK_THROW( satcom::lib::dynamic_socket_cast<SomeSocketHandle>( satcom::lib::FileHandle(FDHandle())), std::bad_cast ); + + BOOST_CHECK_EQUAL( myh.dumpState(), + "handle: satcom::lib::SocketHandle<satcom::lib::SocketPolicy<satcom::lib::test::SomeAddressingPolicy, satcom::lib::test::SomeFramingPolicy, satcom::lib::test::SomeCommunicationPolicy, satcom::lib::test::SomeReadPolicy, satcom::lib::test::SomeWritePolicy, satcom::lib::test::SomeBufferingPolicy> >\n" + "file.handle: -1\n" + "file.refcount: 3\n" + "socket.policy: satcom::lib::SocketPolicy<satcom::lib::test::SomeAddressingPolicy, satcom::lib::test::SomeFramingPolicy, satcom::lib::test::SomeCommunicationPolicy, satcom::lib::test::SomeReadPolicy, satcom::lib::test::SomeWritePolicy, satcom::lib::test::SomeBufferingPolicy>\n" + "socket.protocol: satcom::lib::test::SomeProtocol\n" + "socket.server: false\n" ); + } ///////////////////////////////cc.e////////////////////////////////////////