Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Replace deprecated boost::asio stuff. #2410

Merged
merged 10 commits into from Mar 27, 2019
17 changes: 15 additions & 2 deletions GG/src/Texture.cpp
Expand Up @@ -48,6 +48,10 @@
#include <iomanip>
#include <boost/scoped_array.hpp>

#if BOOST_VERSION >= 107000
#include <boost/variant/get.hpp>
#endif


using namespace GG;

Expand Down Expand Up @@ -262,14 +266,14 @@ void Texture::Load(const boost::filesystem::path& path, bool mipmap/* = false*/)
if (extension == ".png") {
gil::rgba8_image_t rgba_image;
gil::read_and_convert_image(filename, rgba_image, gil::image_read_settings<gil::png_tag>());
image.move_in(rgba_image);
image = std::move(rgba_image);
}
#endif
#if GG_HAVE_LIBTIFF
if (extension == ".tif" || extension == ".tiff") {
gil::rgba8_image_t rgba_image;
gil::read_and_convert_image(filename, rgba_image, gil::image_read_settings<gil::tiff_tag>());
image.move_in(rgba_image);
image = std::move(rgba_image);
}
#endif
}
Expand All @@ -279,12 +283,21 @@ void Texture::Load(const boost::filesystem::path& path, bool mipmap/* = false*/)
m_default_height = Y(image.height());
m_type = GL_UNSIGNED_BYTE;

