From dc166b288b2bff23d488736badbd47b8907ab40c Mon Sep 17 00:00:00 2001
From: g0dil <g0dil@wiback.org>
Date: Fri, 10 Nov 2006 23:14:58 +0000
Subject: [PATCH] add optional 'limit' argument to read add missing
 retrive_filehandle overload fix operator bool (use safe bool idiom) add
 GenericSockAddr as default Address implementation

---
 Socket/ClientSocketHandle.ct  |  8 ++++---
 Socket/ClientSocketHandle.hh  |  4 ++--
 Socket/CommunicationPolicy.cc |  1 -
 Socket/FileHandle.cci         | 13 +++++------
 Socket/FileHandle.hh          |  7 ++++--
 Socket/GenericSockAddr.cci    | 38 +++++++++++++++++++++++++++++++
 Socket/GenericSockAddr.hh     | 42 +++++++++++++++++++++++++++++++++++
 Socket/SocketHandle.cc        |  2 ++
 Socket/SocketPolicy.ih        |  8 +++----
 9 files changed, 103 insertions(+), 20 deletions(-)
 create mode 100644 Socket/GenericSockAddr.cci
 create mode 100644 Socket/GenericSockAddr.hh

diff --git a/Socket/ClientSocketHandle.ct b/Socket/ClientSocketHandle.ct
index 1e7fa7b93..50c80a81b 100644
--- a/Socket/ClientSocketHandle.ct
+++ b/Socket/ClientSocketHandle.ct
@@ -30,17 +30,19 @@
 ///////////////////////////////ct.p////////////////////////////////////////
 
 template <class Policy>
-prefix_ std::string satcom::lib::ClientSocketHandle<Policy>::read()
+prefix_ std::string satcom::lib::ClientSocketHandle<Policy>::read(unsigned limit)
 {
     std::string rv;
-    this->read(rv);
+    this->read(rv,limit);
     return rv;
 }
 
 template <class Policy>
