#ifndef __INC_METIN_II_GAME_DESC_MANAGER_H__ #define __INC_METIN_II_GAME_DESC_MANAGER_H__ #include #include #include #include "IFileMonitor.h" #include #include #include class CLoginKey; class CClientPackageCryptInfo; class DESC_MANAGER : public singleton { public: typedef std::unordered_set DESC_SET; typedef std::unordered_set CLIENT_DESC_SET; typedef std::map DESC_HANDLE_MAP; typedef std::map DESC_HANDSHAKE_MAP; typedef std::map DESC_ACCOUNTID_MAP; typedef std::unordered_map DESC_LOGINNAME_MAP; typedef std::map DESC_HANDLE_RANDOM_KEY_MAP; public: DESC_MANAGER(); virtual ~DESC_MANAGER(); void Initialize(); void Destroy(); LPDESC AcceptDesc(evconnlistener* listener, evutil_socket_t fd, sockaddr* address); LPDESC AcceptP2PDesc(evconnlistener* listener, evutil_socket_t fd, sockaddr* address); void DestroyDesc(LPDESC d, bool erase_from_set = true); DWORD CreateHandshake(); LPCLIENT_DESC CreateConnectionDesc(event_base * base, evdns_base * dns_base, const char * host, WORD port, int iPhaseWhenSucceed, bool bRetryWhenClosed); void TryConnect(); LPDESC FindByHandle(DWORD handle); LPDESC FindByHandshake(DWORD dwHandshake); LPDESC FindByCharacterName(const char* name); LPDESC FindByLoginName(const std::string& login); void ConnectAccount(const std::string& login, LPDESC d); void DisconnectAccount(const std::string& login); void DestroyClosed(); void UpdateLocalUserCount(); DWORD GetLocalUserCount() { return m_iLocalUserCount; } void GetUserCount(int & iTotal, int ** paiEmpireUserCount, int & iLocalCount); const DESC_SET & GetClientSet(); DWORD MakeRandomKey(DWORD dwHandle); bool GetRandomKey(DWORD dwHandle, DWORD* prandom_key); DWORD CreateLoginKey(LPDESC d); LPDESC FindByLoginKey(DWORD dwKey); void ProcessExpiredLoginKey(); bool IsDisconnectInvalidCRC() { return m_bDisconnectInvalidCRC; } void SetDisconnectInvalidCRCMode(bool bMode) { m_bDisconnectInvalidCRC = bMode; } bool IsP2PDescExist(const char * szHost, WORD wPort); // for C/S hybrid crypt bool LoadClientPackageCryptInfo(const char* pDirName); void SendClientPackageCryptKey( LPDESC desc ); void SendClientPackageSDBToLoadMap( LPDESC desc, const char* pMapName ); #ifdef __FreeBSD__ static void NotifyClientPackageFileChanged( const std::string& fileName, eFileUpdatedOptions eUpdateOption ); #endif private: bool m_bDisconnectInvalidCRC; DESC_HANDLE_RANDOM_KEY_MAP m_map_handle_random_key; CLIENT_DESC_SET m_set_pkClientDesc; DESC_SET m_set_pkDesc; DESC_HANDLE_MAP m_map_handle; DESC_HANDSHAKE_MAP m_map_handshake; //DESC_ACCOUNTID_MAP m_AccountIDMap; DESC_LOGINNAME_MAP m_map_loginName; std::map m_map_pkLoginKey; int m_iSocketsConnected; int m_iHandleCount; int m_iLocalUserCount; int m_aiEmpireUserCount[EMPIRE_MAX_NUM]; bool m_bDestroyed; CClientPackageCryptInfo* m_pPackageCrypt; }; #endif