#if BOOST_VERSION >= 107000
#define IF_IMAGE_TYPE_IS(image_prefix) \
if (boost::get<image_prefix ## _image_t>(&image)) { \
m_bytes_pp = sizeof(image_prefix ## _pixel_t); \
image_data = interleaved_view_get_raw_data( \
const_view(boost::get<image_prefix ## _image_t>(image))); \
}
#else
#define IF_IMAGE_TYPE_IS(image_prefix) \
if (image.current_type_is<image_prefix ## _image_t>()) { \
m_bytes_pp = sizeof(image_prefix ## _pixel_t); \
image_data = interleaved_view_get_raw_data( \
const_view(image._dynamic_cast<image_prefix ## _image_t>())); \
}
#endif

const unsigned char* image_data = nullptr;

Expand Down
66 changes: 40 additions & 26 deletions network/ClientNetworking.cpp
Expand Up @@ -33,6 +33,16 @@
using boost::asio::ip::tcp;
using namespace Networking;

/** In Boost 1.66, io_service was replaced with a typedef of io_context.
* That typedef was removed in Boost 1.70 along with other interface changes.
* This code uses io_context for future compatibility and adds the typedef
* here for old versions of Boost. */
#if BOOST_VERSION < 106600
namespace boost { namespace asio {
typedef io_service io_context;
}}
#endif

namespace {
DeclareThreadSafeLogger(network);

Expand All @@ -42,10 +52,10 @@ namespace {
public:
using ServerList = std::vector<std::pair<boost::asio::ip::address, std::string>>;

ServerDiscoverer(boost::asio::io_service& io_service) :
m_io_service(&io_service),
m_timer(io_service),
m_socket(io_service),
ServerDiscoverer(boost::asio::io_context& io_context) :
m_io_context(&io_context),
m_timer(io_context),
m_socket(io_context),
m_recv_buf(),
m_receive_successful(false),
m_server_name()
Expand All @@ -56,7 +66,7 @@ namespace {

void DiscoverServers() {
using namespace boost::asio::ip;
udp::resolver resolver(*m_io_service);
udp::resolver resolver(*m_io_context);
udp::resolver::query query(udp::v4(), "255.255.255.255",
std::to_string(Networking::DiscoveryPort()),
resolver_query_base::address_configured |
Expand All @@ -79,10 +89,14 @@ namespace {
this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
#if BOOST_VERSION >= 106600
m_timer.expires_after(std::chrono::seconds(2));
#else
m_timer.expires_from_now(std::chrono::seconds(2));
#endif
m_timer.async_wait(boost::bind(&ServerDiscoverer::CloseSocket, this));
m_io_service->run();
m_io_service->reset();
m_io_context->run();
m_io_context->reset();
if (m_receive_successful) {
boost::asio::ip::address address = m_server_name == "localhost" ?
boost::asio::ip::address::from_string("127.0.0.1") :
Expand Down Expand Up @@ -121,16 +135,16 @@ namespace {
void CloseSocket()
{ m_socket.close(); }

boost::asio::io_service* m_io_service;
boost::asio::high_resolution_timer m_timer;
boost::asio::ip::udp::socket m_socket;
boost::asio::io_context* m_io_context;
boost::asio::high_resolution_timer m_timer;
boost::asio::ip::udp::socket m_socket;

std::array<char, 1024> m_recv_buf;
std::array<char, 1024> m_recv_buf;

boost::asio::ip::udp::endpoint m_sender_endpoint;
bool m_receive_successful;
std::string m_server_name;
ServerList m_servers;
boost::asio::ip::udp::endpoint m_sender_endpoint;
bool m_receive_successful;
std::string m_server_name;
ServerList m_servers;
};
}

Expand Down Expand Up @@ -233,7 +247,7 @@ class ClientNetworking::Impl {
int m_host_player_id;
Networking::AuthRoles m_roles;

boost::asio::io_service m_io_service;
boost::asio::io_context m_io_context;
boost::asio::ip::tcp::socket m_socket;

// m_mutex guards m_incoming_message, m_rx_connected and m_tx_connected which are written by
Expand Down Expand Up @@ -262,8 +276,8 @@ class ClientNetworking::Impl {
ClientNetworking::Impl::Impl() :
m_player_id(Networking::INVALID_PLAYER_ID),
m_host_player_id(Networking::INVALID_PLAYER_ID),
m_io_service(),
m_socket(m_io_service),
m_io_context(),
m_socket(m_io_context),
m_rx_connected(false),
m_tx_connected(false),
m_incoming_messages(m_mutex)
Expand Down Expand Up @@ -302,7 +316,7 @@ bool ClientNetworking::Impl::HasAuthRole(Networking::RoleType role) const
ClientNetworking::ServerNames ClientNetworking::Impl::DiscoverLANServerNames() {
if (!IsConnected())
return ServerNames();
ServerDiscoverer discoverer(m_io_service);
ServerDiscoverer discoverer(m_io_context);
discoverer.DiscoverServers();
ServerNames names;
for (const auto& server : discoverer.Servers()) {
Expand All @@ -325,7 +339,7 @@ bool ClientNetworking::Impl::ConnectToServer(
auto deadline = start_time + timeout;

using namespace boost::asio::ip;
tcp::resolver resolver(m_io_service);
tcp::resolver resolver(m_io_context);
tcp::resolver::query query(ip_address,
std::to_string(Networking::MessagePort()),
boost::asio::ip::resolver_query_base::numeric_service);
Expand All @@ -347,8 +361,8 @@ bool ClientNetworking::Impl::ConnectToServer(
m_socket.async_connect(*it, boost::bind(&ClientNetworking::Impl::HandleConnection, this,
&it,
boost::asio::placeholders::error));
m_io_service.run();
m_io_service.reset();
m_io_context.run();
m_io_context.reset();

auto connection_time = Clock::now() - start_time;

Expand Down Expand Up @@ -435,7 +449,7 @@ void ClientNetworking::Impl::DisconnectFromServer() {
}

if (is_open)
m_io_service.post(boost::bind(&ClientNetworking::Impl::DisconnectFromServerImpl, this));
m_io_context.post(boost::bind(&ClientNetworking::Impl::DisconnectFromServerImpl, this));
}

void ClientNetworking::Impl::SetPlayerID(int player_id) {
Expand All @@ -455,7 +469,7 @@ void ClientNetworking::Impl::SendMessage(const Message& message) {
return;
}
TraceLogger(network) << "ClientNetworking::SendMessage() : sending message " << message;
m_io_service.post(boost::bind(&ClientNetworking::Impl::SendMessageImpl, this, message));
m_io_context.post(boost::bind(&ClientNetworking::Impl::SendMessageImpl, this, message));
}

boost::optional<Message> ClientNetworking::Impl::GetMessage() {
Expand Down Expand Up @@ -504,12 +518,12 @@ void ClientNetworking::Impl::NetworkingThread(const std::shared_ptr<const Client
if (!m_outgoing_messages.empty())
AsyncWriteMessage();
AsyncReadMessage(protect_from_destruction_in_other_thread);
m_io_service.run();
m_io_context.run();
} catch (const boost::system::system_error& error) {
HandleException(error);
}
m_outgoing_messages.clear();
m_io_service.reset();
m_io_context.reset();
{ // Mutex scope
boost::mutex::scoped_lock lock(m_mutex);
m_rx_connected = false;
Expand Down
37 changes: 20 additions & 17 deletions network/ServerNetworking.cpp
Expand Up @@ -23,7 +23,7 @@ namespace {
on the local network and sends out responses to them. */
class DiscoveryServer {
public:
DiscoveryServer(boost::asio::io_service& io_service);
DiscoveryServer(boost::asio::io_context& io_context);

private:
void Listen();
Expand Down Expand Up @@ -52,12 +52,12 @@ namespace {
////////////////////////////////////////////////////////////////////////////////
// PlayerConnection
////////////////////////////////////////////////////////////////////////////////
PlayerConnection::PlayerConnection(boost::asio::io_service& io_service,
PlayerConnection::PlayerConnection(boost::asio::io_context& io_context,
MessageAndConnectionFn nonplayer_message_callback,
MessageAndConnectionFn player_message_callback,
ConnectionFn disconnected_callback) :
m_service(io_service),
m_socket(io_service),
m_service(io_context),
m_socket(io_context),
m_ID(INVALID_PLAYER_ID),
m_new_connection(true),
m_client_type(Networking::INVALID_CLIENT_TYPE),
Expand Down Expand Up @@ -218,13 +218,13 @@ bool PlayerConnection::IsBinarySerializationUsed() const {
&& m_client_version_string == FreeOrionVersionString();
}

PlayerConnectionPtr PlayerConnection::NewConnection(boost::asio::io_service& io_service,
PlayerConnectionPtr PlayerConnection::NewConnection(boost::asio::io_context& io_context,
MessageAndConnectionFn nonplayer_message_callback,
MessageAndConnectionFn player_message_callback,
ConnectionFn disconnected_callback)
{
return PlayerConnectionPtr(
new PlayerConnection(io_service, nonplayer_message_callback, player_message_callback,
new PlayerConnection(io_context, nonplayer_message_callback, player_message_callback,
disconnected_callback));
}

Expand Down Expand Up @@ -406,8 +406,8 @@ void PlayerConnection::AsyncErrorHandler(PlayerConnectionPtr self, boost::system
////////////////////////////////////////////////////////////////////////////////
// DiscoveryServer
////////////////////////////////////////////////////////////////////////////////
DiscoveryServer::DiscoveryServer(boost::asio::io_service& io_service) :
m_socket(io_service, udp::endpoint(udp::v4(), Networking::DiscoveryPort()))
DiscoveryServer::DiscoveryServer(boost::asio::io_context& io_context) :
m_socket(io_context, udp::endpoint(udp::v4(), Networking::DiscoveryPort()))
{ Listen(); }

void DiscoveryServer::Listen() {
Expand All @@ -434,20 +434,20 @@ bool ServerNetworking::EstablishedPlayer::operator()(
const PlayerConnectionPtr& player_connection) const
{ return player_connection->EstablishedPlayer(); }

ServerNetworking::ServerNetworking(boost::asio::io_service& io_service,
ServerNetworking::ServerNetworking(boost::asio::io_context& io_context,
MessageAndConnectionFn nonplayer_message_callback,
MessageAndConnectionFn player_message_callback,
ConnectionFn disconnected_callback) :
m_host_player_id(Networking::INVALID_PLAYER_ID),
m_discovery_server(nullptr),
m_player_connection_acceptor(io_service),
m_player_connection_acceptor(io_context),
m_nonplayer_message_callback(nonplayer_message_callback),
m_player_message_callback(player_message_callback),
m_disconnected_callback(disconnected_callback)
{
if (!GetOptionsDB().Get<bool>("singleplayer")) {
// only start discovery service for multiplayer servers.
m_discovery_server = new DiscoveryServer(io_service);
m_discovery_server = new DiscoveryServer(io_context);
}

Init();
Expand Down Expand Up @@ -686,12 +686,15 @@ void ServerNetworking::Init() {
}

void ServerNetworking::AcceptNextConnection() {
PlayerConnectionPtr next_connection =
PlayerConnection::NewConnection(
m_player_connection_acceptor.get_io_service(),
m_nonplayer_message_callback,
m_player_message_callback,
boost::bind(&ServerNetworking::DisconnectImpl, this, _1));
auto next_connection = PlayerConnection::NewConnection(
#if BOOST_VERSION >= 106600
m_player_connection_acceptor.get_executor().context(),
#else
m_player_connection_acceptor.get_io_service(),
#endif
m_nonplayer_message_callback,
m_player_message_callback,
boost::bind(&ServerNetworking::DisconnectImpl, this, _1));
next_connection->EventSignal.connect(
boost::bind(&ServerNetworking::EnqueueEvent, this, _1));
m_player_connection_acceptor.async_accept(
Expand Down