1
0
forked from metin2/server
server/game/src/desc_manager.h

107 lines
3.2 KiB
C++

#ifndef __INC_METIN_II_GAME_DESC_MANAGER_H__
#define __INC_METIN_II_GAME_DESC_MANAGER_H__
#include <unordered_map>
#include <common/stl.h>
#include <common/length.h>
#include "IFileMonitor.h"
#include <event2/event.h>
#include <event2/bufferevent.h>
#include <event2/listener.h>
class CLoginKey;
class CClientPackageCryptInfo;
class DESC_MANAGER : public singleton<DESC_MANAGER>
{
public:
typedef std::unordered_set<LPDESC> DESC_SET;
typedef std::unordered_set<LPCLIENT_DESC> CLIENT_DESC_SET;
typedef std::map<int, LPDESC> DESC_HANDLE_MAP;
typedef std::map<DWORD, LPDESC> DESC_HANDSHAKE_MAP;
typedef std::map<DWORD, LPDESC> DESC_ACCOUNTID_MAP;
typedef std::unordered_map<std::string, LPDESC> DESC_LOGINNAME_MAP;
typedef std::map<DWORD, DWORD> 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<DWORD, CLoginKey *> 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