commit 301a42a622805458d1a67895a9dcd45733ba7b3c
parent 1e212b6a467d6a3d5f2855d415a18c44c411f318
Author: cfillion <cfillion@users.noreply.github.com>
Date: Sat, 11 Feb 2017 22:09:26 -0500
archive: fix unicode file names on Windows
Diffstat:
1 file changed, 32 insertions(+), 4 deletions(-)
diff --git a/src/archive.cpp b/src/archive.cpp
@@ -26,11 +26,33 @@
#include <fstream>
-#include <WDL/zlib/zip.h>
-#include <WDL/zlib/unzip.h>
+#include <zlib/zip.h>
+#include <zlib/unzip.h>
+#include <zlib/ioapi.h>
using namespace std;
+#ifdef _WIN32
+static void *wide_fopen(voidpf opaque, const void *filename, int mode)
+{
+ const wchar_t *fopen_mode = nullptr;
+
+ if((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER) == ZLIB_FILEFUNC_MODE_READ)
+ fopen_mode = L"rb";
+ else if(mode & ZLIB_FILEFUNC_MODE_EXISTING)
+ fopen_mode = L"r+b";
+ else if(mode & ZLIB_FILEFUNC_MODE_CREATE)
+ fopen_mode = L"wb";
+
+ FILE *file = nullptr;
+
+ if(filename && fopen_mode)
+ _wfopen_s(&file, static_cast<const wchar_t *>(filename), fopen_mode);
+
+ return file;
+}
+#endif
+
size_t Archive::write(const auto_string &path, ReaPack *reapack)
{
size_t count = 0;
@@ -52,8 +74,14 @@ size_t Archive::write(const auto_string &path, ReaPack *reapack)
ArchiveWriter::ArchiveWriter(const auto_string &path)
{
- m_zip = zipOpen(reinterpret_cast<const char *>(path.c_str()),
- APPEND_STATUS_CREATE);
+ zlib_filefunc64_def filefunc{};
+ fill_fopen64_filefunc(&filefunc);
+#ifdef _WIN32
+ filefunc.zopen64_file = wide_fopen;
+#endif
+
+ m_zip = zipOpen2_64(reinterpret_cast<const char *>(path.c_str()),
+ APPEND_STATUS_CREATE, nullptr, &filefunc);
if(!m_zip)
throw reapack_error(FS::lastError().c_str());