From 6452461c3903139c7bbed3d1eb2705bf1dde656f Mon Sep 17 00:00:00 2001
From: Denis Krjuchkov <denis@crazydev.net>
Date: Sat, 22 Oct 2011 00:57:30 +0600
Subject: [PATCH] path: autodetect filesystem encoding on Win32

WinAPI explicitly declares filesystem encoding.
It can be determined by GetACP().
Use that instead of Glib routine that always "detects" UTF-8 on Win32,
which is incorrect for MPD case.
---
 NEWS       |  1 +
 src/path.c | 16 ++++++++++++++++
 2 files changed, 17 insertions(+)

diff --git a/NEWS b/NEWS
index b2bd52da4..f91548813 100644
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,7 @@
 ver 0.16.6 (2010/??/??)
 * event_pipe: fix WIN32 regression
 * define WINVER in ./configure
+* WIN32: autodetect filesystem encoding
 
 
 ver 0.16.5 (2010/10/09)
diff --git a/src/path.c b/src/path.c
index 5e39c1636..d1b9ad6ee 100644
--- a/src/path.c
+++ b/src/path.c
@@ -27,6 +27,11 @@
 #include <assert.h>
 #include <string.h>
 
+#ifdef G_OS_WIN32
+#include <windows.h> // for GetACP()
+#include <stdio.h> // for sprintf()
+#endif
+
 #undef G_LOG_DOMAIN
 #define G_LOG_DOMAIN "path"
 
@@ -85,11 +90,22 @@ void path_global_init(void)
 
 	charset = config_get_string(CONF_FS_CHARSET, NULL);
 	if (charset == NULL) {
+#ifndef G_OS_WIN32
 		const gchar **encodings;
 		g_get_filename_charsets(&encodings);
 
 		if (encodings[0] != NULL && *encodings[0] != '\0')
 			charset = encodings[0];
+#else /* G_OS_WIN32 */
+		/* Glib claims that file system encoding is always utf-8
+		 * on native Win32 (i.e. not Cygwin).
+		 * However this is true only if <gstdio.h> helpers are used.
+		 * MPD uses regular <stdio.h> functions.
+		 * Those functions use encoding determined by GetACP(). */
+		char win_charset[13];
+		sprintf(win_charset, "cp%u", GetACP());
+		charset = win_charset;
+#endif
 	}
 
 	if (charset) {