diff --git a/contrib/epee/include/file_io_utils.h b/contrib/epee/include/file_io_utils.h index 8e5fa6fd..b79db5b5 100644 --- a/contrib/epee/include/file_io_utils.h +++ b/contrib/epee/include/file_io_utils.h @@ -223,13 +223,23 @@ namespace file_io_utils return str_result; } #endif + + inline const std::wstring& convert_utf8_to_wstring_if_needed(const std::wstring& s) + { + return s; + } + + inline std::wstring convert_utf8_to_wstring_if_needed(const std::string& s) + { + return epee::string_encoding::utf8_to_wstring(s); + } template bool is_file_exist(const t_string& path) - { - boost::filesystem::path p(path); - return boost::filesystem::exists(p); - } + { + boost::filesystem::path p(convert_utf8_to_wstring_if_needed(path)); + return boost::filesystem::exists(p); + } /* inline @@ -262,19 +272,18 @@ namespace file_io_utils template bool save_string_to_file_throw(const t_string& path_to_file, const std::string& str) { - //std::ofstream fstream; - boost::filesystem::ofstream fstream; - fstream.exceptions(std::ifstream::failbit | std::ifstream::badbit); - fstream.open(path_to_file, std::ios_base::binary | std::ios_base::out | std::ios_base::trunc); - fstream << str; - fstream.close(); - return true; + //std::ofstream fstream; + boost::filesystem::ofstream fstream; + fstream.exceptions(std::ifstream::failbit | std::ifstream::badbit); + fstream.open(convert_utf8_to_wstring_if_needed(path_to_file), std::ios_base::binary | std::ios_base::out | std::ios_base::trunc); + fstream << str; + fstream.close(); + return true; } template bool save_string_to_file(const t_string& path_to_file, const std::string& str) { - try { return save_string_to_file_throw(path_to_file, str); @@ -291,13 +300,13 @@ namespace file_io_utils } template - bool load_file_to_string(const t_string& path_to_file, std::string& target_str) + bool load_file_to_string(const t_string& path_to_file, std::string& target_str) { try { boost::filesystem::ifstream fstream; //fstream.exceptions(std::ifstream::failbit | std::ifstream::badbit); - fstream.open(path_to_file, std::ios_base::binary | std::ios_base::in | std::ios::ate); + fstream.open(convert_utf8_to_wstring_if_needed(path_to_file), std::ios_base::binary | std::ios_base::in | std::ios::ate); if (!fstream.good()) return false; std::ifstream::pos_type file_size = fstream.tellg(); @@ -316,7 +325,6 @@ namespace file_io_utils fstream.close(); return true; } - catch (...) { return false; @@ -354,7 +362,7 @@ namespace file_io_utils bool get_file_time(const std::string& path_to_file, OUT time_t& ft) { boost::system::error_code ec; - ft = boost::filesystem::last_write_time(boost::filesystem::path(path_to_file), ec); + ft = boost::filesystem::last_write_time(epee::string_encoding::utf8_to_wstring(path_to_file), ec); if(!ec) return true; else @@ -365,7 +373,7 @@ namespace file_io_utils bool set_file_time(const std::string& path_to_file, const time_t& ft) { boost::system::error_code ec; - boost::filesystem::last_write_time(boost::filesystem::path(path_to_file), ft, ec); + boost::filesystem::last_write_time(epee::string_encoding::utf8_to_wstring(path_to_file), ft, ec); if(!ec) return true; else @@ -468,20 +476,21 @@ namespace file_io_utils bool copy_file(const std::string& source, const std::string& destination) { boost::system::error_code ec; - boost::filesystem::copy_file(source, destination, ec); + boost::filesystem::copy_file(epee::string_encoding::utf8_to_wstring(source), epee::string_encoding::utf8_to_wstring(destination), ec); if (ec) return false; else return true; } + inline bool append_string_to_file(const std::string& path_to_file, const std::string& str) { try { - std::ofstream fstream; + boost::filesystem::ofstream fstream; fstream.exceptions(std::ifstream::failbit | std::ifstream::badbit); - fstream.open(path_to_file.c_str(), std::ios_base::binary | std::ios_base::out | std::ios_base::app); + fstream.open(epee::string_encoding::utf8_to_wstring(path_to_file), std::ios_base::binary | std::ios_base::out | std::ios_base::app); fstream << str; fstream.close(); return true; @@ -553,7 +562,7 @@ namespace file_io_utils { boost::filesystem::directory_iterator end_itr; // default construction yields past-the-end - for ( boost::filesystem::directory_iterator itr( path ); itr != end_itr; ++itr ) + for ( boost::filesystem::directory_iterator itr( epee::string_encoding::utf8_to_wstring(path) ); itr != end_itr; ++itr ) { if ( only_files && boost::filesystem::is_directory(itr->status()) ) { diff --git a/contrib/epee/include/string_tools.h b/contrib/epee/include/string_tools.h index 4d2d06cf..4b153d51 100644 --- a/contrib/epee/include/string_tools.h +++ b/contrib/epee/include/string_tools.h @@ -42,6 +42,7 @@ #include #include "warnings.h" #include "auto_val_init.h" +#include "string_coding.h" #ifndef OUT @@ -536,38 +537,15 @@ POP_GCC_WARNINGS return module_folder; } //---------------------------------------------------------------------------- -#ifdef _WIN32 - inline std::string get_current_module_path() + inline bool set_module_name_and_folder(const std::string& path_to_process_) { - char pname [5000] = {0}; - GetModuleFileNameA( NULL, pname, sizeof(pname)); - pname[sizeof(pname)-1] = 0; //be happy ;) - return pname; - } -#endif - //---------------------------------------------------------------------------- - inline bool set_module_name_and_folder(const std::string& path_to_process_) - { - std::string path_to_process = path_to_process_; - boost::system::error_code ec; - path_to_process = boost::filesystem::canonical(path_to_process, ec).string(); - #ifdef _WIN32 - path_to_process = get_current_module_path(); - #endif - std::string::size_type a = path_to_process.rfind( '\\' ); - if(a == std::string::npos ) - { - a = path_to_process.rfind( '/' ); - } - if ( a != std::string::npos ) - { - get_current_module_name() = path_to_process.substr(a+1, path_to_process.size()); - get_current_module_folder() = path_to_process.substr(0, a); - return true; - }else - return false; + boost::filesystem::path path(epee::string_encoding::utf8_to_wstring(path_to_process_)); - } + get_current_module_folder() = epee::string_encoding::wstring_to_utf8(path.parent_path().wstring()); + get_current_module_name() = epee::string_encoding::wstring_to_utf8(path.filename().wstring()); + + return true; + } //---------------------------------------------------------------------------- inline bool trim_left(std::string& str) { diff --git a/src/common/boost_serialization_helper.h b/src/common/boost_serialization_helper.h index 37932899..2ba8a52c 100644 --- a/src/common/boost_serialization_helper.h +++ b/src/common/boost_serialization_helper.h @@ -21,8 +21,8 @@ namespace tools bool serialize_obj_to_file(t_object& obj, const std::string& file_path) { TRY_ENTRY(); - std::ofstream data_file; - data_file.open( file_path , std::ios_base::binary | std::ios_base::out| std::ios::trunc); + boost::filesystem::ofstream data_file; + data_file.open( epee::string_encoding::utf8_to_wstring(file_path) , std::ios_base::binary | std::ios_base::out| std::ios::trunc); if(data_file.fail()) return false; @@ -64,8 +64,8 @@ namespace tools { TRY_ENTRY(); - std::ifstream data_file; - data_file.open( file_path, std::ios_base::binary | std::ios_base::in); + boost::filesystem::ifstream data_file; + data_file.open( epee::string_encoding::utf8_to_wstring(file_path), std::ios_base::binary | std::ios_base::in); if(data_file.fail()) return false; boost::archive::binary_iarchive a(data_file); diff --git a/src/common/command_line.h b/src/common/command_line.h index 1f14ef22..8b96524a 100644 --- a/src/common/command_line.h +++ b/src/common/command_line.h @@ -122,7 +122,7 @@ namespace command_line boost::program_options::basic_parsed_options parse_command_line(int argc, const charT* const argv[], const boost::program_options::options_description& desc, bool allow_unregistered = false) { - auto parser = boost::program_options::command_line_parser(argc, argv); + auto parser = boost::program_options::basic_command_line_parser(argc, argv); parser.options(desc); if (allow_unregistered) { diff --git a/src/currency_core/blockchain_storage.cpp b/src/currency_core/blockchain_storage.cpp index fd6bb3bd..2b68f647 100644 --- a/src/currency_core/blockchain_storage.cpp +++ b/src/currency_core/blockchain_storage.cpp @@ -225,10 +225,10 @@ bool blockchain_storage::init(const std::string& config_folder, const boost::pro // remove old incompatible DB const std::string old_db_folder_path = m_config_folder + "/" CURRENCY_BLOCKCHAINDATA_FOLDERNAME_OLD; - if (boost::filesystem::exists(old_db_folder_path)) + if (boost::filesystem::exists(epee::string_encoding::utf8_to_wstring(old_db_folder_path))) { LOG_PRINT_YELLOW("Removing old DB in " << old_db_folder_path << "...", LOG_LEVEL_0); - boost::filesystem::remove_all(old_db_folder_path); + boost::filesystem::remove_all(epee::string_encoding::utf8_to_wstring(old_db_folder_path)); } const std::string db_folder_path = m_config_folder + "/" CURRENCY_BLOCKCHAINDATA_FOLDERNAME; @@ -242,7 +242,7 @@ bool blockchain_storage::init(const std::string& config_folder, const boost::pro { // if DB could not be opened -- try to remove the whole folder and re-open DB LOG_PRINT_YELLOW("Failed to initialize database in folder: " << db_folder_path << ", first attempt", LOG_LEVEL_0); - boost::filesystem::remove_all(db_folder_path); + boost::filesystem::remove_all(epee::string_encoding::utf8_to_wstring(db_folder_path)); res = m_db.open(db_folder_path, cache_size_l1); CHECK_AND_ASSERT_MES(res, false, "Failed to initialize database in folder: " << db_folder_path << ", second attempt"); } @@ -312,7 +312,7 @@ bool blockchain_storage::init(const std::string& config_folder, const boost::pro m_db_addr_to_alias.deinit(); m_db_per_block_gindex_incs.deinit(); m_db.close(); - size_t files_removed = boost::filesystem::remove_all(db_folder_path); + size_t files_removed = boost::filesystem::remove_all(epee::string_encoding::utf8_to_wstring(db_folder_path)); LOG_PRINT_L1(files_removed << " files at " << db_folder_path << " removed"); // try to re-create DB and re-init containers @@ -1821,8 +1821,8 @@ bool blockchain_storage::is_reorganize_required(const block_extended_info& main_ main_cumul_diff.pow_diff = main_pow_diff_end - main_pow_diff_begin; //TODO: measurement of precise cumulative difficult - wide_difficulty_type alt = get_a_to_b_relative_cumulative_difficulty(difficulty_pos_at_split_point, difficulty_pow_at_split_point, alt_cumul_diff, main_cumul_diff); - wide_difficulty_type main = get_a_to_b_relative_cumulative_difficulty(difficulty_pos_at_split_point, difficulty_pow_at_split_point, main_cumul_diff, alt_cumul_diff); + boost::multiprecision::uint1024_t alt = get_a_to_b_relative_cumulative_difficulty(difficulty_pos_at_split_point, difficulty_pow_at_split_point, alt_cumul_diff, main_cumul_diff); + boost::multiprecision::uint1024_t main = get_a_to_b_relative_cumulative_difficulty(difficulty_pos_at_split_point, difficulty_pow_at_split_point, main_cumul_diff, alt_cumul_diff); LOG_PRINT_L1("[FORK_CHOICE]: " << ENDL << "difficulty_pow_at_split_point:" << difficulty_pow_at_split_point << ENDL << "difficulty_pos_at_split_point:" << difficulty_pos_at_split_point << ENDL @@ -2644,7 +2644,8 @@ void blockchain_storage::print_blockchain_with_tx(uint64_t start_index, uint64_t { boost::filesystem::ofstream ss; ss.exceptions(/*std::ifstream::failbit |*/ std::ifstream::badbit); - ss.open(log_space::log_singletone::get_default_log_folder() + "/blockchain_with_tx.txt", std::ios_base::binary | std::ios_base::out | std::ios_base::trunc); + ss.open(epee::string_encoding::utf8_to_wstring(log_space::log_singletone::get_default_log_folder() + "/blockchain_with_tx.txt"), + std::ios_base::binary | std::ios_base::out | std::ios_base::trunc); CRITICAL_REGION_LOCAL(m_read_lock); diff --git a/src/currency_core/currency_format_utils.cpp b/src/currency_core/currency_format_utils.cpp index 9c695c57..8fd732a3 100644 --- a/src/currency_core/currency_format_utils.cpp +++ b/src/currency_core/currency_format_utils.cpp @@ -2713,7 +2713,7 @@ namespace currency } - wide_difficulty_type get_a_to_b_relative_cumulative_difficulty(const wide_difficulty_type& difficulty_pos_at_split_point, + boost::multiprecision::uint1024_t get_a_to_b_relative_cumulative_difficulty(const wide_difficulty_type& difficulty_pos_at_split_point, const wide_difficulty_type& difficulty_pow_at_split_point, const difficulties& a_diff, const difficulties& b_diff ) @@ -2728,20 +2728,20 @@ namespace currency boost::multiprecision::uint1024_t res = (basic_sum * a_pow_cumulative_difficulty * a_pos_cumulative_difficulty) / (boost::multiprecision::uint1024_t(b_pow_cumulative_difficulty)*b_pos_cumulative_difficulty); - if (res > boost::math::tools::max_value()) - { - ASSERT_MES_AND_THROW("[INTERNAL ERROR]: Failed to get_a_to_b_relative_cumulative_difficulty, res = " << res << ENDL - << ", difficulty_pos_at_split_point: " << difficulty_pos_at_split_point << ENDL - << ", difficulty_pow_at_split_point:" << difficulty_pow_at_split_point << ENDL - << ", a_pos_cumulative_difficulty:" << a_pos_cumulative_difficulty << ENDL - << ", b_pos_cumulative_difficulty:" << b_pos_cumulative_difficulty << ENDL - << ", a_pow_cumulative_difficulty:" << a_pow_cumulative_difficulty << ENDL - << ", b_pow_cumulative_difficulty:" << b_pow_cumulative_difficulty << ENDL - ); - } +// if (res > boost::math::tools::max_value()) +// { +// ASSERT_MES_AND_THROW("[INTERNAL ERROR]: Failed to get_a_to_b_relative_cumulative_difficulty, res = " << res << ENDL +// << ", difficulty_pos_at_split_point: " << difficulty_pos_at_split_point << ENDL +// << ", difficulty_pow_at_split_point:" << difficulty_pow_at_split_point << ENDL +// << ", a_pos_cumulative_difficulty:" << a_pos_cumulative_difficulty << ENDL +// << ", b_pos_cumulative_difficulty:" << b_pos_cumulative_difficulty << ENDL +// << ", a_pow_cumulative_difficulty:" << a_pow_cumulative_difficulty << ENDL +// << ", b_pow_cumulative_difficulty:" << b_pow_cumulative_difficulty << ENDL +// ); +// } TRY_ENTRY(); - wide_difficulty_type short_res = res.convert_to(); - return short_res; +// wide_difficulty_type short_res = res.convert_to(); + return res; CATCH_ENTRY_WITH_FORWARDING_EXCEPTION(); } diff --git a/src/currency_core/currency_format_utils.h b/src/currency_core/currency_format_utils.h index 4b1aa928..513df6f1 100644 --- a/src/currency_core/currency_format_utils.h +++ b/src/currency_core/currency_format_utils.h @@ -604,7 +604,7 @@ namespace currency wide_difficulty_type pow_diff; }; - wide_difficulty_type get_a_to_b_relative_cumulative_difficulty(const wide_difficulty_type& difficulty_pos_at_split_point, + boost::multiprecision::uint1024_t get_a_to_b_relative_cumulative_difficulty(const wide_difficulty_type& difficulty_pos_at_split_point, const wide_difficulty_type& difficulty_pow_at_split_point, const difficulties& a_diff, const difficulties& b_diff diff --git a/src/currency_core/tx_pool.cpp b/src/currency_core/tx_pool.cpp index b8c56fa4..440bd9a7 100644 --- a/src/currency_core/tx_pool.cpp +++ b/src/currency_core/tx_pool.cpp @@ -1125,10 +1125,10 @@ namespace currency // remove old incompartible DB const std::string old_db_folder_path = m_config_folder + "/" CURRENCY_POOLDATA_FOLDERNAME_OLD; - if (boost::filesystem::exists(old_db_folder_path)) + if (boost::filesystem::exists(epee::string_encoding::utf8_to_wstring(old_db_folder_path))) { LOG_PRINT_YELLOW("Removing old DB in " << old_db_folder_path << "...", LOG_LEVEL_0); - boost::filesystem::remove_all(old_db_folder_path); + boost::filesystem::remove_all(epee::string_encoding::utf8_to_wstring(old_db_folder_path)); } const std::string db_folder_path = m_config_folder + "/" CURRENCY_POOLDATA_FOLDERNAME; @@ -1142,7 +1142,7 @@ namespace currency { // if DB could not be opened -- try to remove the whole folder and re-open DB LOG_PRINT_YELLOW("Failed to initialize database in folder: " << db_folder_path << ", first attempt", LOG_LEVEL_0); - boost::filesystem::remove_all(db_folder_path); + boost::filesystem::remove_all(epee::string_encoding::utf8_to_wstring(db_folder_path)); res = m_db.open(db_folder_path, cache_size_l1); CHECK_AND_ASSERT_MES(res, false, "Failed to initialize database in folder: " << db_folder_path << ", second attempt"); } @@ -1182,7 +1182,7 @@ namespace currency m_db_alias_addresses.deinit(); m_db_solo_options.deinit(); m_db.close(); - size_t files_removed = boost::filesystem::remove_all(db_folder_path); + size_t files_removed = boost::filesystem::remove_all(epee::string_encoding::utf8_to_wstring(db_folder_path)); LOG_PRINT_L1(files_removed << " files at " << db_folder_path << " removed"); // try to re-create DB and re-init containers diff --git a/src/daemon/daemon.cpp b/src/daemon/daemon.cpp index f41affd6..4b07ce89 100644 --- a/src/daemon/daemon.cpp +++ b/src/daemon/daemon.cpp @@ -172,8 +172,8 @@ int main(int argc, char* argv[]) std::string data_dir = command_line::get_arg(vm, command_line::arg_data_dir); std::string config = command_line::get_arg(vm, command_line::arg_config_file); - boost::filesystem::path data_dir_path(data_dir); - boost::filesystem::path config_path(config); + boost::filesystem::path data_dir_path(epee::string_encoding::utf8_to_wstring(data_dir)); + boost::filesystem::path config_path(epee::string_encoding::utf8_to_wstring(config)); if (!config_path.has_parent_path()) { config_path = data_dir_path / config_path; diff --git a/src/gui/qt-daemon/application/daemon_backend.cpp b/src/gui/qt-daemon/application/daemon_backend.cpp index bd62eeb0..3f0a4d02 100644 --- a/src/gui/qt-daemon/application/daemon_backend.cpp +++ b/src/gui/qt-daemon/application/daemon_backend.cpp @@ -154,8 +154,8 @@ bool daemon_backend::init(int argc, char* argv[], view::i_view* pview_handler) m_data_dir = command_line::get_arg(m_vm, command_line::arg_data_dir); std::string config = command_line::get_arg(m_vm, command_line::arg_config_file); - boost::filesystem::path data_dir_path(m_data_dir); - boost::filesystem::path config_path(config); + boost::filesystem::path data_dir_path(epee::string_encoding::utf8_to_wstring(m_data_dir)); + boost::filesystem::path config_path(epee::string_encoding::utf8_to_wstring(config)); if (!config_path.has_parent_path()) { config_path = data_dir_path / config_path; @@ -393,6 +393,7 @@ bool daemon_backend::deinit_local_daemon() LOG_PRINT_L0("Deinitializing p2p..."); //dsi.text_state = "Deinitializing p2p"; m_pview->update_daemon_status(dsi); + m_p2psrv.deinit(); m_ccore.set_currency_protocol(NULL); m_cprotocol.set_p2p_endpoint(NULL); diff --git a/src/gui/qt-daemon/application/gui_utils.cpp b/src/gui/qt-daemon/application/gui_utils.cpp index 7ccfdb1e..1a7b66bc 100644 --- a/src/gui/qt-daemon/application/gui_utils.cpp +++ b/src/gui/qt-daemon/application/gui_utils.cpp @@ -75,14 +75,14 @@ namespace gui_tools { namespace fs = boost::filesystem; - char pszPath[MAX_PATH] = ""; + wchar_t pszPath[MAX_PATH] = L""; - if (SHGetSpecialFolderPathA(NULL, pszPath, nFolder, fCreate)) + if (SHGetSpecialFolderPathW(NULL, pszPath, nFolder, fCreate)) { return fs::path(pszPath); } - //LogPrintf("SHGetSpecialFolderPathA() failed, could not obtain requested path.\n"); + //LogPrintf("SHGetSpecialFolderPathW() failed, could not obtain requested path.\n"); return fs::path(""); } #endif diff --git a/src/gui/qt-daemon/application/mainwindow.cpp b/src/gui/qt-daemon/application/mainwindow.cpp index 4777a0bb..7d5a834c 100644 --- a/src/gui/qt-daemon/application/mainwindow.cpp +++ b/src/gui/qt-daemon/application/mainwindow.cpp @@ -316,12 +316,12 @@ bool MainWindow::load_app_config() CATCH_ENTRY2(false); } -bool MainWindow::init(const std::string& htmlPath) +bool MainWindow::init(const std::string& html_path) { TRY_ENTRY(); //QtWebEngine::initialize(); - init_tray_icon(htmlPath); - set_html_path(htmlPath); + init_tray_icon(html_path); + set_html_path(html_path); m_backend.subscribe_to_core_events(this); @@ -354,7 +354,7 @@ void MainWindow::on_menu_show() CATCH_ENTRY2(void()); } -void MainWindow::init_tray_icon(const std::string& htmlPath) +void MainWindow::init_tray_icon(const std::string& html_path) { TRY_ENTRY(); if (!QSystemTrayIcon::isSystemTrayAvailable()) @@ -384,14 +384,14 @@ void MainWindow::init_tray_icon(const std::string& htmlPath) //setup icon #ifdef TARGET_OS_MAC - m_normal_icon_path = htmlPath + "/files/app22macos.png"; // X11 tray icon size is 22x22 - m_blocked_icon_path = htmlPath + "/files/app22macos_blocked.png"; // X11 tray icon size is 22x22 + m_normal_icon_path = html_path + "/files/app22macos.png"; // X11 tray icon size is 22x22 + m_blocked_icon_path = html_path + "/files/app22macos_blocked.png"; // X11 tray icon size is 22x22 #else - m_normal_icon_path = htmlPath + "/files/app22windows.png"; // X11 tray icon size is 22x22 - m_blocked_icon_path = htmlPath + "/files/app22windows_blocked.png"; // X11 tray icon size + m_normal_icon_path = html_path + "/files/app22windows.png"; // X11 tray icon size is 22x22 + m_blocked_icon_path = html_path + "/files/app22windows_blocked.png"; // X11 tray icon size #endif //setWindowIcon(QIcon(iconPath.c_str())); - QIcon qi(m_normal_icon_path.c_str()); + QIcon qi( QString::fromWCharArray(epee::string_encoding::utf8_to_wstring(m_normal_icon_path).c_str()) ); qi.setIsMask(true); m_tray_icon->setIcon(qi); m_tray_icon->setToolTip(CURRENCY_NAME_BASE); @@ -411,7 +411,7 @@ void MainWindow::bool_toggle_icon(const QString& param) else path = m_normal_icon_path; - QIcon qi(path.c_str()); + QIcon qi( QString::fromWCharArray(epee::string_encoding::utf8_to_wstring(path).c_str()) ); qi.setIsMask(true); m_tray_icon->setIcon(qi); CATCH_ENTRY2(void()); @@ -771,7 +771,7 @@ bool MainWindow::set_html_path(const std::string& path) TRY_ENTRY(); //init_tray_icon(path); #ifdef _MSC_VER - QString url = QString::fromUtf8(epee::string_encoding::convert_ansii_to_utf8(path).c_str()) + "/index.html"; + QString url = QString::fromUtf8(path.c_str()) + "/index.html"; load_file(url); #else // load_file(QString((std::string("file://") + path + "/index.html").c_str())); @@ -1232,7 +1232,7 @@ QString MainWindow::have_secure_app_data() view::api_response ar = AUTO_VAL_INIT(ar); boost::system::error_code ec; - if (boost::filesystem::exists(m_backend.get_config_folder() + "/" + GUI_SECURE_CONFIG_FILENAME, ec)) + if (boost::filesystem::exists(epee::string_encoding::utf8_to_wstring(m_backend.get_config_folder() + "/" + GUI_SECURE_CONFIG_FILENAME), ec)) ar.error_code = API_RETURN_CODE_TRUE; else ar.error_code = API_RETURN_CODE_FALSE; @@ -1240,6 +1240,7 @@ QString MainWindow::have_secure_app_data() return MAKE_RESPONSE(ar); CATCH_ENTRY_FAIL_API_RESPONCE(); } + QString MainWindow::drop_secure_app_data() { TRY_ENTRY(); @@ -1247,13 +1248,14 @@ QString MainWindow::drop_secure_app_data() view::api_response ar = AUTO_VAL_INIT(ar); boost::system::error_code ec; - if (boost::filesystem::remove(m_backend.get_config_folder() + "/" + GUI_SECURE_CONFIG_FILENAME, ec)) + if (boost::filesystem::remove(epee::string_encoding::utf8_to_wstring(m_backend.get_config_folder() + "/" + GUI_SECURE_CONFIG_FILENAME), ec)) ar.error_code = API_RETURN_CODE_TRUE; else ar.error_code = API_RETURN_CODE_FALSE; return MAKE_RESPONSE(ar); CATCH_ENTRY_FAIL_API_RESPONCE(); } + QString MainWindow::get_all_aliases() { TRY_ENTRY(); diff --git a/src/gui/qt-daemon/main.cpp b/src/gui/qt-daemon/main.cpp index e5aca25a..28e7a564 100644 --- a/src/gui/qt-daemon/main.cpp +++ b/src/gui/qt-daemon/main.cpp @@ -42,8 +42,16 @@ int main(int argc, char *argv[]) #endif +#ifdef WIN32 + WCHAR sz_file_name[MAX_PATH + 1] = L""; + ::GetModuleFileNameW(NULL, sz_file_name, MAX_PATH + 1); + std::string path_to_process_utf8 = epee::string_encoding::wstring_to_utf8(sz_file_name); +#else + std::string path_to_process_utf8 = argv[0]; +#endif + TRY_ENTRY(); - epee::string_tools::set_module_name_and_folder(argv[0]); + epee::string_tools::set_module_name_and_folder(path_to_process_utf8); QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); #ifdef _MSC_VER #if _MSC_VER >= 1910 diff --git a/src/simplewallet/simplewallet.cpp b/src/simplewallet/simplewallet.cpp index db6e604f..68f65a96 100644 --- a/src/simplewallet/simplewallet.cpp +++ b/src/simplewallet/simplewallet.cpp @@ -331,7 +331,7 @@ bool simple_wallet::init(const boost::program_options::variables_map& vm) } else { - bool r = open_wallet(epee::string_encoding::convert_to_ansii(m_wallet_file), pwd_container.password()); + bool r = open_wallet(m_wallet_file, pwd_container.password()); CHECK_AND_ASSERT_MES(r, false, "could not open account"); } @@ -379,7 +379,7 @@ bool simple_wallet::new_wallet(const string &wallet_file, const std::string& pas m_wallet->set_do_rise_transfer(false); try { - m_wallet->generate(epee::string_encoding::convert_to_unicode(m_wallet_file), password); + m_wallet->generate(epee::string_encoding::utf8_to_wstring(m_wallet_file), password); message_writer(epee::log_space::console_color_white, true) << "Generated new wallet: " << m_wallet->get_account().get_public_address_str(); std::cout << "view key: " << string_tools::pod_to_hex(m_wallet->get_account().get_keys().m_view_secret_key) << std::endl << std::flush; if(m_do_not_set_date) @@ -421,7 +421,7 @@ bool simple_wallet::restore_wallet(const std::string &wallet_file, const std::st m_wallet->set_do_rise_transfer(false); try { - m_wallet->restore(epee::string_encoding::convert_to_unicode(wallet_file), password, restore_seed); + m_wallet->restore(epee::string_encoding::utf8_to_wstring(wallet_file), password, restore_seed); message_writer(epee::log_space::console_color_white, true) << "Wallet restored: " << m_wallet->get_account().get_public_address_str(); std::cout << "view key: " << string_tools::pod_to_hex(m_wallet->get_account().get_keys().m_view_secret_key) << std::endl << std::flush; if (m_do_not_set_date) @@ -457,7 +457,7 @@ bool simple_wallet::open_wallet(const string &wallet_file, const std::string& pa { try { - m_wallet->load(epee::string_encoding::convert_to_unicode(m_wallet_file), password); + m_wallet->load(epee::string_encoding::utf8_to_wstring(m_wallet_file), password); message_writer(epee::log_space::console_color_white, true) << "Opened" << (m_wallet->is_watch_only() ? " watch-only" : "") << " wallet: " << m_wallet->get_account().get_public_address_str(); if (m_print_brain_wallet) @@ -1512,7 +1512,11 @@ bool simple_wallet::submit_transfer(const std::vector &args) return true; } //---------------------------------------------------------------------------------------------------- +#ifdef WIN32 +int wmain( int argc, wchar_t* argv_w[ ], wchar_t* envp[ ] ) +#else int main(int argc, char* argv[]) +#endif { #ifdef WIN32 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); @@ -1528,6 +1532,18 @@ int main(int argc, char* argv[]) std::fflush(nullptr); }); +#ifdef WIN32 + // windows: convert argv_w into UTF-8-encoded std::string the same way it is in Linux and macOS + std::vector argv_str; + std::vector argv_vec; + for (size_t i = 0; i < argc; ++i) + { + argv_str.push_back( epee::string_encoding::wstring_to_utf8( argv_w[i] ) ); + argv_vec.push_back( argv_str.back().c_str() ); + } + const char* const* argv = argv_vec.data(); +#endif + string_tools::set_module_name_and_folder(argv[0]); po::options_description desc_general("General options"); @@ -1662,7 +1678,7 @@ int main(int argc, char* argv[]) try { LOG_PRINT_L0("Loading wallet..."); - wal.load(epee::string_encoding::convert_to_unicode(wallet_file), pwd_container.password()); + wal.load(epee::string_encoding::utf8_to_wstring(wallet_file), pwd_container.password()); } catch (const tools::error::wallet_load_notice_wallet_restored& e) { diff --git a/src/version.h.in b/src/version.h.in index 68442457..b084d7d3 100644 --- a/src/version.h.in +++ b/src/version.h.in @@ -7,6 +7,6 @@ #define PROJECT_REVISION "0" #define PROJECT_VERSION PROJECT_MAJOR_VERSION "." PROJECT_MINOR_VERSION "." PROJECT_REVISION -#define PROJECT_VERSION_BUILD_NO 58 +#define PROJECT_VERSION_BUILD_NO 60 #define PROJECT_VERSION_BUILD_NO_STR STRINGIFY_EXPAND(PROJECT_VERSION_BUILD_NO) #define PROJECT_VERSION_LONG PROJECT_VERSION "." PROJECT_VERSION_BUILD_NO_STR "[" BUILD_COMMIT_ID "]"