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 "net/ISocket.h"
#include <memory>
class IDataSocket;
//! Listen socket interface
@ -29,7 +31,7 @@ public:
data stream. Returns nullptr if no socket is waiting to be accepted.
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
}
IDataSocket *SecureListenSocket::accept()
std::unique_ptr<IDataSocket> SecureListenSocket::accept()
{
SecureSocket *socket = nullptr;
std::unique_ptr<SecureSocket> socket;
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);
if (socket != nullptr) {
setListeningJob();
}
setListeningJob();
// default location of the TLS cert file in users dir
std::string certificateFilename = Settings::value(Settings::Security::Certificate).toString().toStdString();
@ -52,22 +52,19 @@ IDataSocket *SecureListenSocket::accept()
}
if (!socket->loadCertificates(certificateFilename)) {
delete socket;
return nullptr;
}
socket->secureAccept();
return dynamic_cast<IDataSocket *>(socket);
return socket;
} catch (XArchNetwork &) {
if (socket != nullptr) {
delete socket;
if (socket) {
setListeningJob();
}
return nullptr;
} catch (std::exception &ex) {
if (socket != nullptr) {
delete socket;
if (socket) {
setListeningJob();
}
throw ex;

View file

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

View file

@ -91,24 +91,20 @@ void *TCPListenSocket::getEventTarget() const
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 {
socket = new TCPSocket(m_events, m_socketMultiplexer, ARCH->acceptSocket(m_socket, nullptr));
if (socket != nullptr) {
setListeningJob();
}
socket = std::make_unique<TCPSocket>(m_events, m_socketMultiplexer, ARCH->acceptSocket(m_socket, nullptr));
setListeningJob();
return socket;
} catch (XArchNetwork &) {
if (socket != nullptr) {
delete socket;
if (socket) {
setListeningJob();
}
return nullptr;
} catch (std::exception &ex) {
if (socket != nullptr) {
delete socket;
if (socket) {
setListeningJob();
}
throw ex;

View file

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

View file

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