whoa/src/net/connection/ClientConnection.cpp
2026-01-19 14:40:55 +00:00

180 lines
4.3 KiB
C++

#include "net/connection/ClientConnection.hpp"
#include "client/ClientServices.hpp"
#include "common/datastore/CDataStore.hpp"
#include "net/Login.hpp"
#include "ui/FrameScript.hpp"
void ClientConnection::AccountLogin(const char* name, const char* password, int32_t region, WOW_LOCALE locale) {
// Assertion-like thing
this->Initiate(COP_AUTHENTICATE, 11, nullptr);
}
void ClientConnection::AccountLogin_Finish(int32_t errorCode) {
this->Complete(errorCode == 12, errorCode);
}
void ClientConnection::AccountLogin_Queued() {
this->Initiate(COP_WAIT_QUEUE, 27, nullptr);
// TODO CGlueMgr::UpdateWaitQueue(this->m_queuePosition);
}
void ClientConnection::Cancel(int32_t errorCode) {
this->Complete(0, errorCode);
}
void ClientConnection::CharacterLogin(uint64_t guid, int32_t a2) {
this->Initiate(COP_LOGIN_CHARACTER, 76, nullptr);
if (this->m_connected) {
this->RequestCharacterLogin(guid, a2);
} else {
this->Cancel(4);
}
}
void ClientConnection::Cleanup() {
if (this->m_cleanup) {
this->m_cleanup();
this->m_cleanup = nullptr;
}
}
void ClientConnection::Complete(int32_t result, int32_t errorCode) {
this->Cleanup();
this->m_statusResult = result;
this->m_errorCode = errorCode;
this->m_statusComplete = 1;
// TODO LogConnectionStatus(this->m_statusCop, errorCode, 0);
}
void ClientConnection::Connect() {
// TODO
this->byte2F5A = 0;
this->Initiate(COP_CONNECT, 7, nullptr);
if (this->m_connected) {
this->Complete(1, 5);
}
ClientServices::LoginConnection()->GetRealmList();
}
int32_t ClientConnection::Disconnect() {
this->NetClient::Disconnect();
this->m_connected = 0;
// TODO
// WardenClient_Destroy();
return 1;
}
void ClientConnection::EnumerateCharacters(ENUMERATE_CHARACTERS_CALLBACK callback, void* param) {
// TODO Assertion-like thing
for (uint32_t i = 0; i < this->m_characterList.Count(); i++) {
callback(this->m_characterList[i], param);
}
}
void ClientConnection::GetCharacterList() {
this->Initiate(COP_GET_CHARACTERS, 43, nullptr);
if (this->m_connected) {
this->RequestCharacterEnum();
} else {
this->Cancel(4);
}
}
void ClientConnection::GetRealmList() {
this->Initiate(COP_GET_REALMS, 35, nullptr);
if (ClientServices::LoginConnection()->IsLoggedOn()) {
ClientServices::LoginConnection()->GetRealmList();
}
else {
ClientServices::LoginConnection()->Reconnect();
}
}
void ClientConnection::HandleCharacterDelete(uint8_t result) {
this->Complete(result == 71, result);
}
int32_t ClientConnection::HandleConnect() {
this->Complete(1, 5);
this->m_connected = 1;
// TODO WardenClient_Initialize();
return this->NetClient::HandleConnect();
}
void ClientConnection::Initiate(WOWCS_OPS op, int32_t errorCode, void (*cleanup)()) {
this->m_cleanup = cleanup;
this->m_statusCop = op;
this->m_errorCode = errorCode;
this->m_statusComplete = 0;
// TODO LogConnectionStatus(this->m_statusCop, errorCode, 1);
}
int32_t ClientConnection::IsConnected() {
return this->m_connected;
}
int32_t ClientConnection::PollStatus(WOWCS_OPS& op, const char** msg, int32_t& result, int32_t& errorCode) {
op = this->m_statusCop;
errorCode = this->m_errorCode;
result = this->m_statusResult;
static char altText[256];
if (this->m_statusComplete) {
auto text = errorCode >= 0 && errorCode < 104
? FrameScript_GetText(ClientServices::GetErrorToken(errorCode), -1, GENDER_NOT_APPLICABLE)
: nullptr;
if (!text) {
SStrPrintf(altText, sizeof(altText), "(%i)", errorCode);
*msg = altText;
} else if (errorCode == 27) {
// TODO
*msg = "TODO";
} else {
*msg = text;
}
return this->m_statusComplete;
}
*msg = "";
return this->m_statusComplete;
}
void ClientConnection::RequestCharacterDelete(uint64_t guid) {
this->Initiate(COP_DELETE_CHARACTER, 70, nullptr);
if (this->IsConnected()) {
CDataStore netMsg;
netMsg.Put(static_cast<uint32_t>(CMSG_CHAR_DELETE));
netMsg.Put(guid);
netMsg.Finalize();
this->Send(&netMsg);
}
else {
this->Cancel(4);
}
}