chore: use std::unique_ptr for IDataSocket
port-of input-leap/836e08b0642ad158ecedc44e59a3bd3c61b56141 ported-by sithlord48
This commit is contained in:
parent
9eabbb690c
commit
0b4a2e0e5b
6 changed files with 27 additions and 33 deletions
|
|
@ -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;
|
||||||
|
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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()));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue