Files
LGram16 dd97ddec92 Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 20:17:20 +09:00

117 lines
3.4 KiB
C++

#ifndef _GAMA_CLIENT_EVENT_HANDLER_DERIVED_H_
#define _GAMA_CLIENT_EVENT_HANDLER_DERIVED_H_
#include <Thread/Lock.h>
#include <Thread/Thread.h>
#include <Network/ClientNetwork/EventHandler.h>
#include <Network/ClientNetwork/NetworkMsgBlock.h>
#include <Network/ClientNetwork/SessionMgr.h>
#include <map>
// 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<DWORD, CClientEventHandler*> 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