X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Socket%2FSocketProtocol.hh;h=b41fccb8b05e182579462235abe3db3a3e5f30d0;hb=532240d72e09e19e57fac9bb55c2560b9c9e5b97;hp=7c34b3a9773148fe94fb0fffd93441d22927f9eb;hpb=77191ea0291fb6c2ad0a472c83258722bf221f8f;p=senf.git diff --git a/Socket/SocketProtocol.hh b/Socket/SocketProtocol.hh index 7c34b3a..b41fccb 100644 --- a/Socket/SocketProtocol.hh +++ b/Socket/SocketProtocol.hh @@ -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 @@ -22,11 +22,6 @@ /** \file \brief SocketProtocol and ConcreteSocketProtocol public header - - \idea We should optimize the protocol handling. Allocating a protocol instance for every socket - body seems quite wasteful. We could derive SocketPolicy from SocketBody (probably privately, - since private inheritance models more of 'has a' than 'is a'). This would allow to reduce - the number of heap-allocations per socket to one which is good. */ // The private inheritance idea should indeed work very well: We just need to change the @@ -37,22 +32,19 @@ /** \defgroup protocol_group The Protocol Classes - \htmlonly - - SocketPolicy - ConcreteSocketProtocol - SocketProtocol - BSDSocketProtocol - AddressableBSDSocketProtocol - IPv4Protocol - IPv6Protocol - TCPProtocol - TCPv4SocketProtocol - TCPv6SocketProtocol - PacketProtocol - - Protocols - \endhtmlonly +
+ \ref SocketProtocol + \ref UNSocketProtocol + \ref PacketSocketProtocol + \ref ConcreteSocketProtocol + \ref BSDSocketProtocol + \ref DatagramSocketProtocol + \ref TCPSocketProtocol + \ref UNDatagramSocketProtocol + \ref AddressableBSDSocketProtocol + \ref TCPv4SocketProtocol +
+ \htmlonly Protocols \endhtmlonly The socket handle classes and templates only implement the most important socket API methods using the policy framework. To access the complete API, the protocol interface is @@ -72,9 +64,6 @@ \see \ref handle_group \n \ref policy_group - - \todo Complete the protocol interface implementations. Better distribution of members to - protocol facets and more precise distribution of functionality among the facets. */ /** \defgroup concrete_protocol_group Protocol Implementations (Concrete Protocol Classes) @@ -100,8 +89,8 @@ accessibility of the socket body from all facets. */ -#ifndef HH_SocketProtocol_ -#define HH_SocketProtocol_ 1 +#ifndef HH_SENF_Socket_SocketProtocol_ +#define HH_SENF_Socket_SocketProtocol_ 1 // Custom includes #include @@ -153,14 +142,6 @@ namespace senf { /////////////////////////////////////////////////////////////////////////// // Virtual interface - virtual std::auto_ptr 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 @@ -187,10 +168,11 @@ namespace senf { not support the notion of EOF, this member should always return \c false. */ - virtual void close() const; ///< Close socket + virtual void close(); ///< Close socket /**< This override will automatically \c shutdown() the socket whenever it is closed. - \throws senf::SystemException */ + \throws senf::SystemException + \fixme Move into (at least) BSDSOcketProtocol */ virtual void terminate() const; ///< Forcibly close socket /**< This override will automatically \c shutdown() the @@ -198,7 +180,8 @@ namespace senf { disable SO_LINGER to ensure, that v_terminate will not block. Like the overriden method, this member will ignore failures and will never throw. It is therefore safe to be - called from a destructor. */ + called from a destructor. + \fixme Move into (at least) BSDSocketProtocol */ virtual void state(SocketStateMap & map, unsigned lod) const; ///< Return socket state information @@ -260,27 +243,27 @@ namespace senf { ::dup2()). */ private: - // backpointer to owning SocketBody instance - - SocketBody & body() const; + virtual std::auto_ptr clone(bool isServer) const = 0; + virtual std::auto_ptr clone(int fd, bool isServer) const = 0; + virtual SocketBody & body() const = 0; - SocketBody * body_; friend class SocketBody; }; - template class ClientSocketHandle; - template class ServerSocketHandle; + template class ClientSocketHandle; + template class ServerSocketHandle; /** \brief Concrete Socket Protocol implementation base class ConcreteSocketProtocol is the base class of a concrete socket protocol implementation. The final protocol class must inherit from ConcreteSocketProtocol. The template argument \a - SocketPolicy must be set to the complete socket policy of the protocol. + SocketPolicy must be set to the complete socket policy of the protocol. \a Self is the name + of the final protocol class which inherits this class. A protocol implementation may define the protocol interface directly. It can also (additionally) make use of multiple inheritance to combine a set of protocol facets into a specific protocol implementation (i.e. TCPv4SocketProtocol inherits from - ConcreteSocketProtocol and from the protocol facets IPv4Protocol, TCPProtocol, + ConcreteSocketProtocol and from the protocol facets IPv4SocketProtocol, TCPSocketProtocol, BSDSocketProtocol and AddressableBSDSocketProtocol). The protocol facets are not concrete protocols themselves, they are combined to build concrete protocols. This structure will remove a lot of code duplication. It is important to ensure, that the protocol facets do not @@ -288,7 +271,7 @@ namespace senf { \doc init_client init_server */ - template + template class ConcreteSocketProtocol : public virtual SocketProtocol { @@ -312,7 +295,7 @@ namespace senf { /////////////////////////////////////////////////////////////////////////// Policy const & policy() const; - + protected: ClientSocketHandle clientHandle() const; ///< Get client handle for associated socket @@ -324,8 +307,11 @@ namespace senf { this protocol instance */ private: - Policy policy_; + virtual std::auto_ptr clone(bool isServer) const; + virtual std::auto_ptr clone(int fd, bool isServer) const; + virtual SocketBody & body() const; + Policy policy_; }; /// @}