reapack

Package manager for REAPER
Log | Files | Refs | Submodules | README | LICENSE

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:
Msrc/archive.cpp | 36++++++++++++++++++++++++++++++++----
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());