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 "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;
|
||||
|
||||
//@}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ public:
|
|||
);
|
||||
|
||||
// IListenSocket overrides
|
||||
IDataSocket *accept() override;
|
||||
std::unique_ptr<IDataSocket> accept() override;
|
||||
|
||||
private:
|
||||
const SecurityLevel m_securityLevel;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ public:
|
|||
void *getEventTarget() const override;
|
||||
|
||||
// IListenSocket overrides
|
||||
IDataSocket *accept() override;
|
||||
std::unique_ptr<IDataSocket> accept() override;
|
||||
|
||||
protected:
|
||||
void setListeningJob();
|
||||
|
|
|
|||
|
|
@ -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()));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue