diff --git a/src/network/network_query.h b/src/network/network_query.h new file mode 100644 --- /dev/null +++ b/src/network/network_query.h @@ -0,0 +1,59 @@ +/* + * This file is part of OpenTTD. + * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. + * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . + */ + +/** @file network_query.h Query part of the network protocol. */ + +#ifndef NETWORK_QUERY_H +#define NETWORK_QUERY_H + +#include "network_internal.h" + +/** Class for handling the client side of quering a game server. */ +class QueryNetworkGameSocketHandler : public ZeroedMemoryAllocator, public NetworkGameSocketHandler { +private: + static std::vector> queries; ///< Pending queries. + std::string connection_string; ///< Address we are connected to. + +protected: + NetworkRecvStatus Receive_SERVER_FULL(Packet *p) override; + NetworkRecvStatus Receive_SERVER_BANNED(Packet *p) override; + NetworkRecvStatus Receive_SERVER_ERROR(Packet *p) override; + NetworkRecvStatus Receive_SERVER_GAME_INFO(Packet *p) override; + + NetworkRecvStatus SendGameInfo(); + + bool CheckConnection(); + void Send(); + bool Receive(); + +public: + /** + * Create a new socket for the client side of quering game server. + * @param s The socket to connect with. + * @param connection_string The connection string of the server. + */ + QueryNetworkGameSocketHandler(SOCKET s, const std::string &connection_string) : NetworkGameSocketHandler(s), connection_string(connection_string) {} + + /** + * Start to query a server based on an open socket. + * @param s The socket to connect with. + * @param connection_string The connection string of the server. + */ + static void QueryServer(SOCKET s, const std::string &connection_string) + { + auto query = std::make_unique(s, connection_string); + query->SendGameInfo(); + + QueryNetworkGameSocketHandler::queries.push_back(std::move(query)); + } + + static void SendReceive(); + + NetworkRecvStatus CloseConnection(NetworkRecvStatus status) override; +}; + +#endif /* NETWORK_QUERY_H */