#ifndef NET_CONNECTION_NET_CLIENT_HPP #define NET_CONNECTION_NET_CLIENT_HPP #include "net/connection/WowConnectionResponse.hpp" #include "event/Event.hpp" #include "net/Types.hpp" #include #include #include class CDataStore; class NetClient; class WowConnection; typedef int32_t (*MESSAGE_HANDLER)(void* param, NETMESSAGE msgId, uint32_t time, CDataStore* msg); struct AuthenticationChallenge { uint32_t uint0; uint32_t uint4; uint64_t uint8; }; class NETEVENTQUEUENODE : public TSLinkedNode { public: // Member variables EVENTID m_eventId; uint32_t m_timeReceived; void* m_data; uint32_t m_dataSize; }; class NETEVENTQUEUE { public: // Member variables NetClient* m_client; SCritSect m_critSect; STORM_LIST(NETEVENTQUEUENODE) m_eventQueue; // Member functions NETEVENTQUEUE(NetClient* client) : m_client(client) {}; void AddEvent(EVENTID eventId, void* conn, NetClient* client, const void* data, uint32_t bytes); }; class NetClient : public WowConnectionResponse { public: // Static variables static int32_t s_clientCount; // Member variables LoginData m_loginData; NETSTATE m_netState = NS_UNINITIALIZED; bool m_suspended = false; MESSAGE_HANDLER m_handlers[NUM_MSG_TYPES]; void* m_handlerParams[NUM_MSG_TYPES]; NETEVENTQUEUE* m_netEventQueue = nullptr; WowConnection* m_serverConnection = nullptr; WowConnection* m_redirectConnection = nullptr; uint32_t m_pingSent = 0; uint32_t m_pingSequence = 0; uint32_t m_latency[16]; uint32_t m_latencyStart; uint32_t m_latencyEnd; SCritSect m_pingLock; // Virtual member functions virtual void WCMessageReady(WowConnection* conn, uint32_t timeStamp, CDataStore* msg); virtual void WCConnected(WowConnection* conn, WowConnection* inbound, uint32_t timeStamp, const NETCONNADDR* addr); virtual void WCCantConnect(WowConnection* conn, uint32_t timeStamp, NETCONNADDR* addr); virtual void WCDisconnected(WowConnection* conn, uint32_t timeStamp, NETCONNADDR* addr); // Member functions void AuthChallengeHandler(WowConnection* conn, CDataStore* msg); void Connect(const char* addrStr); int32_t ConnectInternal(const char* host, uint16_t port); int32_t Initialize(); void PongHandler(WowConnection* conn, CDataStore* msg); void SetLoginData(LoginData* loginData); void SetMessageHandler(NETMESSAGE msgId, MESSAGE_HANDLER handler, void* param); }; #endif