chore: use std::unique_ptr for IDataSocket

port-of input-leap/836e08b0642ad158ecedc44e59a3bd3c61b56141
ported-by sithlord48
This commit is contained in:
Povilas Kanapickas 2025-05-24 21:26:13 -04:00 committed by Nick Bolton
parent 9eabbb690c
commit 0b4a2e0e5b
6 changed files with 27 additions and 33 deletions

View file

@ -10,6 +10,8 @@
#include "base/EventTypes.h" #include "base/EventTypes.h"
#include "net/ISocket.h" #include "net/ISocket.h"
#include <memory>
class IDataSocket; class IDataSocket;
//! Listen socket interface //! Listen socket interface
@ -29,7 +31,7 @@ public:
data stream. Returns nullptr if no socket is waiting to be accepted. data stream. Returns nullptr if no socket is waiting to be accepted.
This is only valid after a call to \c bind(). This is only valid after a call to \c bind().
*/ */
virtual IDataSocket *accept() = 0; virtual std::unique_ptr<IDataSocket> accept() = 0;
//@} //@}

View file

@ -32,16 +32,16 @@ SecureListenSocket::SecureListenSocket(
// do nothing // do nothing
} }
IDataSocket *SecureListenSocket::accept() std::unique_ptr<IDataSocket> SecureListenSocket::accept()
{ {
SecureSocket *socket = nullptr; std::unique_ptr<SecureSocket> socket;
try { try {
socket = new SecureSocket(m_events, m_socketMultiplexer, ARCH->acceptSocket(m_socket, nullptr), m_securityLevel); socket = std::make_unique<SecureSocket>(
m_events, m_socketMultiplexer, ARCH->acceptSocket(m_socket, nullptr), m_securityLevel
);
socket->initSsl(true); socket->initSsl(true);
if (socket != nullptr) { setListeningJob();
setListeningJob();
}
// default location of the TLS cert file in users dir // default location of the TLS cert file in users dir
std::string certificateFilename = Settings::value(Settings::Security::Certificate).toString().toStdString(); std::string certificateFilename = Settings::value(Settings::Security::Certificate).toString().toStdString();
@ -52,22 +52,19 @@ IDataSocket *SecureListenSocket::accept()
} }
if (!socket->loadCertificates(certificateFilename)) { if (!socket->loadCertificates(certificateFilename)) {
delete socket;
return nullptr; return nullptr;
} }
socket->secureAccept(); socket->secureAccept();
return dynamic_cast<IDataSocket *>(socket); return socket;
} catch (XArchNetwork &) { } catch (XArchNetwork &) {
if (socket != nullptr) { if (socket) {
delete socket;
setListeningJob(); setListeningJob();
} }
return nullptr; return nullptr;
} catch (std::exception &ex) { } catch (std::exception &ex) {
if (socket != nullptr) { if (socket) {
delete socket;
setListeningJob(); setListeningJob();
} }
throw ex; throw ex;

View file

@ -25,7 +25,7 @@ public:
); );
// IListenSocket overrides // IListenSocket overrides
IDataSocket *accept() override; std::unique_ptr<IDataSocket> accept() override;
private: private:
const SecurityLevel m_securityLevel; const SecurityLevel m_securityLevel;

View file

@ -91,24 +91,20 @@ void *TCPListenSocket::getEventTarget() const
return const_cast<void *>(static_cast<const void *>(this)); return const_cast<void *>(static_cast<const void *>(this));
} }
IDataSocket *TCPListenSocket::accept() std::unique_ptr<IDataSocket> TCPListenSocket::accept()
{ {
IDataSocket *socket = nullptr; std::unique_ptr<IDataSocket> socket;
try { try {
socket = new TCPSocket(m_events, m_socketMultiplexer, ARCH->acceptSocket(m_socket, nullptr)); socket = std::make_unique<TCPSocket>(m_events, m_socketMultiplexer, ARCH->acceptSocket(m_socket, nullptr));
if (socket != nullptr) { setListeningJob();
setListeningJob();
}
return socket; return socket;
} catch (XArchNetwork &) { } catch (XArchNetwork &) {
if (socket != nullptr) { if (socket) {
delete socket;
setListeningJob(); setListeningJob();
} }
return nullptr; return nullptr;
} catch (std::exception &ex) { } catch (std::exception &ex) {
if (socket != nullptr) { if (socket) {
delete socket;
setListeningJob(); setListeningJob();
} }
throw ex; throw ex;

View file

@ -36,7 +36,7 @@ public:
void *getEventTarget() const override; void *getEventTarget() const override;
// IListenSocket overrides // IListenSocket overrides
IDataSocket *accept() override; std::unique_ptr<IDataSocket> accept() override;
protected: protected:
void setListeningJob(); void setListeningJob();

View file

@ -124,24 +124,23 @@ void ClientListener::removeUnknownClient(ClientProxyUnknown *unknownClient)
void ClientListener::handleClientConnecting(const Event &, void *) void ClientListener::handleClientConnecting(const Event &, void *)
{ {
// accept client connection // accept client connection
IDataSocket *socket = m_listen->accept(); auto socket = m_listen->accept();
if (socket == nullptr) { if (!socket)
return; return;
}
m_clientSockets.insert(socket); auto rawSocketPointer = socket.release();
m_clientSockets.insert(rawSocketPointer);
m_events->adoptHandler( m_events->adoptHandler(
EventTypes::ClientListenerAccepted, socket->getEventTarget(), EventTypes::ClientListenerAccepted, rawSocketPointer->getEventTarget(),
new TMethodEventJob<ClientListener>(this, &ClientListener::handleClientAccepted, socket) new TMethodEventJob<ClientListener>(this, &ClientListener::handleClientAccepted, rawSocketPointer)
); );
// When using non SSL, server accepts clients immediately, while SSL // When using non SSL, server accepts clients immediately, while SSL
// has to call secure accept which may require retry // has to call secure accept which may require retry
if (m_securityLevel == SecurityLevel::PlainText) { if (m_securityLevel == SecurityLevel::PlainText) {
m_events->addEvent(Event(EventTypes::ClientListenerAccepted, rawSocketPointer->getEventTarget()));
m_events->addEvent(Event(EventTypes::ClientListenerAccepted, socket->getEventTarget()));
} }
} }