#ifndef _GAMA_CLIENT_EVENT_HANDLER_DERIVED_H_ #define _GAMA_CLIENT_EVENT_HANDLER_DERIVED_H_ #include #include #include #include #include #include // forward decl. struct PktBase; class CXORCrypt; namespace ClientNet { class CSessionMgr; class CClientEventHandlerMgr; // Ŭ¶óÀ̾ðÆ®Ãø À̺¥Æ® Çڵ鷯 class CClientEventHandler { public: CClientEventHandler(); virtual ~CClientEventHandler(); virtual int OnDispatch(PktBase* lpPktBase, INET_Addr& peerAddr) = 0; virtual int OnOpen(int iErrorCode) = 0; virtual int OnClose() = 0; DWORD GetHandlerID() const { return m_dwHandlerID; } DWORD GetSessionID() const { return m_dwSessionID; } INET_Addr& GetPeerAddress() { return m_peerAddress; } bool IsCloseCalled() { return m_bCloseCalled; } bool SendPacket(CNetworkMsgBlock* lpMsgBlock); private: void SetHandlerID(DWORD dwHandlerID) { m_dwHandlerID = dwHandlerID; } void SetSessionID(DWORD dwSessionID) { m_dwSessionID = dwSessionID; } void SetCloseCalled() { m_bCloseCalled = true; } void SetPeerAddress(INET_Addr& peerAddress) { m_peerAddress = peerAddress; } void SetEventHandlerMgr(CClientEventHandlerMgr* lpEventHandlerMgr) { m_lpEventHandlerMgr = lpEventHandlerMgr; } CClientEventHandlerMgr* m_lpEventHandlerMgr; DWORD m_dwHandlerID; DWORD m_dwSessionID; INET_Addr m_peerAddress; bool m_bCloseCalled; // ¼¼¼Ç ID¼¼ÆÃÀ» À§Çؼ­ ÇÊ¿äÇÔ. friend class CClientEventHandlerMgr; }; // Ŭ¶óÀÌ¾ðÆ® Çڵ鷯 °ü¸®ÀÚ. class CClientEventHandlerMgr : public CThread { public: CClientEventHandlerMgr(); virtual ~CClientEventHandlerMgr(); bool Connect(INET_Addr& connAddr, CClientEventHandler* lpEventHandler); bool Close(CClientEventHandler* lpEventHandler); bool SendPacket(CClientEventHandler* lpEventHandler, CNetworkMsgBlock* lpMsgBlock); void HandleEvents(unsigned long dwProcessPerCall); private: virtual unsigned int Run(); // ½ÇÁ¦ ½ÇÇà µÇ´Â ·çÇÁ¸¦ ³Ö´Â´Ù. virtual BOOL End(); // ·çÇÁ°¡ ³¡³¯ ¼ö ÀÖ´Â ·çƾÀ» ³Ö´Â´Ù. typedef std::map ClientEventHanderMap; CLockedMsgQueue m_LockedMsgQueue; CNetworkMsgQueue m_LocalMsgQueue; ClientEventHanderMap m_ClientEventHandlerMap; DWORD m_dwMaxEventHandlerID; LONG m_bExit; // ½º·¹µå ³»ºÎ¿¡¼­ »ç¿ë. CSessionMgr m_SessionMgr; }; // ½º·¹µå ³»ºÎ À̺¥Æ® Çڵ鷯 class CThreadEventHandler : public CEventHandler { public: CThreadEventHandler(CLockedMsgQueue& LockedMsgQueue, DWORD dwClientHandlerID); virtual int OnReceived(CNetworkMsgBlock& msg_block); virtual int OnDispatch(CSession& ReceivedSession) { return 0; } virtual int OnOpen(CSession& ConnSession, int iErrorCode); virtual int OnClose(CSession& CloseSession); virtual int OnTimeout(CSession& Session); private: CLockedMsgQueue& m_LockedMsgQueue; CXORCrypt& m_Crypt; DWORD m_dwClientHandlerID; }; }; #endif