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" <neolit...@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 <neolit...@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); _______________________________________________ subsurface mailing list subsurface@hohndel.org http://lists.hohndel.org/cgi-bin/mailman/listinfo/subsurface