#pragma once #include "../eq_packet.h" #include "../eq_stream_intf.h" #include "../opcodemgr.h" #include "reliable_stream_connection.h" #include #include #include namespace EQ { namespace Net { class EQStream; class EQStreamManager : public EQStreamManagerInterface { public: EQStreamManager(const EQStreamManagerInterfaceOptions &options); ~EQStreamManager(); virtual void SetOptions(const EQStreamManagerInterfaceOptions& options); void OnNewConnection(std::function)> func) { m_on_new_connection = func; } void OnConnectionStateChange(std::function, DbProtocolStatus, DbProtocolStatus)> func) { m_on_connection_state_change = func; } private: ReliableStreamConnectionManager m_reliable_stream; std::function)> m_on_new_connection; std::function, DbProtocolStatus, DbProtocolStatus)> m_on_connection_state_change; std::map, std::shared_ptr> m_streams; void ReliableStreamNewConnection(std::shared_ptr connection); void ReliableStreamConnectionStateChange(std::shared_ptr connection, DbProtocolStatus from, DbProtocolStatus to); void ReliableStreamPacketRecv(std::shared_ptr connection, const Packet &p); friend class EQStream; }; class EQStream : public EQStreamInterface { public: EQStream(EQStreamManagerInterface *parent, std::shared_ptr connection); ~EQStream(); virtual void QueuePacket(const EQApplicationPacket *p, bool ack_req = true); virtual void FastQueuePacket(EQApplicationPacket **p, bool ack_req = true); virtual EQApplicationPacket *PopPacket(); virtual void Close(); virtual void ReleaseFromUse() { }; virtual void RemoveData() { }; virtual std::string GetRemoteAddr() const; virtual uint32 GetRemoteIP() const; virtual uint16 GetRemotePort() const { return m_connection->RemotePort(); } virtual bool CheckState(EQStreamState state); virtual std::string Describe() const { return "Direct EQStream"; } virtual void SetActive(bool val) { } virtual MatchState CheckSignature(const Signature *sig); virtual EQStreamState GetState(); virtual void SetOpcodeManager(OpcodeManager **opm) { m_opcode_manager = opm; } virtual OpcodeManager * GetOpcodeManager() const { return (*m_opcode_manager); }; virtual Stats GetStats() const; virtual void ResetStats(); virtual EQStreamManagerInterface* GetManager() const; private: EQStreamManagerInterface *m_owner; std::shared_ptr m_connection; OpcodeManager **m_opcode_manager; std::deque> m_packet_queue; std::unordered_map m_packet_recv_count; std::unordered_map m_packet_sent_count; friend class EQStreamManager; }; } }