Unicode path support

This commit is contained in:
Anonymous275 2020-12-26 23:35:43 +02:00
parent ab2a58bf42
commit 9a04665c34
6 changed files with 31 additions and 21 deletions

View File

@ -7,7 +7,7 @@
/// ///
#pragma once #pragma once
#include <string> #include <string>
void PreGame(int argc, char* argv[],const std::string& GamePath); void PreGame(const std::string& GamePath);
std::string CheckVer(const std::string &path); std::string CheckVer(const std::string &path);
void InitGame(const std::string& Dir); void InitGame(const std::string& Dir);
std::string GetGameDir(); std::string GetGameDir();

View File

@ -9,7 +9,7 @@
#include <string> #include <string>
void InitLauncher(int argc, char* argv[]); void InitLauncher(int argc, char* argv[]);
void CheckDir(int argc,char* args[]); void CheckDir(int argc,char* args[]);
std::string GetGamePath(); std::wstring GetGamePath();
std::string GetVer(); std::string GetVer();
std::string GetEN(); std::string GetEN();
extern bool Dev; extern bool Dev;

View File

@ -11,12 +11,14 @@
#include <ShlObj.h> #include <ShlObj.h>
#include "Logger.h" #include "Logger.h"
#include <iostream> #include <iostream>
#include <codecvt>
#include <thread> #include <thread>
#include <locale>
unsigned long GamePID = 0; unsigned long GamePID = 0;
std::string QueryKey(HKEY hKey,int ID); std::string QueryKey(HKEY hKey,int ID);
std::string GetGamePath(){ std::wstring GetGamePath(){
static std::string Path; static std::wstring Path;
if(!Path.empty())return Path; if(!Path.empty())return Path;
HKEY hKey; HKEY hKey;
@ -25,7 +27,8 @@ std::string GetGamePath(){
if (openRes != ERROR_SUCCESS){ if (openRes != ERROR_SUCCESS){
fatal("Please launch the game at least once"); fatal("Please launch the game at least once");
} }
Path = QueryKey(hKey,4); std::string T = QueryKey(hKey,4);
Path = std::wstring(T.begin(),T.end());
if(Path.empty()){ if(Path.empty()){
CoInitialize(nullptr); CoInitialize(nullptr);
@ -33,9 +36,8 @@ std::string GetGamePath(){
SHGetKnownFolderPath(FOLDERID_Documents, KF_FLAG_SIMPLE_IDLIST, nullptr, (PWSTR *)(&path)); SHGetKnownFolderPath(FOLDERID_Documents, KF_FLAG_SIMPLE_IDLIST, nullptr, (PWSTR *)(&path));
CoTaskMemFree(path); CoTaskMemFree(path);
std::wstring ws(path); std::wstring ws(path);
std::string s(ws.begin(), ws.end()); ws += L"\\BeamNG.drive\\";
Path = s; return ws;
Path += "\\BeamNG.drive\\";
} }
return Path; return Path;

View File

@ -258,10 +258,11 @@ void SyncResources(SOCKET Sock){
UpdateUl(false,std::to_string(Pos) + "/" + std::to_string(Amount) + ": " + a.substr(a.find_last_of('/'))); UpdateUl(false,std::to_string(Pos) + "/" + std::to_string(Amount) + ": " + a.substr(a.find_last_of('/')));
std::this_thread::sleep_for(std::chrono::milliseconds(50)); std::this_thread::sleep_for(std::chrono::milliseconds(50));
try { try {
if(!fs::exists(GetGamePath() + "mods/multiplayer")){ if(!fs::exists(GetGamePath() + L"mods/multiplayer")){
fs::create_directory(GetGamePath() + "mods/multiplayer"); fs::create_directory(GetGamePath() + L"mods/multiplayer");
} }
fs::copy_file(a, GetGamePath() + "mods/multiplayer" + a.substr(a.find_last_of('/')), std::string P = "mods/multiplayer" + a.substr(a.find_last_of('/'));
fs::copy_file(a, GetGamePath() + std::wstring(P.begin(),P.end()),
fs::copy_options::overwrite_existing); fs::copy_options::overwrite_existing);
} catch (std::exception& e) { } catch (std::exception& e) {
error("Failed copy to the mods folder! " + std::string(e.what())); error("Failed copy to the mods folder! " + std::string(e.what()));
@ -299,10 +300,10 @@ void SyncResources(SOCKET Sock){
}while(fs::file_size(a) != ModSize && !Terminate); }while(fs::file_size(a) != ModSize && !Terminate);
if(!Terminate){ if(!Terminate){
if(!fs::exists(GetGamePath() + "mods/multiplayer")){ if(!fs::exists(GetGamePath() + L"mods/multiplayer")){
fs::create_directory(GetGamePath() + "mods/multiplayer"); fs::create_directory(GetGamePath() + L"mods/multiplayer");
} }
fs::copy_file(a,GetGamePath() + "mods/multiplayer" + FName, fs::copy_options::overwrite_existing); fs::copy_file(a,GetGamePath() + L"mods/multiplayer" + std::wstring(FName.begin(),FName.end()), fs::copy_options::overwrite_existing);
} }
WaitForConfirm(); WaitForConfirm();
} }

View File

@ -187,8 +187,14 @@ void InitLauncher(int argc, char* argv[]) {
CustomPort(argc, argv); CustomPort(argc, argv);
CheckForUpdates(argc, argv, std::string(GetVer()) + GetPatch()); CheckForUpdates(argc, argv, std::string(GetVer()) + GetPatch());
} }
inline std::string to_string(const std::wstring& str){
auto loc = std::locale{};
std::vector<char> buf(str.size());
std::use_facet<std::ctype<wchar_t>>(loc).narrow(str.data(), str.data() + str.size(), '?', buf.data());
void PreGame(int argc, char* argv[],const std::string& GamePath){ return std::string(buf.data(), buf.size());
}
void PreGame(const std::string& GamePath){
info("Game Version : " + CheckVer(GamePath)); info("Game Version : " + CheckVer(GamePath));
if(!Dev) { if(!Dev) {
@ -196,16 +202,17 @@ void PreGame(int argc, char* argv[],const std::string& GamePath){
//if(fallback)link = "https://backup1.beammp.com/builds/client"; //if(fallback)link = "https://backup1.beammp.com/builds/client";
std::string link = "https://beammp.com/builds/client"; std::string link = "https://beammp.com/builds/client";
try { try {
if (!fs::exists(GetGamePath() + "mods")) { if (!fs::exists(GetGamePath() + L"mods")) {
fs::create_directory(GetGamePath() + "mods"); fs::create_directory(GetGamePath() + L"mods");
} }
if (!fs::exists(GetGamePath() + "mods/multiplayer")) { if (!fs::exists(GetGamePath() + L"mods/multiplayer")) {
fs::create_directory(GetGamePath() + "mods/multiplayer"); fs::create_directory(GetGamePath() + L"mods/multiplayer");
} }
std::wstring P = GetGamePath() + LR"(mods/multiplayer/BeamMP.zip)";
Download(link, to_string(P), true);
}catch(std::exception&e){ }catch(std::exception&e){
fatal(e.what()); fatal(e.what());
} }
Download(link, GetGamePath() + R"(mods/multiplayer/BeamMP.zip)", true);
info("Download Complete!"); info("Download Complete!");
} }

View File

@ -27,7 +27,7 @@ int main(int argc, char* argv[]) {
InitLauncher(argc,argv); InitLauncher(argc,argv);
//CheckDir(argc,argv); //CheckDir(argc,argv);
LegitimacyCheck(); LegitimacyCheck();
PreGame(argc,argv,GetGameDir()); PreGame(GetGameDir());
InitGame(GetGameDir()); InitGame(GetGameDir());
CoreNetwork(); CoreNetwork();
} }