178 lines
4.1 KiB
C++
178 lines
4.1 KiB
C++
#include "stdafx.h"
|
|
#include "NetbarInterface.h"
|
|
#include "iigw_api_client.h"
|
|
#include "GameProto.h"
|
|
#include "GameProto.pb.h"
|
|
#include "GameClient.h"
|
|
|
|
TencentNetbarInterface::TencentNetbarInterface()
|
|
{
|
|
m_requestStatus.store(RS_NotRequest);
|
|
m_workThread = NULL;
|
|
m_netbarStatus = NS_Unknown;
|
|
m_clientErrorCode = 0;
|
|
m_serverErrorCode = 0;
|
|
m_serverErrorMessage.clear();
|
|
m_netbarLevel = -1;
|
|
m_clientNetbarReq = new Game::NetbaraStatusReq();
|
|
}
|
|
|
|
TencentNetbarInterface::~TencentNetbarInterface()
|
|
{
|
|
delete m_clientNetbarReq;
|
|
m_clientNetbarReq = nullptr;
|
|
}
|
|
|
|
void TencentNetbarInterface::init(GameClient* client)
|
|
{
|
|
m_client = client;
|
|
}
|
|
|
|
void TencentNetbarInterface::tick()
|
|
{
|
|
switch (m_requestStatus)
|
|
{
|
|
case RequestStatus::RS_ClientRequest_Done:
|
|
{
|
|
m_client->sendProtobufMessage(GameProto::GAME_PROTO_NETBAR_REQ, m_clientNetbarReq);
|
|
m_requestStatus = RequestStatus::RS_ServerRequesting;
|
|
}
|
|
break;
|
|
|
|
case RequestStatus::RS_ClientRequest_Failed:
|
|
{
|
|
m_requestStatus = RequestStatus::RS_ReqestFailed;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
bool TencentNetbarInterface::beginRequestNetbarStatus(RequestCallback callback)
|
|
{
|
|
if(m_requestStatus==RequestStatus::RS_RequestDone || m_requestStatus==RequestStatus::RS_ReqestFailed)
|
|
{
|
|
//already done
|
|
if(callback)
|
|
{
|
|
callback(m_requestStatus.load());
|
|
}
|
|
return true;
|
|
}
|
|
|
|
if(m_requestStatus != RequestStatus::RS_NotRequest)
|
|
{
|
|
//already requesting
|
|
return false;
|
|
}
|
|
|
|
m_requestStatus = RequestStatus::RS_ClientRequesting;
|
|
|
|
unsigned int threadID = 0;
|
|
m_workThread = (HANDLE)_beginthreadex(NULL, 0, TencentNetbarInterface::_workingThreadEntry, this, 0,&threadID);
|
|
if(m_workThread == NULL)
|
|
{
|
|
m_requestStatus = RequestStatus::RS_ClientRequest_Failed;
|
|
return false;
|
|
}
|
|
m_requestCallback = callback;
|
|
return true;
|
|
}
|
|
|
|
unsigned int TencentNetbarInterface::_workingThreadEntry(void* param)
|
|
{
|
|
TencentNetbarInterface* pThis = (TencentNetbarInterface*)param;
|
|
if(pThis)
|
|
{
|
|
pThis->workThreadEntry();
|
|
}
|
|
::CloseHandle(pThis->m_workThread);
|
|
pThis->m_workThread = NULL;
|
|
return 0;
|
|
}
|
|
|
|
bool TencentNetbarInterface::workThreadEntry()
|
|
{
|
|
HMODULE hNetbarDllHandle = NULL;
|
|
bool isSuccess = false;
|
|
|
|
do {
|
|
hNetbarDllHandle = ::LoadLibraryW(L"iigw_client_api.dll");
|
|
if (hNetbarDllHandle == NULL)
|
|
{
|
|
m_clientErrorCode = GetLastError();
|
|
m_requestStatus = RequestStatus::RS_ClientRequest_Failed;
|
|
break;
|
|
}
|
|
|
|
//create interface
|
|
iepm_qqwb::IQQNetbarIIGWPlugin *pProxy = iepm_qqwb::CreateQQNetbarIIGWPlugin(hNetbarDllHandle);
|
|
if(pProxy == nullptr)
|
|
{
|
|
m_requestStatus = RequestStatus::RS_ClientRequest_Failed;
|
|
break;
|
|
}
|
|
|
|
//call client interfae
|
|
int ret = pProxy->IsNetbarMachine(TENCENT_NETBAR_DNF_CLIENT_GAME_ID, GameClient::s_default_account_id, iepm_qqwb::at_qq);
|
|
bool isNetbar = (ret == IIGW_MSG_STATUS_NETBAR_PC);
|
|
|
|
iepm_qqwb::NetbarLv netbarlv = {0};
|
|
memset(&netbarlv, 0, sizeof(netbarlv));
|
|
|
|
m_clientErrorCode = pProxy->ReqNetbarLv2(
|
|
TENCENT_NETBAR_DNF_CLIENT_GAME_ID,
|
|
GameClient::s_default_world_id,
|
|
GameClient::s_default_account_id,
|
|
iepm_qqwb::at_qq,
|
|
nullptr,
|
|
0,
|
|
&netbarlv,
|
|
5000
|
|
);
|
|
|
|
if (m_clientErrorCode != 0 || netbarlv.tokenLen<=0 )
|
|
{
|
|
m_requestStatus = RequestStatus::RS_ClientRequest_Failed;
|
|
break;
|
|
}
|
|
|
|
m_clientNetbarReq->Clear();
|
|
m_clientNetbarReq->set_is_netbar_machine(isNetbar);
|
|
m_clientNetbarReq->set_token((const char*)netbarlv.tokenBuff, (size_t)netbarlv.tokenLen);
|
|
m_clientNetbarReq->set_macs(netbarlv.macs);
|
|
|
|
m_requestStatus = RequestStatus::RS_ClientRequest_Done;
|
|
|
|
isSuccess = true;
|
|
} while (false);
|
|
|
|
if(hNetbarDllHandle)
|
|
{
|
|
::FreeLibrary(hNetbarDllHandle);
|
|
hNetbarDllHandle = NULL;
|
|
}
|
|
return isSuccess;
|
|
}
|
|
|
|
void TencentNetbarInterface::onReceiveNetbarReportRequest(Game::NetbarStatusRes* response)
|
|
{
|
|
m_netbarLevel = response->netbar_level();
|
|
m_serverErrorCode = response->error_code();
|
|
m_serverErrorMessage = response->error_message();
|
|
|
|
if (m_serverErrorCode == 0)
|
|
{
|
|
m_serverErrorCode = NetbarStatus::NS_Netbar;
|
|
}
|
|
else
|
|
{
|
|
m_serverErrorCode = NetbarStatus::NS_ServerFailed;
|
|
}
|
|
m_requestStatus = RequestStatus::RS_RequestDone;
|
|
|
|
if (m_requestCallback)
|
|
{
|
|
m_requestCallback(m_requestStatus);
|
|
}
|
|
}
|