4#define OPCODE_ENUM OPcodes
12#include <boost/asio/write.hpp>
13#include <boost/asio/read.hpp>
14#include <boost/asio/read_until.hpp>
19 : _debugOutput( debugOutput )
20 , _socket( io_context.get_executor() )
21 , _deadline( io_context.get_executor() )
22 , _heartbeatTimer( io_context.get_executor() )
23 , _asioPointer( asioPointer )
40 void Client::start(
const boost::asio::ip::tcp::resolver::iterator endpoint_iter )
43 _deadline.async_wait( [&](
const boost::system::error_code )
60 _deadline.expires_from_now( boost::posix_time::seconds( 30 ) );
66 [&](
const boost::system::error_code ec,
const std::size_t N )
73 [[maybe_unused]]
size_t bytes_transferred )
82 _deadline.expires_from_now( boost::posix_time::seconds( 30 ) );
85 [&](
const boost::system::error_code code,
const std::size_t N )
87 handle_read_packet( code, N );
97 [[maybe_unused]]
size_t bytes_transferred )
118 [&](
const boost::system::error_code code,
const std::size_t N )
142 request_stream >> file_path;
144 request_stream.read(
_buf.data(), 2 );
148 ss << request_stream.tellg();
152 const size_t pos = file_path.find_last_of(
'\\' );
153 if ( pos != string::npos ) file_path = file_path.substr( pos + 1 );
154 _outputFile.open( file_path.c_str(), std::ios_base::binary );
163 request_stream.read(
_buf.data(), (std::streamsize)
_buf.size() );
168 while ( request_stream.gcount() > 0 );
171 [&](
const boost::system::error_code code,
const std::size_t N )
173 handle_read_file_content( code, N );
179 if ( bytes_transferred > 0 )
208 boost::asio::streambuf buf;
214 size_t header = buf.size();
216 buffers.push_back( boost::asio::buffer( &header,
sizeof header ) );
217 buffers.push_back( buf.data() );
218 async_write(
_socket, buffers, [&](
const boost::system::error_code ec,
const size_t )
259 if (
_deadline.expires_at() <= boost::asio::deadline_timer::traits_type::now() )
268 _deadline.expires_at( boost::posix_time::pos_infin );
272 _deadline.async_wait( [&](
const boost::system::error_code )
280 if ( endpoint_iter != boost::asio::ip::tcp::resolver::iterator() )
284 std::stringstream ss;
285 ss << endpoint_iter->endpoint();
289 _deadline.expires_from_now( boost::posix_time::seconds( 60 ) );
293 endpoint_iter->endpoint(),
294 [&, endpoint_iter](
const boost::system::error_code ec )
296 handle_connect( ec, endpoint_iter );
306 void Client::handle_connect(
const boost::system::error_code& ec, boost::asio::ip::tcp::resolver::iterator endpoint_iter )
345 std::stringstream ss;
346 ss << endpoint_iter->endpoint();
static void LOG_PRINT(const char *msg, bool error=false)
virtual void handlePacket(WorldPacket &p)=0
void receivePacket(WorldPacket &p) const
void handle_read_packet(const boost::system::error_code &ec, size_t bytes_transferred)
void handle_read_file_content(const boost::system::error_code &err, std::size_t bytes_transferred)
eastl::deque< WorldPacket > _packetQueue
std::ofstream _outputFile
deadline_timer _heartbeatTimer
boost::asio::streambuf _inputBuffer
void handle_read_file(const boost::system::error_code &ec, size_t bytes_transferred)
void start(boost::asio::ip::tcp::resolver::iterator endpoint_iter)
bool sendPacket(const WorldPacket &p)
Client(ASIO *asioPointer, boost::asio::io_context &service, bool debugOutput)
std::array< char, 1024 > _buf
void handle_read_body(const boost::system::error_code &ec, size_t bytes_transferred)
void handle_connect(const boost::system::error_code &ec, boost::asio::ip::tcp::resolver::iterator endpoint_iter)
boost::asio::streambuf _requestBuf
void start_connect(boost::asio::ip::tcp::resolver::iterator endpoint_iter)
void handle_write(const boost::system::error_code &ec)
static const ValueType SMSG_SEND_FILE
static const ValueType MSG_HEARTBEAT
bool loadFromBuffer(boost::asio::streambuf &buf)
Str StringFormat(const char *fmt, Args &&...args)
Handle console commands that start with a forward slash.
std::basic_stringstream< char, std::char_traits< char >, dvd_allocator< char > > stringstream
eastl::vector< Type > vector