Commit 0314f7b8 authored by fallenstardust's avatar fallenstardust

update bufferio.h

parent 69d41059
...@@ -153,6 +153,10 @@ public: ...@@ -153,6 +153,10 @@ public:
static int DecodeUTF8(const char* src, wchar_t(&dst)[N]) { static int DecodeUTF8(const char* src, wchar_t(&dst)[N]) {
return DecodeUTF8String(src, dst, N); return DecodeUTF8String(src, dst, N);
} }
template<size_t N, typename T>
static void NullTerminate(T(&str)[N]) {
str[N - 1] = 0;
}
static int GetVal(const wchar_t* pstr) { static int GetVal(const wchar_t* pstr) {
unsigned int ret = 0; unsigned int ret = 0;
while(*pstr >= L'0' && *pstr <= L'9') { while(*pstr >= L'0' && *pstr <= L'9') {
......
...@@ -1310,7 +1310,7 @@ void DeckBuilder::GetHoveredCard() { ...@@ -1310,7 +1310,7 @@ void DeckBuilder::GetHoveredCard() {
} else if(y >= 164 * mainGame->yScale && y <= 435 * mainGame->yScale) { } else if(y >= 164 * mainGame->yScale && y <= 435 * mainGame->yScale) {
int lx = 10, px, py = (y - 164 * mainGame->yScale) / (68 * mainGame->yScale); int lx = 10, px, py = (y - 164 * mainGame->yScale) / (68 * mainGame->yScale);
hovered_pos = 1; hovered_pos = 1;
if(deckManager.current_deck.main.size() > 40) if(deckManager.current_deck.main.size() > DECK_MIN_SIZE)
lx = (deckManager.current_deck.main.size() - 41) / 4 + 11; lx = (deckManager.current_deck.main.size() - 41) / 4 + 11;
if(x >= 750 * mainGame->xScale) if(x >= 750 * mainGame->xScale)
px = lx - 1; px = lx - 1;
...@@ -1770,7 +1770,7 @@ bool DeckBuilder::push_main(code_pointer pointer, int seq) { ...@@ -1770,7 +1770,7 @@ bool DeckBuilder::push_main(code_pointer pointer, int seq) {
if(pointer->second.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_LINK)) if(pointer->second.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_LINK))
return false; return false;
auto& container = deckManager.current_deck.main; auto& container = deckManager.current_deck.main;
int maxc = mainGame->is_siding ? 64 : 60; int maxc = mainGame->is_siding ? DECK_MAX_SIZE + 5 : DECK_MAX_SIZE;
if((int)container.size() >= maxc) if((int)container.size() >= maxc)
return false; return false;
if(seq >= 0 && seq < (int)container.size()) if(seq >= 0 && seq < (int)container.size())
...@@ -1785,7 +1785,7 @@ bool DeckBuilder::push_extra(code_pointer pointer, int seq) { ...@@ -1785,7 +1785,7 @@ bool DeckBuilder::push_extra(code_pointer pointer, int seq) {
if(!(pointer->second.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_LINK))) if(!(pointer->second.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_LINK)))
return false; return false;
auto& container = deckManager.current_deck.extra; auto& container = deckManager.current_deck.extra;
int maxc = mainGame->is_siding ? 20 : 15; int maxc = mainGame->is_siding ? EXTRA_MAX_SIZE + 5 : EXTRA_MAX_SIZE;
if((int)container.size() >= maxc) if((int)container.size() >= maxc)
return false; return false;
if(seq >= 0 && seq < (int)container.size()) if(seq >= 0 && seq < (int)container.size())
...@@ -1798,7 +1798,7 @@ bool DeckBuilder::push_extra(code_pointer pointer, int seq) { ...@@ -1798,7 +1798,7 @@ bool DeckBuilder::push_extra(code_pointer pointer, int seq) {
} }
bool DeckBuilder::push_side(code_pointer pointer, int seq) { bool DeckBuilder::push_side(code_pointer pointer, int seq) {
auto& container = deckManager.current_deck.side; auto& container = deckManager.current_deck.side;
int maxc = mainGame->is_siding ? 20 : 15; int maxc = mainGame->is_siding ? SIDE_MAX_SIZE + 5 : SIDE_MAX_SIZE;
if((int)container.size() >= maxc) if((int)container.size() >= maxc)
return false; return false;
if(seq >= 0 && seq < (int)container.size()) if(seq >= 0 && seq < (int)container.size())
......
...@@ -175,7 +175,7 @@ int DeckManager::LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec, bool is_p ...@@ -175,7 +175,7 @@ int DeckManager::LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec, bool is_p
} }
if(cd.type & TYPE_TOKEN) if(cd.type & TYPE_TOKEN)
continue; continue;
if(deck.side.size() < 15) if(deck.side.size() < SIDE_MAX_SIZE)
deck.side.push_back(dataManager.GetCodePointer(code)); deck.side.push_back(dataManager.GetCodePointer(code));
} }
return errorcode; return errorcode;
......
...@@ -846,10 +846,11 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, int len) { ...@@ -846,10 +846,11 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, int len) {
mainGame->soundManager->PlaySoundEffect(SoundManager::SFX::PLAYER_ENTER); mainGame->soundManager->PlaySoundEffect(SoundManager::SFX::PLAYER_ENTER);
STOC_HS_PlayerEnter packet; STOC_HS_PlayerEnter packet;
std::memcpy(&packet, pdata, STOC_HS_PlayerEnter_size); std::memcpy(&packet, pdata, STOC_HS_PlayerEnter_size);
const auto* pkt = &packet; auto pkt = &packet;
if(pkt->pos > 3) if(pkt->pos > 3)
break; break;
wchar_t name[20]; wchar_t name[20];
BufferIO::NullTerminate(pkt->name);
BufferIO::CopyWStr(pkt->name, name, 20); BufferIO::CopyWStr(pkt->name, name, 20);
if(mainGame->dInfo.isTag) { if(mainGame->dInfo.isTag) {
if(pkt->pos == 0) if(pkt->pos == 0)
...@@ -1543,7 +1544,7 @@ int DuelClient::ClientAnalyze(unsigned char* msg, unsigned int len) { ...@@ -1543,7 +1544,7 @@ int DuelClient::ClientAnalyze(unsigned char* msg, unsigned int len) {
wchar_t ynbuf[256]; wchar_t ynbuf[256];
myswprintf(ynbuf, dataManager.GetSysString(221), dataManager.FormatLocation(l, s), dataManager.GetName(code)); myswprintf(ynbuf, dataManager.GetSysString(221), dataManager.FormatLocation(l, s), dataManager.GetName(code));
myswprintf(textBuffer, L"%ls\n%ls\n%ls", event_string, ynbuf, dataManager.GetSysString(223)); myswprintf(textBuffer, L"%ls\n%ls\n%ls", event_string, ynbuf, dataManager.GetSysString(223));
} else if(desc < 2048) { } else if(desc <= MAX_STRING_ID) {
myswprintf(textBuffer, dataManager.GetSysString(desc), dataManager.GetName(code)); myswprintf(textBuffer, dataManager.GetSysString(desc), dataManager.GetName(code));
} else { } else {
myswprintf(textBuffer, dataManager.GetDesc(desc), dataManager.GetName(code)); myswprintf(textBuffer, dataManager.GetDesc(desc), dataManager.GetName(code));
...@@ -4164,19 +4165,11 @@ void DuelClient::BeginRefreshHost() { ...@@ -4164,19 +4165,11 @@ void DuelClient::BeginRefreshHost() {
remotes.clear(); remotes.clear();
hosts.clear(); hosts.clear();
event_base* broadev = event_base_new(); event_base* broadev = event_base_new();
#ifdef _IRR_ANDROID_PLATFORM_
//get local ip address in android style
int ipaddr = android::getLocalAddr(mainGame->appMain);
if (ipaddr == -1) {
return;
}
#else
char hname[256]; char hname[256];
gethostname(hname, 256); gethostname(hname, 256);
hostent* host = gethostbyname(hname); hostent* host = gethostbyname(hname);
if(!host) if(!host)
return; return;
#endif
SOCKET reply = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); SOCKET reply = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
sockaddr_in reply_addr; sockaddr_in reply_addr;
memset(&reply_addr, 0, sizeof(reply_addr)); memset(&reply_addr, 0, sizeof(reply_addr));
...@@ -4201,22 +4194,24 @@ void DuelClient::BeginRefreshHost() { ...@@ -4201,22 +4194,24 @@ void DuelClient::BeginRefreshHost() {
sockTo.sin_port = htons(7920); sockTo.sin_port = htons(7920);
HostRequest hReq; HostRequest hReq;
hReq.identifier = NETWORK_CLIENT_ID; hReq.identifier = NETWORK_CLIENT_ID;
#ifdef _IRR_ANDROID_PLATFORM_ for(int i = 0; i < 8; ++i) {
local.sin_addr.s_addr = ipaddr; if(host->h_addr_list[i] == 0)
SOCKET sSend = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); break;
if (sSend == INVALID_SOCKET) unsigned int local_addr = 0;
return; std::memcpy(&local_addr, host->h_addr_list[i], sizeof local_addr);
int opt = TRUE; local.sin_addr.s_addr = local_addr;
setsockopt(sSend, SOL_SOCKET, SO_BROADCAST, (const char*) &opt, SOCKET sSend = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
sizeof opt); if(sSend == INVALID_SOCKET)
if (bind(sSend, (sockaddr*) &local, sizeof(sockaddr)) == SOCKET_ERROR) { break;
int opt = TRUE;
setsockopt(sSend, SOL_SOCKET, SO_BROADCAST, (const char*)&opt, sizeof opt);
if(bind(sSend, (sockaddr*)&local, sizeof(sockaddr)) == SOCKET_ERROR) {
closesocket(sSend);
break;
}
sendto(sSend, (const char*)&hReq, sizeof(HostRequest), 0, (sockaddr*)&sockTo, sizeof(sockaddr));
closesocket(sSend); closesocket(sSend);
return;
} }
sendto(sSend, (const char*) &hReq, sizeof(HostRequest), 0,
(sockaddr*) &sockTo, sizeof(sockaddr));
closesocket(sSend);
#endif
} }
int DuelClient::RefreshThread(event_base* broadev) { int DuelClient::RefreshThread(event_base* broadev) {
event_base_dispatch(broadev); event_base_dispatch(broadev);
......
...@@ -249,7 +249,8 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, int len) { ...@@ -249,7 +249,8 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, int len) {
return; return;
CTOS_PlayerInfo packet; CTOS_PlayerInfo packet;
std::memcpy(&packet, pdata, sizeof packet); std::memcpy(&packet, pdata, sizeof packet);
const auto* pkt = &packet; auto pkt = &packet;
BufferIO::NullTerminate(pkt->name);
BufferIO::CopyWStr(pkt->name, dp->name, 20); BufferIO::CopyWStr(pkt->name, dp->name, 20);
break; break;
} }
...@@ -271,10 +272,10 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, int len) { ...@@ -271,10 +272,10 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, int len) {
duel_mode = new TagDuel(); duel_mode = new TagDuel();
duel_mode->etimer = event_new(net_evbase, 0, EV_TIMEOUT | EV_PERSIST, TagDuel::TagTimer, duel_mode); duel_mode->etimer = event_new(net_evbase, 0, EV_TIMEOUT | EV_PERSIST, TagDuel::TagTimer, duel_mode);
} }
if(pkt->info.rule > 5) if(pkt->info.rule > CURRENT_RULE)
pkt->info.rule = 5; pkt->info.rule = CURRENT_RULE;
if(pkt->info.mode > 2) if(pkt->info.mode > MODE_TAG)
pkt->info.mode = 0; pkt->info.mode = MODE_SINGLE;
unsigned int hash = 1; unsigned int hash = 1;
for(auto lfit = deckManager._lfList.begin(); lfit != deckManager._lfList.end(); ++lfit) { for(auto lfit = deckManager._lfList.begin(); lfit != deckManager._lfList.end(); ++lfit) {
if(pkt->info.lflist == lfit->hash) { if(pkt->info.lflist == lfit->hash) {
...@@ -291,6 +292,8 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, int len) { ...@@ -291,6 +292,8 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, int len) {
#else #else
duel_mode->host_info = pkt->info; duel_mode->host_info = pkt->info;
#endif #endif
BufferIO::NullTerminate(pkt->name);
BufferIO::NullTerminate(pkt->pass);
BufferIO::CopyWStr(pkt->name, duel_mode->name, 20); BufferIO::CopyWStr(pkt->name, duel_mode->name, 20);
BufferIO::CopyWStr(pkt->pass, duel_mode->pass, 20); BufferIO::CopyWStr(pkt->pass, duel_mode->pass, 20);
duel_mode->JoinGame(dp, 0, true); duel_mode->JoinGame(dp, 0, true);
......
...@@ -34,7 +34,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) ...@@ -34,7 +34,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater)
} }
CTOS_JoinGame packet; CTOS_JoinGame packet;
std::memcpy(&packet, pdata, sizeof packet); std::memcpy(&packet, pdata, sizeof packet);
const auto* pkt = &packet; auto pkt = &packet;
if(pkt->version != PRO_VERSION) { if(pkt->version != PRO_VERSION) {
STOC_ErrorMsg scem; STOC_ErrorMsg scem;
scem.msg = ERRMSG_VERERROR; scem.msg = ERRMSG_VERERROR;
...@@ -44,6 +44,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) ...@@ -44,6 +44,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater)
return; return;
} }
wchar_t jpass[20]; wchar_t jpass[20];
BufferIO::NullTerminate(pkt->pass);
BufferIO::CopyWStr(pkt->pass, jpass, 20); BufferIO::CopyWStr(pkt->pass, jpass, 20);
if(wcscmp(jpass, pass)) { if(wcscmp(jpass, pass)) {
STOC_ErrorMsg scem; STOC_ErrorMsg scem;
......
...@@ -38,7 +38,7 @@ void TagDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) { ...@@ -38,7 +38,7 @@ void TagDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) {
} }
CTOS_JoinGame packet; CTOS_JoinGame packet;
std::memcpy(&packet, pdata, sizeof packet); std::memcpy(&packet, pdata, sizeof packet);
const auto* pkt = &packet; auto pkt = &packet;
if(pkt->version != PRO_VERSION) { if(pkt->version != PRO_VERSION) {
STOC_ErrorMsg scem; STOC_ErrorMsg scem;
scem.msg = ERRMSG_VERERROR; scem.msg = ERRMSG_VERERROR;
...@@ -48,6 +48,7 @@ void TagDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) { ...@@ -48,6 +48,7 @@ void TagDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) {
return; return;
} }
wchar_t jpass[20]; wchar_t jpass[20];
BufferIO::NullTerminate(pkt->pass);
BufferIO::CopyWStr(pkt->pass, jpass, 20); BufferIO::CopyWStr(pkt->pass, jpass, 20);
if(wcscmp(jpass, pass)) { if(wcscmp(jpass, pass)) {
STOC_ErrorMsg scem; STOC_ErrorMsg scem;
......
...@@ -153,6 +153,10 @@ public: ...@@ -153,6 +153,10 @@ public:
static int DecodeUTF8(const char* src, wchar_t(&dst)[N]) { static int DecodeUTF8(const char* src, wchar_t(&dst)[N]) {
return DecodeUTF8String(src, dst, N); return DecodeUTF8String(src, dst, N);
} }
template<size_t N, typename T>
static void NullTerminate(T(&str)[N]) {
str[N - 1] = 0;
}
static int GetVal(const wchar_t* pstr) { static int GetVal(const wchar_t* pstr) {
unsigned int ret = 0; unsigned int ret = 0;
while(*pstr >= L'0' && *pstr <= L'9') { while(*pstr >= L'0' && *pstr <= L'9') {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment