Merge pull request #3313
43026822 Wallet2 + CLI wallet: UTF-8 support for filenames and paths under Windows (rbrunner7)
This commit is contained in:
@@ -45,6 +45,11 @@
|
||||
#include <sstream>
|
||||
#include <unordered_map>
|
||||
|
||||
#ifdef WIN32
|
||||
#include <boost/locale.hpp>
|
||||
#include <boost/filesystem.hpp>
|
||||
#endif
|
||||
|
||||
using namespace std;
|
||||
using namespace cryptonote;
|
||||
|
||||
@@ -292,6 +297,11 @@ uint64_t Wallet::maximumAllowedAmount()
|
||||
}
|
||||
|
||||
void Wallet::init(const char *argv0, const char *default_log_base_name) {
|
||||
#ifdef WIN32
|
||||
// Activate UTF-8 support for Boost filesystem classes on Windows
|
||||
std::locale::global(boost::locale::generator().generate(""));
|
||||
boost::filesystem::path::imbue(std::locale());
|
||||
#endif
|
||||
epee::string_tools::set_module_name_and_folder(argv0);
|
||||
mlog_configure(mlog_get_default_log_path(default_log_base_name), true);
|
||||
}
|
||||
|
||||
@@ -3781,12 +3781,24 @@ void wallet2::store_to(const std::string &path, const epee::wipeable_string &pas
|
||||
}
|
||||
} else {
|
||||
// save to new file
|
||||
#ifdef WIN32
|
||||
// On Windows avoid using std::ofstream which does not work with UTF-8 filenames
|
||||
// The price to pay is temporary higher memory consumption for string stream + binary archive
|
||||
std::ostringstream oss;
|
||||
binary_archive<true> oar(oss);
|
||||
bool success = ::serialization::serialize(oar, cache_file_data);
|
||||
if (success) {
|
||||
success = epee::file_io_utils::save_string_to_file(new_file, oss.str());
|
||||
}
|
||||
THROW_WALLET_EXCEPTION_IF(!success, error::file_save_error, new_file);
|
||||
#else
|
||||
std::ofstream ostr;
|
||||
ostr.open(new_file, std::ios_base::binary | std::ios_base::out | std::ios_base::trunc);
|
||||
binary_archive<true> oar(ostr);
|
||||
bool success = ::serialization::serialize(oar, cache_file_data);
|
||||
ostr.close();
|
||||
THROW_WALLET_EXCEPTION_IF(!success || !ostr.good(), error::file_save_error, new_file);
|
||||
#endif
|
||||
|
||||
// here we have "*.new" file, we need to rename it to be without ".new"
|
||||
std::error_code e = tools::replace_file(new_file, m_wallet_file);
|
||||
|
||||
Reference in New Issue
Block a user