Fix incomplete move construction of SSLSocket. Add move constructor to Socket and TcpSocket
This commit is contained in:
parent
c97280d190
commit
d3f8f3a92b
@ -23,7 +23,7 @@ namespace fr
|
||||
~SSLSocket() override;
|
||||
SSLSocket(SSLSocket &&);
|
||||
SSLSocket(const SSLSocket &) = delete;
|
||||
SSLSocket& operator=(SSLSocket &&);
|
||||
SSLSocket &operator=(SSLSocket &&);
|
||||
void operator=(const SSLSocket &)=delete;
|
||||
|
||||
/*!
|
||||
|
||||
@ -52,10 +52,10 @@ namespace fr
|
||||
};
|
||||
|
||||
Socket();
|
||||
Socket(Socket &&) =delete;
|
||||
Socket(Socket &&);
|
||||
Socket(const Socket &) =delete;
|
||||
void operator=(const Socket &) =delete;
|
||||
void operator=(Socket &&) =delete;
|
||||
Socket &operator=(Socket &&);
|
||||
|
||||
/*!
|
||||
* Converts an fr::Socket::Status value to a printable string
|
||||
@ -314,4 +314,4 @@ namespace fr
|
||||
}
|
||||
|
||||
|
||||
#endif //FRNETLIB_SOCKET_H
|
||||
#endif //FRNETLIB_SOCKET_H
|
||||
|
||||
@ -16,9 +16,9 @@ namespace fr
|
||||
public:
|
||||
TcpSocket() noexcept;
|
||||
~TcpSocket() override;
|
||||
TcpSocket(TcpSocket &&) = delete;
|
||||
TcpSocket(TcpSocket &&);
|
||||
TcpSocket(const TcpSocket &) = delete;
|
||||
void operator=(TcpSocket &&)=delete;
|
||||
TcpSocket &operator=(TcpSocket &&);
|
||||
void operator=(const TcpSocket &)=delete;
|
||||
|
||||
/*!
|
||||
@ -126,4 +126,4 @@ namespace fr
|
||||
}
|
||||
|
||||
|
||||
#endif //FRNETLIB_TCPSOCKET_H
|
||||
#endif //FRNETLIB_TCPSOCKET_H
|
||||
|
||||
@ -8,7 +8,6 @@
|
||||
#include <mbedtls/ssl.h>
|
||||
#include <cstdlib> //size_t
|
||||
#include <cstring> //memcpy, memset
|
||||
#include <utility> //move
|
||||
|
||||
namespace fr
|
||||
{
|
||||
@ -29,22 +28,11 @@ namespace fr
|
||||
}
|
||||
}
|
||||
|
||||
constexpr mbedtls_ssl_config move_mbedtls_ssl_config(mbedtls_ssl_config &&src)
|
||||
static inline mbedtls_ssl_config move_mbedtls_ssl_config(mbedtls_ssl_config &&src)
|
||||
{
|
||||
mbedtls_ssl_config retval = {};
|
||||
swap(retval.ciphersuite_list, src.ciphersuite_list);
|
||||
swap(retval.p_dbg, src.p_dbg);
|
||||
swap(retval.f_get_cache, src.f_get_cache);
|
||||
swap(retval.f_set_cache, src.f_set_cache);
|
||||
swap(retval.p_cache, src.p_cache);
|
||||
retval.max_major_ver = src.max_major_ver;
|
||||
retval.max_minor_ver = src.max_minor_ver;
|
||||
retval.min_major_ver = src.min_major_ver;
|
||||
retval.min_minor_ver = src.min_minor_ver;
|
||||
retval.endpoint = src.endpoint;
|
||||
retval.transport = src.transport;
|
||||
retval.authmode = src.authmode;
|
||||
retval.allow_legacy_renegotiation = src.allow_legacy_renegotiation;
|
||||
memcpy(&retval, &src, sizeof(src));
|
||||
memset(&src, 0, sizeof(src));
|
||||
return retval;
|
||||
}
|
||||
}
|
||||
|
||||
@ -60,7 +60,8 @@ namespace fr
|
||||
}
|
||||
|
||||
SSLSocket::SSLSocket(SSLSocket &&s)
|
||||
: ssl_context(std::move(s.ssl_context)),
|
||||
: Socket(std::move(s)),
|
||||
ssl_context(std::move(s.ssl_context)),
|
||||
ssl_socket_descriptor(std::move(s.ssl_socket_descriptor)),
|
||||
ssl(std::move(s.ssl)),
|
||||
conf(move_mbedtls_ssl_config(std::move(s.conf))),
|
||||
@ -68,8 +69,9 @@ namespace fr
|
||||
receive_timeout(s.receive_timeout),
|
||||
is_blocking(s.is_blocking){}
|
||||
|
||||
SSLSocket& SSLSocket::operator=(SSLSocket &&s)
|
||||
SSLSocket &SSLSocket::operator=(SSLSocket &&s)
|
||||
{
|
||||
Socket::operator=(std::move(s));
|
||||
ssl_context = std::move(s.ssl_context);
|
||||
ssl_socket_descriptor = std::move(s.ssl_socket_descriptor);
|
||||
ssl = std::move(s.ssl);
|
||||
|
||||
@ -24,6 +24,23 @@ namespace fr
|
||||
init_wsa();
|
||||
}
|
||||
|
||||
Socket::Socket(Socket &&s)
|
||||
: fr_socket_remote_address(std::move(s.fr_socket_remote_address)),
|
||||
ai_family(s.ai_family),
|
||||
max_receive_size(s.max_receive_size),
|
||||
socket_read_timeout(s.socket_read_timeout),
|
||||
socket_write_timeout(s.socket_write_timeout){}
|
||||
|
||||
Socket &Socket::operator=(Socket &&s)
|
||||
{
|
||||
fr_socket_remote_address = std::move(s.fr_socket_remote_address);
|
||||
ai_family = s.ai_family;
|
||||
max_receive_size = s.max_receive_size;
|
||||
socket_read_timeout = s.socket_read_timeout;
|
||||
socket_write_timeout = s.socket_write_timeout;
|
||||
return *this;
|
||||
}
|
||||
|
||||
Socket::Status Socket::send(const Sendable &obj)
|
||||
{
|
||||
if(!connected())
|
||||
@ -166,4 +183,4 @@ namespace fr
|
||||
{
|
||||
close_socket();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -17,11 +17,24 @@ namespace fr
|
||||
|
||||
}
|
||||
|
||||
TcpSocket::TcpSocket(TcpSocket &&t)
|
||||
: Socket(std::move(t)),
|
||||
socket_descriptor(std::exchange(t.socket_descriptor, -1)),
|
||||
is_blocking(t.is_blocking){}
|
||||
|
||||
TcpSocket::~TcpSocket()
|
||||
{
|
||||
TcpSocket::close_socket();
|
||||
}
|
||||
|
||||
TcpSocket &TcpSocket::operator=(TcpSocket &&t)
|
||||
{
|
||||
Socket::operator=(std::move(t));
|
||||
std::swap(socket_descriptor, t.socket_descriptor);
|
||||
is_blocking = t.is_blocking;
|
||||
return *this;
|
||||
}
|
||||
|
||||
Socket::Status TcpSocket::send_raw(const char *data, size_t size, size_t &sent)
|
||||
{
|
||||
while(sent < size)
|
||||
@ -257,4 +270,4 @@ namespace fr
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user