Files
2022-10-26 12:25:11 +08:00

135 lines
4.2 KiB
C++

#ifndef _HANAUTH_QUERY_MANAGER_H
#define _HANAUTH_QUERY_MANAGER_H
#ifdef __NA000000_NORTH_AMERICA_HANGAME_CHANNELING__
#include <HanAuth/HanAuthForSvr.h>
#include "./HanAuthStruct.h"
#include <ObjKeyGenerator.h>
#include <ITimeout.h>
//==================================================================================================
//
//
namespace util {
class WxRingBuffer;
};
//==================================================================================================
//
//
namespace nsHanAuth {
//==================================================================================================
//
//
struct QuerySlot
{
INDEX_ID_T index_;
DWORD session_index_;
DWORD front_id_;
char client_ip_[IP_MAX_LEN];
char local_ip_[IP_MAX_LEN];
inline void SetInfo(INDEX_ID_T index, DWORD session_index, DWORD front_id,
char client_ip[IP_MAX_LEN], char local_ip[IP_MAX_LEN]);
inline BOOLEAN IsValid(INDEX_ID_T index) const { return index_ == index; }
inline void Clear() { ZeroMemory(this, sizeof(*this)); }
};
inline void
QuerySlot::SetInfo(INDEX_ID_T index, DWORD session_index, DWORD front_id,
char client_ip[IP_MAX_LEN], char local_ip[IP_MAX_LEN])
{
index_ = index;
session_index_ = session_index;
front_id_ = front_id;
strncpy(client_ip_, client_ip, _countof(client_ip_));
client_ip_[_countof(client_ip_) - 1] = '\0';
strncpy(local_ip_, local_ip, _countof(local_ip_));
local_ip_[_countof(local_ip_) - 1] = '\0';
}
//==================================================================================================
//
struct IHanAuthCallback
{
virtual void AuthResult(INDEX_ID_T query_slot_index, int hanAuth_result,
const char user_id[ID_MAX_LEN + 1] /* etc ... */) = 0;
};
//==================================================================================================
//
//
class HanAuthQueryManager
{
protected:
HanAuthQueryManager();
virtual ~HanAuthQueryManager();
public:
static void CreateInstance();
static void DestroyInstance();
// action:
// thread 0
// result:
// BOOLEAN
static BOOLEAN Init(GAME_ID_BLOCK szGameId, int nServiceCode);
// action:
// thread 0
// arguments:
// callback½Ã ÇÊ¿ä Á¤º¸ - QuerySlot
static INDEX_ID_T AllocSlot(const QuerySlot& callback_data);
static BOOLEAN ReleaseSlot(INDEX_ID_T query_slot_index);
static BOOLEAN GetSlot(INDEX_ID_T query_slot_index, QuerySlot* slot);
static BOOLEAN QueryAuthentication(INDEX_ID_T query_slot_index,
MEMBER_ID_BLOCK szMemberId, AUTH_STRING_BLOCK szAuthString);
static BOOLEAN Update(IHanAuthCallback* callback_interface);
private:
static unsigned int __stdcall QueryThread(void* parameter);
void NotifySyncMessage();
void ReplySyncMessage(const Message_Sync* msg);
#define HANAUTH_MSG_NODE(type) \
static BOOLEAN MessageProc_##type(const type* msg);
static BOOLEAN MessageProc_Message_Close(const Message_Close* msg);
static BOOLEAN MessageProc_Message_Sync(const Message_Sync* msg);
static BOOLEAN MessageProc_Message_Authentication(const Message_Authentication* msg);
static BOOLEAN MessageProc_Message_AuthenticationResult(const Message_AuthenticationResult* msg,
IHanAuthCallback* callback_interface);
#undef HANAUTH_MSG_NODE
static const INDEX_ID_T QuerySlotCounts = 12000;
static const DWORD QueryQueueSize = 12000 * 4;
typedef util::CObjKeyGenerator<INDEX_ID_T> QueryKeyGenerator;
HANDLE query_thread_handle_, query_io_handle_;
enum eClosingStatus { eClosing_None, eClosing_Closing, eClosing_Closed, };
BOOLEAN closing_state_;
ITimerBase sync_timer_;
QueryKeyGenerator* const m_pQueryKeyGenerator;
QuerySlot* const m_QuerySlots;
util::WxRingBuffer* const m_QueryRequestQueue; // main -> query thread
util::WxRingBuffer* const m_QueryResultQueue; // query thread -> main
static HanAuthQueryManager* instance_s_;
};
}; //end of namespace 'nsHanAuth'
#endif //__NA000000_NORTH_AMERICA_HANGAME_CHANNELING__
#endif //_HANAUTH_QUERY_MANAGER_H