[PATCH] Files: fix a path encoding issue on Windows
Dirk Hohndel
dirk at hohndel.org
Tue Dec 17 06:48:51 UTC 2013
Thiago, can I get an ACK from you for this patch, please?
/D
On Tue, 2013-12-17 at 16:10 +0200, Lubomir I. Ivanov wrote:
> From: "Lubomir I. Ivanov" <neolit123 at gmail.com>
>
> The Qt frontend currently uses a C backend e.g. file.c,
> but Windows does things it's own way and we cannot quite
> relly on methods such as open() to work for paths with
> special characters.
>
> A solution for that is to always pass UTF-8 encoded filenames
> (that may eventually reach file.c:readfile()) and then
> if on Windows converted such to UTF-16 for use with
> the Windows's specific function _wopen().
>
> This possibly avoids re-writing file.c to use Qt/QFile.
>
> Signed-off-by: Lubomir I. Ivanov <neolit123 at gmail.com>
> ---
> this new version also fixes the file names for
> MainWindow::importFiles()
> ---
> file.c | 14 ++++++++++++++
> qt-ui/mainwindow.cpp | 4 ++--
> 2 files changed, 16 insertions(+), 2 deletions(-)
>
> diff --git a/file.c b/file.c
> index 9fd44d9..91749df 100644
> --- a/file.c
> +++ b/file.c
> @@ -15,6 +15,9 @@
> #ifndef O_BINARY
> #define O_BINARY 0
> #endif
> +#ifdef WIN32
> +#include <windows.h>
> +#endif
>
> int readfile(const char *filename, struct memblock *mem)
> {
> @@ -25,7 +28,18 @@ int readfile(const char *filename, struct memblock *mem)
> mem->buffer = NULL;
> mem->size = 0;
>
> +/* filename should be UTF-8 encoded and then we can convert it to the 2 byte wchar_t on win32
> + * and use _wopen(). */
> +#ifdef WIN32
> + wchar_t filename_w[MAX_PATH] = { 0 };
> + int sz = MultiByteToWideChar(CP_UTF8, 0, filename, -1, NULL, 0);
> + if (!sz)
> + return -1;
> + MultiByteToWideChar(CP_UTF8, 0, filename, -1, filename_w, sz);
> + fd = _wopen(filename_w, O_RDONLY | O_BINARY, 0);
> +#else
> fd = open(filename, O_RDONLY | O_BINARY, 0);
> +#endif
> if (fd < 0)
> return fd;
> ret = fstat(fd, &st);
> diff --git a/qt-ui/mainwindow.cpp b/qt-ui/mainwindow.cpp
> index fbe3779..f236bd8 100644
> --- a/qt-ui/mainwindow.cpp
> +++ b/qt-ui/mainwindow.cpp
> @@ -822,7 +822,7 @@ void MainWindow::importFiles(const QStringList fileNames)
> QByteArray fileNamePtr;
> char *error = NULL;
> for (int i = 0; i < fileNames.size(); ++i) {
> - fileNamePtr = fileNames.at(i).toLocal8Bit();
> + fileNamePtr = fileNames.at(i).toUtf8();
> parse_file(fileNamePtr.data(), &error);
> if (error != NULL) {
> showError(error);
> @@ -843,7 +843,7 @@ void MainWindow::loadFiles(const QStringList fileNames)
> QByteArray fileNamePtr;
>
> for (int i = 0; i < fileNames.size(); ++i) {
> - fileNamePtr = fileNames.at(i).toLocal8Bit();
> + fileNamePtr = fileNames.at(i).toUtf8();
> parse_file(fileNamePtr.data(), &error);
> set_filename(fileNamePtr.data(), TRUE);
> setTitle(MWTF_FILENAME);
More information about the subsurface
mailing list