#pragma once #include "tcp_server.h" #include "packet.h" #include "../types.h" #include "../event/timer.h" #include "../event/event_loop.h" #include #include namespace EQ { namespace Net { class RelayLink { public: RelayLink(const std::string &addr, int port, const std::string &identifier, const std::string &password); ~RelayLink(); void OnMessageType(uint16 opcode, std::function cb); void SendPacket(uint16 opcode, const EQ::Net::Packet &p); bool Connected() const { return m_connection != nullptr; } std::string GetIP() const { return m_addr; } uint16 GetPort() const { return m_port; } private: void Connect(); void ProcessData(EQ::Net::TCPConnection *c, const unsigned char *data, size_t length); void ProcessPacket(const EQ::Net::Packet &p); void ProcessBuffer(); void ProcessQueue(); void SendIdentifier(); void SendInternal(const EQ::Net::Packet &p); void SendPassword(); void OnAuthFailed(const EQ::Net::Packet &p); void SendKeepAlive(); std::unique_ptr m_timer; std::unique_ptr m_keepalive; std::string m_addr; std::string m_identifier; std::string m_password; int m_port; std::shared_ptr m_connection; bool m_established; bool m_connecting; std::vector m_data_buffer; std::map> m_opcode_dispatch; std::queue m_packet_queue; }; } }