Path: convert fs_charset_to_utf8() to static method Path::ToUTF8()
This commit is contained in:
parent
3bd35d1883
commit
3c7cf94643
@ -289,14 +289,14 @@ mpd_inotify_callback(int wd, unsigned mask,
|
|||||||
(mask & (IN_CREATE|IN_ISDIR)) == (IN_CREATE|IN_ISDIR))) {
|
(mask & (IN_CREATE|IN_ISDIR)) == (IN_CREATE|IN_ISDIR))) {
|
||||||
/* a file was changed, or a directory was
|
/* a file was changed, or a directory was
|
||||||
moved/deleted: queue a database update */
|
moved/deleted: queue a database update */
|
||||||
char *uri_utf8 = uri_fs != NULL
|
|
||||||
? fs_charset_to_utf8(uri_fs)
|
|
||||||
: g_strdup("");
|
|
||||||
|
|
||||||
if (uri_utf8 != NULL) {
|
if (uri_fs != nullptr) {
|
||||||
inotify_queue->Enqueue(uri_utf8);
|
const std::string uri_utf8 = Path::ToUTF8(uri_fs);
|
||||||
g_free(uri_utf8);
|
if (!uri_utf8.empty())
|
||||||
|
inotify_queue->Enqueue(uri_utf8.c_str());
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
inotify_queue->Enqueue("");
|
||||||
}
|
}
|
||||||
|
|
||||||
g_free(uri_fs);
|
g_free(uri_fs);
|
||||||
|
@ -246,7 +246,11 @@ map_fs_to_utf8(const char *path_fs)
|
|||||||
while (path_fs[0] == G_DIR_SEPARATOR)
|
while (path_fs[0] == G_DIR_SEPARATOR)
|
||||||
++path_fs;
|
++path_fs;
|
||||||
|
|
||||||
return fs_charset_to_utf8(path_fs);
|
const std::string path_utf8 = Path::ToUTF8(path_fs);
|
||||||
|
if (path_utf8.empty())
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
return g_strdup(path_utf8.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
const Path &
|
const Path &
|
||||||
|
@ -163,13 +163,12 @@ LoadPlaylistFileInfo(PlaylistInfo &info,
|
|||||||
|
|
||||||
char *name = g_strndup(name_fs,
|
char *name = g_strndup(name_fs,
|
||||||
name_length + 1 - sizeof(PLAYLIST_FILE_SUFFIX));
|
name_length + 1 - sizeof(PLAYLIST_FILE_SUFFIX));
|
||||||
char *name_utf8 = fs_charset_to_utf8(name);
|
std::string name_utf8 = Path::ToUTF8(name);
|
||||||
g_free(name);
|
g_free(name);
|
||||||
if (name_utf8 == NULL)
|
if (name_utf8.empty())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
info.name = name_utf8;
|
info.name = std::move(name_utf8);
|
||||||
g_free(name_utf8);
|
|
||||||
info.mtime = st.st_mtime;
|
info.mtime = st.st_mtime;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -65,18 +65,15 @@ apply_song_metadata(struct song *dest, const struct song *src)
|
|||||||
return dest;
|
return dest;
|
||||||
|
|
||||||
if (song_in_database(dest)) {
|
if (song_in_database(dest)) {
|
||||||
char *path_fs = map_song_fs(dest).Steal();
|
const Path &path_fs = map_song_fs(dest);
|
||||||
if (path_fs == nullptr)
|
if (path_fs.IsNull())
|
||||||
return dest;
|
return dest;
|
||||||
|
|
||||||
char *path_utf8 = fs_charset_to_utf8(path_fs);
|
std::string path_utf8 = path_fs.ToUTF8();
|
||||||
if (path_utf8 != NULL)
|
if (path_utf8.empty())
|
||||||
g_free(path_fs);
|
path_utf8 = path_fs.c_str();
|
||||||
else
|
|
||||||
path_utf8 = path_fs;
|
|
||||||
|
|
||||||
tmp = song_file_new(path_utf8, NULL);
|
tmp = song_file_new(path_utf8.c_str(), NULL);
|
||||||
g_free(path_utf8);
|
|
||||||
|
|
||||||
merge_song_metadata(tmp, dest, src);
|
merge_song_metadata(tmp, dest, src);
|
||||||
} else {
|
} else {
|
||||||
|
@ -373,28 +373,25 @@ update_directory(Directory *directory, const struct stat *st)
|
|||||||
|
|
||||||
struct dirent *ent;
|
struct dirent *ent;
|
||||||
while ((ent = readdir(dir))) {
|
while ((ent = readdir(dir))) {
|
||||||
char *utf8;
|
std::string utf8;
|
||||||
struct stat st2;
|
struct stat st2;
|
||||||
|
|
||||||
if (skip_path(ent->d_name) || exclude_list.Check(ent->d_name))
|
if (skip_path(ent->d_name) || exclude_list.Check(ent->d_name))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
utf8 = fs_charset_to_utf8(ent->d_name);
|
utf8 = Path::ToUTF8(ent->d_name);
|
||||||
if (utf8 == NULL)
|
if (utf8.empty())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (skip_symlink(directory, utf8)) {
|
if (skip_symlink(directory, utf8.c_str())) {
|
||||||
modified |= delete_name_in(directory, utf8);
|
modified |= delete_name_in(directory, utf8.c_str());
|
||||||
g_free(utf8);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stat_directory_child(directory, utf8, &st2) == 0)
|
if (stat_directory_child(directory, utf8.c_str(), &st2) == 0)
|
||||||
update_directory_child(directory, utf8, &st2);
|
update_directory_child(directory, utf8.c_str(), &st2);
|
||||||
else
|
else
|
||||||
modified |= delete_name_in(directory, utf8);
|
modified |= delete_name_in(directory, utf8.c_str());
|
||||||
|
|
||||||
g_free(utf8);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
closedir(dir);
|
closedir(dir);
|
||||||
|
@ -48,24 +48,31 @@
|
|||||||
|
|
||||||
static char *fs_charset;
|
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();
|
return std::string();
|
||||||
char *path_utf8 = fs_charset_to_utf8(value);
|
|
||||||
if (path_utf8 == nullptr)
|
|
||||||
return std::string();
|
|
||||||
std::string result = value;
|
|
||||||
g_free(path_utf8);
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *
|
GIConv conv = g_iconv_open("utf-8", fs_charset);
|
||||||
fs_charset_to_utf8(const char *path_fs)
|
if (conv == reinterpret_cast<GIConv>(-1))
|
||||||
{
|
return std::string();
|
||||||
return g_convert(path_fs, -1,
|
|
||||||
"utf-8", fs_charset,
|
// g_iconv() does not need nul-terminator,
|
||||||
NULL, NULL, NULL);
|
// 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 *
|
char *
|
||||||
|
@ -48,13 +48,6 @@ void path_global_init();
|
|||||||
|
|
||||||
void path_global_finish();
|
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
|
* Converts a file name in UTF-8 to the filesystem charset. Returns a
|
||||||
* duplicate of the UTF-8 string on failure.
|
* duplicate of the UTF-8 string on failure.
|
||||||
@ -173,6 +166,13 @@ public:
|
|||||||
return Path(Donate(), utf8_to_fs_charset(utf8));
|
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.
|
* Copy a #Path object.
|
||||||
*/
|
*/
|
||||||
@ -257,7 +257,9 @@ public:
|
|||||||
* Returns empty string on error or if this instance is "nulled"
|
* Returns empty string on error or if this instance is "nulled"
|
||||||
* (#IsNull returns true).
|
* (#IsNull returns true).
|
||||||
*/
|
*/
|
||||||
std::string ToUTF8() const;
|
std::string ToUTF8() const {
|
||||||
|
return ToUTF8(value);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user