This is an automated email from the ASF dual-hosted git repository.

rmiddleton pushed a commit to branch LOGCXX-549
in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git

commit f503f453cad66c8bc23ceccdf44b49527de47867
Author: Robert Middleton <[email protected]>
AuthorDate: Sat Aug 13 15:14:01 2022 -0400

    LOGCXX-549 Turned the Socket and SocketServer classes into non APR-specific 
classes
---
 CMakeLists.txt                                     |   1 +
 src/main/cpp/CMakeLists.txt                        |   6 +-
 .../cpp/{serversocket.cpp => aprserversocket.cpp}  |  80 ++++++------
 src/main/cpp/{socket.cpp => aprsocket.cpp}         |  82 ++++++-------
 src/main/cpp/serversocket.cpp                      | 135 ++-------------------
 src/main/cpp/socket.cpp                            | 129 ++------------------
 src/main/cpp/socketappenderskeleton.cpp            |   4 +-
 src/main/cpp/sockethubappender.cpp                 |   7 +-
 src/main/cpp/telnetappender.cpp                    |   2 +-
 src/main/include/CMakeLists.txt                    |   6 +
 src/main/include/log4cxx/helpers/serversocket.h    |  27 +++--
 src/main/include/log4cxx/helpers/socket.h          |  44 +++----
 src/main/include/log4cxx/log4cxx.h.in              |   3 +-
 .../serversocket.h => private/aprserversocket.h}   |  51 +++-----
 .../serversocket.h => private/aprsocket.h}         |  49 +++-----
 .../serversocket.h => private/serversocket_priv.h} |  48 ++------
 .../serversocket.h => private/socket_priv.h}       |  48 ++------
 17 files changed, 204 insertions(+), 518 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index a4b96376..2e95bdcd 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -242,6 +242,7 @@ message(STATUS "  charset ......................... : 
${LOG4CXX_CHARSET}")
 message(STATUS "  Using libESMTP .................. : ${HAS_LIBESMTP}")
 message(STATUS "  ODBC library .................... : ${HAS_ODBC}")
 message(STATUS "  syslog .......................... : ${HAS_SYSLOG}")
+message(STATUS "  Networking support .............. : ${NETWORKING_SUPPORT}")
 message(STATUS "  Qt support ...................... : ${LOG4CXX_QT_SUPPORT}")
 message(STATUS "C++ version and Boost settings:")
 message(STATUS "  Prefer boost: ................... : ${PREFER_BOOST}")
diff --git a/src/main/cpp/CMakeLists.txt b/src/main/cpp/CMakeLists.txt
index 8f9c16d5..0f71bf66 100644
--- a/src/main/cpp/CMakeLists.txt
+++ b/src/main/cpp/CMakeLists.txt
@@ -139,13 +139,15 @@ target_sources(log4cxx
   rollingpolicybase.cpp
   rolloverdescription.cpp
   rootlogger.cpp
-  serversocket.cpp
+  $<IF:$<BOOL:NETWORKING_SUPPORT>,serversocket.cpp,>
+  $<IF:$<BOOL:NETWORKING_SUPPORT>,aprserversocket.cpp,>
   shortfilelocationpatternconverter.cpp
   simpledateformat.cpp
   simplelayout.cpp
   sizebasedtriggeringpolicy.cpp
   smtpappender.cpp
-  socket.cpp
+  $<IF:$<BOOL:NETWORKING_SUPPORT>,socket.cpp,>
+  $<IF:$<BOOL:NETWORKING_SUPPORT>,aprsocket.cpp,>
   socketappenderskeleton.cpp
   sockethubappender.cpp
   socketoutputstream.cpp
diff --git a/src/main/cpp/serversocket.cpp b/src/main/cpp/aprserversocket.cpp
similarity index 64%
copy from src/main/cpp/serversocket.cpp
copy to src/main/cpp/aprserversocket.cpp
index 1cc9a3b9..797b5a1b 100644
--- a/src/main/cpp/serversocket.cpp
+++ b/src/main/cpp/aprserversocket.cpp
@@ -15,28 +15,35 @@
  * limitations under the License.
  */
 
-#include <log4cxx/helpers/serversocket.h>
-#include <mutex>
+#include <log4cxx/private/aprserversocket.h>
+#include <log4cxx/private/serversocket_priv.h>
+#include <log4cxx/private/aprsocket.h>
 #include "apr_network_io.h"
 #include "apr_pools.h"
 #include "apr_poll.h"
 
-using namespace log4cxx::helpers;
+using log4cxx::helpers::APRServerSocket;
 
-/**  Creates a server socket on a specified port.
-*/
-ServerSocket::ServerSocket(int port) : pool(), socket(0), timeout(0)
-{
+#define _priv static_cast<APRServerSocketPriv*>(m_priv.get())
+
+struct APRServerSocket::APRServerSocketPriv : public ServerSocketPrivate {
+       Pool pool;
+       std::mutex mutex;
+       apr_socket_t* socket;
+};
+
+APRServerSocket::APRServerSocket(int port) :
+       ServerSocket(std::make_unique<APRServerSocketPriv>()){
        apr_status_t status =
-               apr_socket_create(&socket, APR_INET, SOCK_STREAM,
-                       APR_PROTO_TCP, pool.getAPRPool());
+               apr_socket_create(&_priv->socket, APR_INET, SOCK_STREAM,
+                       APR_PROTO_TCP, _priv->pool.getAPRPool());
 
        if (status != APR_SUCCESS)
        {
                throw SocketException(status);
        }
 
-       status = apr_socket_opt_set(socket, APR_SO_NONBLOCK, 1);
+       status = apr_socket_opt_set(_priv->socket, APR_SO_NONBLOCK, 1);
 
        if (status != APR_SUCCESS)
        {
@@ -47,7 +54,7 @@ ServerSocket::ServerSocket(int port) : pool(), socket(0), 
timeout(0)
        apr_sockaddr_t* server_addr;
        status =
                apr_sockaddr_info_get(&server_addr, NULL, APR_INET,
-                       port, 0, pool.getAPRPool());
+                       port, 0, _priv->pool.getAPRPool());
 
        if (status != APR_SUCCESS)
        {
@@ -55,7 +62,7 @@ ServerSocket::ServerSocket(int port) : pool(), socket(0), 
timeout(0)
        }
 
        // bind the socket to the address
-       status = apr_socket_bind(socket, server_addr);
+       status = apr_socket_bind(_priv->socket, server_addr);
 
        if (status != APR_SUCCESS)
        {
@@ -63,7 +70,7 @@ ServerSocket::ServerSocket(int port) : pool(), socket(0), 
timeout(0)
        }
 
 
-       status = apr_socket_listen(socket, 50);
+       status = apr_socket_listen(_priv->socket, 50);
 
        if (status != APR_SUCCESS)
        {
@@ -71,50 +78,45 @@ ServerSocket::ServerSocket(int port) : pool(), socket(0), 
timeout(0)
        }
 }
 
+void APRServerSocket::close(){
+       std::unique_lock<std::mutex> lock(_priv->mutex);
 
-ServerSocket::~ServerSocket()
-{
-}
-
-void ServerSocket::close()
-{
-       std::unique_lock<std::mutex> lock(mutex);
-
-       if (socket != 0)
+       if (_priv->socket != 0)
        {
-               apr_status_t status = apr_socket_close(socket);
+               apr_status_t status = apr_socket_close(_priv->socket);
 
                if (status != APR_SUCCESS)
                {
                        throw SocketException(status);
                }
 
-               socket = 0;
+               _priv->socket = 0;
        }
 }
 
+
 /** Listens for a connection to be made to this socket and
 accepts it
 */
-SocketPtr ServerSocket::accept()
+log4cxx::helpers::SocketPtr APRServerSocket::accept()
 {
-       std::unique_lock<std::mutex> lock(mutex);
+       std::unique_lock<std::mutex> lock(_priv->mutex);
 
-       if (socket == 0)
+       if (_priv->socket == 0)
        {
                throw IOException();
        }
 
        apr_pollfd_t poll;
-       poll.p = pool.getAPRPool();
+       poll.p = _priv->pool.getAPRPool();
        poll.desc_type = APR_POLL_SOCKET;
        poll.reqevents = APR_POLLIN;
        poll.rtnevents = 0;
-       poll.desc.s = socket;
+       poll.desc.s = _priv->socket;
        poll.client_data = NULL;
 
        apr_int32_t signaled;
-       apr_interval_time_t to = timeout * 1000;
+       apr_interval_time_t to = _priv->timeout * 1000;
        apr_status_t status = apr_poll(&poll, 1, &signaled, to);
 
        if (APR_STATUS_IS_TIMEUP(status))
@@ -135,7 +137,7 @@ SocketPtr ServerSocket::accept()
        }
 
        apr_socket_t* newSocket;
-       status = apr_socket_accept(&newSocket, socket, newPool);
+       status = apr_socket_accept(&newSocket, _priv->socket, newPool);
 
        if (status != APR_SUCCESS)
        {
@@ -151,19 +153,5 @@ SocketPtr ServerSocket::accept()
                throw SocketException(status);
        }
 
-       return SocketPtr(new Socket(newSocket, newPool));
-}
-
-/** Retrive setting for SO_TIMEOUT.
-*/
-int ServerSocket::getSoTimeout() const
-{
-       return timeout;
-}
-
-/** Enable/disable SO_TIMEOUT with the specified timeout, in milliseconds.
-*/
-void ServerSocket::setSoTimeout(int newVal)
-{
-       timeout = newVal;
+       return std::make_shared<APRSocket>(newSocket, newPool);
 }
diff --git a/src/main/cpp/socket.cpp b/src/main/cpp/aprsocket.cpp
similarity index 64%
copy from src/main/cpp/socket.cpp
copy to src/main/cpp/aprsocket.cpp
index cdd8724f..fa56fe91 100644
--- a/src/main/cpp/socket.cpp
+++ b/src/main/cpp/aprsocket.cpp
@@ -14,39 +14,50 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#include <log4cxx/helpers/socket.h>
+
+#include <log4cxx/private/aprsocket.h>
+#include <log4cxx/private/socket_priv.h>
 #include <log4cxx/helpers/bytebuffer.h>
-#include <log4cxx/helpers/transcoder.h>
+
 #include "apr_network_io.h"
 #include "apr_signal.h"
 
+using log4cxx::helpers::APRSocket;
 
-using namespace log4cxx;
-using namespace log4cxx::helpers;
+struct APRSocket::APRSocketPriv : public 
log4cxx::helpers::Socket::SocketPrivate {
+       APRSocketPriv() :
+               socket(nullptr)
+       {}
 
-IMPLEMENT_LOG4CXX_OBJECT(Socket)
+       APRSocketPriv(apr_socket_t* sock, apr_pool_t* p) :
+               pool(p, true),
+               socket(sock)
+       {}
 
-/** Creates a stream socket and connects it to the specified port
-number at the specified IP address.
-*/
-Socket::Socket(InetAddressPtr& addr, int prt) : pool(), socket(0), 
address(addr), port(prt)
-{
+       Pool pool;
+       apr_socket_t* socket;
+};
+
+#define _priv static_cast<APRSocketPriv*>(m_priv.get())
+
+APRSocket::APRSocket(InetAddressPtr& address, int port) :
+       Socket(std::make_unique<APRSocketPriv>()){
        apr_status_t status =
-               apr_socket_create(&socket, APR_INET, SOCK_STREAM,
-                       APR_PROTO_TCP, pool.getAPRPool());
+               apr_socket_create(&_priv->socket, APR_INET, SOCK_STREAM,
+                       APR_PROTO_TCP, _priv->pool.getAPRPool());
 
        if (status != APR_SUCCESS)
        {
                throw SocketException(status);
        }
 
-       LOG4CXX_ENCODE_CHAR(host, addr->getHostAddress());
+       LOG4CXX_ENCODE_CHAR(host, address->getHostAddress());
 
        // create socket address (including port)
        apr_sockaddr_t* client_addr;
        status =
                apr_sockaddr_info_get(&client_addr, host.c_str(), APR_INET,
-                       prt, 0, pool.getAPRPool());
+                       port, 0, _priv->pool.getAPRPool());
 
        if (status != APR_SUCCESS)
        {
@@ -54,7 +65,7 @@ Socket::Socket(InetAddressPtr& addr, int prt) : pool(), 
socket(0), address(addr)
        }
 
        // connect the socket
-       status =  apr_socket_connect(socket, client_addr);
+       status =  apr_socket_connect(_priv->socket, client_addr);
 
        if (status != APR_SUCCESS)
        {
@@ -62,15 +73,14 @@ Socket::Socket(InetAddressPtr& addr, int prt) : pool(), 
socket(0), address(addr)
        }
 }
 
-Socket::Socket(apr_socket_t* s, apr_pool_t* p) :
-       pool(p, true), socket(s)
-{
+APRSocket::APRSocket(apr_socket_t* s, apr_pool_t* pool) :
+       Socket(std::make_unique<APRSocketPriv>(s, pool)){
        apr_sockaddr_t* sa;
        apr_status_t status = apr_socket_addr_get(&sa, APR_REMOTE, s);
 
        if (status == APR_SUCCESS)
        {
-               port = sa->port;
+               _priv->port = sa->port;
                LogString remotename;
                LogString remoteip;
 
@@ -87,17 +97,13 @@ Socket::Socket(apr_socket_t* s, apr_pool_t* p) :
                        Transcoder::decode(buf, remoteip);
                }
 
-               address = InetAddressPtr(new InetAddress(remotename, remoteip));
+               _priv->address = InetAddressPtr(new InetAddress(remotename, 
remoteip));
        }
 }
 
-Socket::~Socket()
-{
-}
-
-size_t Socket::write(ByteBuffer& buf)
+size_t APRSocket::write(ByteBuffer& buf)
 {
-       if (socket == 0)
+       if (_priv->socket == 0)
        {
                throw ClosedChannelException();
        }
@@ -114,10 +120,10 @@ size_t Socket::write(ByteBuffer& buf)
                // SIGPIPE handler.
 #if APR_HAVE_SIGACTION
                apr_sigfunc_t* old = apr_signal(SIGPIPE, SIG_IGN);
-               apr_status_t status = apr_socket_send(socket, buf.current(), 
&written);
+               apr_status_t status = apr_socket_send(_priv->socket, 
buf.current(), &written);
                apr_signal(SIGPIPE, old);
 #else
-               apr_status_t status = apr_socket_send(socket, buf.current(), 
&written);
+               apr_status_t status = apr_socket_send(_priv->socket, 
buf.current(), &written);
 #endif
 
                buf.position(buf.position() + written);
@@ -133,29 +139,17 @@ size_t Socket::write(ByteBuffer& buf)
 }
 
 
-void Socket::close()
+void APRSocket::close()
 {
-       if (socket != 0)
+       if (_priv->socket != 0)
        {
-               apr_status_t status = apr_socket_close(socket);
+               apr_status_t status = apr_socket_close(_priv->socket);
 
                if (status != APR_SUCCESS)
                {
                        throw SocketException(status);
                }
 
-               socket = 0;
+               _priv->socket = 0;
        }
 }
-
-InetAddressPtr Socket::getInetAddress() const
-{
-       return address;
-}
-
-int Socket::getPort() const
-{
-       return port;
-}
-
-
diff --git a/src/main/cpp/serversocket.cpp b/src/main/cpp/serversocket.cpp
index 1cc9a3b9..cb81a141 100644
--- a/src/main/cpp/serversocket.cpp
+++ b/src/main/cpp/serversocket.cpp
@@ -16,154 +16,41 @@
  */
 
 #include <log4cxx/helpers/serversocket.h>
-#include <mutex>
-#include "apr_network_io.h"
-#include "apr_pools.h"
-#include "apr_poll.h"
+#include <log4cxx/private/serversocket_priv.h>
+#include <log4cxx/private/aprserversocket.h>
 
 using namespace log4cxx::helpers;
 
 /**  Creates a server socket on a specified port.
 */
-ServerSocket::ServerSocket(int port) : pool(), socket(0), timeout(0)
+ServerSocket::ServerSocket(std::unique_ptr<ServerSocketPrivate> priv) :
+       m_priv(std::move(priv))
 {
-       apr_status_t status =
-               apr_socket_create(&socket, APR_INET, SOCK_STREAM,
-                       APR_PROTO_TCP, pool.getAPRPool());
-
-       if (status != APR_SUCCESS)
-       {
-               throw SocketException(status);
-       }
-
-       status = apr_socket_opt_set(socket, APR_SO_NONBLOCK, 1);
-
-       if (status != APR_SUCCESS)
-       {
-               throw SocketException(status);
-       }
-
-       // Create server socket address (including port number)
-       apr_sockaddr_t* server_addr;
-       status =
-               apr_sockaddr_info_get(&server_addr, NULL, APR_INET,
-                       port, 0, pool.getAPRPool());
-
-       if (status != APR_SUCCESS)
-       {
-               throw ConnectException(status);
-       }
-
-       // bind the socket to the address
-       status = apr_socket_bind(socket, server_addr);
-
-       if (status != APR_SUCCESS)
-       {
-               throw BindException(status);
-       }
-
-
-       status = apr_socket_listen(socket, 50);
-
-       if (status != APR_SUCCESS)
-       {
-               throw SocketException(status);
-       }
 }
 
-
 ServerSocket::~ServerSocket()
 {
+       close();
 }
 
 void ServerSocket::close()
 {
-       std::unique_lock<std::mutex> lock(mutex);
-
-       if (socket != 0)
-       {
-               apr_status_t status = apr_socket_close(socket);
-
-               if (status != APR_SUCCESS)
-               {
-                       throw SocketException(status);
-               }
-
-               socket = 0;
-       }
-}
-
-/** Listens for a connection to be made to this socket and
-accepts it
-*/
-SocketPtr ServerSocket::accept()
-{
-       std::unique_lock<std::mutex> lock(mutex);
-
-       if (socket == 0)
-       {
-               throw IOException();
-       }
-
-       apr_pollfd_t poll;
-       poll.p = pool.getAPRPool();
-       poll.desc_type = APR_POLL_SOCKET;
-       poll.reqevents = APR_POLLIN;
-       poll.rtnevents = 0;
-       poll.desc.s = socket;
-       poll.client_data = NULL;
-
-       apr_int32_t signaled;
-       apr_interval_time_t to = timeout * 1000;
-       apr_status_t status = apr_poll(&poll, 1, &signaled, to);
-
-       if (APR_STATUS_IS_TIMEUP(status))
-       {
-               throw SocketTimeoutException();
-       }
-       else if (status != APR_SUCCESS)
-       {
-               throw SocketException(status);
-       }
-
-       apr_pool_t* newPool;
-       status = apr_pool_create(&newPool, 0);
-
-       if (status != APR_SUCCESS)
-       {
-               throw PoolException(status);
-       }
-
-       apr_socket_t* newSocket;
-       status = apr_socket_accept(&newSocket, socket, newPool);
-
-       if (status != APR_SUCCESS)
-       {
-               apr_pool_destroy(newPool);
-               throw SocketException(status);
-       }
-
-       status = apr_socket_opt_set(newSocket, APR_SO_NONBLOCK, 0);
-
-       if (status != APR_SUCCESS)
-       {
-               apr_pool_destroy(newPool);
-               throw SocketException(status);
-       }
-
-       return SocketPtr(new Socket(newSocket, newPool));
 }
 
 /** Retrive setting for SO_TIMEOUT.
 */
 int ServerSocket::getSoTimeout() const
 {
-       return timeout;
+       return m_priv->timeout;
 }
 
 /** Enable/disable SO_TIMEOUT with the specified timeout, in milliseconds.
 */
 void ServerSocket::setSoTimeout(int newVal)
 {
-       timeout = newVal;
+       m_priv->timeout = newVal;
+}
+
+ServerSocketUniquePtr ServerSocket::create(int port){
+       return std::make_unique<APRServerSocket>(port);
 }
diff --git a/src/main/cpp/socket.cpp b/src/main/cpp/socket.cpp
index cdd8724f..d27e4924 100644
--- a/src/main/cpp/socket.cpp
+++ b/src/main/cpp/socket.cpp
@@ -17,145 +17,36 @@
 #include <log4cxx/helpers/socket.h>
 #include <log4cxx/helpers/bytebuffer.h>
 #include <log4cxx/helpers/transcoder.h>
-#include "apr_network_io.h"
-#include "apr_signal.h"
 
+#include <log4cxx/private/socket_priv.h>
+#include <log4cxx/private/aprsocket.h>
 
 using namespace log4cxx;
 using namespace log4cxx::helpers;
 
 IMPLEMENT_LOG4CXX_OBJECT(Socket)
 
-/** Creates a stream socket and connects it to the specified port
-number at the specified IP address.
-*/
-Socket::Socket(InetAddressPtr& addr, int prt) : pool(), socket(0), 
address(addr), port(prt)
-{
-       apr_status_t status =
-               apr_socket_create(&socket, APR_INET, SOCK_STREAM,
-                       APR_PROTO_TCP, pool.getAPRPool());
-
-       if (status != APR_SUCCESS)
-       {
-               throw SocketException(status);
-       }
-
-       LOG4CXX_ENCODE_CHAR(host, addr->getHostAddress());
-
-       // create socket address (including port)
-       apr_sockaddr_t* client_addr;
-       status =
-               apr_sockaddr_info_get(&client_addr, host.c_str(), APR_INET,
-                       prt, 0, pool.getAPRPool());
-
-       if (status != APR_SUCCESS)
-       {
-               throw ConnectException(status);
-       }
-
-       // connect the socket
-       status =  apr_socket_connect(socket, client_addr);
-
-       if (status != APR_SUCCESS)
-       {
-               throw ConnectException(status);
-       }
-}
+Socket::Socket(std::unique_ptr<Socket::SocketPrivate> priv) :
+       m_priv(std::move(priv)){
 
-Socket::Socket(apr_socket_t* s, apr_pool_t* p) :
-       pool(p, true), socket(s)
-{
-       apr_sockaddr_t* sa;
-       apr_status_t status = apr_socket_addr_get(&sa, APR_REMOTE, s);
-
-       if (status == APR_SUCCESS)
-       {
-               port = sa->port;
-               LogString remotename;
-               LogString remoteip;
-
-               if (sa->hostname != NULL)
-               {
-                       Transcoder::decode(sa->hostname, remotename);
-               }
-
-               char* buf = 0;
-               status = apr_sockaddr_ip_get(&buf, sa);
-
-               if (status == APR_SUCCESS)
-               {
-                       Transcoder::decode(buf, remoteip);
-               }
-
-               address = InetAddressPtr(new InetAddress(remotename, remoteip));
-       }
 }
 
 Socket::~Socket()
 {
 }
 
-size_t Socket::write(ByteBuffer& buf)
-{
-       if (socket == 0)
-       {
-               throw ClosedChannelException();
-       }
-
-       int totalWritten = 0;
-
-       while (buf.remaining() > 0)
-       {
-               apr_size_t written = buf.remaining();
-
-               // while writing to the socket, we need to ignore the SIGPIPE
-               // signal. Otherwise, when the client has closed the connection,
-               // the send() function would not return an error but call the
-               // SIGPIPE handler.
-#if APR_HAVE_SIGACTION
-               apr_sigfunc_t* old = apr_signal(SIGPIPE, SIG_IGN);
-               apr_status_t status = apr_socket_send(socket, buf.current(), 
&written);
-               apr_signal(SIGPIPE, old);
-#else
-               apr_status_t status = apr_socket_send(socket, buf.current(), 
&written);
-#endif
-
-               buf.position(buf.position() + written);
-               totalWritten += written;
-
-               if (status != APR_SUCCESS)
-               {
-                       throw SocketException(status);
-               }
-       }
-
-       return totalWritten;
-}
-
-
-void Socket::close()
-{
-       if (socket != 0)
-       {
-               apr_status_t status = apr_socket_close(socket);
-
-               if (status != APR_SUCCESS)
-               {
-                       throw SocketException(status);
-               }
-
-               socket = 0;
-       }
-}
-
 InetAddressPtr Socket::getInetAddress() const
 {
-       return address;
+       return m_priv->address;
 }
 
 int Socket::getPort() const
 {
-       return port;
+       return m_priv->port;
+}
+
+SocketUniquePtr Socket::create(InetAddressPtr& address, int port){
+       return std::make_unique<APRSocket>(address, port);
 }
 
 
diff --git a/src/main/cpp/socketappenderskeleton.cpp 
b/src/main/cpp/socketappenderskeleton.cpp
index de79bd8a..03d87cc1 100644
--- a/src/main/cpp/socketappenderskeleton.cpp
+++ b/src/main/cpp/socketappenderskeleton.cpp
@@ -89,7 +89,7 @@ void SocketAppenderSkeleton::connect(Pool& p)
 
                try
                {
-                       SocketPtr socket(new Socket(_priv->address, 
_priv->port));
+                       SocketPtr socket = Socket::create(_priv->address, 
_priv->port);
                        setSocket(socket, p);
                }
                catch (SocketException& e)
@@ -157,7 +157,7 @@ void SocketAppenderSkeleton::monitor()
                        {
                                LogLog::debug(LogString(LOG4CXX_STR("Attempting 
connection to "))
                                        + _priv->address->getHostName());
-                               socket = SocketPtr(new Socket(_priv->address, 
_priv->port));
+                               socket = Socket::create(_priv->address, 
_priv->port);
                                Pool p;
                                setSocket(socket, p);
                                LogLog::debug(LOG4CXX_STR("Connection 
established. Exiting connector thread."));
diff --git a/src/main/cpp/sockethubappender.cpp 
b/src/main/cpp/sockethubappender.cpp
index 86613bbe..ca84f168 100644
--- a/src/main/cpp/sockethubappender.cpp
+++ b/src/main/cpp/sockethubappender.cpp
@@ -201,17 +201,16 @@ void SocketHubAppender::startServer()
 
 void SocketHubAppender::monitor()
 {
-       ServerSocket* serverSocket = 0;
+       ServerSocketUniquePtr serverSocket = 0;
 
        try
        {
-               serverSocket = new ServerSocket(_priv->port);
+               serverSocket = ServerSocket::create(_priv->port);
                serverSocket->setSoTimeout(1000);
        }
        catch (SocketException& e)
        {
                LogLog::error(LOG4CXX_STR("exception setting timeout, shutting 
down server socket."), e);
-               delete serverSocket;
                return;
        }
 
@@ -266,8 +265,6 @@ void SocketHubAppender::monitor()
 
                stopRunning = (stopRunning || _priv->closed);
        }
-
-       delete serverSocket;
 }
 
 void SocketHubAppender::setPort(int port1)
diff --git a/src/main/cpp/telnetappender.cpp b/src/main/cpp/telnetappender.cpp
index 9a2e8ee5..0c72a809 100644
--- a/src/main/cpp/telnetappender.cpp
+++ b/src/main/cpp/telnetappender.cpp
@@ -75,7 +75,7 @@ void TelnetAppender::activateOptions(Pool& /* p */)
 {
        if (_priv->serverSocket == NULL)
        {
-               _priv->serverSocket = 
std::make_unique<ServerSocket>(_priv->port);
+               _priv->serverSocket = ServerSocket::create(_priv->port);
                _priv->serverSocket->setSoTimeout(1000);
        }
 
diff --git a/src/main/include/CMakeLists.txt b/src/main/include/CMakeLists.txt
index e31443fb..576701f7 100644
--- a/src/main/include/CMakeLists.txt
+++ b/src/main/include/CMakeLists.txt
@@ -58,6 +58,12 @@ foreach(varName WCHAR_T  UNICHAR  CFSTRING )
   endif()
 endforeach()
 
+option(NETWORKING_SUPPORT "Support logging over a network socket" ON)
+if(NETWORKING_SUPPORT)
+    set(NETWORKING_SUPPORT 1)
+else()
+    set(NETWORKING_SUPPORT 0)
+endif()
 
 # Configure log4cxx_private.h
 set(LOG4CXX_CHARSET "locale" CACHE STRING "LogString characters, choice of 
locale (default), utf-8, ISO-8859-1, US-ASCII, EBCDIC")
diff --git a/src/main/include/log4cxx/helpers/serversocket.h 
b/src/main/include/log4cxx/helpers/serversocket.h
index 7da75b96..b6cc51d7 100644
--- a/src/main/include/log4cxx/helpers/serversocket.h
+++ b/src/main/include/log4cxx/helpers/serversocket.h
@@ -21,27 +21,35 @@
 #include <log4cxx/helpers/socket.h>
 #include <mutex>
 
+struct apr_socket_t;
+
 namespace log4cxx
 {
 namespace helpers
 {
+
+class ServerSocket;
+LOG4CXX_PTR_DEF(ServerSocket);
+LOG4CXX_UNIQUE_PTR_DEF(ServerSocket);
+
 class LOG4CXX_EXPORT ServerSocket
 {
+       protected:
+               struct ServerSocketPrivate;
+               ServerSocket(std::unique_ptr<ServerSocketPrivate> priv);
+
        public:
-               /**  Creates a server socket on a specified port.
-               */
-               ServerSocket(int port);
 
                virtual ~ServerSocket();
 
                /** Listens for a connection to be made to this socket and
                accepts it
                */
-               SocketPtr accept();
+               virtual SocketPtr accept() = 0;
 
                /** Closes this socket.
                */
-               void close();
+               virtual void close();
 
                /** Retrive setting for SO_TIMEOUT.
                */
@@ -51,11 +59,10 @@ class LOG4CXX_EXPORT ServerSocket
                */
                void setSoTimeout(int timeout);
 
-       private:
-               Pool pool;
-               std::mutex mutex;
-               apr_socket_t* socket;
-               int timeout;
+               static ServerSocketUniquePtr create(int port);
+
+       protected:
+               std::unique_ptr<ServerSocketPrivate> m_priv;
 
 };
 }  // namespace helpers
diff --git a/src/main/include/log4cxx/helpers/socket.h 
b/src/main/include/log4cxx/helpers/socket.h
index 9284490b..fd7cadd4 100644
--- a/src/main/include/log4cxx/helpers/socket.h
+++ b/src/main/include/log4cxx/helpers/socket.h
@@ -18,11 +18,6 @@
 #ifndef _LOG4CXX_HELPERS_SOCKET_H
 #define _LOG4CXX_HELPERS_SOCKET_H
 
-extern "C" {
-       struct apr_socket_t;
-}
-
-
 #include <log4cxx/helpers/inetaddress.h>
 #include <log4cxx/helpers/pool.h>
 
@@ -32,6 +27,11 @@ namespace log4cxx
 namespace helpers
 {
 class ByteBuffer;
+
+class Socket;
+LOG4CXX_PTR_DEF(Socket);
+LOG4CXX_UNIQUE_PTR_DEF(Socket);
+
 /**
 <p>This class implements client sockets (also called just "sockets"). A socket
 is an endpoint for communication between two machines.
@@ -42,48 +42,40 @@ local firewall.
 */
 class LOG4CXX_EXPORT Socket : public helpers::Object
 {
+       protected:
+               struct SocketPrivate;
+
+               Socket(std::unique_ptr<SocketPrivate>);
+
        public:
                DECLARE_ABSTRACT_LOG4CXX_OBJECT(Socket)
                BEGIN_LOG4CXX_CAST_MAP()
                LOG4CXX_CAST_ENTRY(Socket)
                END_LOG4CXX_CAST_MAP()
 
-               /** Creates a stream socket and connects it to the specified 
port
-               number at the specified IP address.
-               */
-               Socket(InetAddressPtr& address, int port);
-               Socket(apr_socket_t* socket, apr_pool_t* pool);
-               ~Socket();
+               virtual ~Socket();
 
-               size_t write(ByteBuffer&);
+               virtual size_t write(ByteBuffer&) = 0;
 
                /** Closes this socket. */
-               void close();
+               virtual void close() = 0;
 
                /** Returns the value of this socket's address field. */
                InetAddressPtr getInetAddress() const;
 
                /** Returns the value of this socket's port field. */
                int getPort() const;
+
+               static SocketUniquePtr create(InetAddressPtr& address, int 
port);
+
        private:
                Socket(const Socket&);
                Socket& operator=(const Socket&);
 
-               Pool pool;
-
-               apr_socket_t* socket;
-
-
-               /** The IP address of the remote end of this socket. */
-               InetAddressPtr address;
-
-               /** The port number on the remote host to which
-               this socket is connected. */
-               int port;
+       protected:
+               std::unique_ptr<SocketPrivate> m_priv;
 };
 
-LOG4CXX_PTR_DEF(Socket);
-
 } // namespace helpers
 } // namespace log4cxx
 
diff --git a/src/main/include/log4cxx/log4cxx.h.in 
b/src/main/include/log4cxx/log4cxx.h.in
index c97869cc..e350d831 100644
--- a/src/main/include/log4cxx/log4cxx.h.in
+++ b/src/main/include/log4cxx/log4cxx.h.in
@@ -48,7 +48,7 @@
 #define LOG4CXX_WCHAR_T_API @WCHAR_T_API@
 #define LOG4CXX_UNICHAR_API @UNICHAR_API@
 #define LOG4CXX_CFSTRING_API @CFSTRING_API@
-
+#define LOG4CXX_HAS_NETWORKING @NETWORKING_SUPPORT@
 
 typedef long long log4cxx_int64_t;
 #define LOG4CXX_USE_GLOBAL_SCOPE_TEMPLATE 0
@@ -62,6 +62,7 @@ typedef unsigned int log4cxx_uint32_t;
 
 #define LOG4CXX_PTR_DEF(T) typedef std::shared_ptr<T> T##Ptr;\
        typedef std::weak_ptr<T> T##WeakPtr
+#define LOG4CXX_UNIQUE_PTR_DEF(T) typedef std::unique_ptr<T> T##UniquePtr;
 #define LOG4CXX_LIST_DEF(N, T) typedef std::vector<T> N
 
 #if _WIN32
diff --git a/src/main/include/log4cxx/helpers/serversocket.h 
b/src/main/include/log4cxx/private/aprserversocket.h
similarity index 52%
copy from src/main/include/log4cxx/helpers/serversocket.h
copy to src/main/include/log4cxx/private/aprserversocket.h
index 7da75b96..b05aba91 100644
--- a/src/main/include/log4cxx/helpers/serversocket.h
+++ b/src/main/include/log4cxx/private/aprserversocket.h
@@ -15,50 +15,33 @@
  * limitations under the License.
  */
 
-#ifndef _LOG4CXX_HELPERS_SERVER_SOCKET_H
-#define _LOG4CXX_HELPERS_SERVER_SOCKET_H
+#ifndef LOG4CXX_HELPERS_APRSERVERSOCKET_H
+#define LOG4CXX_HELPERS_APRSERVERSOCKET_H
 
-#include <log4cxx/helpers/socket.h>
-#include <mutex>
+#include <log4cxx/helpers/serversocket.h>
 
 namespace log4cxx
 {
 namespace helpers
 {
-class LOG4CXX_EXPORT ServerSocket
-{
-       public:
-               /**  Creates a server socket on a specified port.
-               */
-               ServerSocket(int port);
-
-               virtual ~ServerSocket();
 
-               /** Listens for a connection to be made to this socket and
-               accepts it
-               */
-               SocketPtr accept();
-
-               /** Closes this socket.
-               */
-               void close();
+/**
+ * A ServerSocket that uses APR as the network implementation
+ */
+class LOG4CXX_EXPORT APRServerSocket : public helpers::ServerSocket
+{
+        public:
+            APRServerSocket(int port);
 
-               /** Retrive setting for SO_TIMEOUT.
-               */
-               int getSoTimeout() const;
+           void close();
 
-               /** Enable/disable SO_TIMEOUT with the specified timeout, in 
milliseconds.
-               */
-               void setSoTimeout(int timeout);
+           SocketPtr accept();
 
        private:
-               Pool pool;
-               std::mutex mutex;
-               apr_socket_t* socket;
-               int timeout;
-
+               struct APRServerSocketPriv;
 };
-}  // namespace helpers
-} // namespace log4cxx
 
-#endif //_LOG4CXX_HELPERS_SERVER_SOCKET_H
+}
+}
+
+#endif /* LOG4CXX_HELPERS_APRSERVERSOCKET_H */
diff --git a/src/main/include/log4cxx/helpers/serversocket.h 
b/src/main/include/log4cxx/private/aprsocket.h
similarity index 55%
copy from src/main/include/log4cxx/helpers/serversocket.h
copy to src/main/include/log4cxx/private/aprsocket.h
index 7da75b96..5869a756 100644
--- a/src/main/include/log4cxx/helpers/serversocket.h
+++ b/src/main/include/log4cxx/private/aprsocket.h
@@ -15,50 +15,37 @@
  * limitations under the License.
  */
 
-#ifndef _LOG4CXX_HELPERS_SERVER_SOCKET_H
-#define _LOG4CXX_HELPERS_SERVER_SOCKET_H
+#ifndef LOG4CXX_HELPERS_APRSOCKET_H
+#define LOG4CXX_HELPERS_APRSOCKET_H
 
 #include <log4cxx/helpers/socket.h>
-#include <mutex>
+
+struct apr_socket_t;
 
 namespace log4cxx
 {
 namespace helpers
 {
-class LOG4CXX_EXPORT ServerSocket
+
+class LOG4CXX_EXPORT APRSocket : public helpers::Socket
 {
        public:
-               /**  Creates a server socket on a specified port.
+               /** Creates a stream socket and connects it to the specified 
port
+               number at the specified IP address.
                */
-               ServerSocket(int port);
-
-               virtual ~ServerSocket();
+               APRSocket(InetAddressPtr& address, int port);
+               APRSocket(apr_socket_t*, apr_pool_t* pool);
 
-               /** Listens for a connection to be made to this socket and
-               accepts it
-               */
-               SocketPtr accept();
+               virtual size_t write(ByteBuffer&);
 
-               /** Closes this socket.
-               */
-               void close();
-
-               /** Retrive setting for SO_TIMEOUT.
-               */
-               int getSoTimeout() const;
-
-               /** Enable/disable SO_TIMEOUT with the specified timeout, in 
milliseconds.
-               */
-               void setSoTimeout(int timeout);
+               /** Closes this socket. */
+               virtual void close();
 
        private:
-               Pool pool;
-               std::mutex mutex;
-               apr_socket_t* socket;
-               int timeout;
-
+               struct APRSocketPriv;
 };
-}  // namespace helpers
-} // namespace log4cxx
 
-#endif //_LOG4CXX_HELPERS_SERVER_SOCKET_H
+}
+}
+
+#endif /* LOG4CXX_HELPERS_APRSOCKET_H */
diff --git a/src/main/include/log4cxx/helpers/serversocket.h 
b/src/main/include/log4cxx/private/serversocket_priv.h
similarity index 51%
copy from src/main/include/log4cxx/helpers/serversocket.h
copy to src/main/include/log4cxx/private/serversocket_priv.h
index 7da75b96..0d3b021d 100644
--- a/src/main/include/log4cxx/helpers/serversocket.h
+++ b/src/main/include/log4cxx/private/serversocket_priv.h
@@ -15,50 +15,24 @@
  * limitations under the License.
  */
 
-#ifndef _LOG4CXX_HELPERS_SERVER_SOCKET_H
-#define _LOG4CXX_HELPERS_SERVER_SOCKET_H
+#ifndef LOG4CXX_HELPERS_SERVERSOCKET_PRIV_H
+#define LOG4CXX_HELPERS_SERVERSOCKET_PRIV_H
 
-#include <log4cxx/helpers/socket.h>
-#include <mutex>
+#include <log4cxx/helpers/serversocket.h>
 
 namespace log4cxx
 {
 namespace helpers
 {
-class LOG4CXX_EXPORT ServerSocket
-{
-       public:
-               /**  Creates a server socket on a specified port.
-               */
-               ServerSocket(int port);
-
-               virtual ~ServerSocket();
-
-               /** Listens for a connection to be made to this socket and
-               accepts it
-               */
-               SocketPtr accept();
-
-               /** Closes this socket.
-               */
-               void close();
 
-               /** Retrive setting for SO_TIMEOUT.
-               */
-               int getSoTimeout() const;
-
-               /** Enable/disable SO_TIMEOUT with the specified timeout, in 
milliseconds.
-               */
-               void setSoTimeout(int timeout);
-
-       private:
-               Pool pool;
-               std::mutex mutex;
-               apr_socket_t* socket;
-               int timeout;
+struct ServerSocket::ServerSocketPrivate{
+    ServerSocketPrivate() :
+        timeout(0){}
 
+    int timeout;
 };
-}  // namespace helpers
-} // namespace log4cxx
 
-#endif //_LOG4CXX_HELPERS_SERVER_SOCKET_H
+}
+}
+
+#endif /* LOG4CXX_HELPERS_SERVERSOCKET_PRIV_H */
diff --git a/src/main/include/log4cxx/helpers/serversocket.h 
b/src/main/include/log4cxx/private/socket_priv.h
similarity index 53%
copy from src/main/include/log4cxx/helpers/serversocket.h
copy to src/main/include/log4cxx/private/socket_priv.h
index 7da75b96..fcc09bf7 100644
--- a/src/main/include/log4cxx/helpers/serversocket.h
+++ b/src/main/include/log4cxx/private/socket_priv.h
@@ -15,50 +15,26 @@
  * limitations under the License.
  */
 
-#ifndef _LOG4CXX_HELPERS_SERVER_SOCKET_H
-#define _LOG4CXX_HELPERS_SERVER_SOCKET_H
+#ifndef LOG4CXX_HELPERS_SOCKET_PRIV_H
+#define LOG4CXX_HELPERS_SOCKET_PRIV_H
 
 #include <log4cxx/helpers/socket.h>
-#include <mutex>
 
 namespace log4cxx
 {
 namespace helpers
 {
-class LOG4CXX_EXPORT ServerSocket
-{
-       public:
-               /**  Creates a server socket on a specified port.
-               */
-               ServerSocket(int port);
-
-               virtual ~ServerSocket();
-
-               /** Listens for a connection to be made to this socket and
-               accepts it
-               */
-               SocketPtr accept();
-
-               /** Closes this socket.
-               */
-               void close();
 
-               /** Retrive setting for SO_TIMEOUT.
-               */
-               int getSoTimeout() const;
-
-               /** Enable/disable SO_TIMEOUT with the specified timeout, in 
milliseconds.
-               */
-               void setSoTimeout(int timeout);
-
-       private:
-               Pool pool;
-               std::mutex mutex;
-               apr_socket_t* socket;
-               int timeout;
+struct Socket::SocketPrivate{
+    /** The IP address of the remote end of this socket. */
+    InetAddressPtr address;
 
+    /** The port number on the remote host to which
+    this socket is connected. */
+    int port;
 };
-}  // namespace helpers
-} // namespace log4cxx
 
-#endif //_LOG4CXX_HELPERS_SERVER_SOCKET_H
+}
+}
+
+#endif /* LOG4CXX_HELPERS_SOCKET_PRIV_H */

Reply via email to