X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Socket%2FSocketProtocol.hh;h=50301f94d983d8e865b0f543032f169297df3a95;hb=6f50bf49e282c0528f51faa0a245bbfa2b867399;hp=e05beac7cf9c5837d28ab405735ffe114811b6b7;hpb=f73fa16ed5abdce272ac77f8b8b9ef2b9922c266;p=senf.git
diff --git a/Socket/SocketProtocol.hh b/Socket/SocketProtocol.hh
index e05beac..50301f9 100644
--- a/Socket/SocketProtocol.hh
+++ b/Socket/SocketProtocol.hh
@@ -39,17 +39,17 @@
\htmlonly
\endhtmlonly
@@ -148,22 +148,14 @@ namespace senf {
///////////////////////////////////////////////////////////////////////////
virtual SocketPolicyBase const & policy() const = 0;
- ///< Access the policy instance
+ ///< Access the policy instance
///////////////////////////////////////////////////////////////////////////
// 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 number of bytes available for reading without
- ///< blocking
+ ///< Return (maximum) number of bytes available for reading
+ ///< without < blocking
/**< This member will check in a (very, sigh) protocol
dependent way, how many bytes may be read from a socket
in a single (non-blocking) read operation. If the
@@ -176,9 +168,9 @@ namespace senf {
returns ethernet frames, returning 1500 from
available() is ok). However, this should only be done
as a last resort. Also beware, that this number should
- not be to large since the socket layer will always need
- to allocate that number of bytes for the data to be
- read. */
+ not be too large since the socket layer will always
+ need to allocate that number of bytes for the data to
+ be read. */
virtual bool eof() const = 0; ///< Check for end-of-file condition
/**< This is another check which (like available()) is
@@ -187,18 +179,18 @@ namespace senf {
not support the notion of EOF, this member should
always return \c false. */
- virtual void close() const; ///< Close socket
+ virtual void close() const; ///< Close socket
/**< This override will automatically \c shutdown() the
socket whenever it is closed.
\throws senf::SystemException */
-
- virtual void terminate() const; ///< Forcibly close socket
+
+ virtual void terminate() const; ///< Forcibly close socket
/**< This override will automatically \c shutdown() the
- socket whenever it is called. Additionally it will
- 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. */
+ socket whenever it is called. Additionally it will
+ 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. */
virtual void state(SocketStateMap & map, unsigned lod) const;
///< Return socket state information
@@ -209,7 +201,7 @@ namespace senf {
\a lod value with a default value of 0. The
interpretation of the \a lod value is completely
implementation defined.
-
+
Every class derived from SocketProtocol should
reimplement state(). The reimplemented method should
call (all) baseclass-implementations of this
@@ -220,21 +212,21 @@ namespace senf {
keys are interpreted as hierarchical strings with '.'
as a separator (like hostnames or struct or class
members). They are automatically sorted correctly.
-
+
The values are std:string with one additional feature:
they allow assignment or conversion from *any* type as
long as that type is streamable. This simplifies
assigning non-string values to the map:
-
+
\code
- map["socket.protocol.ip.address"] << peer();
- map["socket.protocol.tcp.backlog"] << backlog();
+ map["socket.protocol.ip.address"] << peer();
+ map["socket.protocol.tcp.backlog"] << backlog();
\endcode
-
+
This will work even if peer() returns an ip-address
object or backlog() returns an integer. The values are
automatically converted to their string representation.
-
+
Additionally, if the slot the date is written to is not
empty, the \<\< operator will add add a comma
as separator. */
@@ -260,14 +252,15 @@ 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;
/** \brief Concrete Socket Protocol implementation base class
@@ -286,7 +279,7 @@ namespace senf {
\doc init_client init_server
*/
- template
+ template
class ConcreteSocketProtocol
: public virtual SocketProtocol
{
@@ -310,12 +303,23 @@ namespace senf {
///////////////////////////////////////////////////////////////////////////
Policy const & policy() const;
-
+
protected:
+ ClientSocketHandle clientHandle() const;
+ ///< Get client handle for associated socket
+ /**< Returns a client handle for the socket associated with
+ this protocol instance */
+ ServerSocketHandle serverHandle() const;
+ ///< Get server handle for associated socket
+ /**< Returns a server handle for the socket associated with
+ 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_;
};
/// @}