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

399 lines
7.8 KiB
C++

#include "SunClientPrecompiledHeader.h"
#ifdef _APPLY_JAPAN_GAMECHU_CHANNELING
#include "GWICWrapper.h"
#include "GACTMgr.h"
#include "GACTFactory.h"
// For Finding WIC Window In GameChuLauncher
#define CHARGE_WND_HANDLE "D7CD782E-A5B6-471d-9564-72F87BA18BDF"
// For Sending GameClient's HWND to GameChuLauncher.
#define GET_MSG_HWND "2D67AF8D-88E6-4407-83C7-155ACF425B82"
GWICWrapper::GWICWrapper()
{
m_hGame = NULL;
m_hWIC = NULL;
m_pACTMgr = NULL;
m_pACTFactory = NULL;
m_bInitialized = FALSE;
}
GWICWrapper::~GWICWrapper(void)
{
Clear();
}
BOOL GWICWrapper::Initialize()
{
m_hWIC = FindWIC();
if (m_hWIC == NULL)
{
MessageBox(NULL, "Failed to Find WIC", NULL, MB_OK);
return FALSE;
}
m_mapRegisteredCBEvent.clear();
m_pACTMgr = new GACTMgr(this);
m_pACTFactory = new GACTFactory(this, m_pACTMgr);
m_bInitialized = TRUE;
return TRUE;
}
void GWICWrapper::Clear()
{
m_hGame = NULL;
m_hWIC = NULL;
ClearRCBF();
if (m_pACTMgr)
{
delete m_pACTMgr;
m_pACTMgr = NULL;
}
if (m_pACTFactory)
{
delete m_pACTFactory;
m_pACTFactory = NULL;
}
}
void GWICWrapper::ClearRCBF()
{
TRCBF_POS pos = m_mapRegisteredCBEvent.begin();
TRCBF_POS end = m_mapRegisteredCBEvent.end();
HANDLE hEvent = NULL;
while( pos != end )
{
hEvent = pos->second;
if (hEvent)
::CloseHandle(hEvent);
pos++;
}
m_mapRegisteredCBEvent.clear();
}
HWND GWICWrapper::GetHWIC()
{
if (m_hWIC == NULL)
m_hWIC = FindWIC();
return m_hWIC;
}
HWND GWICWrapper::GetHGame()
{
return m_hGame;
}
void GWICWrapper::SetHGame(HWND hGame)
{
m_hGame = hGame;
}
BOOL GWICWrapper::TransferMyHWND()
{
string sGUID = GET_MSG_HWND;
LRESULT lResult = SendMsg(sGUID, m_hGame);
HWND hWIC = (HWND)(lResult);
BOOL bSuccess = FALSE;
if ((m_hWIC == hWIC) && (m_hWIC != NULL))
bSuccess = TRUE;
m_bInitialized = bSuccess;
return bSuccess;
}
BOOL GWICWrapper::InvokeChargeCash()
{
string sID = CHARGE_CASH;
string sCBID = CHARGE_CASH_CALLBACK;
return Invoke(sID, sCBID, "");
}
BOOL GWICWrapper::InvokeCash()
{
string sID = CASH_REQ;
string sCBID = CASH_REQ_CALLBACK;
return Invoke(sID, sCBID, "");
}
BOOL GWICWrapper::InvokeBuyItem(const string& sValue)
{
string sID = BUY_ITEM;
string sCBID = BUY_ITEM_CALLBACK;
return Invoke(sID, sCBID, sValue);
}
BOOL GWICWrapper::InvokeGift(const string& sValue)
{
string sID = CHARGE_GIFT;
string sCBID = CHARGE_GIFT_CALLBACK;
return Invoke(sID, sCBID, sValue);
}
BOOL GWICWrapper::InvokeClan(const string& sValue)
{
string sID = CLAN;
string sCBID = CLAN_CALLBACK;
return Invoke(sID, sCBID, sValue);
}
BOOL GWICWrapper::InvokeSendMsg(const string& sValue)
{
string sID = SENDMSG;
string sCBID = SENDMSG_CALLBACK;
return Invoke(sID, sCBID, sValue);
}
BOOL GWICWrapper::Invoke(const string& sID, const string& sCBID, const string& sValue)
{
if ((CheckFunction(sID) == TRUE) && (IsProcessing() == FALSE))
{
// 1. Create ACT ..
IACT* pACT = m_pACTFactory->CreateACT(sID, sCBID, sValue);
if (pACT == NULL)
{
return FALSE;
}
// 2. Execute
LRESULT lResult = m_pACTMgr->Execute(pACT);
if (lResult != 0)
{
return TRUE;
}
}
return FALSE;
}
//
LRESULT GWICWrapper::SendMsg( IACT* pACT )
{
if (m_hGame == NULL && m_hWIC == NULL)
return 0;
LRESULT lResult = 0;
string sValue = pACT->GetRequest();
if (sValue.length() > 0)
{
COPYDATASTRUCT stData;
CHAR szTemp[MAX_PATH];
sprintf(szTemp, "%s=%s\0", pACT->GetID().c_str(), pACT->GetRequest().c_str());
stData.dwData = 0;
stData.cbData = (DWORD)strlen(szTemp) +1;
stData.lpData = (PVOID)szTemp;
lResult = ::SendMessageA(m_hWIC, WM_COPYDATA, (WPARAM)m_hGame, (LPARAM)(&stData));
}
return lResult;
}
LRESULT GWICWrapper::SendMsg(const string& sID, HWND hWnd)
{
if ( m_hGame == NULL && m_hWIC == NULL )
return 0;
COPYDATASTRUCT stData;
stData.dwData = 0;
stData.lpData = (LPVOID)sID.c_str();
stData.cbData = (DWORD)sID.length() + 1;
return ::SendMessage(m_hWIC, WM_COPYDATA, (WPARAM)hWnd, (LPARAM)(&stData));
}
BOOL GWICWrapper::CheckFunction(const string& sID)
{
HANDLE hEvent = ::OpenEventA(EVENT_ALL_ACCESS | EVENT_MODIFY_STATE,FALSE, sID.c_str());
if (hEvent == NULL)
return FALSE;
CloseHandle(hEvent);
return TRUE;
}
BOOL GWICWrapper::IsProcessing()
{
if (m_pACTMgr->GetCount() > 0)
return TRUE;
return FALSE;
}
HANDLE GWICWrapper::CreateCBEvent(const string& sCBID)
{
HANDLE hEvent = NULL;
hEvent = FindRegisteredCBEvent(sCBID);
if (hEvent == NULL)
{
hEvent = ::CreateEventA(NULL, FALSE, FALSE, sCBID.c_str());
if (hEvent)
RegisterCBEvent(sCBID, hEvent);
}
return hEvent;
}
void GWICWrapper::DestroyCBEvent(const string& sCBID)
{
if (sCBID.size() == 0)
return;
HANDLE hEvent = FindRegisteredCBEvent(sCBID);
if (hEvent != NULL)
{
::CloseHandle(hEvent);
this->UnRegisterCBEvent(sCBID);
}
}
string GWICWrapper::FindRegisteredCBID(HANDLE hCBEvent)
{
if (hCBEvent == NULL)
return "";
TRCBF_POS pos = m_mapRegisteredCBEvent.begin();
TRCBF_POS end = m_mapRegisteredCBEvent.end();
HANDLE hEvent = NULL;
while (pos != end)
{
hEvent = pos->second;
if (hEvent == hCBEvent)
return pos->first;
pos++;
}
return "";
}
HANDLE GWICWrapper::FindRegisteredCBEvent(const string& sCBID)
{
if (sCBID.size() == 0)
return NULL;
TRCBF_POS pos = m_mapRegisteredCBEvent.begin();
TRCBF_POS end = m_mapRegisteredCBEvent.end();
string sID = "";
while (pos != end)
{
sID = pos->first;
if (sID == sCBID)
return pos->second;
pos++;
}
return NULL;
}
HANDLE GWICWrapper::RegisterCBEvent(const string& sCBID, HANDLE hEvent)
{
TRCBF_POS pos = m_mapRegisteredCBEvent.find(sCBID);
if (pos == m_mapRegisteredCBEvent.end())
{
m_mapRegisteredCBEvent.insert(std::make_pair(sCBID, hEvent));
}
return hEvent;
}
BOOL GWICWrapper::UnRegisterCBEvent(const string& sCBID)
{
TRCBF_POS pos = m_mapRegisteredCBEvent.find(sCBID);
if (pos != m_mapRegisteredCBEvent.end())
{
m_mapRegisteredCBEvent.erase(pos);
return TRUE;
}
return FALSE;
}
HWND GWICWrapper::FindWIC()
{
return ::FindWindowA(NULL, CHARGE_WND_HANDLE);
}
//
LRESULT GWICWrapper::OnCopyData(WPARAM wParam, LPARAM lParam)
{
IACT* pACT = NULL;
pACT = m_pACTMgr->GetACT(0);
if (pACT && lParam)
{
COPYDATASTRUCT *pData= (COPYDATASTRUCT *)lParam;
pACT->SetCallBackResult((LPCSTR)(pData->lpData));
//
if (this->FindRegisteredCBEvent( pACT->GetCBID() ) == NULL)
m_pACTMgr->CallBack(pACT);
}
return 0;
}
void GWICWrapper::CheckCBEvent()
{
if (m_bInitialized != TRUE)
{
return;
}
IACT* pACT = m_pACTMgr->GetACT(0);
if (pACT)
{
string sCBID = pACT->GetCBID();
HANDLE hEvent = FindRegisteredCBEvent(sCBID);
if (hEvent)
if (WaitForSingleObject(hEvent, 0) == WAIT_OBJECT_0)
TerminateInvoke(hEvent);
}
}
//
void GWICWrapper::TerminateInvoke(HANDLE hEvent)
{
IACT* pACT = m_pACTMgr->GetACT(0);
if (pACT == NULL)
return;
string sCBID = FindRegisteredCBID(hEvent);
if ( sCBID == pACT->GetCBID() )
{
m_pACTMgr->CallBack(pACT);
}
}
#endif //_APPLY_JAPAN_GAMECHU_CHANNELING