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