aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/developer-notes.md2
-rw-r--r--src/bench/wallet_create.cpp2
-rw-r--r--src/qt/guiutil.cpp2
-rw-r--r--src/rpc/blockchain.cpp10
-rw-r--r--src/rpc/mempool.cpp2
-rw-r--r--src/rpc/server.cpp2
-rw-r--r--src/test/fs_tests.cpp7
-rw-r--r--src/util/fs.h17
-rw-r--r--src/wallet/rpc/backup.cpp4
-rw-r--r--src/wallet/rpc/wallet.cpp4
10 files changed, 29 insertions, 23 deletions
diff --git a/doc/developer-notes.md b/doc/developer-notes.md
index 791c049a4a..00a3b2ea6d 100644
--- a/doc/developer-notes.md
+++ b/doc/developer-notes.md
@@ -1406,7 +1406,7 @@ A few guidelines for introducing and reviewing new RPC interfaces:
- *Rationale*: User-facing consistency.
-- Use `fs::path::u8string()` and `fs::u8path()` functions when converting path
+- Use `fs::path::u8string()`/`fs::path::utf8string()` and `fs::u8path()` functions when converting path
to JSON strings, not `fs::PathToString` and `fs::PathFromString`
- *Rationale*: JSON strings are Unicode strings, not byte strings, and
diff --git a/src/bench/wallet_create.cpp b/src/bench/wallet_create.cpp
index ba3c25d25e..993c4c4b3f 100644
--- a/src/bench/wallet_create.cpp
+++ b/src/bench/wallet_create.cpp
@@ -34,7 +34,7 @@ static void WalletCreate(benchmark::Bench& bench, bool encrypted)
fs::path wallet_path = test_setup->m_path_root / strprintf("test_wallet_%d", random.rand32()).c_str();
bench.run([&] {
- auto wallet = CreateWallet(context, wallet_path.u8string(), /*load_on_start=*/std::nullopt, options, status, error_string, warnings);
+ auto wallet = CreateWallet(context, wallet_path.utf8string(), /*load_on_start=*/std::nullopt, options, status, error_string, warnings);
assert(status == DatabaseStatus::SUCCESS);
assert(wallet != nullptr);
diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp
index b8ac187ff9..ebfd14cc25 100644
--- a/src/qt/guiutil.cpp
+++ b/src/qt/guiutil.cpp
@@ -669,7 +669,7 @@ fs::path QStringToPath(const QString &path)
QString PathToQString(const fs::path &path)
{
- return QString::fromStdString(path.u8string());
+ return QString::fromStdString(path.utf8string());
}
QString NetworkToQString(Network net)
diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp
index be6a8c47fd..7556366692 100644
--- a/src/rpc/blockchain.cpp
+++ b/src/rpc/blockchain.cpp
@@ -2603,7 +2603,7 @@ static RPCHelpMan dumptxoutset()
if (fs::exists(path)) {
throw JSONRPCError(
RPC_INVALID_PARAMETER,
- path.u8string() + " already exists. If you are sure this is what you want, "
+ path.utf8string() + " already exists. If you are sure this is what you want, "
"move it out of the way first");
}
@@ -2612,7 +2612,7 @@ static RPCHelpMan dumptxoutset()
if (afile.IsNull()) {
throw JSONRPCError(
RPC_INVALID_PARAMETER,
- "Couldn't open file " + temppath.u8string() + " for writing.");
+ "Couldn't open file " + temppath.utf8string() + " for writing.");
}
NodeContext& node = EnsureAnyNodeContext(request.context);
@@ -2620,7 +2620,7 @@ static RPCHelpMan dumptxoutset()
node, node.chainman->ActiveChainstate(), afile, path, temppath);
fs::rename(temppath, path);
- result.pushKV("path", path.u8string());
+ result.pushKV("path", path.utf8string());
return result;
},
};
@@ -2692,7 +2692,7 @@ UniValue CreateUTXOSnapshot(
result.pushKV("coins_written", maybe_stats->coins_count);
result.pushKV("base_hash", tip->GetBlockHash().ToString());
result.pushKV("base_height", tip->nHeight);
- result.pushKV("path", path.u8string());
+ result.pushKV("path", path.utf8string());
result.pushKV("txoutset_hash", maybe_stats->hashSerialized.ToString());
result.pushKV("nchaintx", tip->nChainTx);
return result;
@@ -2745,7 +2745,7 @@ static RPCHelpMan loadtxoutset()
if (afile.IsNull()) {
throw JSONRPCError(
RPC_INVALID_PARAMETER,
- "Couldn't open file " + path.u8string() + " for reading.");
+ "Couldn't open file " + path.utf8string() + " for reading.");
}
SnapshotMetadata metadata;
diff --git a/src/rpc/mempool.cpp b/src/rpc/mempool.cpp
index 04bd7fa928..f6d9d42f0f 100644
--- a/src/rpc/mempool.cpp
+++ b/src/rpc/mempool.cpp
@@ -806,7 +806,7 @@ static RPCHelpMan savemempool()
}
UniValue ret(UniValue::VOBJ);
- ret.pushKV("filename", dump_path.u8string());
+ ret.pushKV("filename", dump_path.utf8string());
return ret;
},
diff --git a/src/rpc/server.cpp b/src/rpc/server.cpp
index 7adc28f416..ea5271f434 100644
--- a/src/rpc/server.cpp
+++ b/src/rpc/server.cpp
@@ -243,7 +243,7 @@ static RPCHelpMan getrpcinfo()
UniValue result(UniValue::VOBJ);
result.pushKV("active_commands", active_commands);
- const std::string path = LogInstance().m_file_path.u8string();
+ const std::string path = LogInstance().m_file_path.utf8string();
UniValue log_path(UniValue::VSTR, path);
result.pushKV("logpath", log_path);
diff --git a/src/test/fs_tests.cpp b/src/test/fs_tests.cpp
index f6fab7f733..1581a37a07 100644
--- a/src/test/fs_tests.cpp
+++ b/src/test/fs_tests.cpp
@@ -20,9 +20,10 @@ BOOST_AUTO_TEST_CASE(fsbridge_pathtostring)
std::string u8_str = "fs_tests_₿_🏃";
std::u8string str8{u8"fs_tests_₿_🏃"};
BOOST_CHECK_EQUAL(fs::PathToString(fs::PathFromString(u8_str)), u8_str);
- BOOST_CHECK_EQUAL(fs::u8path(u8_str).u8string(), u8_str);
- BOOST_CHECK_EQUAL(fs::path(str8).u8string(), u8_str);
- BOOST_CHECK_EQUAL(fs::PathFromString(u8_str).u8string(), u8_str);
+ BOOST_CHECK_EQUAL(fs::u8path(u8_str).utf8string(), u8_str);
+ BOOST_CHECK_EQUAL(fs::path(str8).utf8string(), u8_str);
+ BOOST_CHECK(fs::path(str8).u8string() == str8);
+ BOOST_CHECK_EQUAL(fs::PathFromString(u8_str).utf8string(), u8_str);
BOOST_CHECK_EQUAL(fs::PathToString(fs::u8path(u8_str)), u8_str);
#ifndef WIN32
// On non-windows systems, verify that arbitrary byte strings containing
diff --git a/src/util/fs.h b/src/util/fs.h
index 4eee97c338..f841e0d76c 100644
--- a/src/util/fs.h
+++ b/src/util/fs.h
@@ -54,10 +54,15 @@ public:
// Disallow std::string conversion method to avoid locale-dependent encoding on windows.
std::string string() const = delete;
- std::string u8string() const
+ /**
+ * Return a UTF-8 representation of the path as a std::string, for
+ * compatibility with code using std::string. For code using the newer
+ * std::u8string type, it is more efficient to call the inherited
+ * std::filesystem::path::u8string method instead.
+ */
+ std::string utf8string() const
{
const std::u8string& utf8_str{std::filesystem::path::u8string()};
- // Convert to std::string as a convenience for use in RPC code.
return std::string{utf8_str.begin(), utf8_str.end()};
}
@@ -136,7 +141,7 @@ static inline bool copy_file(const path& from, const path& to, copy_options opti
* Because \ref PathToString and \ref PathFromString functions don't specify an
* encoding, they are meant to be used internally, not externally. They are not
* appropriate to use in applications requiring UTF-8, where
- * fs::path::u8string() and fs::u8path() methods should be used instead. Other
+ * fs::path::u8string() / fs::path::utf8string() and fs::u8path() methods should be used instead. Other
* applications could require still different encodings. For example, JSON, XML,
* or URI applications might prefer to use higher-level escapes (\uXXXX or
* &XXXX; or %XX) instead of multibyte encoding. Rust, Python, Java applications
@@ -150,13 +155,13 @@ static inline std::string PathToString(const path& path)
// use here, because these methods encode the path using C++'s narrow
// multibyte encoding, which on Windows corresponds to the current "code
// page", which is unpredictable and typically not able to represent all
- // valid paths. So fs::path::u8string() and
+ // valid paths. So fs::path::utf8string() and
// fs::u8path() functions are used instead on Windows. On
- // POSIX, u8string/u8path functions are not safe to use because paths are
+ // POSIX, u8string/utf8string/u8path functions are not safe to use because paths are
// not always valid UTF-8, so plain string methods which do not transform
// the path there are used.
#ifdef WIN32
- return path.u8string();
+ return path.utf8string();
#else
static_assert(std::is_same<path::string_type, std::string>::value, "PathToString not implemented on this platform");
return path.std::filesystem::path::string();
diff --git a/src/wallet/rpc/backup.cpp b/src/wallet/rpc/backup.cpp
index 3e1ec667e0..99c548bf1d 100644
--- a/src/wallet/rpc/backup.cpp
+++ b/src/wallet/rpc/backup.cpp
@@ -734,7 +734,7 @@ RPCHelpMan dumpwallet()
* It may also avoid other security issues.
*/
if (fs::exists(filepath)) {
- throw JSONRPCError(RPC_INVALID_PARAMETER, filepath.u8string() + " already exists. If you are sure this is what you want, move it out of the way first");
+ throw JSONRPCError(RPC_INVALID_PARAMETER, filepath.utf8string() + " already exists. If you are sure this is what you want, move it out of the way first");
}
std::ofstream file;
@@ -828,7 +828,7 @@ RPCHelpMan dumpwallet()
file.close();
UniValue reply(UniValue::VOBJ);
- reply.pushKV("filename", filepath.u8string());
+ reply.pushKV("filename", filepath.utf8string());
return reply;
},
diff --git a/src/wallet/rpc/wallet.cpp b/src/wallet/rpc/wallet.cpp
index 164ce9afed..4417f8aa6a 100644
--- a/src/wallet/rpc/wallet.cpp
+++ b/src/wallet/rpc/wallet.cpp
@@ -165,7 +165,7 @@ static RPCHelpMan listwalletdir()
UniValue wallets(UniValue::VARR);
for (const auto& path : ListDatabases(GetWalletDir())) {
UniValue wallet(UniValue::VOBJ);
- wallet.pushKV("name", path.u8string());
+ wallet.pushKV("name", path.utf8string());
wallets.push_back(wallet);
}
@@ -802,7 +802,7 @@ static RPCHelpMan migratewallet()
if (res->solvables_wallet) {
r.pushKV("solvables_name", res->solvables_wallet->GetName());
}
- r.pushKV("backup_path", res->backup_path.u8string());
+ r.pushKV("backup_path", res->backup_path.utf8string());
return r;
},