Commit 0554ebeb authored by xiaoye's avatar xiaoye

从 const wchar_t* 改为 std::wstring

parent 811d74a9
...@@ -222,30 +222,25 @@ bool DataManager::LoadServerList(irr::io::IReadFile* reader) { ...@@ -222,30 +222,25 @@ bool DataManager::LoadServerList(irr::io::IReadFile* reader) {
return true; return true;
} }
void DataManager::ReadServerConfLine(const char* linebuf) { void DataManager::ReadServerConfLine(const char* linebuf) {
if(strchr(linebuf, '|') == nullptr)
return;
char* buffer = const_cast<char*>(linebuf); char* buffer = const_cast<char*>(linebuf);
buffer[strcspn(buffer, "\n")] = '\0'; buffer[strcspn(buffer, "\n")] = '\0';
char *separator = strchr(buffer, '|'); char* separator = strchr(buffer, '|');
if (separator != NULL) { if (separator != nullptr) {
*separator = '\0'; *separator = '\0';
wchar_t wname[256]; std::wstring name, ip;
wchar_t wip[256]; wchar_t wname[256], wip[256];
if (mbstowcs(wname, buffer, 256) != (size_t)-1 && mbstowcs(wip, separator + 1, 256) != (size_t)-1) { if (mbstowcs(wname, buffer, 256) != (size_t)-1 && mbstowcs(wip, separator + 1, 256) != (size_t)-1) {
wchar_t* name = new wchar_t[256]; ip = wip;
wchar_t* ip = new wchar_t[256]; name = wname;
wcscpy(name, wname);
wcscpy(ip, wip);
auto it = std::find_if(_serverStrings.begin(), _serverStrings.end(),
[name](const auto& pair) { return wcscmp(pair.first, name) == 0; }
);
if (it != _serverStrings.end())
it->second = ip;
else
_serverStrings.emplace_back(name, ip);
} }
auto it = std::find_if(_serverStrings.begin(), _serverStrings.end(),
[name](const auto& pair) { return pair.first == name; }
);
if (it != _serverStrings.end())
it->second = ip;
else
_serverStrings.emplace_back(name, ip);
} }
} }
bool DataManager::LoadINI(const char* file) { bool DataManager::LoadINI(const char* file) {
...@@ -289,9 +284,9 @@ bool DataManager::LoadINI(irr::io::IReadFile* reader) { ...@@ -289,9 +284,9 @@ bool DataManager::LoadINI(irr::io::IReadFile* reader) {
return true; return true;
} }
void DataManager::ReadINI(const char* linebuf) { void DataManager::ReadINI(const char* linebuf) {
const wchar_t* name = GetINIValue(linebuf, "ServerName = "); std::wstring name = GetINIValue(linebuf, "ServerName = ");
const wchar_t* host = GetINIValue(linebuf, "ServerHost = "); std::wstring host = GetINIValue(linebuf, "ServerHost = ");
const wchar_t* port = GetINIValue(linebuf, "ServerPort = "); std::wstring port = GetINIValue(linebuf, "ServerPort = ");
if (name != L"") if (name != L"")
iniName = name; iniName = name;
if (host != L"") if (host != L"")
...@@ -299,45 +294,51 @@ void DataManager::ReadINI(const char* linebuf) { ...@@ -299,45 +294,51 @@ void DataManager::ReadINI(const char* linebuf) {
if (port != L"") if (port != L"")
iniPort = port; iniPort = port;
} }
const wchar_t* DataManager::GetINIValue(const char* line, const char* key) { std::wstring DataManager::GetINIValue(const char* line, const char* key) {
if (!line || !key) return L""; if (!line || !key) {
const char* keyPos = strstr(line, key); return L"";
if (!keyPos) return L""; }
const char* valStart = keyPos + strlen(key); const char* keyPos = strstr(line, key);
while (*valStart == ' ') valStart++; if (!keyPos) {
const char* valEnd = valStart; return L"";
while (*valEnd && *valEnd != '\n' && *valEnd != '\r') { }
valEnd++; const char* valStart = keyPos + strlen(key);
} while (*valStart == ' ')
wchar_t value[256]; valStart++;
if (mbstowcs(value, std::string(valStart, valEnd).c_str(), 256) != (size_t)-1) { const char* valEnd = valStart;
wchar_t* result = new wchar_t[256]; while (*valEnd && *valEnd != '\n' && *valEnd != '\r')
wcscpy(result, value); valEnd++;
return result; if (valStart == valEnd)
} return L"";
return L""; std::string narrowStr(valStart, valEnd);
if (narrowStr.empty())
return L"";
size_t requiredSize = mbstowcs(nullptr, narrowStr.c_str(), 0);
if (requiredSize == (size_t)-1)
return L"";
std::wstring wideStr(requiredSize + 1, L'\0');
mbstowcs(&wideStr[0], narrowStr.c_str(), requiredSize + 1);
wideStr.resize(requiredSize);
return wideStr;
} }
void DataManager::InsertServerList() { void DataManager::InsertServerList() {
if (iniName != L"" && iniHost != L"") { if (iniName != L"" && iniHost != L"") {
const wchar_t* ip = iniHost; std::wstring ip = iniHost;
const wchar_t* name = iniName; std::wstring name = iniName;
size_t len = wcslen(iniHost) + wcslen(iniPort) + 2;
wchar_t* buffer = new wchar_t[len];
if (iniPort != L"") { if (iniPort != L"") {
std::swprintf(buffer, len, L"%s:%s", iniHost, iniPort);
ip = buffer;
} }
auto it = std::find_if(_serverStrings.begin(), _serverStrings.end(), auto it = std::find_if(_serverStrings.begin(), _serverStrings.end(),
[name](const auto& pair) { return wcscmp(pair.first, name) == 0; } [name](const auto& pair) { return pair.first == name; }
); );
if (it != _serverStrings.end()) if (it != _serverStrings.end())
it->second = ip; it->second = ip;
else else
_serverStrings.emplace_back(name, ip); _serverStrings.emplace_back(name, ip);
} }
iniName == L""; iniName.clear();
iniHost == L""; iniHost.clear();
iniPort == L""; iniPort.clear();
} }
bool DataManager::Error(sqlite3* pDB, sqlite3_stmt* pStmt) { bool DataManager::Error(sqlite3* pDB, sqlite3_stmt* pStmt) {
std::snprintf(errmsg, sizeof errmsg, "%s", sqlite3_errmsg(pDB)); std::snprintf(errmsg, sizeof errmsg, "%s", sqlite3_errmsg(pDB));
......
...@@ -58,7 +58,7 @@ public: ...@@ -58,7 +58,7 @@ public:
bool LoadINI(const wchar_t* file); bool LoadINI(const wchar_t* file);
bool LoadINI(irr::io::IReadFile* reader); bool LoadINI(irr::io::IReadFile* reader);
void ReadINI(const char* linebuf); void ReadINI(const char* linebuf);
const wchar_t* GetINIValue(const char* line, const char* key); std::wstring GetINIValue(const char* line, const char* key);
void InsertServerList(); void InsertServerList();
bool Error(sqlite3* pDB, sqlite3_stmt* pStmt = nullptr); bool Error(sqlite3* pDB, sqlite3_stmt* pStmt = nullptr);
...@@ -90,7 +90,7 @@ public: ...@@ -90,7 +90,7 @@ public:
std::unordered_map<unsigned int, std::wstring> _victoryStrings; std::unordered_map<unsigned int, std::wstring> _victoryStrings;
std::unordered_map<unsigned int, std::wstring> _setnameStrings; std::unordered_map<unsigned int, std::wstring> _setnameStrings;
std::unordered_map<unsigned int, std::wstring> _sysStrings; std::unordered_map<unsigned int, std::wstring> _sysStrings;
std::vector<std::pair<const wchar_t*, const wchar_t*>> _serverStrings; std::vector<std::pair<std::wstring, std::wstring>> _serverStrings;
char errmsg[512]{}; char errmsg[512]{};
static unsigned char scriptBuffer[0x100000]; static unsigned char scriptBuffer[0x100000];
...@@ -115,9 +115,9 @@ private: ...@@ -115,9 +115,9 @@ private:
std::unordered_map<unsigned int, CardDataC> _datas; std::unordered_map<unsigned int, CardDataC> _datas;
std::unordered_map<unsigned int, CardString> _strings; std::unordered_map<unsigned int, CardString> _strings;
std::unordered_map<unsigned int, std::vector<uint16_t>> extra_setcode; std::unordered_map<unsigned int, std::vector<uint16_t>> extra_setcode;
const wchar_t* iniName; std::wstring iniName;
const wchar_t* iniHost; std::wstring iniHost;
const wchar_t* iniPort; std::wstring iniPort;
}; };
extern DataManager dataManager; extern DataManager dataManager;
......
...@@ -1528,7 +1528,7 @@ void Game::RefreshBot() { ...@@ -1528,7 +1528,7 @@ void Game::RefreshBot() {
void Game::RefreshServerList() { void Game::RefreshServerList() {
lstServerList->clear(); lstServerList->clear();
for (const auto& pair : dataManager._serverStrings) { for (const auto& pair : dataManager._serverStrings) {
const wchar_t* key = pair.first; const wchar_t* key = pair.first.c_str();
lstServerList->addItem(key); lstServerList->addItem(key);
} }
} }
......
...@@ -492,16 +492,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -492,16 +492,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
} }
case BUTTON_SERVER_SELECTED: { case BUTTON_SERVER_SELECTED: {
int sel = mainGame->lstServerList->getSelected(); int sel = mainGame->lstServerList->getSelected();
if (sel == -1) wcscpy(mainGame->gameConf.lasthost, sel == -1 ? L"" : dataManager._serverStrings[sel].second.c_str());
wcscpy(mainGame->gameConf.lasthost, L"");
else {
const wchar_t* key = mainGame->lstServerList->getListItem(sel);
auto it = std::find_if(dataManager._serverStrings.begin(),
dataManager._serverStrings.end(),
[key](const auto& pair) { return wcscmp(pair.first, key) == 0; }
);
wcscpy(mainGame->gameConf.lasthost, it == dataManager._serverStrings.end() ? L"" : it->second);
}
wchar_t buf[256]; wchar_t buf[256];
myswprintf(buf, L"%s", mainGame->gameConf.lasthost); myswprintf(buf, L"%s", mainGame->gameConf.lasthost);
mainGame->ebJoinHost->setText(buf); mainGame->ebJoinHost->setText(buf);
......
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