From 3c7cf94643bc45237d1e61c4e6015d498e4400b0 Mon Sep 17 00:00:00 2001 From: Denis Krjuchkov Date: Thu, 24 Jan 2013 02:26:38 +0600 Subject: Path: convert fs_charset_to_utf8() to static method Path::ToUTF8() --- src/fs/Path.cxx | 35 +++++++++++++++++++++-------------- src/fs/Path.hxx | 18 ++++++++++-------- 2 files changed, 31 insertions(+), 22 deletions(-) (limited to 'src/fs') diff --git a/src/fs/Path.cxx b/src/fs/Path.cxx index 294f60781..0590fbd8f 100644 --- a/src/fs/Path.cxx +++ b/src/fs/Path.cxx @@ -48,24 +48,31 @@ static char *fs_charset; -std::string Path::ToUTF8() const +std::string Path::ToUTF8(const_pointer path_fs) { - if (value == nullptr) + if (path_fs == nullptr) return std::string(); - char *path_utf8 = fs_charset_to_utf8(value); - if (path_utf8 == nullptr) + + GIConv conv = g_iconv_open("utf-8", fs_charset); + if (conv == reinterpret_cast(-1)) return std::string(); - std::string result = value; - g_free(path_utf8); - return value; -} -char * -fs_charset_to_utf8(const char *path_fs) -{ - return g_convert(path_fs, -1, - "utf-8", fs_charset, - NULL, NULL, NULL); + // g_iconv() does not need nul-terminator, + // std::string could be created without it too. + char path_utf8[MPD_PATH_MAX_UTF8 - 1]; + char *in = const_cast(path_fs); + char *out = path_utf8; + size_t in_left = strlen(path_fs); + size_t out_left = sizeof(path_utf8); + + size_t ret = g_iconv(conv, &in, &in_left, &out, &out_left); + + g_iconv_close(conv); + + if (ret == static_cast(-1) || in_left > 0) + return std::string(); + + return std::string(path_utf8, sizeof(path_utf8) - out_left); } char * diff --git a/src/fs/Path.hxx b/src/fs/Path.hxx index 0b51983f6..87c3551e9 100644 --- a/src/fs/Path.hxx +++ b/src/fs/Path.hxx @@ -48,13 +48,6 @@ void path_global_init(); void path_global_finish(); -/** - * Converts a file name in the filesystem charset to UTF-8. Returns - * NULL on failure. - */ -char * -fs_charset_to_utf8(const char *path_fs); - /** * Converts a file name in UTF-8 to the filesystem charset. Returns a * duplicate of the UTF-8 string on failure. @@ -173,6 +166,13 @@ public: return Path(Donate(), utf8_to_fs_charset(utf8)); } + /** + * Convert the path to UTF-8. + * Returns empty string on error or if #path_fs is null pointer. + */ + gcc_pure + static std::string ToUTF8(const_pointer path_fs); + /** * Copy a #Path object. */ @@ -257,7 +257,9 @@ public: * Returns empty string on error or if this instance is "nulled" * (#IsNull returns true). */ - std::string ToUTF8() const; + std::string ToUTF8() const { + return ToUTF8(value); + } }; #endif -- cgit v1.2.3