Win utf8 treatment for CreateFile.
authorErik de Castro Lopo <erikd@mega-nerd.com>
Sun, 21 Apr 2013 07:53:02 +0000 (17:53 +1000)
committerErik de Castro Lopo <erikd@mega-nerd.com>
Sun, 21 Apr 2013 07:53:07 +0000 (17:53 +1000)
Patch from Janne Hyvärinen <cse@sci.fi>.

include/share/win_utf8_io.h
src/share/grabbag/file.c
src/share/win_utf8_io/win_utf8_io.c

index c0419b2..9e2cd4e 100644 (file)
@@ -10,7 +10,7 @@ extern "C" {
 #include <stdio.h>
 #include <sys/stat.h>
 #include <stdarg.h>
-
+#include <windows.h>
 
 int get_utf8_argv(int *argc, char ***argv);
 
@@ -28,6 +28,7 @@ int rename_utf8(const char *oldname, const char *newname);
 size_t strlen_utf8(const char *str);
 int win_get_console_width(void);
 int print_console(FILE *stream, const wchar_t *text, uint32_t len);
+HANDLE WINAPI CreateFile_utf8(const char *lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
 
 #ifdef __cplusplus
 } /* extern "C" */
index dd2880c..a3706f1 100644 (file)
@@ -127,8 +127,8 @@ FLAC__bool grabbag__file_are_same(const char *f1, const char *f2)
        BY_HANDLE_FILE_INFORMATION info1, info2;
        HANDLE h1, h2;
        BOOL ok = 1;
-       h1 = CreateFile(f1, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
-       h2 = CreateFile(f2, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+       h1 = CreateFile_utf8(f1, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+       h2 = CreateFile_utf8(f2, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        if(h1 == INVALID_HANDLE_VALUE || h2 == INVALID_HANDLE_VALUE)
                ok = 0;
        ok &= GetFileInformationByHandle(h1, &info1);
index b32db3c..d8736e1 100644 (file)
@@ -307,3 +307,16 @@ int rename_utf8(const char *oldname, const char *newname)
 
        return ret;
 }
+
+HANDLE WINAPI CreateFile_utf8(const char *lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
+{
+       wchar_t *wname;
+       HANDLE handle = INVALID_HANDLE_VALUE;
+
+       if ((wname = wchar_from_utf8(lpFileName)) != NULL) {
+               handle = CreateFileW(wname, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
+               free(wname);
+       }
+
+       return handle;
+}