diff options
author | Denis Krjuchkov <denis@crazydev.net> | 2012-06-03 13:00:11 +0600 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2012-06-12 19:31:19 +0200 |
commit | 25d053cbf288fb966526c554bea6158ef5c38202 (patch) | |
tree | ceb3bda54406eec336aedf138ab326e966077a5f /src | |
parent | 055257a210015a623062ad3ad3cb8a40fbc6839f (diff) | |
download | mpd-25d053cbf288fb966526c554bea6158ef5c38202.tar.gz mpd-25d053cbf288fb966526c554bea6158ef5c38202.tar.xz mpd-25d053cbf288fb966526c554bea6158ef5c38202.zip |
Work around incorrect g_file_test() behavior on Win32
g_file_test is redefined to be g_file_test_utf8 and thus can't handle
non-ASCII characters. This fix adds simple wrapper (taken from glib)
that fixes encoding and calls g_file_test_utf8. All required inclusions
of glib_compat.h are added as well.
Diffstat (limited to 'src')
-rw-r--r-- | src/cmdline.c | 1 | ||||
-rw-r--r-- | src/decoder/wildmidi_decoder_plugin.c | 1 | ||||
-rw-r--r-- | src/glib_compat.h | 28 | ||||
-rw-r--r-- | src/playlist_save.c | 1 | ||||
-rw-r--r-- | src/update_walk.c | 1 |
5 files changed, 32 insertions, 0 deletions
diff --git a/src/cmdline.c b/src/cmdline.c index d986c8eb8..b1482c350 100644 --- a/src/cmdline.c +++ b/src/cmdline.c @@ -27,6 +27,7 @@ #include "output_list.h" #include "ls.h" #include "mpd_error.h" +#include "glib_compat.h" #ifdef ENABLE_ENCODER #include "encoder_list.h" diff --git a/src/decoder/wildmidi_decoder_plugin.c b/src/decoder/wildmidi_decoder_plugin.c index 66e6c61cf..5eb0638da 100644 --- a/src/decoder/wildmidi_decoder_plugin.c +++ b/src/decoder/wildmidi_decoder_plugin.c @@ -19,6 +19,7 @@ #include "config.h" #include "decoder_api.h" +#include "glib_compat.h" #include <glib.h> diff --git a/src/glib_compat.h b/src/glib_compat.h index 4d0e7040d..0b96a662d 100644 --- a/src/glib_compat.h +++ b/src/glib_compat.h @@ -74,4 +74,32 @@ g_uri_parse_scheme(const char *uri) #endif +#if defined(G_OS_WIN32) && defined(g_file_test) + +/* Modern GLib on Win32 likes to use UTF-8 for file names. +It redefines g_file_test() to be g_file_test_utf8(). +This gives incorrect results for non-ASCII files. +Old g_file_test() is available for *binary compatibility*, +but symbol is hidden from linker, we copy-paste its definition here */ + +#undef g_file_test + +static inline gboolean +g_file_test(const gchar *filename, GFileTest test) +{ + gchar *utf8_filename = g_locale_to_utf8(filename, -1, NULL, NULL, NULL); + gboolean retval; + + if (utf8_filename == NULL) + return FALSE; + + retval = g_file_test_utf8(utf8_filename, test); + + g_free(utf8_filename); + + return retval; +} + +#endif + #endif diff --git a/src/playlist_save.c b/src/playlist_save.c index 8ddc93ec9..d290d889c 100644 --- a/src/playlist_save.c +++ b/src/playlist_save.c @@ -26,6 +26,7 @@ #include "uri.h" #include "database.h" #include "idle.h" +#include "glib_compat.h" #include <glib.h> diff --git a/src/update_walk.c b/src/update_walk.c index 5d2f778ff..b93c9c453 100644 --- a/src/update_walk.c +++ b/src/update_walk.c @@ -29,6 +29,7 @@ #include "decoder_list.h" #include "decoder_plugin.h" #include "playlist_list.h" +#include "glib_compat.h" #include "conf.h" #ifdef ENABLE_ARCHIVE |