-prefix_ void satcom::lib::ClientSocketHandle<Policy>::read(std::string & buffer)
+prefix_ void satcom::lib::ClientSocketHandle<Policy>::read(std::string & buffer, unsigned limit)
 {
     unsigned nread = available();
+    if (limit>0 && nread>limit) 
+	nread = limit;
     // FIXME: This is not necessary correct and more or less a hack ...
     buffer.assign(nread,0);
     unsigned rv = this->read(const_cast<char *>(buffer.data()),nread);
diff --git a/Socket/ClientSocketHandle.hh b/Socket/ClientSocketHandle.hh
index 0e670ab45..4f9b98627 100644
--- a/Socket/ClientSocketHandle.hh
+++ b/Socket/ClientSocketHandle.hh
@@ -78,8 +78,8 @@ namespace lib {
         ///@{
 
         // read from socket (connected or unconnected)
-        std::string  read         ();
-        void         read         (std::string & buffer);
+        std::string  read         (unsigned limit=0);
+        void         read         (std::string & buffer, unsigned limit=0);
         unsigned     read         (char * buffer, unsigned size);
 
         // read from unconnected socket returning peer address
diff --git a/Socket/CommunicationPolicy.cc b/Socket/CommunicationPolicy.cc
index 8523966ef..bc2fa337b 100644
--- a/Socket/CommunicationPolicy.cc
+++ b/Socket/CommunicationPolicy.cc
@@ -53,7 +53,6 @@ prefix_ int satcom::lib::ConnectedCommunicationPolicy::do_accept(FileHandle hand
             switch (errno) {
             case EWOULDBLOCK:
                 return -1;
-                break;
             case EINTR:
                 break;
             default:
diff --git a/Socket/FileHandle.cci b/Socket/FileHandle.cci
index f633fdfcc..bb366baac 100644
--- a/Socket/FileHandle.cci
+++ b/Socket/FileHandle.cci
@@ -172,18 +172,12 @@ prefix_ bool satcom::lib::FileHandle::valid()
     return body().valid();
 }
 
-prefix_ satcom::lib::FileHandle::operator bool ()
+prefix_ bool satcom::lib::FileHandle::boolean_test()
     const
 {
     return valid() && !eof();
 }
 
-prefix_ bool satcom::lib::FileHandle::operator!()
-    const
-{
-    return ! (valid() && !eof());
-}
-
 prefix_ int satcom::lib::FileHandle::fd()
     const
 {
@@ -233,6 +227,11 @@ satcom::lib::FileHandle::cast_dynamic(FileHandle handle)
     return handle;
 }
 
+prefix_ int satcom::lib::retrieve_filehandle(FileHandle handle)
+{
+    return handle.fd();
+}
+
 ///////////////////////////////cci.e///////////////////////////////////////
 #undef prefix_
 
diff --git a/Socket/FileHandle.hh b/Socket/FileHandle.hh
index 3bc615551..febfa011c 100644
--- a/Socket/FileHandle.hh
+++ b/Socket/FileHandle.hh
@@ -33,6 +33,7 @@
 
 // Custom includes
 #include <memory> // std::auto_ptr
+#include "Utils/SafeBool.hh"
 
 //#include "FileHandle.mpp"
 ///////////////////////////////hh.p////////////////////////////////////////
@@ -44,6 +45,7 @@ namespace lib {
     /** \brief
      */
     class FileHandle
+	: public SafeBool<FileHandle>
     {
     public:
         ///////////////////////////////////////////////////////////////////////////
@@ -77,8 +79,7 @@ namespace lib {
         bool eof() const;
         bool valid() const;
 
-        operator bool () const;
-        bool operator!() const;
+	bool boolean_test() const;
 
         int fd() const;
 
@@ -99,6 +100,8 @@ namespace lib {
         FileBody::ptr body_;
     };
 
+    int retrieve_filehandle(FileHandle handle);
+
 }}
 
 ///////////////////////////////hh.e////////////////////////////////////////
diff --git a/Socket/GenericSockAddr.cci b/Socket/GenericSockAddr.cci
new file mode 100644
index 000000000..7ab43721d
--- /dev/null
+++ b/Socket/GenericSockAddr.cci
@@ -0,0 +1,38 @@
+// $Id$
+//
+// Copyright (C) 2006 
+
+// Definition of inline non-template functions
+
+// Custom includes
+
+#define prefix_ inline
+///////////////////////////////cci.p///////////////////////////////////////
+
+prefix_ satcom::lib::GenericSockAddr::GenericSockAddr()
+{}
+
+prefix_ struct sockaddr * satcom::lib::GenericSockAddr::sockaddr_p()
+{
+    return reinterpret_cast<sockaddr *>(&addr_);
+}
+
+prefix_ struct sockaddr const * satcom::lib::GenericSockAddr::sockaddr_p()
+    const
+{
+    return reinterpret_cast<sockaddr const *>(&addr_);
+}
+
+prefix_ unsigned satcom::lib::GenericSockAddr::sockaddr_len()
+    const
+{
+    return sizeof(addr_);
+}
+
+///////////////////////////////cci.e///////////////////////////////////////
+#undef prefix_
+
+
+// Local Variables:
+// mode: c++
+// End:
diff --git a/Socket/GenericSockAddr.hh b/Socket/GenericSockAddr.hh
new file mode 100644
index 000000000..c05d1587a
--- /dev/null
+++ b/Socket/GenericSockAddr.hh
@@ -0,0 +1,42 @@
+// $Id$
+//
+// Copyright (C) 2006 
+
+#ifndef HH_GenericSockAddr_
+#define HH_GenericSockAddr_ 1
+
+// Custom includes
+#include <sys/socket.h>
+
+//#include "GenericSockAddr.mpp"
+///////////////////////////////hh.p////////////////////////////////////////
+
+namespace satcom {
+namespace lib {
+
+    class GenericSockAddr
+    {
+    public:
+	GenericSockAddr();
+	
+	struct sockaddr * sockaddr_p();
+	struct sockaddr const * sockaddr_p() const;
+	unsigned sockaddr_len() const;
+	
+    private:
+	struct ::sockaddr_storage addr_;
+    };
+
+}}
+
+///////////////////////////////hh.e////////////////////////////////////////
+#include "GenericSockAddr.cci"
+//#include "GenericSockAddr.ct"
+//#include "GenericSockAddr.cti"
+//#include "GenericSockAddr.mpp"
+#endif
+
+
+// Local Variables:
+// mode: c++
+// End:
diff --git a/Socket/SocketHandle.cc b/Socket/SocketHandle.cc
index 186953aa2..d0e7e91a6 100644
--- a/Socket/SocketHandle.cc
+++ b/Socket/SocketHandle.cc
@@ -99,12 +99,14 @@ prefix_ bool satcom::lib::detail::StateMapOrdering::operator()(std::string a1, s
             return false;
         if (contains(i2,i2_end,'.'))
             // the longer string is a sub-'directory' of the shorter
+	    // FIXME: shouldn't this be *i2 == '.' ?
             return true;
         return *i1 < *i2;
     }
     else if (i2 == i2_end) { // && i1 != i1_end
         if (contains(i1,i1_end,'.'))
             // the longer string is a sub-'directory' of the shorter
+	    // FIXME: shouldn't this be *i1 == '.' ?
             return false;
         return *i1 < *i2;
     }
diff --git a/Socket/SocketPolicy.ih b/Socket/SocketPolicy.ih
index 58fcba342..b60fd941a 100644
--- a/Socket/SocketPolicy.ih
+++ b/Socket/SocketPolicy.ih
@@ -46,6 +46,8 @@
 #include <boost/mpl/and.hpp>
 #include <boost/utility.hpp> // for enable_if
 
+#include "GenericSockAddr.hh"
+
 ///////////////////////////////ih.p////////////////////////////////////////
 
 namespace satcom {
@@ -62,11 +64,7 @@ namespace lib {
     {
         virtual ~ AddressingPolicyBase() {}
         
-        class Address 
-        {
-        private:
-            Address();
-        };
+	typedef GenericSockAddr Address;
     };
 
 #   define SP_DeclareBase(x1,x2,SomePolicy)                                             \
-- 
GitLab