diff --git a/Socket/ClientSocketHandle.cti b/Socket/ClientSocketHandle.cti index 8bd5ca85302cff5254a9e342c2449a249d8fba3c..9a5cd7b28a759463e9dd4195258ea9fb79b06615 100644 --- a/Socket/ClientSocketHandle.cti +++ b/Socket/ClientSocketHandle.cti @@ -124,12 +124,9 @@ prefix_ senf::ClientSocketHandle<Policy>::ClientSocketHandle(FileHandle other, b template <class Policy> prefix_ -senf::ClientSocketHandle<Policy>::ClientSocketHandle(std::auto_ptr<SocketProtocol> protocol, - int fd) - : SocketHandle<Policy>(protocol,false) -{ - this->body().fd(fd); -} +senf::ClientSocketHandle<Policy>::ClientSocketHandle(std::auto_ptr<SocketBody> body) + : SocketHandle<Policy>(body) +{} #ifndef DOXYGEN template <class Policy> diff --git a/Socket/ClientSocketHandle.hh b/Socket/ClientSocketHandle.hh index 6150e28ffc6f520b93e991945978a1665261f70a..93cd2521017ac1a73558a9fa918db6c18645b7e2 100644 --- a/Socket/ClientSocketHandle.hh +++ b/Socket/ClientSocketHandle.hh @@ -429,8 +429,7 @@ namespace senf { protected: ClientSocketHandle(FileHandle other, bool isChecked); - explicit ClientSocketHandle(std::auto_ptr<SocketProtocol> protocol, - int fd = -1); + explicit ClientSocketHandle(std::auto_ptr<SocketBody> body); private: unsigned available(); diff --git a/Socket/ClientSocketHandle.test.cc b/Socket/ClientSocketHandle.test.cc index a7a253f1a216436eedf52e5198b6e97277bde474..5714e55b1f6cf5694d4ee71551774171a5f3b570 100644 --- a/Socket/ClientSocketHandle.test.cc +++ b/Socket/ClientSocketHandle.test.cc @@ -39,17 +39,17 @@ namespace { - namespace sl = senf; - class MySocketHandle - : public sl::ClientSocketHandle<sl::test::SomeProtocol::Policy> + : public senf::ClientSocketHandle<senf::test::SomeProtocol::Policy> { public: MySocketHandle() - : sl::ClientSocketHandle<sl::test::SomeProtocol::Policy>( - std::auto_ptr<sl::SocketProtocol>(new sl::test::SomeProtocol())) + : senf::ClientSocketHandle<senf::test::SomeProtocol::Policy>( + std::auto_ptr<senf::SocketBody>( + new senf::ProtocolSocketBody<senf::test::SomeProtocol>(false))) {} }; + } BOOST_AUTO_UNIT_TEST(clientSocketHandle) @@ -59,27 +59,27 @@ BOOST_AUTO_UNIT_TEST(clientSocketHandle) // conversion to other socket handles { - typedef sl::MakeSocketPolicy< - sl::test::SomeFramingPolicy, - sl::test::SomeReadPolicy, - sl::test::SomeWritePolicy + typedef senf::MakeSocketPolicy< + senf::test::SomeFramingPolicy, + senf::test::SomeReadPolicy, + senf::test::SomeWritePolicy >::policy OtherSocketPolicy; - typedef sl::SocketHandle<OtherSocketPolicy> OtherSocketHandle; + typedef senf::SocketHandle<OtherSocketPolicy> OtherSocketHandle; BOOST_CHECKPOINT("Copy-constructing socket handle"); OtherSocketHandle osh (myh); BOOST_CHECKPOINT("Assigning socket handle"); osh = myh; - typedef sl::ClientSocketHandle<sl::test::SomeProtocol::Policy> SomeSocketHandle; + typedef senf::ClientSocketHandle<senf::test::SomeProtocol::Policy> SomeSocketHandle; BOOST_CHECKPOINT("static_casting socket handle"); SomeSocketHandle ssh = - sl::static_socket_cast<SomeSocketHandle>(osh); - BOOST_CHECK_NO_THROW( sl::dynamic_socket_cast<SomeSocketHandle>(osh) ); - typedef sl::ClientSocketHandle<sl::MakeSocketPolicy< + senf::static_socket_cast<SomeSocketHandle>(osh); + BOOST_CHECK_NO_THROW( senf::dynamic_socket_cast<SomeSocketHandle>(osh) ); + typedef senf::ClientSocketHandle<senf::MakeSocketPolicy< OtherSocketPolicy, - sl::NoAddressingPolicy + senf::NoAddressingPolicy >::policy> SomeOtherSocketHandle; - BOOST_CHECK_THROW( sl::dynamic_socket_cast<SomeOtherSocketHandle>(osh), + BOOST_CHECK_THROW( senf::dynamic_socket_cast<SomeOtherSocketHandle>(osh), std::bad_cast ); } diff --git a/Socket/ProtocolClientSocketHandle.cti b/Socket/ProtocolClientSocketHandle.cti index e467fb0658777f79de9b22faaf2035b27fae3d05..43c7b01f2e8996c9e7c88bd2a36d677477ee0abd 100644 --- a/Socket/ProtocolClientSocketHandle.cti +++ b/Socket/ProtocolClientSocketHandle.cti @@ -43,7 +43,7 @@ ProtocolClientSocketHandle(senf::NoInit_t) template <class SocketProtocol> prefix_ senf::ProtocolClientSocketHandle<SocketProtocol>::ProtocolClientSocketHandle() : ClientSocketHandle<typename SocketProtocol::Policy>( - std::auto_ptr<senf::SocketProtocol>(new SocketProtocol())) + std::auto_ptr<senf::SocketBody>(new senf::ProtocolSocketBody<SocketProtocol>(false))) { this->protocol().init_client(); } diff --git a/Socket/ProtocolClientSocketHandle.mpp b/Socket/ProtocolClientSocketHandle.mpp index 20790a3623ef6b167722ba69e462720d7a5d7cc9..37a22de93d711c411e834b48e65511eb4583682d 100644 --- a/Socket/ProtocolClientSocketHandle.mpp +++ b/Socket/ProtocolClientSocketHandle.mpp @@ -62,7 +62,7 @@ template < mpp_TemplateParameters() > prefix_ senf::ProtocolClientSocketHandle<SocketProtocol>:: ProtocolClientSocketHandle( mpp_MethodParameters() ) : ClientSocketHandle<typename SocketProtocol::Policy>( - std::auto_ptr<senf::SocketProtocol>(new SocketProtocol())) + std::auto_ptr<senf::SocketBody>(new ProtocolSocketBody<SocketProtocol>(false))) { this->protocol().init_client( mpp_CallParameters() ); } @@ -88,4 +88,6 @@ ProtocolClientSocketHandle( mpp_MethodParameters() ) // c-file-style: "senf" // indent-tabs-mode: nil // ispell-local-dictionary: "american" +// compile-command: "scons -u test" +// comment-column: 40 // End: diff --git a/Socket/ProtocolServerSocketHandle.cti b/Socket/ProtocolServerSocketHandle.cti index 85ce2006a6291b224b281349f412e6bb6dc6b940..e27a8e518e7e846a0ab4719895f6c83cf7cb8661 100644 --- a/Socket/ProtocolServerSocketHandle.cti +++ b/Socket/ProtocolServerSocketHandle.cti @@ -43,7 +43,7 @@ ProtocolServerSocketHandle(senf::NoInit_t) template <class SocketProtocol> prefix_ senf::ProtocolServerSocketHandle<SocketProtocol>::ProtocolServerSocketHandle() : ServerSocketHandle<typename SocketProtocol::Policy>( - std::auto_ptr<senf::SocketProtocol>(new SocketProtocol())) + std::auto_ptr<senf::SocketBody>(new ProtocolSocketBody<SocketProtocol>(true))) {} #define BOOST_PP_ITERATION_PARAMS_1 (4, (1, 9, SENF_ABSOLUTE_INCLUDE_PATH(Socket/ProtocolServerSocketHandle.mpp), 2)) diff --git a/Socket/ProtocolServerSocketHandle.mpp b/Socket/ProtocolServerSocketHandle.mpp index 08d1993a946f3f5a4e05597cc49516fbf4755a94..6d80464497d94a1641ae3bb20b13670994a16dde 100644 --- a/Socket/ProtocolServerSocketHandle.mpp +++ b/Socket/ProtocolServerSocketHandle.mpp @@ -66,7 +66,7 @@ template < mpp_PSSH_TemplateParameters() > prefix_ senf::ProtocolServerSocketHandle<SocketProtocol>:: ProtocolServerSocketHandle( mpp_PSSH_MethodParameters() ) : ServerSocketHandle<typename SocketProtocol::Policy>( - std::auto_ptr<senf::SocketProtocol>(new SocketProtocol())) + std::auto_ptr<senf::SocketBody>(new ProtocolSocketBody<SocketProtocol>(true))) { this->protocol().init_server( mpp_PSSH_CallParameters() ); } diff --git a/Socket/ProtocolServerSocketHandle.test.cc b/Socket/ProtocolServerSocketHandle.test.cc index e45ed4dd8d4dbc3487002ba84e4f16c922b42011..149342c73c9210c41299589c009955e9d44e7778 100644 --- a/Socket/ProtocolServerSocketHandle.test.cc +++ b/Socket/ProtocolServerSocketHandle.test.cc @@ -69,8 +69,8 @@ BOOST_AUTO_UNIT_TEST(protocolServerSocketHandle) "file.handle: -1\n" "file.refcount: 2\n" "handle: senf::ProtocolServerSocketHandle<(anonymous namespace)::MyProtocol>\n" - "socket.policy: senf::SocketPolicy<senf::test::SomeAddressingPolicy, senf::test::SomeFramingPolicy, senf::test::SomeCommunicationPolicy, senf::test::SomeReadPolicy, senf::test::SomeWritePolicy>\n" "socket.protocol: (anonymous namespace)::MyProtocol\n" + "socket.protocol.policy: senf::SocketPolicy<senf::test::SomeAddressingPolicy, senf::test::SomeFramingPolicy, senf::test::SomeCommunicationPolicy, senf::test::SomeReadPolicy, senf::test::SomeWritePolicy>\n" "socket.server: true\n" ); } diff --git a/Socket/Protocols/DVB/DVBDemuxHandles.cc b/Socket/Protocols/DVB/DVBDemuxHandles.cc index beed3c439663d7ed47c3483e2a18037b2afa6454..e54b3f92c17ed185a6152c5dbbf5461556d87dfb 100644 --- a/Socket/Protocols/DVB/DVBDemuxHandles.cc +++ b/Socket/Protocols/DVB/DVBDemuxHandles.cc @@ -57,12 +57,6 @@ prefix_ unsigned senf::DVBDemuxSectionProtocol::available() return 4096; } -prefix_ std::auto_ptr<senf::SocketProtocol> senf::DVBDemuxSectionProtocol::clone() - const -{ - return std::auto_ptr<SocketProtocol>(new DVBDemuxSectionProtocol()); -} - prefix_ void senf::DVBDemuxSectionProtocol::setSectionFilter(struct dmx_sct_filter_params *filter) const { @@ -89,12 +83,6 @@ prefix_ unsigned senf::DVBDemuxPESProtocol::available() return 4096; //??? } -prefix_ std::auto_ptr<senf::SocketProtocol> senf::DVBDemuxPESProtocol::clone() - const -{ - return std::auto_ptr<SocketProtocol>(new DVBDemuxPESProtocol()); -} - prefix_ void senf::DVBDemuxPESProtocol::setPESFilter(struct dmx_pes_filter_params *filter) const { @@ -121,12 +109,6 @@ prefix_ unsigned senf::DVBDvrProtocol::available() return 188; } -prefix_ std::auto_ptr<senf::SocketProtocol> senf::DVBDvrProtocol::clone() - const -{ - return std::auto_ptr<SocketProtocol>(new DVBDvrProtocol()); -} - ///////////////////////////////cc.e//////////////////////////////////////// #undef prefix_ //#include "DVBDemuxHandles.mpp" diff --git a/Socket/Protocols/DVB/DVBDemuxHandles.hh b/Socket/Protocols/DVB/DVBDemuxHandles.hh index 59fd81ab61565611b8517b2b0900ed62bda49585..6d521c76183775d1898e58f5e60146fa57ea351d 100644 --- a/Socket/Protocols/DVB/DVBDemuxHandles.hh +++ b/Socket/Protocols/DVB/DVBDemuxHandles.hh @@ -52,7 +52,7 @@ namespace senf { /** \brief xxx */ class DVBDemuxSectionProtocol - : public ConcreteSocketProtocol<DVBDemux_Policy>, + : public ConcreteSocketProtocol<DVBDemux_Policy, DVBDemuxSectionProtocol>, public DVBDemuxProtocol { public: @@ -73,8 +73,6 @@ namespace senf { unsigned available() const; - std::auto_ptr<SocketProtocol> clone() const; - ///@} void setSectionFilter(struct dmx_sct_filter_params *filter) const; @@ -87,7 +85,7 @@ namespace senf { /** \brief xxx */ class DVBDemuxPESProtocol - : public ConcreteSocketProtocol<DVBDemux_Policy>, + : public ConcreteSocketProtocol<DVBDemux_Policy,DVBDemuxPESProtocol>, public DVBDemuxProtocol { public: @@ -108,8 +106,6 @@ namespace senf { unsigned available() const; - std::auto_ptr<SocketProtocol> clone() const; - ///@} void setPESFilter(struct dmx_pes_filter_params *filter) const; @@ -124,7 +120,7 @@ namespace senf { /** \brief xxx */ class DVBDvrProtocol - : public ConcreteSocketProtocol<DVBDemux_Policy>, + : public ConcreteSocketProtocol<DVBDemux_Policy, DVBDvrProtocol>, public DVBDemuxProtocol { public: @@ -145,8 +141,6 @@ namespace senf { unsigned available() const; - std::auto_ptr<SocketProtocol> clone() const; - ///@} }; diff --git a/Socket/Protocols/DVB/DVBFrontendHandle.cc b/Socket/Protocols/DVB/DVBFrontendHandle.cc index c5e88e4bb528bdfa6d3eee4378d8b570cf98748d..7092bdae917219e46c4061eaafa4724461e4560e 100644 --- a/Socket/Protocols/DVB/DVBFrontendHandle.cc +++ b/Socket/Protocols/DVB/DVBFrontendHandle.cc @@ -63,13 +63,6 @@ prefix_ bool senf::DVBFrontendProtocol::eof() return false; } -prefix_ std::auto_ptr<senf::SocketProtocol> senf::DVBFrontendProtocol::clone() - const -{ - return std::auto_ptr<SocketProtocol>(new DVBFrontendProtocol()); -} - - prefix_ void senf::DVBFrontendProtocol::signalStrength(int16_t *strength) const { diff --git a/Socket/Protocols/DVB/DVBFrontendHandle.hh b/Socket/Protocols/DVB/DVBFrontendHandle.hh index f40bab923864014c91fefb3de741eb9de53aaf44..626a37233520303c255bd701a59222bbdbf3b2ab 100644 --- a/Socket/Protocols/DVB/DVBFrontendHandle.hh +++ b/Socket/Protocols/DVB/DVBFrontendHandle.hh @@ -54,7 +54,7 @@ namespace senf { /** \brief xxx */ class DVBFrontendProtocol - : public ConcreteSocketProtocol<DVBFrontend_Policy> + : public ConcreteSocketProtocol<DVBFrontend_Policy, DVBFrontendProtocol> { public: /////////////////////////////////////////////////////////////////////////// @@ -75,8 +75,6 @@ namespace senf { unsigned available() const; bool eof() const; - std::auto_ptr<SocketProtocol> clone() const; - ///@} void signalStrength(int16_t *strength) const; diff --git a/Socket/Protocols/INet/ConnectedRawINetSocketHandle.cc b/Socket/Protocols/INet/ConnectedRawINetSocketHandle.cc index 39bb3dcfe66dfac2fede97f3c1444ef7e6d11a59..da6be3528c0cfffe449a3152092ae94eead04691 100644 --- a/Socket/Protocols/INet/ConnectedRawINetSocketHandle.cc +++ b/Socket/Protocols/INet/ConnectedRawINetSocketHandle.cc @@ -60,12 +60,6 @@ senf::ConnectedRawV4SocketProtocol::init_client(int const & protocol, INet4Socke clientHandle().connect(address); } -prefix_ std::auto_ptr<senf::SocketProtocol> senf::ConnectedRawV4SocketProtocol::clone() - const -{ - return std::auto_ptr<SocketProtocol>(new ConnectedRawV4SocketProtocol()); -} - /////////////////////////////////////////////////////////////////////////// // senf::UDPv6SocketProtocol:: @@ -92,12 +86,6 @@ senf::ConnectedRawV6SocketProtocol::init_client(int const & protocol, INet6Socke clientHandle().connect(address); } -prefix_ std::auto_ptr<senf::SocketProtocol> senf::ConnectedRawV6SocketProtocol::clone() - const -{ - return std::auto_ptr<SocketProtocol>(new ConnectedRawV6SocketProtocol()); -} - ///////////////////////////////cc.e//////////////////////////////////////// #undef prefix_ //#include "ConnectedRawINetSocketHandle.mpp" diff --git a/Socket/Protocols/INet/ConnectedRawINetSocketHandle.hh b/Socket/Protocols/INet/ConnectedRawINetSocketHandle.hh index 5cd86f87eaa809a6d91c71821ec6e1c3a2db91de..e1795d34375188319360baa7cb8de52a0f46e3dc 100644 --- a/Socket/Protocols/INet/ConnectedRawINetSocketHandle.hh +++ b/Socket/Protocols/INet/ConnectedRawINetSocketHandle.hh @@ -74,12 +74,11 @@ namespace senf { \see RawV6SocketProtocol */ class ConnectedRawV4SocketProtocol - : public ConcreteSocketProtocol<ConnectedRawV4Socket_Policy>, + : public ConcreteSocketProtocol<ConnectedRawV4Socket_Policy, ConnectedRawV4SocketProtocol>, public IPv4Protocol, public RawINetProtocol, public BSDSocketProtocol, - public AddressableBSDSocketProtocol//, -// public senf::pool_alloc_mixin<RawV4Socket_Policy> + public AddressableBSDSocketProtocol { public: /////////////////////////////////////////////////////////////////////////// @@ -101,11 +100,6 @@ namespace senf { \param[in] protocol Layer 4 protocol to filter for / to send \param[in] address local address to connect to */ - ///@} - ///\name Abstract Interface Implementation - - std::auto_ptr<SocketProtocol> clone() const; - ///@} }; @@ -149,12 +143,11 @@ namespace senf { \see RawV6SocketProtocol */ class ConnectedRawV6SocketProtocol - : public ConcreteSocketProtocol<ConnectedRawV6Socket_Policy>, + : public ConcreteSocketProtocol<ConnectedRawV6Socket_Policy, ConnectedRawV6SocketProtocol>, public IPv6Protocol, public RawINetProtocol, public BSDSocketProtocol, - public AddressableBSDSocketProtocol//, -// public senf::pool_alloc_mixin<RawV6SocketProtocol> + public AddressableBSDSocketProtocol { public: /////////////////////////////////////////////////////////////////////////// @@ -180,11 +173,6 @@ namespace senf { ProtocolClientSocketHandle::ProtocolClientSocketHandle() constructor (??) */ - ///@} - ///\name Abstract Interface Implementation - - std::auto_ptr<SocketProtocol> clone() const; - ///@} }; diff --git a/Socket/Protocols/INet/ConnectedUDPSocketHandle.cc b/Socket/Protocols/INet/ConnectedUDPSocketHandle.cc index d1150ba1bc152b275dd99bd11a92ab69e17a396d..4842f83a1035a18c7b3b372e6805fc42d7e004b6 100644 --- a/Socket/Protocols/INet/ConnectedUDPSocketHandle.cc +++ b/Socket/Protocols/INet/ConnectedUDPSocketHandle.cc @@ -58,12 +58,6 @@ senf::ConnectedUDPv4SocketProtocol::init_client(INet4SocketAddress const & addre clientHandle().connect(address); } -prefix_ std::auto_ptr<senf::SocketProtocol> senf::ConnectedUDPv4SocketProtocol::clone() - const -{ - return std::auto_ptr<SocketProtocol>(new ConnectedUDPv4SocketProtocol()); -} - /////////////////////////////////////////////////////////////////////////// // senf::ConnectedUDPv6SocketProtocol:: @@ -84,12 +78,6 @@ senf::ConnectedUDPv6SocketProtocol::init_client(INet6SocketAddress const & addre clientHandle().connect(address); } -prefix_ std::auto_ptr<senf::SocketProtocol> senf::ConnectedUDPv6SocketProtocol::clone() - const -{ - return std::auto_ptr<SocketProtocol>(new ConnectedUDPv6SocketProtocol()); -} - ///////////////////////////////cc.e//////////////////////////////////////// #undef prefix_ //#include "ConnectedUDPSocketHandle.mpp" diff --git a/Socket/Protocols/INet/ConnectedUDPSocketHandle.hh b/Socket/Protocols/INet/ConnectedUDPSocketHandle.hh index 928cf80328e9858dce9b500f9cd39706c272935a..5e09364b476db77ca0f09d156b10875ffbe87374 100644 --- a/Socket/Protocols/INet/ConnectedUDPSocketHandle.hh +++ b/Socket/Protocols/INet/ConnectedUDPSocketHandle.hh @@ -77,12 +77,11 @@ namespace senf { \see ConnectedUDPv6SocketProtocol */ class ConnectedUDPv4SocketProtocol - : public ConcreteSocketProtocol<ConnectedUDPv4Socket_Policy>, + : public ConcreteSocketProtocol<ConnectedUDPv4Socket_Policy, ConnectedUDPv4SocketProtocol>, public IPv4Protocol, public UDPProtocol, public BSDSocketProtocol, - public AddressableBSDSocketProtocol, - public senf::pool_alloc_mixin<ConnectedUDPv4SocketProtocol> + public AddressableBSDSocketProtocol { public: /////////////////////////////////////////////////////////////////////////// @@ -105,11 +104,6 @@ namespace senf { ProtocolClientSocketHandle::ProtocolClientSocketHandle() constructor */ - ///@} - ///\name Abstract Interface Implementation - - std::auto_ptr<SocketProtocol> clone() const; - ///@} }; @@ -143,12 +137,11 @@ namespace senf { \see ConnectedUDPv4SocketProtocol */ class ConnectedUDPv6SocketProtocol - : public ConcreteSocketProtocol<ConnectedUDPv6Socket_Policy>, + : public ConcreteSocketProtocol<ConnectedUDPv6Socket_Policy, ConnectedUDPv6SocketProtocol>, public IPv6Protocol, public UDPProtocol, public BSDSocketProtocol, - public AddressableBSDSocketProtocol, - public senf::pool_alloc_mixin<ConnectedUDPv6SocketProtocol> + public AddressableBSDSocketProtocol { public: /////////////////////////////////////////////////////////////////////////// @@ -171,11 +164,6 @@ namespace senf { ProtocolClientSocketHandle::ProtocolClientSocketHandle() constructor */ - ///@} - ///\name Abstract Interface Implementation - - std::auto_ptr<SocketProtocol> clone() const; - ///@} }; diff --git a/Socket/Protocols/INet/RawINetSocketHandle.cc b/Socket/Protocols/INet/RawINetSocketHandle.cc index c77594835a51dd98d0dde983c05272f3ca222b12..159cb1666c1d948d31bb75662403cbaa9bc1807f 100644 --- a/Socket/Protocols/INet/RawINetSocketHandle.cc +++ b/Socket/Protocols/INet/RawINetSocketHandle.cc @@ -60,12 +60,6 @@ senf::RawV4SocketProtocol::init_client(int const & protocol, INet4SocketAddress clientHandle().bind(address); } -prefix_ std::auto_ptr<senf::SocketProtocol> senf::RawV4SocketProtocol::clone() - const -{ - return std::auto_ptr<SocketProtocol>(new RawV4SocketProtocol()); -} - /////////////////////////////////////////////////////////////////////////// // senf::RawV6SocketProtocol:: @@ -92,12 +86,6 @@ senf::RawV6SocketProtocol::init_client(int const & protocol, INet6SocketAddress clientHandle().bind(address); } -prefix_ std::auto_ptr<senf::SocketProtocol> senf::RawV6SocketProtocol::clone() - const -{ - return std::auto_ptr<SocketProtocol>(new RawV6SocketProtocol()); -} - ///////////////////////////////cc.e//////////////////////////////////////// #undef prefix_ //#include "RawINetSocketHandle.mpp" diff --git a/Socket/Protocols/INet/RawINetSocketHandle.hh b/Socket/Protocols/INet/RawINetSocketHandle.hh index 2886c7f41e67a4d3af924676aa5ff73d77eb9e3b..3853c460fee4d43e23f1a8edea60f75e49c09a6d 100644 --- a/Socket/Protocols/INet/RawINetSocketHandle.hh +++ b/Socket/Protocols/INet/RawINetSocketHandle.hh @@ -74,14 +74,13 @@ namespace senf { \see RawV6SocketProtocol */ class RawV4SocketProtocol - : public ConcreteSocketProtocol<RawV4Socket_Policy>, + : public ConcreteSocketProtocol<RawV4Socket_Policy, RawV4SocketProtocol>, public IPv4Protocol, public RawINetProtocol, public BSDSocketProtocol, public AddressableBSDSocketProtocol, public MulticastProtocol, - public INet4MulticastProtocol, - public senf::pool_alloc_mixin<RawV4SocketProtocol> + public INet4MulticastProtocol { public: /////////////////////////////////////////////////////////////////////////// @@ -103,11 +102,6 @@ namespace senf { \param[in] protocol Layer 4 protocol to filter for / to send \param[in] address local address to bind to */ - ///@} - ///\name Abstract Interface Implementation - - std::auto_ptr<SocketProtocol> clone() const; - ///@} }; @@ -149,14 +143,13 @@ namespace senf { \see RawV4SocketProtocol */ class RawV6SocketProtocol - : public ConcreteSocketProtocol<RawV6Socket_Policy>, + : public ConcreteSocketProtocol<RawV6Socket_Policy,RawV6SocketProtocol>, public IPv6Protocol, public RawINetProtocol, public BSDSocketProtocol, public AddressableBSDSocketProtocol, public MulticastProtocol, - public INet4MulticastProtocol, - public senf::pool_alloc_mixin<RawV6SocketProtocol> + public INet4MulticastProtocol { public: /////////////////////////////////////////////////////////////////////////// @@ -182,11 +175,6 @@ namespace senf { ProtocolClientSocketHandle::ProtocolClientSocketHandle() constructor */ - ///@} - ///\name Abstract Interface Implementation - - std::auto_ptr<SocketProtocol> clone() const; - ///@} }; diff --git a/Socket/Protocols/INet/TCPSocketHandle.cc b/Socket/Protocols/INet/TCPSocketHandle.cc index 1b38473bf10aa28d20e4d707cbae23cb7405e110..5afe60c0bc5fa9685238024f02aab81472670f57 100644 --- a/Socket/Protocols/INet/TCPSocketHandle.cc +++ b/Socket/Protocols/INet/TCPSocketHandle.cc @@ -78,12 +78,6 @@ prefix_ void senf::TCPv4SocketProtocol::init_server(INet4SocketAddress const & a throwErrno(); } -prefix_ std::auto_ptr<senf::SocketProtocol> senf::TCPv4SocketProtocol::clone() - const -{ - return std::auto_ptr<SocketProtocol>(new TCPv4SocketProtocol()); -} - /////////////////////////////////////////////////////////////////////////// // senf::TCPv6SocketProtocol:: @@ -124,12 +118,6 @@ prefix_ void senf::TCPv6SocketProtocol::init_server(INet6SocketAddress const & a throwErrno(); } -prefix_ std::auto_ptr<senf::SocketProtocol> senf::TCPv6SocketProtocol::clone() - const -{ - return std::auto_ptr<SocketProtocol>(new TCPv6SocketProtocol()); -} - ///////////////////////////////cc.e//////////////////////////////////////// #undef prefix_ //#include "TCPSocketHandle.mpp" diff --git a/Socket/Protocols/INet/TCPSocketHandle.hh b/Socket/Protocols/INet/TCPSocketHandle.hh index b3293de35b5e4bedecc8d0ca47347684abccb048..dffd6686ebfdf303d5102f2d7ce4799fd94159f7 100644 --- a/Socket/Protocols/INet/TCPSocketHandle.hh +++ b/Socket/Protocols/INet/TCPSocketHandle.hh @@ -31,7 +31,6 @@ #define HH_TCPSocketHandle_ 1 // Custom includes -#include "../../../Utils/pool_alloc_mixin.hh" #include "INetProtocol.hh" #include "TCPProtocol.hh" #include "../../../Socket/Protocols/BSDSocketProtocol.hh" @@ -80,12 +79,11 @@ namespace senf { \see TCPv6SocketProtocol */ class TCPv4SocketProtocol - : public ConcreteSocketProtocol<TCPv4Socket_Policy>, + : public ConcreteSocketProtocol<TCPv4Socket_Policy,TCPv4SocketProtocol>, public IPv4Protocol, public TCPProtocol, public BSDSocketProtocol, - public AddressableBSDSocketProtocol, - public senf::pool_alloc_mixin<TCPv4SocketProtocol> + public AddressableBSDSocketProtocol { public: /////////////////////////////////////////////////////////////////////////// @@ -123,11 +121,6 @@ namespace senf { ProtocolServerSocketHandle::ProtocolServerSocketHandle() constructor */ - ///@} - ///\name Abstract Interface Implementation - - std::auto_ptr<SocketProtocol> clone() const; - ///@} }; @@ -162,12 +155,11 @@ namespace senf { \see TCPv4SocketProtocol */ class TCPv6SocketProtocol - : public ConcreteSocketProtocol<TCPv6Socket_Policy>, + : public ConcreteSocketProtocol<TCPv6Socket_Policy,TCPv6SocketProtocol>, public IPv6Protocol, public TCPProtocol, public BSDSocketProtocol, - public AddressableBSDSocketProtocol, - public senf::pool_alloc_mixin<TCPv6SocketProtocol> + public AddressableBSDSocketProtocol { public: /////////////////////////////////////////////////////////////////////////// @@ -205,11 +197,6 @@ namespace senf { ProtocolServerSocketHandle::ProtocolServerSocketHandle() constructor */ - ///@} - ///\name Abstract Interface Implementation - - std::auto_ptr<SocketProtocol> clone() const; - ///@} }; diff --git a/Socket/Protocols/INet/UDPSocketHandle.cc b/Socket/Protocols/INet/UDPSocketHandle.cc index 687ad592653f55cc86d351d7851db05b5a83705d..e7c7dc5a2a1937e90d6f295c70a3c3fc93b196bd 100644 --- a/Socket/Protocols/INet/UDPSocketHandle.cc +++ b/Socket/Protocols/INet/UDPSocketHandle.cc @@ -58,12 +58,6 @@ senf::UDPv4SocketProtocol::init_client(INet4SocketAddress const & address) clientHandle().bind(address); } -prefix_ std::auto_ptr<senf::SocketProtocol> senf::UDPv4SocketProtocol::clone() - const -{ - return std::auto_ptr<SocketProtocol>(new UDPv4SocketProtocol()); -} - /////////////////////////////////////////////////////////////////////////// // senf::UDPv6SocketProtocol:: @@ -84,12 +78,6 @@ senf::UDPv6SocketProtocol::init_client(INet6SocketAddress const & address) clientHandle().bind(address); } -prefix_ std::auto_ptr<senf::SocketProtocol> senf::UDPv6SocketProtocol::clone() - const -{ - return std::auto_ptr<SocketProtocol>(new UDPv6SocketProtocol()); -} - ///////////////////////////////cc.e//////////////////////////////////////// #undef prefix_ //#include "UDPSocketHandle.mpp" diff --git a/Socket/Protocols/INet/UDPSocketHandle.hh b/Socket/Protocols/INet/UDPSocketHandle.hh index 13673e87ca60924d09b00b6efe8dc3ff761c4c05..6ed334c625937149e09ba7e490580fd25f283c5b 100644 --- a/Socket/Protocols/INet/UDPSocketHandle.hh +++ b/Socket/Protocols/INet/UDPSocketHandle.hh @@ -79,15 +79,14 @@ namespace senf { \see UDPv6SocketProtocol */ class UDPv4SocketProtocol - : public ConcreteSocketProtocol<UDPv4Socket_Policy>, + : public ConcreteSocketProtocol<UDPv4Socket_Policy, UDPv4SocketProtocol>, public IPv4Protocol, public UDPProtocol, public MulticastProtocol, public INet4MulticastProtocol, public BSDSocketProtocol, public DatagramSocketProtocol, - public AddressableBSDSocketProtocol, - public senf::pool_alloc_mixin<UDPv4SocketProtocol> + public AddressableBSDSocketProtocol { public: /////////////////////////////////////////////////////////////////////////// @@ -110,11 +109,6 @@ namespace senf { constructor */ ///@} - ///\name Abstract Interface Implementation - - std::auto_ptr<SocketProtocol> clone() const; - - ///@} }; @@ -147,15 +141,14 @@ namespace senf { \see UDPv4SocketProtocol */ class UDPv6SocketProtocol - : public ConcreteSocketProtocol<UDPv6Socket_Policy>, + : public ConcreteSocketProtocol<UDPv6Socket_Policy, UDPv6SocketProtocol>, public IPv6Protocol, public UDPProtocol, public MulticastProtocol, public INet6MulticastProtocol, public BSDSocketProtocol, public DatagramSocketProtocol, - public AddressableBSDSocketProtocol, - public senf::pool_alloc_mixin<UDPv6SocketProtocol> + public AddressableBSDSocketProtocol { public: /////////////////////////////////////////////////////////////////////////// @@ -177,11 +170,6 @@ namespace senf { ProtocolClientSocketHandle::ProtocolClientSocketHandle() constructor */ - ///@} - ///\name Abstract Interface Implementation - - std::auto_ptr<SocketProtocol> clone() const; - ///@} }; diff --git a/Socket/Protocols/Raw/PacketSocketHandle.cc b/Socket/Protocols/Raw/PacketSocketHandle.cc index b3183f91c72e1c0a27bdec05a945297119971eda..a57edf5f2df345ee0d3a5a9899c05640477225cc 100644 --- a/Socket/Protocols/Raw/PacketSocketHandle.cc +++ b/Socket/Protocols/Raw/PacketSocketHandle.cc @@ -54,12 +54,6 @@ prefix_ void senf::PacketProtocol::init_client(SocketType type, int protocol) fd(sock); } -prefix_ std::auto_ptr<senf::SocketProtocol> senf::PacketProtocol::clone() - const -{ - return std::auto_ptr<SocketProtocol>(new PacketProtocol()); -} - prefix_ unsigned senf::PacketProtocol::available() const { diff --git a/Socket/Protocols/Raw/PacketSocketHandle.hh b/Socket/Protocols/Raw/PacketSocketHandle.hh index a44edf2c61fc6f7865c52dd9ca88e13c480a4325..0ee1f8d7f37c52360c6008b134b0800742b19f49 100644 --- a/Socket/Protocols/Raw/PacketSocketHandle.hh +++ b/Socket/Protocols/Raw/PacketSocketHandle.hh @@ -77,9 +77,8 @@ namespace senf { Socket Handle typedefs above. */ class PacketProtocol - : public ConcreteSocketProtocol<Packet_Policy>, - public BSDSocketProtocol, - public senf::pool_alloc_mixin<PacketProtocol> + : public ConcreteSocketProtocol<Packet_Policy, PacketProtocol>, + public BSDSocketProtocol { public: enum SocketType { RawSocket, DatagramSocket }; @@ -129,7 +128,6 @@ namespace senf { ///\name Abstract Interface Implementation ///@{ - std::auto_ptr<SocketProtocol> clone() const; unsigned available() const; bool eof() const; diff --git a/Socket/Protocols/Raw/TunTapSocketHandle.cc b/Socket/Protocols/Raw/TunTapSocketHandle.cc index da12942878129b88dcd8c046f08d5e256003b7db..704944769f1db77770a86fa36d509d9678bc3d3d 100644 --- a/Socket/Protocols/Raw/TunTapSocketHandle.cc +++ b/Socket/Protocols/Raw/TunTapSocketHandle.cc @@ -62,12 +62,6 @@ prefix_ void senf::TapProtocol::init_client(std::string const & interface_name, fd(f); } -prefix_ std::auto_ptr<senf::SocketProtocol> senf::TapProtocol::clone() - const -{ - return std::auto_ptr<SocketProtocol>(new TapProtocol()); -} - prefix_ unsigned senf::TapProtocol::available() const { diff --git a/Socket/Protocols/Raw/TunTapSocketHandle.hh b/Socket/Protocols/Raw/TunTapSocketHandle.hh index 4e66de08ea81b754469685e8c639fa454ecc9536..844ab34d3b56802b6544b71fbebf2b1af050a23d 100644 --- a/Socket/Protocols/Raw/TunTapSocketHandle.hh +++ b/Socket/Protocols/Raw/TunTapSocketHandle.hh @@ -73,9 +73,8 @@ namespace senf { Socket Handle typedefs above. */ class TapProtocol - : public ConcreteSocketProtocol<Tap_Policy>, - public BSDSocketProtocol, - public senf::pool_alloc_mixin<TapProtocol> + : public ConcreteSocketProtocol<Tap_Policy,TapProtocol>, + public BSDSocketProtocol { public: ///\name Constructors @@ -99,7 +98,6 @@ namespace senf { ///\name Abstract Interface Implementation ///@{ - std::auto_ptr<SocketProtocol> clone() const; unsigned available() const; bool eof() const; diff --git a/Socket/Protocols/UN/ConnectedUNDatagramSocketHandle.cc b/Socket/Protocols/UN/ConnectedUNDatagramSocketHandle.cc index c4b48b1b7dda88aff43d104623b991f318ef8b21..ffefd715f858ed56973b094c9137e5b0712419f0 100644 --- a/Socket/Protocols/UN/ConnectedUNDatagramSocketHandle.cc +++ b/Socket/Protocols/UN/ConnectedUNDatagramSocketHandle.cc @@ -50,12 +50,6 @@ prefix_ void senf::ConnectedUNDatagramSocketProtocol::init_client(UNSocketAddres clientHandle().connect(address); } -prefix_ std::auto_ptr<senf::SocketProtocol> senf::ConnectedUNDatagramSocketProtocol::clone() - const -{ - return std::auto_ptr<SocketProtocol>(new ConnectedUNDatagramSocketProtocol()); -} - ///////////////////////////////cc.e//////////////////////////////////////// #undef prefix_ //#include "UNDatagramSocketHandle.mpp" diff --git a/Socket/Protocols/UN/ConnectedUNDatagramSocketHandle.hh b/Socket/Protocols/UN/ConnectedUNDatagramSocketHandle.hh index 6a3d8c6a899a08a08e9a9e8db7d3674b7d95bb04..50ead3ef3dd13e9e2e67a21285f9dcd8161d1b0a 100644 --- a/Socket/Protocols/UN/ConnectedUNDatagramSocketHandle.hh +++ b/Socket/Protocols/UN/ConnectedUNDatagramSocketHandle.hh @@ -71,11 +71,11 @@ namespace senf { */ class ConnectedUNDatagramSocketProtocol - : public ConcreteSocketProtocol<ConnectedUNDatagramSocket_Policy>, + : public ConcreteSocketProtocol<ConnectedUNDatagramSocket_Policy, + ConnectedUNDatagramSocketProtocol>, public UNProtocol, public BSDSocketProtocol, - public AddressableBSDSocketProtocol, - public senf::pool_alloc_mixin<ConnectedUNDatagramSocketProtocol> + public AddressableBSDSocketProtocol { public: /////////////////////////////////////////////////////////////////////////// @@ -97,11 +97,6 @@ namespace senf { ProtocolClientSocketHandle::ProtocolClientSocketHandle() constructor */ - ///@} - ///\name Abstract Interface Implementation - - std::auto_ptr<SocketProtocol> clone() const; - ///@} }; diff --git a/Socket/Protocols/UN/UNDatagramSocketHandle.cc b/Socket/Protocols/UN/UNDatagramSocketHandle.cc index 77408fa55e7534037b8db8d4de2ae8525c2cd071..42d7f38cadd2f6edc07ffae61abce489baaa6b0d 100644 --- a/Socket/Protocols/UN/UNDatagramSocketHandle.cc +++ b/Socket/Protocols/UN/UNDatagramSocketHandle.cc @@ -51,12 +51,6 @@ prefix_ void senf::UNDatagramSocketProtocol::init_client(UNSocketAddress const & clientHandle().bind(address); } -prefix_ std::auto_ptr<senf::SocketProtocol> senf::UNDatagramSocketProtocol::clone() - const -{ - return std::auto_ptr<SocketProtocol>(new UNDatagramSocketProtocol()); -} - ///////////////////////////////cc.e//////////////////////////////////////// #undef prefix_ //#include "UNDatagramSocketHandle.mpp" diff --git a/Socket/Protocols/UN/UNDatagramSocketHandle.hh b/Socket/Protocols/UN/UNDatagramSocketHandle.hh index 3b7f8a5e9c0a8ef23424abb957e7d15fa0d3a4f9..92c2cd6c73ec1555220a6951af526cec218ea2b2 100644 --- a/Socket/Protocols/UN/UNDatagramSocketHandle.hh +++ b/Socket/Protocols/UN/UNDatagramSocketHandle.hh @@ -71,7 +71,8 @@ namespace senf { Socket Handle typedefs above. */ class UNDatagramSocketProtocol - : public ConcreteSocketProtocol<UNDatagramSocket_Policy>, + : public ConcreteSocketProtocol<UNDatagramSocket_Policy, + UNDatagramSocketProtocol>, public UNProtocol, public BSDSocketProtocol, public AddressableBSDSocketProtocol @@ -96,11 +97,6 @@ namespace senf { ProtocolClientSocketHandle::ProtocolClientSocketHandle() constructor */ - ///@} - ///\name Abstract Interface Implementation - - std::auto_ptr<SocketProtocol> clone() const; - ///@} }; diff --git a/Socket/Protocols/UN/UNDatagramSocketHandle.test.cc b/Socket/Protocols/UN/UNDatagramSocketHandle.test.cc index 7ad720d29d275d3af000d956b7778862c5dfd17c..cf2b4138e5dc903b3c1cd9b54fb0fe3d49bf7c04 100644 --- a/Socket/Protocols/UN/UNDatagramSocketHandle.test.cc +++ b/Socket/Protocols/UN/UNDatagramSocketHandle.test.cc @@ -40,19 +40,26 @@ BOOST_AUTO_UNIT_TEST(unDatagramSocketHandle) std::string testString ("Hallo Welt."); std::string socketPath (".socket-UNDatagramSocketHandle.test"); + BOOST_CHECKPOINT( 1 ); senf::UNSocketAddress addr (socketPath); + BOOST_CHECKPOINT( 2 ); senf::UNDatagramClientSocketHandle inputSocket(addr); + BOOST_CHECKPOINT( 3 ); senf::UNDatagramClientSocketHandle outputSocket; + BOOST_CHECKPOINT( 4 ); outputSocket.writeto( addr, testString); + BOOST_CHECKPOINT( 5 ); BOOST_CHECK_EQUAL( inputSocket.read(), testString); + BOOST_CHECKPOINT( 6 ); outputSocket.close(); + BOOST_CHECKPOINT( 7 ); inputSocket.close(); // if( unlink(socketPath.c_str()) != 0) diff --git a/Socket/ServerSocketHandle.cti b/Socket/ServerSocketHandle.cti index f2342f15da5dd32151d42d28913d73267bfa6a33..e0e133f39f0aaf3a3bc5bea402f867735f2a31fc 100644 --- a/Socket/ServerSocketHandle.cti +++ b/Socket/ServerSocketHandle.cti @@ -48,8 +48,8 @@ ServerSocketHandle(ServerSocketHandle<OtherPolicy> other, template <class SocketPolicy> prefix_ senf::ServerSocketHandle<SocketPolicy>:: -ServerSocketHandle(std::auto_ptr<SocketProtocol> protocol) - : SocketHandle<SocketPolicy>(protocol,true) +ServerSocketHandle(std::auto_ptr<SocketBody> body) + : SocketHandle<SocketPolicy>(body) {} template <class SocketPolicy> @@ -95,8 +95,8 @@ template <class Policy> prefix_ typename senf::ServerSocketHandle<Policy>::ClientSocketHandle senf::ServerSocketHandle<Policy>::accept() { - return ClientSocketHandle(this->protocol().clone(), - Policy::CommunicationPolicy::accept(*this)); + return ClientSocketHandle(this->body().clone( + Policy::CommunicationPolicy::accept(*this), false)); } template <class Policy> diff --git a/Socket/ServerSocketHandle.hh b/Socket/ServerSocketHandle.hh index 22e9cb9eb09bbd5699f126c39a3cf372896d4f11..68f29b08edc8b0cddb9247d2b3d441399d5706ef 100644 --- a/Socket/ServerSocketHandle.hh +++ b/Socket/ServerSocketHandle.hh @@ -200,7 +200,7 @@ namespace senf { protected: ServerSocketHandle(FileHandle other, bool isChecked); - explicit ServerSocketHandle(std::auto_ptr<SocketProtocol> protocol); + explicit ServerSocketHandle(std::auto_ptr<SocketBody> body); private: diff --git a/Socket/ServerSocketHandle.test.cc b/Socket/ServerSocketHandle.test.cc index 950b072fb5c8d7d64923b5a822b0bbc85597d3af..0d9ba42c8f25de8a255522d8f0dce586c72107ec 100644 --- a/Socket/ServerSocketHandle.test.cc +++ b/Socket/ServerSocketHandle.test.cc @@ -39,45 +39,45 @@ namespace { - namespace sl = senf; - class MySocketHandle - : public sl::ServerSocketHandle<sl::test::SomeProtocol::Policy> + : public senf::ServerSocketHandle<senf::test::SomeProtocol::Policy> { public: MySocketHandle() - : sl::ServerSocketHandle<sl::test::SomeProtocol::Policy>( - std::auto_ptr<sl::SocketProtocol>(new sl::test::SomeProtocol())) + : senf::ServerSocketHandle<senf::test::SomeProtocol::Policy>( + std::auto_ptr<senf::SocketBody>( + new senf::ProtocolSocketBody<senf::test::SomeProtocol>(true))) {} }; + } BOOST_AUTO_UNIT_TEST(serverSocketHandle) { - typedef sl::MakeSocketPolicy< - sl::test::SomeFramingPolicy, - sl::test::SomeReadPolicy, - sl::test::SomeWritePolicy + typedef senf::MakeSocketPolicy< + senf::test::SomeFramingPolicy, + senf::test::SomeReadPolicy, + senf::test::SomeWritePolicy >::policy OtherSocketPolicy; - typedef sl::SocketHandle<OtherSocketPolicy> OtherSocketHandle; + typedef senf::SocketHandle<OtherSocketPolicy> OtherSocketHandle; MySocketHandle myh; OtherSocketHandle osh (myh); osh = myh; - typedef sl::ServerSocketHandle<sl::test::SomeProtocol::Policy> SomeSocketHandle; - SomeSocketHandle ssh = sl::static_socket_cast<SomeSocketHandle>(osh); + typedef senf::ServerSocketHandle<senf::test::SomeProtocol::Policy> SomeSocketHandle; + SomeSocketHandle ssh = senf::static_socket_cast<SomeSocketHandle>(osh); - typedef sl::ServerSocketHandle<sl::MakeSocketPolicy< + typedef senf::ServerSocketHandle<senf::MakeSocketPolicy< OtherSocketPolicy, senf::NoAddressingPolicy >::policy> SomeOtherSocketHandle; - typedef sl::ClientSocketHandle<OtherSocketPolicy> OtherClientHandle; + typedef senf::ClientSocketHandle<OtherSocketPolicy> OtherClientHandle; - BOOST_CHECK_NO_THROW( sl::dynamic_socket_cast<SomeSocketHandle>(osh) ); - BOOST_CHECK_THROW( sl::dynamic_socket_cast<SomeOtherSocketHandle>(osh), + BOOST_CHECK_NO_THROW( senf::dynamic_socket_cast<SomeSocketHandle>(osh) ); + BOOST_CHECK_THROW( senf::dynamic_socket_cast<SomeOtherSocketHandle>(osh), std::bad_cast ); - BOOST_CHECK_THROW( sl::dynamic_socket_cast<OtherClientHandle>(osh), + BOOST_CHECK_THROW( senf::dynamic_socket_cast<OtherClientHandle>(osh), std::bad_cast ); BOOST_CHECK_NO_THROW( myh.bind(0) ); diff --git a/Socket/SocketHandle.cc b/Socket/SocketHandle.cc index 562253b27b45d50ff96fc22ba7913b775f5ff6fa..042d2671d0719557d6497980e79cbd643b28adb7 100644 --- a/Socket/SocketHandle.cc +++ b/Socket/SocketHandle.cc @@ -57,8 +57,8 @@ prefix_ void senf::SocketBody::state(SocketStateMap & map, unsigned lod) 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())); + map["socket.protocol"] << v_protocolName(); + map["socket.protocol.policy"] << prettyName(typeid(protocol().policy())); protocol().state(map,lod); } diff --git a/Socket/SocketHandle.cci b/Socket/SocketHandle.cci index c25d09f304672a861f1feab403d74931355fbc33..896d13af0274659928e2a31503e16fd9ecc76c94 100644 --- a/Socket/SocketHandle.cci +++ b/Socket/SocketHandle.cci @@ -34,26 +34,23 @@ #define prefix_ inline ///////////////////////////////cci.p/////////////////////////////////////// -prefix_ senf::SocketBody::SocketBody(std::auto_ptr<SocketProtocol> protocol, - bool isServer) - : protocol_(protocol), isServer_(isServer) -{ - SENF_ASSERT( ! protocol_->body_ ); - protocol_->body_ = this; -} +prefix_ senf::SocketBody::SocketBody(bool isServer) + : isServer_(isServer) +{} + +prefix_ senf::SocketBody::SocketBody(bool isServer, int fd) + : FileBody(fd), isServer_(isServer) +{} -prefix_ senf::SocketBody::SocketBody(std::auto_ptr<SocketProtocol> protocol, - bool isServer, int fd) - : FileBody(fd), protocol_(protocol), isServer_(isServer) +prefix_ senf::SocketProtocol & senf::SocketBody::protocol() { - SENF_ASSERT( ! protocol_->body_ ); - protocol_->body_ = this; + return const_cast<SocketProtocol &>(v_protocol()); } prefix_ senf::SocketProtocol const & senf::SocketBody::protocol() const { - return *protocol_; + return v_protocol(); } prefix_ bool senf::SocketBody::isServer() @@ -61,6 +58,18 @@ prefix_ bool senf::SocketBody::isServer() return isServer_; } +prefix_ std::auto_ptr<senf::SocketBody> senf::SocketBody::clone(bool isServer) + const +{ + return protocol().clone(isServer); +} + +prefix_ std::auto_ptr<senf::SocketBody> senf::SocketBody::clone(int fd, bool isServer) + const +{ + return protocol().clone(fd, isServer); +} + /////////////////////////////////////////////////////////////////////////// // senf::detail::StreamableString diff --git a/Socket/SocketHandle.ct b/Socket/SocketHandle.ct index 6b66701eddbd9b78debf18e121202f33a4852580..98ce1009bdfb0aedbbbd09f8a016c26015d1751a 100644 --- a/Socket/SocketHandle.ct +++ b/Socket/SocketHandle.ct @@ -28,6 +28,7 @@ // Custom includes #include <boost/lexical_cast.hpp> +#include "../Utils/TypeInfo.hh" #define prefix_ ///////////////////////////////ct.p//////////////////////////////////////// @@ -45,6 +46,23 @@ senf::detail::StreamableString::operator<<(T const & other) return *this; } +/////////////////////////////////////////////////////////////////////////// +// senf::ProtocolSocketBody<SProtocol> + +template <class SProtocol> +prefix_ senf::SocketProtocol const & senf::ProtocolSocketBody<SProtocol>::v_protocol() + const +{ + return *this; +} + +template <class SProtocol> +prefix_ std::string senf::ProtocolSocketBody<SProtocol>::v_protocolName() + const +{ + return senf::prettyName(typeid(SProtocol)); +} + ///////////////////////////////ct.e//////////////////////////////////////// #undef prefix_ diff --git a/Socket/SocketHandle.cti b/Socket/SocketHandle.cti index 852cc3fc0bf84483af2eadd35a9c251f542ae1cb..983c5a5c9bac83600c6e5bbfe7b9bf184ce392b2 100644 --- a/Socket/SocketHandle.cti +++ b/Socket/SocketHandle.cti @@ -35,6 +35,9 @@ #define prefix_ inline ///////////////////////////////cti.p/////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////// +// senf::SocketHandle<SocketPolicy> + template <class SocketPolicy> prefix_ senf::SocketHandle<SocketPolicy>::SocketHandle() {} @@ -57,9 +60,8 @@ senf::SocketHandle<SocketPolicy>::operator=(SocketHandle<OtherPolicy> other) template <class SocketPolicy> prefix_ -senf::SocketHandle<SocketPolicy>::SocketHandle(std::auto_ptr<SocketProtocol> protocol, - bool isServer) - : FileHandle(std::auto_ptr<FileBody>(new SocketBody(protocol,isServer))) +senf::SocketHandle<SocketPolicy>::SocketHandle(std::auto_ptr<SocketBody> body) + : FileHandle(std::auto_ptr<FileBody>(body.release())) {} template <class SocketPolicy> @@ -182,6 +184,19 @@ prefix_ std::string senf::SocketHandle<SocketPolicy>::dumpState(unsigned lod) return detail::dumpState(map); } +/////////////////////////////////////////////////////////////////////////// +// senf::ProtocolSocketBody<SProtocol> + +template <class SProtocol> +prefix_ senf::ProtocolSocketBody<SProtocol>::ProtocolSocketBody(bool isServer) + : SocketBody(isServer) +{} + +template <class SProtocol> +prefix_ senf::ProtocolSocketBody<SProtocol>::ProtocolSocketBody(bool isServer, int fd) + : SocketBody(isServer, fd) +{} + ///////////////////////////////cti.e/////////////////////////////////////// #undef prefix_ diff --git a/Socket/SocketHandle.hh b/Socket/SocketHandle.hh index 77cd781384169a5ce06fe73ebe3522e49f370aa4..85a14b6c50d646e5f0c1c6098e2b3f6ef6e1045f 100644 --- a/Socket/SocketHandle.hh +++ b/Socket/SocketHandle.hh @@ -147,7 +147,7 @@ namespace senf { documentation. */ protected: - explicit SocketHandle(std::auto_ptr<SocketProtocol> protocol, bool isServer); + explicit SocketHandle(std::auto_ptr<SocketBody> body); ///< Initialize SocketHandle providing the protocol /**< \param protocol Protocol class of the protocol implemented by this socket handle diff --git a/Socket/SocketHandle.ih b/Socket/SocketHandle.ih index 996ead40f227d82a56942cb0fff1f3a4a9bda6f8..43edd145712a11eb948dd57cf9cccbbafd4662c8 100644 --- a/Socket/SocketHandle.ih +++ b/Socket/SocketHandle.ih @@ -85,6 +85,8 @@ namespace senf { std::string dumpState(SocketStateMap const & map); } + template <class Policy, class Self> class ConcreteSocketProtocol; + /** \brief SocketHandle referenced body \internal @@ -95,13 +97,9 @@ namespace senf { properly. If this invariant is violated, your Program will probably crash. */ class SocketBody - : public FileBody, - public senf::pool_alloc_mixin<SocketBody> + : public FileBody { public: - using senf::pool_alloc_mixin<SocketBody>::operator new; - using senf::pool_alloc_mixin<SocketBody>::operator delete; - /////////////////////////////////////////////////////////////////////////// // Types @@ -111,19 +109,12 @@ namespace senf { ///\name Structors and default members ///@{ - SocketBody(std::auto_ptr<SocketProtocol> protocol, bool isServer); - /**< - \param protocol Protocol class implementing the desired - protocol - \param isServer \c true, if this socket is a server - socket, false otherwise */ - SocketBody(std::auto_ptr<SocketProtocol> protocol, bool isServer, int fd); - /**< - \param protocol Protocol class implementing the desired - protocol - \param isServer \c true, if this socket is a server - socket, false otherwise - \param fd socket file descriptor */ + SocketBody(bool isServer); /**< \param isServer \c true, if this socket is a server + socket, false otherwise */ + SocketBody(bool isServer, int fd); + /**< \param isServer \c true, if this socket is a server + socket, false otherwise + \param fd socket file descriptor */ // no copy // no conversion constructors @@ -131,14 +122,18 @@ namespace senf { ///@} /////////////////////////////////////////////////////////////////////////// - SocketProtocol const & protocol() const; - ///< Access the protocol instance + SocketProtocol & protocol(); ///< Access the protocol instance + SocketProtocol const & protocol() const; ///< Access the protocol instance (const) + bool isServer(); ///< Check socket type /**< \return \c true, if this is a server socket, \c false otherwise */ void state(SocketStateMap & map, unsigned lod); + std::auto_ptr<SocketBody> clone(bool isServer) const; + std::auto_ptr<SocketBody> clone(int fd, bool isServer) const; + private: virtual void v_close(); ///< Close socket /**< This override will automatically \c shutdown() the @@ -156,10 +151,38 @@ namespace senf { dependent, this member will forward the call to senf::SocketPolicy::eof() */ - boost::scoped_ptr<SocketProtocol> protocol_; + virtual SocketProtocol const & v_protocol() const = 0; + virtual std::string v_protocolName() const = 0; + bool isServer_; }; + template <class SProtocol> + class ProtocolSocketBody + : public SocketBody, + private SProtocol, + public senf::pool_alloc_mixin< ProtocolSocketBody<SProtocol> > + { + public: + typedef SProtocol Protocol; + + using senf::pool_alloc_mixin< ProtocolSocketBody<SProtocol> >::operator new; + using senf::pool_alloc_mixin< ProtocolSocketBody<SProtocol> >::operator delete; + + ProtocolSocketBody(bool isServer); /**< \param isServer \c true, if this socket is a server + socket, false otherwise */ + ProtocolSocketBody(bool isServer, int fd); + /**< \param isServer \c true, if this socket is a server + socket, false otherwise + \param fd socket file descriptor */ + + private: + virtual SocketProtocol const & v_protocol() const; + virtual std::string v_protocolName() const; + + friend class ConcreteSocketProtocol<typename SProtocol::Policy, SProtocol>; + }; + } ///////////////////////////////ih.e//////////////////////////////////////// diff --git a/Socket/SocketHandle.test.cc b/Socket/SocketHandle.test.cc index 0bcb47748c56309ffd250fda996ae9e3725f7eaf..9312676bffa8364485b5d701f1ac0149a31949a9 100644 --- a/Socket/SocketHandle.test.cc +++ b/Socket/SocketHandle.test.cc @@ -37,15 +37,15 @@ ///////////////////////////////cc.p//////////////////////////////////////// namespace { - namespace sl = senf; class MySocketHandle - : public sl::SocketHandle<sl::test::SomeProtocol::Policy> + : public senf::SocketHandle<senf::test::SomeProtocol::Policy> { public: MySocketHandle() - : sl::SocketHandle<sl::test::SomeProtocol::Policy>( - std::auto_ptr<sl::SocketProtocol>(new sl::test::SomeProtocol()),false) + : senf::SocketHandle<senf::test::SomeProtocol::Policy>( + std::auto_ptr<senf::SocketBody>( + new senf::ProtocolSocketBody<senf::test::SomeProtocol>(false))) {} }; @@ -53,30 +53,29 @@ namespace { : public senf::FileHandle { public: - FDHandle() - : senf::FileHandle(std::auto_ptr<senf::FileBody>( - new senf::FileBody())) {} + FDHandle() : senf::FileHandle(std::auto_ptr<senf::FileBody>(new senf::FileBody())) {} }; + } BOOST_AUTO_UNIT_TEST(socketHandle) { - typedef sl::MakeSocketPolicy< - sl::test::SomeCommunicationPolicy, - sl::test::SomeReadPolicy + typedef senf::MakeSocketPolicy< + senf::test::SomeCommunicationPolicy, + senf::test::SomeReadPolicy >::policy OtherSocketPolicy; - typedef sl::SocketHandle<OtherSocketPolicy> OtherSocketHandle; + typedef senf::SocketHandle<OtherSocketPolicy> OtherSocketHandle; MySocketHandle myh; OtherSocketHandle osh (myh); osh = myh; - typedef sl::SocketHandle<sl::test::SomeProtocol::Policy> SomeSocketHandle; + typedef senf::SocketHandle<senf::test::SomeProtocol::Policy> SomeSocketHandle; SomeSocketHandle ssh = senf::static_socket_cast<SomeSocketHandle>(osh); BOOST_CHECK_NO_THROW( senf::dynamic_socket_cast<SomeSocketHandle>(osh) ); - typedef sl::SocketHandle< sl::MakeSocketPolicy< + typedef senf::SocketHandle< senf::MakeSocketPolicy< OtherSocketPolicy, senf::NoAddressingPolicy >::policy> SomeOtherSocketHandle; @@ -91,8 +90,8 @@ BOOST_AUTO_UNIT_TEST(socketHandle) "file.handle: -1\n" "file.refcount: 3\n" "handle: senf::SocketHandle<senf::SocketPolicy<senf::test::SomeAddressingPolicy, senf::test::SomeFramingPolicy, senf::test::SomeCommunicationPolicy, senf::test::SomeReadPolicy, senf::test::SomeWritePolicy> >\n" - "socket.policy: senf::SocketPolicy<senf::test::SomeAddressingPolicy, senf::test::SomeFramingPolicy, senf::test::SomeCommunicationPolicy, senf::test::SomeReadPolicy, senf::test::SomeWritePolicy>\n" "socket.protocol: senf::test::SomeProtocol\n" + "socket.protocol.policy: senf::SocketPolicy<senf::test::SomeAddressingPolicy, senf::test::SomeFramingPolicy, senf::test::SomeCommunicationPolicy, senf::test::SomeReadPolicy, senf::test::SomeWritePolicy>\n" "socket.server: false\n" ); } diff --git a/Socket/SocketProtocol.cci b/Socket/SocketProtocol.cci index 5f8bbb6e0d4bd70bc17e246c09dbf0da0d2fb378..04be16c20dd9cf98ac1a0c3f9a2bedb322601c18 100644 --- a/Socket/SocketProtocol.cci +++ b/Socket/SocketProtocol.cci @@ -27,7 +27,8 @@ //#include "SocketProtocol.ih" // Custom includes -#include <../Utils/senfassert.hh> +#include "../Utils/senfassert.hh" +#include "../Utils/Logger/SenfLog.hh" #define prefix_ inline ///////////////////////////////cci.p/////////////////////////////////////// @@ -55,19 +56,11 @@ prefix_ void senf::SocketProtocol::fd(int fd) } prefix_ senf::SocketProtocol::SocketProtocol() - : body_(0) {} prefix_ senf::SocketProtocol::~SocketProtocol() {} -prefix_ senf::SocketBody & senf::SocketProtocol::body() - const -{ - SENF_ASSERT( body_ ); - return *body_; -} - ///////////////////////////////cci.e/////////////////////////////////////// #undef prefix_ diff --git a/Socket/SocketProtocol.cti b/Socket/SocketProtocol.cti index 1c16b75ea45e25d72de9191c67e875c5b0ec0791..4751ec4006097002cf1d737b6bedc6fbae59c569 100644 --- a/Socket/SocketProtocol.cti +++ b/Socket/SocketProtocol.cti @@ -35,32 +35,56 @@ /////////////////////////////////////////////////////////////////////////// // senf::ConcreteSocketProtocol<SocketPolicy> -template <class SocketPolicy> -prefix_ senf::ConcreteSocketProtocol<SocketPolicy>::~ConcreteSocketProtocol() +template <class SocketPolicy, class Self> +prefix_ senf::ConcreteSocketProtocol<SocketPolicy,Self>::~ConcreteSocketProtocol() {} -template <class SocketPolicy> -prefix_ typename senf::ConcreteSocketProtocol<SocketPolicy>::Policy const & -senf::ConcreteSocketProtocol<SocketPolicy>::policy() +template <class SocketPolicy, class Self> +prefix_ typename senf::ConcreteSocketProtocol<SocketPolicy,Self>::Policy const & +senf::ConcreteSocketProtocol<SocketPolicy,Self>::policy() const { return policy_; } +template <class SocketPolicy, class Self> +prefix_ std::auto_ptr<senf::SocketBody> +senf::ConcreteSocketProtocol<SocketPolicy,Self>::clone(bool isServer) + const +{ + return std::auto_ptr<SocketBody>(new ProtocolSocketBody<Self>(isServer)); +} + +template <class SocketPolicy, class Self> +prefix_ std::auto_ptr<senf::SocketBody> +senf::ConcreteSocketProtocol<SocketPolicy,Self>::clone(int fd, bool isServer) + const +{ + return std::auto_ptr<SocketBody>(new ProtocolSocketBody<Self>(isServer, fd)); +} + +template <class SocketPolicy, class Self> +prefix_ senf::SocketBody & senf::ConcreteSocketProtocol<SocketPolicy,Self>::body() + const +{ + return const_cast< ProtocolSocketBody<Self> &>( + static_cast< ProtocolSocketBody<Self> const & >(*this)); +} + //////////////////////////////////////// // protected members -template <class SocketPolicy> +template <class SocketPolicy, class Self> prefix_ senf::ClientSocketHandle<SocketPolicy> -senf::ConcreteSocketProtocol<SocketPolicy>::clientHandle() +senf::ConcreteSocketProtocol<SocketPolicy,Self>::clientHandle() const { return static_socket_cast< ClientSocketHandle<Policy> >(fh()); } -template <class SocketPolicy> +template <class SocketPolicy, class Self> prefix_ senf::ServerSocketHandle<SocketPolicy> -senf::ConcreteSocketProtocol<SocketPolicy>::serverHandle() +senf::ConcreteSocketProtocol<SocketPolicy,Self>::serverHandle() const { return static_socket_cast< ServerSocketHandle<Policy> >(fh()); diff --git a/Socket/SocketProtocol.hh b/Socket/SocketProtocol.hh index 7c34b3a9773148fe94fb0fffd93441d22927f9eb..50301f94d983d8e865b0f543032f169297df3a95 100644 --- a/Socket/SocketProtocol.hh +++ b/Socket/SocketProtocol.hh @@ -153,14 +153,6 @@ namespace senf { /////////////////////////////////////////////////////////////////////////// // Virtual interface - virtual std::auto_ptr<SocketProtocol> clone() const = 0; - ///< Polymorphically return a copy of this protocol class - /**< This member will create a new copy of the protocol - class on the heap. - \attention This member must be implemented in every \e - leaf protocol class to return a new instance of the - appropriate type. */ - virtual unsigned available() const = 0; ///< Return (maximum) number of bytes available for reading ///< without < blocking @@ -260,11 +252,10 @@ namespace senf { ::dup2()). */ private: - // backpointer to owning SocketBody instance - - SocketBody & body() const; + virtual std::auto_ptr<SocketBody> clone(bool isServer) const = 0; + virtual std::auto_ptr<SocketBody> clone(int fd, bool isServer) const = 0; + virtual SocketBody & body() const = 0; - SocketBody * body_; friend class SocketBody; }; @@ -288,7 +279,7 @@ namespace senf { \doc init_client init_server */ - template <class SocketPolicy> + template <class SocketPolicy, class Self> class ConcreteSocketProtocol : public virtual SocketProtocol { @@ -312,7 +303,7 @@ namespace senf { /////////////////////////////////////////////////////////////////////////// Policy const & policy() const; - + protected: ClientSocketHandle<Policy> clientHandle() const; ///< Get client handle for associated socket @@ -324,8 +315,11 @@ namespace senf { this protocol instance */ private: - Policy policy_; + virtual std::auto_ptr<SocketBody> clone(bool isServer) const; + virtual std::auto_ptr<SocketBody> clone(int fd, bool isServer) const; + virtual SocketBody & body() const; + Policy policy_; }; /// @} diff --git a/Socket/SocketProtocol.test.hh b/Socket/SocketProtocol.test.hh index 220864d961b88a9b4b78696d40c4cb8effe06b3c..f1459fe3ebea8603cea5eb7eb7fd35a2f888e65d 100644 --- a/Socket/SocketProtocol.test.hh +++ b/Socket/SocketProtocol.test.hh @@ -32,11 +32,10 @@ ///////////////////////////////hh.p//////////////////////////////////////// namespace senf { - namespace test { class SomeProtocol - : public ConcreteSocketProtocol<SomeSocketPolicy> + : public ConcreteSocketProtocol<SomeSocketPolicy,SomeProtocol> { public: ~SomeProtocol() {} @@ -44,8 +43,6 @@ namespace test { void init_client() const {} void init_server() const {} - std::auto_ptr<SocketProtocol> clone() const - { return std::auto_ptr<SocketProtocol>(new SomeProtocol()); } unsigned available() const { return Policy::ReadPolicy::TEST_SIZE; } bool eof() const