diff options
author | Denis Krjuchkov <denis@crazydev.net> | 2013-01-24 02:26:38 +0600 |
---|---|---|
committer | Denis Krjuchkov <denis@crazydev.net> | 2013-01-28 00:13:45 +0600 |
commit | 3c7cf94643bc45237d1e61c4e6015d498e4400b0 (patch) | |
tree | be93d9088f7b8199b0d07cce56017e6726a47f76 /src/fs | |
parent | 3bd35d188320f20a98a1004c001b132fc0975437 (diff) |
Path: convert fs_charset_to_utf8() to static method Path::ToUTF8()
Diffstat (limited to 'src/fs')
-rw-r--r-- | src/fs/Path.cxx | 35 | ||||
-rw-r--r-- | src/fs/Path.hxx | 18 |
2 files changed, 31 insertions, 22 deletions
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<GIConv>(-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<char *>(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<size_t>(-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 @@ -49,13 +49,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. */ @@ -174,6 +167,13 @@ public: } /** + * 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. */ Path &operator=(const Path &other) { @@ -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 |