Commit 4939dcf0 authored by wind2009's avatar wind2009

Merge remote-tracking branch 'upstream/master' into develop

parents f98d9e50 b7541e82
...@@ -28,7 +28,13 @@ public: ...@@ -28,7 +28,13 @@ public:
static void WriteInt8(unsigned char*& p, char val) { static void WriteInt8(unsigned char*& p, char val) {
buffer_write<char>(p, val); buffer_write<char>(p, val);
} }
// return: string length /**
* @brief Copy a C-style string to another C-style string.
* @param src The source wide string
* @param pstr The destination char string
* @param bufsize The size of the destination buffer
* @return The length of the copied string
*/
template<typename T1, typename T2> template<typename T1, typename T2>
static int CopyWStr(const T1* src, T2* pstr, int bufsize) { static int CopyWStr(const T1* src, T2* pstr, int bufsize) {
int l = 0; int l = 0;
...@@ -50,8 +56,12 @@ public: ...@@ -50,8 +56,12 @@ public:
*pstr = 0; *pstr = 0;
return l; return l;
} }
template<typename T1, typename T2, size_t N>
static int CopyCharArray(const T1* src, T2(&dst)[N]) {
return CopyWStr(src, dst, N);
}
template<size_t N> template<size_t N>
static void CopyString(const char* src, wchar_t(&dst)[N]) { static void CopyString(const char* src, char(&dst)[N]) {
dst[0] = 0; dst[0] = 0;
std::strncat(dst, src, N - 1); std::strncat(dst, src, N - 1);
} }
......
...@@ -64,7 +64,7 @@ inline FILE* myfopen(const char* filename, const char* mode) { ...@@ -64,7 +64,7 @@ inline FILE* myfopen(const char* filename, const char* mode) {
wchar_t wname[256]{}; wchar_t wname[256]{};
wchar_t wmode[20]{}; wchar_t wmode[20]{};
BufferIO::DecodeUTF8(filename, wname); BufferIO::DecodeUTF8(filename, wname);
BufferIO::CopyWStr(mode, wmode, sizeof wmode / sizeof wmode[0]); BufferIO::CopyCharArray(mode, wmode);
fp = _wfopen(wname, wmode); fp = _wfopen(wname, wmode);
#else #else
fp = fopen(filename, mode); fp = fopen(filename, mode);
......
...@@ -111,23 +111,23 @@ bool DataManager::LoadStrings(const char* file) { ...@@ -111,23 +111,23 @@ bool DataManager::LoadStrings(const char* file) {
FILE* fp = fopen(file, "r"); FILE* fp = fopen(file, "r");
if(!fp) if(!fp)
return false; return false;
char linebuf[256]; char linebuf[TEXT_LINE_SIZE]{};
while(fgets(linebuf, 256, fp)) { while(fgets(linebuf, sizeof linebuf, fp)) {
ReadStringConfLine(linebuf); ReadStringConfLine(linebuf);
} }
fclose(fp); fclose(fp);
return true; return true;
} }
bool DataManager::LoadStrings(IReadFile* reader) { bool DataManager::LoadStrings(IReadFile* reader) {
char ch[2] = " "; char ch{};
char linebuf[256] = ""; std::string linebuf;
while(reader->read(&ch[0], 1)) { while (reader->read(&ch, 1)) {
if(ch[0] == '\0') if (ch == '\0')
break; break;
std::strcat(linebuf, ch); linebuf.push_back(ch);
if(ch[0] == '\n') { if (ch == '\n' || linebuf.size() >= TEXT_LINE_SIZE - 1) {
ReadStringConfLine(linebuf); ReadStringConfLine(linebuf.data());
linebuf[0] = '\0'; linebuf.clear();
} }
} }
reader->drop(); reader->drop();
...@@ -136,7 +136,7 @@ bool DataManager::LoadStrings(IReadFile* reader) { ...@@ -136,7 +136,7 @@ bool DataManager::LoadStrings(IReadFile* reader) {
void DataManager::ReadStringConfLine(const char* linebuf) { void DataManager::ReadStringConfLine(const char* linebuf) {
if(linebuf[0] != '!') if(linebuf[0] != '!')
return; return;
char strbuf[256]{}; char strbuf[TEXT_LINE_SIZE]{};
int value{}; int value{};
wchar_t strBuffer[4096]{}; wchar_t strBuffer[4096]{};
if (sscanf(linebuf, "!%63s", strbuf) != 1) if (sscanf(linebuf, "!%63s", strbuf) != 1)
...@@ -414,16 +414,16 @@ byte* DataManager::ScriptReader(const char* script_name, int* slen) { ...@@ -414,16 +414,16 @@ byte* DataManager::ScriptReader(const char* script_name, int* slen) {
#else #else
IReadFile* reader = FileSystem->createAndOpenFile(script_name); IReadFile* reader = FileSystem->createAndOpenFile(script_name);
#endif #endif
if(reader == NULL) if (!reader)
return 0; return nullptr;
size_t size = reader->getSize(); size_t size = reader->getSize();
if(size > sizeof(scriptBuffer)) { if (size > sizeof scriptBuffer) {
reader->drop(); reader->drop();
return 0; return nullptr;
} }
reader->read(scriptBuffer, size); reader->read(scriptBuffer, size);
reader->drop(); reader->drop();
*slen = size; *slen = (int)size;
return scriptBuffer; return scriptBuffer;
} }
......
...@@ -269,7 +269,7 @@ FILE* DeckManager::OpenDeckFile(const wchar_t* file, const char* mode) { ...@@ -269,7 +269,7 @@ FILE* DeckManager::OpenDeckFile(const wchar_t* file, const char* mode) {
return fp; return fp;
} }
IReadFile* DeckManager::OpenDeckReader(const wchar_t* file) { IReadFile* DeckManager::OpenDeckReader(const wchar_t* file) {
#ifdef WIN32 #ifdef _WIN32
IReadFile* reader = dataManager.FileSystem->createAndOpenFile(file); IReadFile* reader = dataManager.FileSystem->createAndOpenFile(file);
#else #else
char file2[256]; char file2[256];
...@@ -333,7 +333,7 @@ bool DeckManager::SaveDeck(Deck& deck, const wchar_t* file) { ...@@ -333,7 +333,7 @@ bool DeckManager::SaveDeck(Deck& deck, const wchar_t* file) {
return true; return true;
} }
bool DeckManager::DeleteDeck(const wchar_t* file) { bool DeckManager::DeleteDeck(const wchar_t* file) {
#ifdef WIN32 #ifdef _WIN32
BOOL result = DeleteFileW(file); BOOL result = DeleteFileW(file);
return !!result; return !!result;
#else #else
......
...@@ -412,8 +412,8 @@ void Game::DrawCard(ClientCard* pcard) { ...@@ -412,8 +412,8 @@ void Game::DrawCard(ClientCard* pcard) {
} }
} }
template<typename T> template<typename T>
inline void DrawShadowText(irr::gui::CGUITTFont* font, const T& text, const core::rect<s32>& position, const core::rect<s32>& padding, void Game::DrawShadowText(irr::gui::CGUITTFont* font, const T& text, const core::rect<s32>& position, const core::rect<s32>& padding,
video::SColor color = 0xffffffff, video::SColor shadowcolor = 0xff000000, bool hcenter = false, bool vcenter = false, const core::rect<s32>* clip = nullptr) { video::SColor color, video::SColor shadowcolor, bool hcenter, bool vcenter, const core::rect<s32>* clip) {
core::rect<s32> shadowposition = recti(position.UpperLeftCorner.X - padding.UpperLeftCorner.X, position.UpperLeftCorner.Y - padding.UpperLeftCorner.Y, core::rect<s32> shadowposition = recti(position.UpperLeftCorner.X - padding.UpperLeftCorner.X, position.UpperLeftCorner.Y - padding.UpperLeftCorner.Y,
position.LowerRightCorner.X - padding.LowerRightCorner.X, position.LowerRightCorner.Y - padding.LowerRightCorner.Y); position.LowerRightCorner.X - padding.LowerRightCorner.X, position.LowerRightCorner.Y - padding.LowerRightCorner.Y);
font->drawUstring(text, shadowposition, shadowcolor, hcenter, vcenter, clip); font->drawUstring(text, shadowposition, shadowcolor, hcenter, vcenter, clip);
......
...@@ -122,13 +122,13 @@ void DuelClient::ClientEvent(bufferevent *bev, short events, void *ctx) { ...@@ -122,13 +122,13 @@ void DuelClient::ClientEvent(bufferevent *bev, short events, void *ctx) {
if (events & BEV_EVENT_CONNECTED) { if (events & BEV_EVENT_CONNECTED) {
bool create_game = (size_t)ctx != 0; bool create_game = (size_t)ctx != 0;
CTOS_PlayerInfo cspi; CTOS_PlayerInfo cspi;
BufferIO::CopyWStr(mainGame->ebNickName->getText(), cspi.name, 20); BufferIO::CopyCharArray(mainGame->ebNickName->getText(), cspi.name);
SendPacketToServer(CTOS_PLAYER_INFO, cspi); SendPacketToServer(CTOS_PLAYER_INFO, cspi);
if(create_game) { if(create_game) {
CTOS_CreateGame cscg; CTOS_CreateGame cscg;
if(bot_mode) { if(bot_mode) {
BufferIO::CopyWStr(L"Bot Game", cscg.name, 20); BufferIO::CopyCharArray(L"Bot Game", cscg.name);
BufferIO::CopyWStr(L"", cscg.pass, 20); BufferIO::CopyCharArray(L"", cscg.pass);
cscg.info.rule = 5; cscg.info.rule = 5;
cscg.info.mode = 0; cscg.info.mode = 0;
cscg.info.start_hand = 5; cscg.info.start_hand = 5;
...@@ -141,8 +141,8 @@ void DuelClient::ClientEvent(bufferevent *bev, short events, void *ctx) { ...@@ -141,8 +141,8 @@ void DuelClient::ClientEvent(bufferevent *bev, short events, void *ctx) {
cscg.info.no_shuffle_deck = mainGame->chkBotNoShuffleDeck->isChecked(); cscg.info.no_shuffle_deck = mainGame->chkBotNoShuffleDeck->isChecked();
} }
else { else {
BufferIO::CopyWStr(mainGame->ebServerName->getText(), cscg.name, 20); BufferIO::CopyCharArray(mainGame->ebServerName->getText(), cscg.name);
BufferIO::CopyWStr(mainGame->ebServerPass->getText(), cscg.pass, 20); BufferIO::CopyCharArray(mainGame->ebServerPass->getText(), cscg.pass);
cscg.info.rule = mainGame->cbRule->getSelected(); cscg.info.rule = mainGame->cbRule->getSelected();
cscg.info.mode = mainGame->cbMatchMode->getSelected(); cscg.info.mode = mainGame->cbMatchMode->getSelected();
cscg.info.start_hand = wcstol(mainGame->ebStartHand->getText(),nullptr,10); cscg.info.start_hand = wcstol(mainGame->ebStartHand->getText(),nullptr,10);
...@@ -159,7 +159,7 @@ void DuelClient::ClientEvent(bufferevent *bev, short events, void *ctx) { ...@@ -159,7 +159,7 @@ void DuelClient::ClientEvent(bufferevent *bev, short events, void *ctx) {
CTOS_JoinGame csjg; CTOS_JoinGame csjg;
csjg.version = PRO_VERSION; csjg.version = PRO_VERSION;
csjg.gameid = 0; csjg.gameid = 0;
BufferIO::CopyWStr(mainGame->ebJoinPass->getText(), csjg.pass, 20); BufferIO::CopyCharArray(mainGame->ebJoinPass->getText(), csjg.pass);
SendPacketToServer(CTOS_JOIN_GAME, csjg); SendPacketToServer(CTOS_JOIN_GAME, csjg);
} }
bufferevent_enable(bev, EV_READ); bufferevent_enable(bev, EV_READ);
...@@ -649,11 +649,11 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, int len) { ...@@ -649,11 +649,11 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, int len) {
mainGame->btnSpectatorSwap->setVisible(true); mainGame->btnSpectatorSwap->setVisible(true);
} }
if(selftype != 1) { if(selftype != 1) {
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[0]->getToolTipText().c_str(), mainGame->dInfo.hostname, 20); BufferIO::CopyWideString(mainGame->stHostPrepDuelist[0]->getToolTipText().c_str(), mainGame->dInfo.hostname);
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[1]->getToolTipText().c_str(), mainGame->dInfo.clientname, 20); BufferIO::CopyWideString(mainGame->stHostPrepDuelist[1]->getToolTipText().c_str(), mainGame->dInfo.clientname);
} else { } else {
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[1]->getToolTipText().c_str(), mainGame->dInfo.hostname, 20); BufferIO::CopyWideString(mainGame->stHostPrepDuelist[1]->getToolTipText().c_str(), mainGame->dInfo.hostname);
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[0]->getToolTipText().c_str(), mainGame->dInfo.clientname, 20); BufferIO::CopyWideString(mainGame->stHostPrepDuelist[0]->getToolTipText().c_str(), mainGame->dInfo.clientname);
} }
} else { } else {
if(selftype > 3) { if(selftype > 3) {
...@@ -663,15 +663,15 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, int len) { ...@@ -663,15 +663,15 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, int len) {
mainGame->btnSpectatorSwap->setVisible(true); mainGame->btnSpectatorSwap->setVisible(true);
} }
if(selftype > 1 && selftype < 4) { if(selftype > 1 && selftype < 4) {
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[2]->getToolTipText().c_str(), mainGame->dInfo.hostname, 20); BufferIO::CopyWideString(mainGame->stHostPrepDuelist[2]->getToolTipText().c_str(), mainGame->dInfo.hostname);
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[3]->getToolTipText().c_str(), mainGame->dInfo.hostname_tag, 20); BufferIO::CopyWideString(mainGame->stHostPrepDuelist[3]->getToolTipText().c_str(), mainGame->dInfo.hostname_tag);
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[0]->getToolTipText().c_str(), mainGame->dInfo.clientname, 20); BufferIO::CopyWideString(mainGame->stHostPrepDuelist[0]->getToolTipText().c_str(), mainGame->dInfo.clientname);
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[1]->getToolTipText().c_str(), mainGame->dInfo.clientname_tag, 20); BufferIO::CopyWideString(mainGame->stHostPrepDuelist[1]->getToolTipText().c_str(), mainGame->dInfo.clientname_tag);
} else { } else {
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[0]->getToolTipText().c_str(), mainGame->dInfo.hostname, 20); BufferIO::CopyWideString(mainGame->stHostPrepDuelist[0]->getToolTipText().c_str(), mainGame->dInfo.hostname);
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[1]->getToolTipText().c_str(), mainGame->dInfo.hostname_tag, 20); BufferIO::CopyWideString(mainGame->stHostPrepDuelist[1]->getToolTipText().c_str(), mainGame->dInfo.hostname_tag);
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[2]->getToolTipText().c_str(), mainGame->dInfo.clientname, 20); BufferIO::CopyWideString(mainGame->stHostPrepDuelist[2]->getToolTipText().c_str(), mainGame->dInfo.clientname);
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[3]->getToolTipText().c_str(), mainGame->dInfo.clientname_tag, 20); BufferIO::CopyWideString(mainGame->stHostPrepDuelist[3]->getToolTipText().c_str(), mainGame->dInfo.clientname_tag);
} }
mainGame->dInfo.tag_player[0] = false; mainGame->dInfo.tag_player[0] = false;
mainGame->dInfo.tag_player[1] = false; mainGame->dInfo.tag_player[1] = false;
...@@ -810,7 +810,7 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, int len) { ...@@ -810,7 +810,7 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, int len) {
} }
// UTF-16 to wchar_t // UTF-16 to wchar_t
wchar_t msg[LEN_CHAT_MSG]; wchar_t msg[LEN_CHAT_MSG];
BufferIO::CopyWStr(chat_msg, msg, LEN_CHAT_MSG); BufferIO::CopyCharArray(chat_msg, msg);
mainGame->gMutex.lock(); mainGame->gMutex.lock();
mainGame->AddChatMsg(msg, player, play_sound); mainGame->AddChatMsg(msg, player, play_sound);
mainGame->gMutex.unlock(); mainGame->gMutex.unlock();
...@@ -827,21 +827,21 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, int len) { ...@@ -827,21 +827,21 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, int len) {
break; break;
wchar_t name[20]; wchar_t name[20];
BufferIO::NullTerminate(pkt->name); BufferIO::NullTerminate(pkt->name);
BufferIO::CopyWStr(pkt->name, name, 20); BufferIO::CopyCharArray(pkt->name, name);
if(mainGame->dInfo.isTag) { if(mainGame->dInfo.isTag) {
if(pkt->pos == 0) if(pkt->pos == 0)
BufferIO::CopyWStr(pkt->name, mainGame->dInfo.hostname, 20); BufferIO::CopyCharArray(pkt->name, mainGame->dInfo.hostname);
else if(pkt->pos == 1) else if(pkt->pos == 1)
BufferIO::CopyWStr(pkt->name, mainGame->dInfo.hostname_tag, 20); BufferIO::CopyCharArray(pkt->name, mainGame->dInfo.hostname_tag);
else if(pkt->pos == 2) else if(pkt->pos == 2)
BufferIO::CopyWStr(pkt->name, mainGame->dInfo.clientname, 20); BufferIO::CopyCharArray(pkt->name, mainGame->dInfo.clientname);
else if(pkt->pos == 3) else if(pkt->pos == 3)
BufferIO::CopyWStr(pkt->name, mainGame->dInfo.clientname_tag, 20); BufferIO::CopyCharArray(pkt->name, mainGame->dInfo.clientname_tag);
} else { } else {
if(pkt->pos == 0) if(pkt->pos == 0)
BufferIO::CopyWStr(pkt->name, mainGame->dInfo.hostname, 20); BufferIO::CopyCharArray(pkt->name, mainGame->dInfo.hostname);
else if(pkt->pos == 1) else if(pkt->pos == 1)
BufferIO::CopyWStr(pkt->name, mainGame->dInfo.clientname, 20); BufferIO::CopyCharArray(pkt->name, mainGame->dInfo.clientname);
} }
mainGame->gMutex.lock(); mainGame->gMutex.lock();
if(mainGame->gameConf.hide_player_name) if(mainGame->gameConf.hide_player_name)
...@@ -876,13 +876,13 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, int len) { ...@@ -876,13 +876,13 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, int len) {
mainGame->stHostPrepDuelist[pos]->setToolTipText(L""); mainGame->stHostPrepDuelist[pos]->setToolTipText(L"");
mainGame->chkHostPrepReady[pos]->setChecked(false); mainGame->chkHostPrepReady[pos]->setChecked(false);
if(pos == 0) if(pos == 0)
BufferIO::CopyWStr(prename, mainGame->dInfo.hostname, 20); BufferIO::CopyCharArray(prename, mainGame->dInfo.hostname);
else if(pos == 1) else if(pos == 1)
BufferIO::CopyWStr(prename, mainGame->dInfo.hostname_tag, 20); BufferIO::CopyCharArray(prename, mainGame->dInfo.hostname_tag);
else if(pos == 2) else if(pos == 2)
BufferIO::CopyWStr(prename, mainGame->dInfo.clientname, 20); BufferIO::CopyCharArray(prename, mainGame->dInfo.clientname);
else if(pos == 3) else if(pos == 3)
BufferIO::CopyWStr(prename, mainGame->dInfo.clientname_tag, 20); BufferIO::CopyCharArray(prename, mainGame->dInfo.clientname_tag);
} else if(state == PLAYERCHANGE_READY) { } else if(state == PLAYERCHANGE_READY) {
mainGame->chkHostPrepReady[pos]->setChecked(true); mainGame->chkHostPrepReady[pos]->setChecked(true);
if(pos == selftype) { if(pos == selftype) {
...@@ -4153,7 +4153,7 @@ void DuelClient::BroadcastReply(evutil_socket_t fd, short events, void * arg) { ...@@ -4153,7 +4153,7 @@ void DuelClient::BroadcastReply(evutil_socket_t fd, short events, void * arg) {
else hoststr.append(dataManager.GetSysString(1248)); else hoststr.append(dataManager.GetSysString(1248));
hoststr.append(L"]"); hoststr.append(L"]");
wchar_t gamename[20]; wchar_t gamename[20];
BufferIO::CopyWStr(pHP->name, gamename, 20); BufferIO::CopyCharArray(pHP->name, gamename);
hoststr.append(gamename); hoststr.append(gamename);
mainGame->lstHostList->addItem(hoststr.c_str()); mainGame->lstHostList->addItem(hoststr.c_str());
mainGame->gMutex.unlock(); mainGame->gMutex.unlock();
......
...@@ -2028,7 +2028,7 @@ bool ClientField::OnCommonEvent(const irr::SEvent& event) { ...@@ -2028,7 +2028,7 @@ bool ClientField::OnCommonEvent(const irr::SEvent& event) {
const wchar_t* input = mainGame->ebChatInput->getText(); const wchar_t* input = mainGame->ebChatInput->getText();
if(input[0]) { if(input[0]) {
uint16_t msgbuf[LEN_CHAT_MSG]; uint16_t msgbuf[LEN_CHAT_MSG];
int len = BufferIO::CopyWStr(input, msgbuf, LEN_CHAT_MSG); int len = BufferIO::CopyCharArray(input, msgbuf);
DuelClient::SendBufferToServer(CTOS_CHAT, msgbuf, (len + 1) * sizeof(uint16_t)); DuelClient::SendBufferToServer(CTOS_CHAT, msgbuf, (len + 1) * sizeof(uint16_t));
mainGame->ebChatInput->setText(L""); mainGame->ebChatInput->setText(L"");
return true; return true;
......
...@@ -51,8 +51,8 @@ void DuelInfo::Clear() { ...@@ -51,8 +51,8 @@ void DuelInfo::Clear() {
} }
bool IsExtension(const wchar_t* filename, const wchar_t* extension) { bool IsExtension(const wchar_t* filename, const wchar_t* extension) {
int flen = std::wcslen(filename); auto flen = std::wcslen(filename);
int elen = std::wcslen(extension); auto elen = std::wcslen(extension);
if (!elen || flen < elen) if (!elen || flen < elen)
return false; return false;
return !mywcsncasecmp(filename + (flen - elen), extension, elen); return !mywcsncasecmp(filename + (flen - elen), extension, elen);
...@@ -1272,9 +1272,10 @@ void Game::RefreshDeck(const wchar_t* deckpath, const std::function<void(const w ...@@ -1272,9 +1272,10 @@ void Game::RefreshDeck(const wchar_t* deckpath, const std::function<void(const w
FileSystem::TraversalDir(deckpath, [additem](const wchar_t* name, bool isdir) { FileSystem::TraversalDir(deckpath, [additem](const wchar_t* name, bool isdir) {
if (!isdir && IsExtension(name, L".ydk")) { if (!isdir && IsExtension(name, L".ydk")) {
size_t len = std::wcslen(name); size_t len = std::wcslen(name);
wchar_t deckname[256]; wchar_t deckname[256]{};
std::wcsncpy(deckname, name, len - 4); size_t count = std::min(len - 4, sizeof deckname / sizeof deckname[0] - 1);
deckname[len - 4] = 0; std::wcsncpy(deckname, name, count);
deckname[count] = 0;
additem(deckname); additem(deckname);
} }
}); });
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
constexpr int DEFAULT_DUEL_RULE = 5; constexpr int DEFAULT_DUEL_RULE = 5;
constexpr int CONFIG_LINE_SIZE = 1024; constexpr int CONFIG_LINE_SIZE = 1024;
constexpr int TEXT_LINE_SIZE = 256;
namespace ygo { namespace ygo {
...@@ -219,6 +220,9 @@ public: ...@@ -219,6 +220,9 @@ public:
void SetWindowsScale(float scale); void SetWindowsScale(float scale);
void FlashWindow(); void FlashWindow();
void SetCursor(ECURSOR_ICON icon); void SetCursor(ECURSOR_ICON icon);
template<typename T>
static void DrawShadowText(irr::gui::CGUITTFont* font, const T& text, const core::rect<s32>& position, const core::rect<s32>& padding,
video::SColor color = 0xffffffff, video::SColor shadowcolor = 0xff000000, bool hcenter = false, bool vcenter = false, const core::rect<s32>* clip = nullptr);
std::mutex gMutex; std::mutex gMutex;
Signal frameSignal; Signal frameSignal;
......
...@@ -129,7 +129,7 @@ int main(int argc, char* argv[]) { ...@@ -129,7 +129,7 @@ int main(int argc, char* argv[]) {
if(i < wargc) { if(i < wargc) {
open_file = true; open_file = true;
if(deckCategorySpecified) { if(deckCategorySpecified) {
#ifdef WIN32 #ifdef _WIN32
myswprintf(open_file_name, L"%ls\\%ls", ygo::mainGame->gameConf.lastcategory, wargv[i]); myswprintf(open_file_name, L"%ls\\%ls", ygo::mainGame->gameConf.lastcategory, wargv[i]);
#else #else
myswprintf(open_file_name, L"%ls/%ls", ygo::mainGame->gameConf.lastcategory, wargv[i]); myswprintf(open_file_name, L"%ls/%ls", ygo::mainGame->gameConf.lastcategory, wargv[i]);
......
...@@ -428,7 +428,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -428,7 +428,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
case BUTTON_DECK_EDIT: { case BUTTON_DECK_EDIT: {
mainGame->RefreshCategoryDeck(mainGame->cbDBCategory, mainGame->cbDBDecks); mainGame->RefreshCategoryDeck(mainGame->cbDBCategory, mainGame->cbDBDecks);
if(open_file && deckManager.LoadCurrentDeck(open_file_name)) { if(open_file && deckManager.LoadCurrentDeck(open_file_name)) {
#ifdef WIN32 #ifdef _WIN32
wchar_t *dash = wcsrchr(open_file_name, L'\\'); wchar_t *dash = wcsrchr(open_file_name, L'\\');
#else #else
wchar_t *dash = wcsrchr(open_file_name, L'/'); wchar_t *dash = wcsrchr(open_file_name, L'/');
......
...@@ -70,9 +70,8 @@ public: ...@@ -70,9 +70,8 @@ public:
static bool DeleteDir(const wchar_t* wdir) { static bool DeleteDir(const wchar_t* wdir) {
wchar_t pdir[256]; wchar_t pdir[256];
int len = BufferIO::CopyWStr(wdir, pdir, sizeof pdir / sizeof pdir[0]); BufferIO::CopyWideString(wdir, pdir);
pdir[len + 1] = 0; SHFILEOPSTRUCTW lpFileOp{};
SHFILEOPSTRUCTW lpFileOp;
lpFileOp.hwnd = NULL; lpFileOp.hwnd = NULL;
lpFileOp.wFunc = FO_DELETE; lpFileOp.wFunc = FO_DELETE;
lpFileOp.pFrom = pdir; lpFileOp.pFrom = pdir;
...@@ -174,8 +173,12 @@ public: ...@@ -174,8 +173,12 @@ public:
static bool DeleteDir(const char* dir) { static bool DeleteDir(const char* dir) {
bool success = true; bool success = true;
TraversalDir(dir, [dir, &success](const char *name, bool isdir) { TraversalDir(dir, [dir, &success](const char *name, bool isdir) {
char full_path[256]; char full_path[1024];
snprintf(full_path, sizeof full_path, "%s/%s", dir, name); int len = std::snprintf(full_path, sizeof full_path, "%s/%s", dir, name);
if (len < 0 || len >= (int)(sizeof full_path)) {
success = false;
return;
}
if (isdir) if (isdir)
{ {
if(!DeleteDir(full_path)) if(!DeleteDir(full_path))
...@@ -207,7 +210,9 @@ public: ...@@ -207,7 +210,9 @@ public:
while((dirp = readdir(dir)) != nullptr) { while((dirp = readdir(dir)) != nullptr) {
file_unit funit; file_unit funit;
char fname[1024]; char fname[1024];
std::snprintf(fname, sizeof fname, "%s/%s", path, dirp->d_name); int len = std::snprintf(fname, sizeof fname, "%s/%s", path, dirp->d_name);
if (len < 0 || len >= (int)(sizeof fname))
continue;
stat(fname, &fileStat); stat(fname, &fileStat);
funit.filename = std::string(dirp->d_name); funit.filename = std::string(dirp->d_name);
funit.is_dir = S_ISDIR(fileStat.st_mode); funit.is_dir = S_ISDIR(fileStat.st_mode);
......
...@@ -97,7 +97,7 @@ void NetServer::BroadcastEvent(evutil_socket_t fd, short events, void* arg) { ...@@ -97,7 +97,7 @@ void NetServer::BroadcastEvent(evutil_socket_t fd, short events, void* arg) {
hp.port = server_port; hp.port = server_port;
hp.version = PRO_VERSION; hp.version = PRO_VERSION;
hp.host = duel_mode->host_info; hp.host = duel_mode->host_info;
BufferIO::CopyWStr(duel_mode->name, hp.name, 20); BufferIO::CopyCharArray(duel_mode->name, hp.name);
sendto(fd, (const char*)&hp, sizeof(HostPacket), 0, (sockaddr*)&sockTo, sizeof(sockTo)); sendto(fd, (const char*)&hp, sizeof(HostPacket), 0, (sockaddr*)&sockTo, sizeof(sockTo));
} }
} }
...@@ -250,7 +250,7 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, int len) { ...@@ -250,7 +250,7 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, int len) {
std::memcpy(&packet, pdata, sizeof packet); std::memcpy(&packet, pdata, sizeof packet);
auto pkt = &packet; auto pkt = &packet;
BufferIO::NullTerminate(pkt->name); BufferIO::NullTerminate(pkt->name);
BufferIO::CopyWStr(pkt->name, dp->name, 20); BufferIO::CopyCharArray(pkt->name, dp->name);
break; break;
} }
case CTOS_CREATE_GAME: { case CTOS_CREATE_GAME: {
...@@ -288,8 +288,8 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, int len) { ...@@ -288,8 +288,8 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, int len) {
duel_mode->host_info = pkt->info; duel_mode->host_info = pkt->info;
BufferIO::NullTerminate(pkt->name); BufferIO::NullTerminate(pkt->name);
BufferIO::NullTerminate(pkt->pass); BufferIO::NullTerminate(pkt->pass);
BufferIO::CopyWStr(pkt->name, duel_mode->name, 20); BufferIO::CopyCharArray(pkt->name, duel_mode->name);
BufferIO::CopyWStr(pkt->pass, duel_mode->pass, 20); BufferIO::CopyCharArray(pkt->pass, duel_mode->pass);
duel_mode->JoinGame(dp, 0, true); duel_mode->JoinGame(dp, 0, true);
StartBroadcast(); StartBroadcast();
break; break;
......
...@@ -45,7 +45,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) ...@@ -45,7 +45,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater)
} }
wchar_t jpass[20]; wchar_t jpass[20];
BufferIO::NullTerminate(pkt->pass); BufferIO::NullTerminate(pkt->pass);
BufferIO::CopyWStr(pkt->pass, jpass, 20); BufferIO::CopyCharArray(pkt->pass, jpass);
if(wcscmp(jpass, pass)) { if(wcscmp(jpass, pass)) {
STOC_ErrorMsg scem; STOC_ErrorMsg scem;
scem.msg = ERRMSG_JOINERROR; scem.msg = ERRMSG_JOINERROR;
...@@ -63,7 +63,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) ...@@ -63,7 +63,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater)
sctc.type = (host_player == dp) ? 0x10 : 0; sctc.type = (host_player == dp) ? 0x10 : 0;
if(!players[0] || !players[1]) { if(!players[0] || !players[1]) {
STOC_HS_PlayerEnter scpe; STOC_HS_PlayerEnter scpe;
BufferIO::CopyWStr(dp->name, scpe.name, 20); BufferIO::CopyCharArray(dp->name, scpe.name);
if(!players[0]) if(!players[0])
scpe.pos = 0; scpe.pos = 0;
else else
...@@ -102,7 +102,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) ...@@ -102,7 +102,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater)
NetServer::SendPacketToPlayer(dp, STOC_TYPE_CHANGE, sctc); NetServer::SendPacketToPlayer(dp, STOC_TYPE_CHANGE, sctc);
if(players[0]) { if(players[0]) {
STOC_HS_PlayerEnter scpe; STOC_HS_PlayerEnter scpe;
BufferIO::CopyWStr(players[0]->name, scpe.name, 20); BufferIO::CopyCharArray(players[0]->name, scpe.name);
scpe.pos = 0; scpe.pos = 0;
NetServer::SendPacketToPlayer(dp, STOC_HS_PLAYER_ENTER, scpe); NetServer::SendPacketToPlayer(dp, STOC_HS_PLAYER_ENTER, scpe);
if(ready[0]) { if(ready[0]) {
...@@ -113,7 +113,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) ...@@ -113,7 +113,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater)
} }
if(players[1]) { if(players[1]) {
STOC_HS_PlayerEnter scpe; STOC_HS_PlayerEnter scpe;
BufferIO::CopyWStr(players[1]->name, scpe.name, 20); BufferIO::CopyCharArray(players[1]->name, scpe.name);
scpe.pos = 1; scpe.pos = 1;
NetServer::SendPacketToPlayer(dp, STOC_HS_PLAYER_ENTER, scpe); NetServer::SendPacketToPlayer(dp, STOC_HS_PLAYER_ENTER, scpe);
if(ready[1]) { if(ready[1]) {
...@@ -191,7 +191,7 @@ void SingleDuel::ToDuelist(DuelPlayer* dp) { ...@@ -191,7 +191,7 @@ void SingleDuel::ToDuelist(DuelPlayer* dp) {
return; return;
observers.erase(dp); observers.erase(dp);
STOC_HS_PlayerEnter scpe; STOC_HS_PlayerEnter scpe;
BufferIO::CopyWStr(dp->name, scpe.name, 20); BufferIO::CopyCharArray(dp->name, scpe.name);
if(!players[0]) { if(!players[0]) {
players[0] = dp; players[0] = dp;
dp->type = NETPLAYER_TYPE_PLAYER1; dp->type = NETPLAYER_TYPE_PLAYER1;
......
...@@ -49,7 +49,7 @@ int SingleMode::SinglePlayThread() { ...@@ -49,7 +49,7 @@ int SingleMode::SinglePlayThread() {
mainGame->dInfo.start_lp = start_lp; mainGame->dInfo.start_lp = start_lp;
myswprintf(mainGame->dInfo.strLP[0], L"%d", mainGame->dInfo.lp[0]); myswprintf(mainGame->dInfo.strLP[0], L"%d", mainGame->dInfo.lp[0]);
myswprintf(mainGame->dInfo.strLP[1], L"%d", mainGame->dInfo.lp[1]); myswprintf(mainGame->dInfo.strLP[1], L"%d", mainGame->dInfo.lp[1]);
BufferIO::CopyWStr(mainGame->ebNickName->getText(), mainGame->dInfo.hostname, 20); BufferIO::CopyWideString(mainGame->ebNickName->getText(), mainGame->dInfo.hostname);
mainGame->dInfo.clientname[0] = 0; mainGame->dInfo.clientname[0] = 0;
mainGame->dInfo.player_type = 0; mainGame->dInfo.player_type = 0;
mainGame->dInfo.turn = 0; mainGame->dInfo.turn = 0;
...@@ -109,10 +109,10 @@ int SingleMode::SinglePlayThread() { ...@@ -109,10 +109,10 @@ int SingleMode::SinglePlayThread() {
is_continuing = SinglePlayAnalyze(engineBuffer.data(), len); is_continuing = SinglePlayAnalyze(engineBuffer.data(), len);
last_replay.BeginRecord(); last_replay.BeginRecord();
last_replay.WriteHeader(rh); last_replay.WriteHeader(rh);
unsigned short buffer[20]; uint16_t buffer[20];
BufferIO::CopyWStr(mainGame->dInfo.hostname, buffer, 20); BufferIO::CopyCharArray(mainGame->dInfo.hostname, buffer);
last_replay.WriteData(buffer, 40, false); last_replay.WriteData(buffer, 40, false);
BufferIO::CopyWStr(mainGame->dInfo.clientname, buffer, 20); BufferIO::CopyCharArray(mainGame->dInfo.clientname, buffer);
last_replay.WriteData(buffer, 40, false); last_replay.WriteData(buffer, 40, false);
last_replay.WriteInt32(start_lp, false); last_replay.WriteInt32(start_lp, false);
last_replay.WriteInt32(start_hand, false); last_replay.WriteInt32(start_hand, false);
...@@ -747,14 +747,14 @@ bool SingleMode::SinglePlayAnalyze(unsigned char* msg, unsigned int len) { ...@@ -747,14 +747,14 @@ bool SingleMode::SinglePlayAnalyze(unsigned char* msg, unsigned int len) {
break; break;
} }
case MSG_AI_NAME: { case MSG_AI_NAME: {
char namebuf[128]; char namebuf[128]{};
wchar_t wname[128]; wchar_t wname[20]{};
int len = BufferIO::ReadInt16(pbuf); int len = BufferIO::ReadInt16(pbuf);
auto begin = pbuf; auto begin = pbuf;
pbuf += len + 1; pbuf += len + 1;
std::memcpy(namebuf, begin, len + 1); std::memcpy(namebuf, begin, len + 1);
BufferIO::DecodeUTF8(namebuf, wname); BufferIO::DecodeUTF8(namebuf, wname);
BufferIO::CopyWStr(wname, mainGame->dInfo.clientname, 20); BufferIO::CopyCharArray(wname, mainGame->dInfo.clientname);
break; break;
} }
case MSG_SHOW_HINT: { case MSG_SHOW_HINT: {
......
...@@ -49,7 +49,7 @@ void TagDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) { ...@@ -49,7 +49,7 @@ void TagDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) {
} }
wchar_t jpass[20]; wchar_t jpass[20];
BufferIO::NullTerminate(pkt->pass); BufferIO::NullTerminate(pkt->pass);
BufferIO::CopyWStr(pkt->pass, jpass, 20); BufferIO::CopyCharArray(pkt->pass, jpass);
if(wcscmp(jpass, pass)) { if(wcscmp(jpass, pass)) {
STOC_ErrorMsg scem; STOC_ErrorMsg scem;
scem.msg = ERRMSG_JOINERROR; scem.msg = ERRMSG_JOINERROR;
...@@ -67,7 +67,7 @@ void TagDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) { ...@@ -67,7 +67,7 @@ void TagDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) {
sctc.type = (host_player == dp) ? 0x10 : 0; sctc.type = (host_player == dp) ? 0x10 : 0;
if(!players[0] || !players[1] || !players[2] || !players[3]) { if(!players[0] || !players[1] || !players[2] || !players[3]) {
STOC_HS_PlayerEnter scpe; STOC_HS_PlayerEnter scpe;
BufferIO::CopyWStr(dp->name, scpe.name, 20); BufferIO::CopyCharArray(dp->name, scpe.name);
if(!players[0]) if(!players[0])
scpe.pos = 0; scpe.pos = 0;
else if(!players[1]) else if(!players[1])
...@@ -101,7 +101,7 @@ void TagDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) { ...@@ -101,7 +101,7 @@ void TagDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) {
for(int i = 0; i < 4; ++i) for(int i = 0; i < 4; ++i)
if(players[i]) { if(players[i]) {
STOC_HS_PlayerEnter scpe; STOC_HS_PlayerEnter scpe;
BufferIO::CopyWStr(players[i]->name, scpe.name, 20); BufferIO::CopyCharArray(players[i]->name, scpe.name);
scpe.pos = i; scpe.pos = i;
NetServer::SendPacketToPlayer(dp, STOC_HS_PLAYER_ENTER, scpe); NetServer::SendPacketToPlayer(dp, STOC_HS_PLAYER_ENTER, scpe);
if(ready[i]) { if(ready[i]) {
...@@ -157,7 +157,7 @@ void TagDuel::ToDuelist(DuelPlayer* dp) { ...@@ -157,7 +157,7 @@ void TagDuel::ToDuelist(DuelPlayer* dp) {
if(dp->type == NETPLAYER_TYPE_OBSERVER) { if(dp->type == NETPLAYER_TYPE_OBSERVER) {
observers.erase(dp); observers.erase(dp);
STOC_HS_PlayerEnter scpe; STOC_HS_PlayerEnter scpe;
BufferIO::CopyWStr(dp->name, scpe.name, 20); BufferIO::CopyCharArray(dp->name, scpe.name);
if(!players[0]) if(!players[0])
dp->type = 0; dp->type = 0;
else if(!players[1]) else if(!players[1])
......
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