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 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) (limited to 'src/fs/Path.cxx') 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 * -- cgit v1.2.3