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 a845d5101c74fa28e37f12b6b4b0aabd6751652b
Author: Robert Middleton <[email protected]>
AuthorDate: Sat Aug 13 16:01:16 2022 -0400

    Make the datagram socket abstract
---
 src/main/cpp/CMakeLists.txt                        |   5 +-
 .../{datagramsocket.cpp => aprdatagramsocket.cpp}  | 265 ++++++++-------------
 src/main/cpp/datagramsocket.cpp                    | 224 ++---------------
 src/main/cpp/syslogwriter.cpp                      |   2 +-
 src/main/include/log4cxx/helpers/datagramsocket.h  |  57 +++--
 .../include/log4cxx/private/aprdatagramsocket.h    |  59 +++++
 .../include/log4cxx/private/datagramsocket_priv.h  |  58 +++++
 7 files changed, 275 insertions(+), 395 deletions(-)

diff --git a/src/main/cpp/CMakeLists.txt b/src/main/cpp/CMakeLists.txt
index 0f71bf66..e8f8d905 100644
--- a/src/main/cpp/CMakeLists.txt
+++ b/src/main/cpp/CMakeLists.txt
@@ -51,8 +51,9 @@ target_sources(log4cxx
   configurator.cpp
   consoleappender.cpp
   cyclicbuffer.cpp
-  datagrampacket.cpp
-  datagramsocket.cpp
+  $<IF:$<BOOL:NETWORKING_SUPPORT>,datagrampacket.cpp,>
+  $<IF:$<BOOL:NETWORKING_SUPPORT>,datagramsocket.cpp,>
+  $<IF:$<BOOL:NETWORKING_SUPPORT>,aprdatagramsocket.cpp,>
   date.cpp
   dateformat.cpp
   datepatternconverter.cpp
diff --git a/src/main/cpp/datagramsocket.cpp 
b/src/main/cpp/aprdatagramsocket.cpp
similarity index 53%
copy from src/main/cpp/datagramsocket.cpp
copy to src/main/cpp/aprdatagramsocket.cpp
index 0aa46ff9..3ace8528 100644
--- a/src/main/cpp/datagramsocket.cpp
+++ b/src/main/cpp/aprdatagramsocket.cpp
@@ -14,168 +14,60 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#include <log4cxx/logstring.h>
-#include <log4cxx/helpers/datagramsocket.h>
-#include <log4cxx/helpers/datagrampacket.h>
-#include <log4cxx/helpers/loglog.h>
-#include <log4cxx/helpers/transcoder.h>
 
-#include "apr_network_io.h"
-#include "apr_lib.h"
+#include <log4cxx/private/aprdatagramsocket.h>
+#include <log4cxx/private/datagramsocket_priv.h>
+#include <apr_network_io.h>
 
-using namespace log4cxx::helpers;
+using log4cxx::helpers::APRDatagramSocket;
 
-struct DatagramSocket::DatagramSocketPriv
-{
-       DatagramSocketPriv()
-               : socket(0), address(), localAddress(), port(0), localPort(0)
-       {
-       }
+#define _priv static_cast<APRDatagramSocketPriv*>(m_priv.get())
 
-       DatagramSocketPriv(int localPort1)
-               : socket(0), address(), localAddress(), port(0), localPort(0)
-       {
-       }
+struct APRDatagramSocket::APRDatagramSocketPriv : public DatagramSocketPriv {
+       APRDatagramSocketPriv() :
+               DatagramSocketPriv(),
+               socket(nullptr)
+       {}
 
-       DatagramSocketPriv(int localPort1, InetAddressPtr localAddress1)
-               : socket(0), address(), localAddress(), port(0), localPort(0)
-       {
-       }
+       APRDatagramSocketPriv(int port) :
+               DatagramSocketPriv(port),
+               socket(nullptr)
+       {}
+
+       APRDatagramSocketPriv(int port, InetAddressPtr localAddress) :
+               DatagramSocketPriv(port, localAddress),
+               socket(nullptr)
+       {}
 
        /** The APR socket */
        apr_socket_t* socket;
 
        /** The memory pool for the socket */
        Pool socketPool;
-
-       InetAddressPtr address;
-
-       InetAddressPtr localAddress;
-
-       int port;
-
-       /** The local port number to which this socket is connected. */
-       int localPort;
 };
 
-IMPLEMENT_LOG4CXX_OBJECT(DatagramSocket)
-
-DatagramSocket::DatagramSocket()
-       : m_priv(std::make_unique<DatagramSocketPriv>())
-{
-       create();
-}
-
-DatagramSocket::DatagramSocket(int localPort1)
-       : m_priv(std::make_unique<DatagramSocketPriv>(localPort1))
-{
-       InetAddressPtr bindAddr = InetAddress::anyAddress();
-
-       create();
-       bind(localPort1, bindAddr);
-}
-
-DatagramSocket::DatagramSocket(int localPort1, InetAddressPtr localAddress1)
-       : m_priv(std::make_unique<DatagramSocketPriv>(localPort1, 
localAddress1))
-{
-       create();
-       bind(localPort1, localAddress1);
-}
-
-DatagramSocket::~DatagramSocket()
-{
-       try
-       {
-               close();
-       }
-       catch (SocketException&)
-       {
-       }
-}
-
-/**  Binds a datagram socket to a local port and address.*/
-void DatagramSocket::bind(int localPort1, InetAddressPtr localAddress1)
-{
-       Pool addrPool;
-
-       // Create server socket address (including port number)
-       LOG4CXX_ENCODE_CHAR(hostAddr, localAddress1->getHostAddress());
-       apr_sockaddr_t* server_addr;
-       apr_status_t status =
-               apr_sockaddr_info_get(&server_addr, hostAddr.c_str(), APR_INET,
-                       localPort1, 0, addrPool.getAPRPool());
-
-       if (status != APR_SUCCESS)
-       {
-               throw BindException(status);
-       }
-
-       // bind the socket to the address
-       status = apr_socket_bind(m_priv->socket, server_addr);
-
-       if (status != APR_SUCCESS)
-       {
-               throw BindException(status);
-       }
-
-       m_priv->localPort = localPort1;
-       m_priv->localAddress = localAddress1;
+APRDatagramSocket::APRDatagramSocket() :
+       DatagramSocket(std::make_unique<APRDatagramSocketPriv>()){
+       init();
 }
 
-/** Close the socket.*/
-void DatagramSocket::close()
-{
-       if (m_priv->socket != 0)
-       {
-               apr_status_t status = apr_socket_close(m_priv->socket);
-
-               if (status != APR_SUCCESS)
-               {
-                       throw SocketException(status);
-               }
-
-               m_priv->socket = 0;
-               m_priv->localPort = 0;
-       }
+APRDatagramSocket::APRDatagramSocket(int port) :
+       DatagramSocket(std::make_unique<APRDatagramSocketPriv>(port)){
+       init();
 }
 
-void DatagramSocket::connect(InetAddressPtr address1, int port1)
-{
-
-       m_priv->address = address1;
-       m_priv->port = port1;
-
-       Pool addrPool;
-
-       // create socket address
-       LOG4CXX_ENCODE_CHAR(hostAddr, address1->getHostAddress());
-       apr_sockaddr_t* client_addr;
-       apr_status_t status =
-               apr_sockaddr_info_get(&client_addr, hostAddr.c_str(), APR_INET,
-                       m_priv->port, 0, addrPool.getAPRPool());
-
-       if (status != APR_SUCCESS)
-       {
-               throw ConnectException(status);
-       }
-
-       // connect the socket
-       status = apr_socket_connect(m_priv->socket, client_addr);
-
-       if (status != APR_SUCCESS)
-       {
-               throw ConnectException(status);
-       }
+APRDatagramSocket::APRDatagramSocket(int port, InetAddressPtr laddr) :
+       DatagramSocket(std::make_unique<APRDatagramSocketPriv>(port, laddr)){
+       init();
 }
 
-/** Creates a datagram socket.*/
-void DatagramSocket::create()
+void APRDatagramSocket::init()
 {
        apr_socket_t* newSocket;
        apr_status_t status =
                apr_socket_create(&newSocket, APR_INET, SOCK_DGRAM,
-                       APR_PROTO_UDP, m_priv->socketPool.getAPRPool());
-       m_priv->socket = newSocket;
+                       APR_PROTO_UDP, _priv->socketPool.getAPRPool());
+       _priv->socket = newSocket;
 
        if (status != APR_SUCCESS)
        {
@@ -183,8 +75,7 @@ void DatagramSocket::create()
        }
 }
 
-/** Receive the datagram packet.*/
-void DatagramSocket::receive(DatagramPacketPtr& p)
+void APRDatagramSocket::receive(DatagramPacketPtr& p)
 {
        Pool addrPool;
 
@@ -202,7 +93,7 @@ void DatagramSocket::receive(DatagramPacketPtr& p)
 
        // receive the datagram packet
        apr_size_t len = p->getLength();
-       status = apr_socket_recvfrom(addr, m_priv->socket, 0,
+       status = apr_socket_recvfrom(addr, _priv->socket, 0,
                        (char*)p->getData(), &len);
 
        if (status != APR_SUCCESS)
@@ -211,8 +102,7 @@ void DatagramSocket::receive(DatagramPacketPtr& p)
        }
 }
 
-/**  Sends a datagram packet.*/
-void DatagramSocket::send(DatagramPacketPtr& p)
+void APRDatagramSocket::send(DatagramPacketPtr& p)
 {
        Pool addrPool;
 
@@ -230,7 +120,7 @@ void DatagramSocket::send(DatagramPacketPtr& p)
 
        // send the datagram packet
        apr_size_t len = p->getLength();
-       status = apr_socket_sendto(m_priv->socket, addr, 0,
+       status = apr_socket_sendto(_priv->socket, addr, 0,
                        (char*)p->getData(), &len);
 
        if (status != APR_SUCCESS)
@@ -239,37 +129,80 @@ void DatagramSocket::send(DatagramPacketPtr& p)
        }
 }
 
-InetAddressPtr DatagramSocket::getInetAddress() const
-{
-       return m_priv->address;
-}
+void APRDatagramSocket::close(){
+       if (_priv->socket != 0)
+       {
+               apr_status_t status = apr_socket_close(_priv->socket);
 
-InetAddressPtr DatagramSocket::getLocalAddress() const
-{
-       return m_priv->localAddress;
-}
+               if (status != APR_SUCCESS)
+               {
+                       throw SocketException(status);
+               }
 
-int DatagramSocket::getLocalPort() const
-{
-       return m_priv->localPort;
+               _priv->socket = 0;
+               _priv->localPort = 0;
+       }
 }
 
-int DatagramSocket::getPort() const
+void APRDatagramSocket::bind(int localPort1, InetAddressPtr localAddress1)
 {
-       return m_priv->port;
-}
+       Pool addrPool;
 
-bool DatagramSocket::isBound() const
-{
-       return m_priv->localPort != 0;
+       // Create server socket address (including port number)
+       LOG4CXX_ENCODE_CHAR(hostAddr, localAddress1->getHostAddress());
+       apr_sockaddr_t* server_addr;
+       apr_status_t status =
+               apr_sockaddr_info_get(&server_addr, hostAddr.c_str(), APR_INET,
+                       localPort1, 0, addrPool.getAPRPool());
+
+       if (status != APR_SUCCESS)
+       {
+               throw BindException(status);
+       }
+
+       // bind the socket to the address
+       status = apr_socket_bind(_priv->socket, server_addr);
+
+       if (status != APR_SUCCESS)
+       {
+               throw BindException(status);
+       }
+
+       m_priv->localPort = localPort1;
+       m_priv->localAddress = localAddress1;
 }
 
-bool DatagramSocket::isClosed() const
+
+void APRDatagramSocket::connect(InetAddressPtr address1, int port1)
 {
-       return m_priv->socket != 0;
+       m_priv->address = address1;
+       m_priv->port = port1;
+
+       Pool addrPool;
+
+       // create socket address
+       LOG4CXX_ENCODE_CHAR(hostAddr, address1->getHostAddress());
+       apr_sockaddr_t* client_addr;
+       apr_status_t status =
+               apr_sockaddr_info_get(&client_addr, hostAddr.c_str(), APR_INET,
+                       m_priv->port, 0, addrPool.getAPRPool());
+
+       if (status != APR_SUCCESS)
+       {
+               throw ConnectException(status);
+       }
+
+       // connect the socket
+       status = apr_socket_connect(_priv->socket, client_addr);
+
+       if (status != APR_SUCCESS)
+       {
+               throw ConnectException(status);
+       }
 }
 
-bool DatagramSocket::isConnected() const
+
+bool APRDatagramSocket::isClosed() const
 {
-       return m_priv->port != 0;
+       return _priv->socket != nullptr;
 }
diff --git a/src/main/cpp/datagramsocket.cpp b/src/main/cpp/datagramsocket.cpp
index 0aa46ff9..ac71ecbe 100644
--- a/src/main/cpp/datagramsocket.cpp
+++ b/src/main/cpp/datagramsocket.cpp
@@ -19,68 +19,19 @@
 #include <log4cxx/helpers/datagrampacket.h>
 #include <log4cxx/helpers/loglog.h>
 #include <log4cxx/helpers/transcoder.h>
+#include <log4cxx/private/datagramsocket_priv.h>
+#include <log4cxx/private/aprdatagramsocket.h>
 
 #include "apr_network_io.h"
 #include "apr_lib.h"
 
 using namespace log4cxx::helpers;
 
-struct DatagramSocket::DatagramSocketPriv
-{
-       DatagramSocketPriv()
-               : socket(0), address(), localAddress(), port(0), localPort(0)
-       {
-       }
-
-       DatagramSocketPriv(int localPort1)
-               : socket(0), address(), localAddress(), port(0), localPort(0)
-       {
-       }
-
-       DatagramSocketPriv(int localPort1, InetAddressPtr localAddress1)
-               : socket(0), address(), localAddress(), port(0), localPort(0)
-       {
-       }
-
-       /** The APR socket */
-       apr_socket_t* socket;
-
-       /** The memory pool for the socket */
-       Pool socketPool;
-
-       InetAddressPtr address;
-
-       InetAddressPtr localAddress;
-
-       int port;
-
-       /** The local port number to which this socket is connected. */
-       int localPort;
-};
-
 IMPLEMENT_LOG4CXX_OBJECT(DatagramSocket)
 
-DatagramSocket::DatagramSocket()
-       : m_priv(std::make_unique<DatagramSocketPriv>())
-{
-       create();
-}
-
-DatagramSocket::DatagramSocket(int localPort1)
-       : m_priv(std::make_unique<DatagramSocketPriv>(localPort1))
-{
-       InetAddressPtr bindAddr = InetAddress::anyAddress();
-
-       create();
-       bind(localPort1, bindAddr);
-}
-
-DatagramSocket::DatagramSocket(int localPort1, InetAddressPtr localAddress1)
-       : m_priv(std::make_unique<DatagramSocketPriv>(localPort1, 
localAddress1))
-{
-       create();
-       bind(localPort1, localAddress1);
-}
+DatagramSocket::DatagramSocket(std::unique_ptr<DatagramSocketPriv> priv) :
+       m_priv(std::move(priv))
+{}
 
 DatagramSocket::~DatagramSocket()
 {
@@ -93,150 +44,9 @@ DatagramSocket::~DatagramSocket()
        }
 }
 
-/**  Binds a datagram socket to a local port and address.*/
-void DatagramSocket::bind(int localPort1, InetAddressPtr localAddress1)
-{
-       Pool addrPool;
-
-       // Create server socket address (including port number)
-       LOG4CXX_ENCODE_CHAR(hostAddr, localAddress1->getHostAddress());
-       apr_sockaddr_t* server_addr;
-       apr_status_t status =
-               apr_sockaddr_info_get(&server_addr, hostAddr.c_str(), APR_INET,
-                       localPort1, 0, addrPool.getAPRPool());
-
-       if (status != APR_SUCCESS)
-       {
-               throw BindException(status);
-       }
-
-       // bind the socket to the address
-       status = apr_socket_bind(m_priv->socket, server_addr);
-
-       if (status != APR_SUCCESS)
-       {
-               throw BindException(status);
-       }
-
-       m_priv->localPort = localPort1;
-       m_priv->localAddress = localAddress1;
-}
-
 /** Close the socket.*/
 void DatagramSocket::close()
 {
-       if (m_priv->socket != 0)
-       {
-               apr_status_t status = apr_socket_close(m_priv->socket);
-
-               if (status != APR_SUCCESS)
-               {
-                       throw SocketException(status);
-               }
-
-               m_priv->socket = 0;
-               m_priv->localPort = 0;
-       }
-}
-
-void DatagramSocket::connect(InetAddressPtr address1, int port1)
-{
-
-       m_priv->address = address1;
-       m_priv->port = port1;
-
-       Pool addrPool;
-
-       // create socket address
-       LOG4CXX_ENCODE_CHAR(hostAddr, address1->getHostAddress());
-       apr_sockaddr_t* client_addr;
-       apr_status_t status =
-               apr_sockaddr_info_get(&client_addr, hostAddr.c_str(), APR_INET,
-                       m_priv->port, 0, addrPool.getAPRPool());
-
-       if (status != APR_SUCCESS)
-       {
-               throw ConnectException(status);
-       }
-
-       // connect the socket
-       status = apr_socket_connect(m_priv->socket, client_addr);
-
-       if (status != APR_SUCCESS)
-       {
-               throw ConnectException(status);
-       }
-}
-
-/** Creates a datagram socket.*/
-void DatagramSocket::create()
-{
-       apr_socket_t* newSocket;
-       apr_status_t status =
-               apr_socket_create(&newSocket, APR_INET, SOCK_DGRAM,
-                       APR_PROTO_UDP, m_priv->socketPool.getAPRPool());
-       m_priv->socket = newSocket;
-
-       if (status != APR_SUCCESS)
-       {
-               throw SocketException(status);
-       }
-}
-
-/** Receive the datagram packet.*/
-void DatagramSocket::receive(DatagramPacketPtr& p)
-{
-       Pool addrPool;
-
-       // Create the address from which to receive the datagram packet
-       LOG4CXX_ENCODE_CHAR(hostAddr, p->getAddress()->getHostAddress());
-       apr_sockaddr_t* addr;
-       apr_status_t status =
-               apr_sockaddr_info_get(&addr, hostAddr.c_str(), APR_INET,
-                       p->getPort(), 0, addrPool.getAPRPool());
-
-       if (status != APR_SUCCESS)
-       {
-               throw SocketException(status);
-       }
-
-       // receive the datagram packet
-       apr_size_t len = p->getLength();
-       status = apr_socket_recvfrom(addr, m_priv->socket, 0,
-                       (char*)p->getData(), &len);
-
-       if (status != APR_SUCCESS)
-       {
-               throw IOException(status);
-       }
-}
-
-/**  Sends a datagram packet.*/
-void DatagramSocket::send(DatagramPacketPtr& p)
-{
-       Pool addrPool;
-
-       // create the adress to which to send the datagram packet
-       LOG4CXX_ENCODE_CHAR(hostAddr, p->getAddress()->getHostAddress());
-       apr_sockaddr_t* addr;
-       apr_status_t status =
-               apr_sockaddr_info_get(&addr, hostAddr.c_str(), APR_INET, 
p->getPort(),
-                       0, addrPool.getAPRPool());
-
-       if (status != APR_SUCCESS)
-       {
-               throw SocketException(status);
-       }
-
-       // send the datagram packet
-       apr_size_t len = p->getLength();
-       status = apr_socket_sendto(m_priv->socket, addr, 0,
-                       (char*)p->getData(), &len);
-
-       if (status != APR_SUCCESS)
-       {
-               throw IOException(status);
-       }
 }
 
 InetAddressPtr DatagramSocket::getInetAddress() const
@@ -264,12 +74,26 @@ bool DatagramSocket::isBound() const
        return m_priv->localPort != 0;
 }
 
-bool DatagramSocket::isClosed() const
-{
-       return m_priv->socket != 0;
-}
-
 bool DatagramSocket::isConnected() const
 {
        return m_priv->port != 0;
 }
+
+DatagramSocketUniquePtr DatagramSocket::create(){
+       return std::make_unique<APRDatagramSocket>();
+}
+
+DatagramSocketUniquePtr DatagramSocket::create(int localPort1){
+       std::unique_ptr<APRDatagramSocket> sock = 
std::make_unique<APRDatagramSocket>();
+       InetAddressPtr bindAddr = InetAddress::anyAddress();
+
+       sock->bind(localPort1, bindAddr);
+       return sock;
+}
+
+DatagramSocketUniquePtr DatagramSocket::create(int localPort1, InetAddressPtr 
localAddress1){
+       std::unique_ptr<APRDatagramSocket> sock = 
std::make_unique<APRDatagramSocket>();
+
+       sock->bind(localPort1, localAddress1);
+       return sock;
+}
diff --git a/src/main/cpp/syslogwriter.cpp b/src/main/cpp/syslogwriter.cpp
index ad8c92e8..dde4ffa8 100644
--- a/src/main/cpp/syslogwriter.cpp
+++ b/src/main/cpp/syslogwriter.cpp
@@ -54,7 +54,7 @@ SyslogWriter::SyslogWriter(const LogString& syslogHost1, int 
syslogHostPort1)
 
        try
        {
-               m_priv->ds = DatagramSocketPtr(new DatagramSocket());
+               m_priv->ds = DatagramSocket::create();
        }
        catch (SocketException& e)
        {
diff --git a/src/main/include/log4cxx/helpers/datagramsocket.h 
b/src/main/include/log4cxx/helpers/datagramsocket.h
index 04df8edb..cbfd29d2 100644
--- a/src/main/include/log4cxx/helpers/datagramsocket.h
+++ b/src/main/include/log4cxx/helpers/datagramsocket.h
@@ -27,42 +27,38 @@ namespace log4cxx
 {
 namespace helpers
 {
+
+class DatagramSocket;
+LOG4CXX_PTR_DEF(DatagramSocket);
+LOG4CXX_UNIQUE_PTR_DEF(DatagramSocket);
+
 /** This class represents a socket for sending and receiving
 datagram packets.*/
 class LOG4CXX_EXPORT DatagramSocket : public helpers::Object
 {
+       protected:
+               struct DatagramSocketPriv;
+               std::unique_ptr<DatagramSocketPriv> m_priv;
+
+               DatagramSocket(std::unique_ptr<DatagramSocketPriv> priv);
+
        public:
                DECLARE_ABSTRACT_LOG4CXX_OBJECT(DatagramSocket)
                BEGIN_LOG4CXX_CAST_MAP()
                LOG4CXX_CAST_ENTRY(DatagramSocket)
                END_LOG4CXX_CAST_MAP()
 
-               /** Constructs a datagram socket and binds it to any available 
port
-               on the local host machine.*/
-               DatagramSocket();
-
-               /** Constructs a datagram socket and binds it to the specified
-               port on the local host machine. */
-               DatagramSocket(int port);
-
-               /**  Creates a datagram socket, bound to the specified local
-               address. */
-               DatagramSocket(int port, InetAddressPtr laddr);
-
                /** ensure the socket is closed. */
-               ~DatagramSocket();
+               virtual ~DatagramSocket();
 
                /**  Binds a datagram socket to a local port and address.*/
-               void bind(int lport, InetAddressPtr laddress);
-
-               /** Creates a datagram socket.*/
-               void create();
+               virtual void bind(int lport, InetAddressPtr laddress) = 0;
 
                /** Closes this datagram socket */
-               void close();
+               virtual void close();
 
                /** Connects the socket to a remote address for this socket. */
-               void connect(InetAddressPtr address, int port);
+               virtual void connect(InetAddressPtr address, int port) = 0;
 
                /** Returns the address to which this socket is connected. */
                InetAddressPtr getInetAddress() const;
@@ -81,26 +77,35 @@ class LOG4CXX_EXPORT DatagramSocket : public helpers::Object
                bool isBound() const;
 
                /** Returns wether the socket is closed or not. */
-               bool isClosed() const;
+               virtual bool isClosed() const = 0;
 
                /** Returns the connection state of the socket. */
                bool isConnected() const;
 
                /**  Receives a datagram packet from this socket. */
-               void receive(DatagramPacketPtr& p);
+               virtual void receive(DatagramPacketPtr& p) = 0;
 
                /** Sends a datagram packet from this socket. */
-               void  send(DatagramPacketPtr& p);
+               virtual void  send(DatagramPacketPtr& p) = 0;
+
+               /** Constructs a datagram socket and binds it to any available 
port
+               on the local host machine.*/
+               static DatagramSocketUniquePtr create();
+
+               /** Constructs a datagram socket and binds it to the specified
+               port on the local host machine. */
+               static DatagramSocketUniquePtr create(int port);
+
+               /**  Creates a datagram socket, bound to the specified local
+               address. */
+               static DatagramSocketUniquePtr create(int port, InetAddressPtr 
laddr);
 
        private:
                DatagramSocket(const DatagramSocket&);
                DatagramSocket& operator=(const DatagramSocket&);
 
-               struct DatagramSocketPriv;
-               std::unique_ptr<DatagramSocketPriv> m_priv;
-
 };
-LOG4CXX_PTR_DEF(DatagramSocket);
+
 }  // namespace helpers
 } // namespace log4cxx
 
diff --git a/src/main/include/log4cxx/private/aprdatagramsocket.h 
b/src/main/include/log4cxx/private/aprdatagramsocket.h
new file mode 100644
index 00000000..0f75cd0a
--- /dev/null
+++ b/src/main/include/log4cxx/private/aprdatagramsocket.h
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LOG4CXX_HELPERS_APRDATAGRAM_SOCKET_H
+#define LOG4CXX_HELPERS_APRDATAGRAM_SOCKET_H
+
+#include <log4cxx/helpers/datagramsocket.h>
+
+namespace log4cxx
+{
+namespace helpers
+{
+
+class APRDatagramSocket : public DatagramSocket {
+    private:
+        struct APRDatagramSocketPriv;
+
+    public:
+       APRDatagramSocket();
+
+       APRDatagramSocket(int port);
+
+       APRDatagramSocket(int port, InetAddressPtr laddr);
+
+       virtual void bind(int lport, InetAddressPtr laddress);
+
+       virtual void close();
+
+       virtual bool isClosed() const;
+
+       /**  Receives a datagram packet from this socket. */
+       virtual void receive(DatagramPacketPtr& p);
+
+       /** Sends a datagram packet from this socket. */
+       virtual void  send(DatagramPacketPtr& p);
+
+       virtual void connect(InetAddressPtr address, int port);
+
+    private:
+       void init();
+};
+
+}
+}
+
+#endif /* LOG4CXX_HELPERS_APRDATAGRAM_SOCKET_H */
diff --git a/src/main/include/log4cxx/private/datagramsocket_priv.h 
b/src/main/include/log4cxx/private/datagramsocket_priv.h
new file mode 100644
index 00000000..1b4b4bb9
--- /dev/null
+++ b/src/main/include/log4cxx/private/datagramsocket_priv.h
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef LOG4CXX_HELPERS_SOCKET_PRIV_H
+#define LOG4CXX_HELPERS_SOCKET_PRIV_H
+
+#include <log4cxx/helpers/datagramsocket.h>
+
+namespace log4cxx
+{
+namespace helpers
+{
+
+struct DatagramSocket::DatagramSocketPriv
+{
+        DatagramSocketPriv()
+               : address(), localAddress(), port(0), localPort(0)
+       {
+       }
+
+       DatagramSocketPriv(int localPort1)
+               : address(), localAddress(), port(0), localPort(0)
+       {
+       }
+
+       DatagramSocketPriv(int localPort1, InetAddressPtr localAddress1)
+               : address(), localAddress(), port(0), localPort(0)
+       {
+       }
+
+       InetAddressPtr address;
+
+       InetAddressPtr localAddress;
+
+       int port;
+
+       /** The local port number to which this socket is connected. */
+       int localPort;
+};
+
+}
+}
+
+#endif /* LOG4CXX_HELPERS_SOCKET_PRIV_H */

Reply via email to