diff --git a/src/miniz/miniz.c b/src/miniz/miniz.c index e75a797ee..d649adb1b 100644 --- a/src/miniz/miniz.c +++ b/src/miniz/miniz.c @@ -2987,6 +2987,14 @@ extern "C" { #include #if defined(_MSC_VER) || defined(__MINGW64__) +#ifdef WIN32 +static FILE *mz_wfopen(const wchar_t *pFilename, const char *pMode) +{ + FILE *pFile = NULL; + _wfopen_s(&pFile, pFilename, pMode); + return pFile; +} +#endif static FILE *mz_fopen(const char *pFilename, const char *pMode) { FILE *pFile = NULL; @@ -3004,6 +3012,9 @@ static FILE *mz_freopen(const char *pPath, const char *pMode, FILE *pStream) #include #endif #define MZ_FOPEN mz_fopen +#ifdef WIN32 +#define MZ_WFOPEN mz_wfopen +#endif #define MZ_FCLOSE fclose #define MZ_FREAD fread #define MZ_FWRITE fwrite @@ -5117,9 +5128,9 @@ mz_bool mz_zip_reader_extract_to_file(mz_zip_archive *pZip, mz_uint file_index, return mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_FEATURE); pFile = MZ_FOPEN(pDst_filename, "wb"); - if (!pFile) + if (!pFile) { return mz_zip_set_error(pZip, MZ_ZIP_FILE_OPEN_FAILED); - + } status = mz_zip_reader_extract_to_callback(pZip, file_index, mz_zip_file_write_callback, pFile, flags); if (MZ_FCLOSE(pFile) == EOF) @@ -5137,6 +5148,39 @@ mz_bool mz_zip_reader_extract_to_file(mz_zip_archive *pZip, mz_uint file_index, return status; } +#ifdef WIN32 +mz_bool mz_zip_reader_extract_to_file_w(mz_zip_archive *pZip, mz_uint file_index, const wchar_t *pDst_filename, mz_uint flags) +{ + mz_bool status; + mz_zip_archive_file_stat file_stat; + MZ_FILE * pFile; + + if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat)) + return MZ_FALSE; + + if ((file_stat.m_is_directory) || (!file_stat.m_is_supported)) + return mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_FEATURE); + + pFile = MZ_WFOPEN(pDst_filename, "w"); + if (!pFile) { + return mz_zip_set_error(pZip, MZ_ZIP_FILE_OPEN_FAILED); + } + status = mz_zip_reader_extract_to_callback(pZip, file_index, mz_zip_file_write_callback, pFile, flags); + + if (MZ_FCLOSE(pFile) == EOF) { + if (status) + mz_zip_set_error(pZip, MZ_ZIP_FILE_CLOSE_FAILED); + status = MZ_FALSE; + } + +#if !defined(MINIZ_NO_TIME) && !defined(MINIZ_NO_STDIO) + if (status) + mz_zip_set_file_times(pDst_filename, file_stat.m_time, file_stat.m_time); +#endif + + return status; +} +#endif mz_bool mz_zip_reader_extract_file_to_file(mz_zip_archive *pZip, const char *pArchive_filename, const char *pDst_filename, mz_uint flags) { diff --git a/src/miniz/miniz.h b/src/miniz/miniz.h index fdf54092d..4ed3320a1 100644 --- a/src/miniz/miniz.h +++ b/src/miniz/miniz.h @@ -1211,6 +1211,9 @@ mz_bool mz_zip_reader_extract_iter_free(mz_zip_reader_extract_iter_state* pState /* Extracts a archive file to a disk file and sets its last accessed and modified times. */ /* This function only extracts files, not archive directory records. */ mz_bool mz_zip_reader_extract_to_file(mz_zip_archive *pZip, mz_uint file_index, const char *pDst_filename, mz_uint flags); +#ifdef WIN32 +mz_bool mz_zip_reader_extract_to_file_w(mz_zip_archive *pZip, mz_uint file_index, const wchar_t *pDst_filename, mz_uint flags); +#endif mz_bool mz_zip_reader_extract_file_to_file(mz_zip_archive *pZip, const char *pArchive_filename, const char *pDst_filename, mz_uint flags); /* Extracts a archive file starting at the current position in the destination FILE stream. */ diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 8ba43db35..559cf92c0 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -1765,13 +1765,17 @@ int GUI_App::install_plugin(std::string name, std::string package_name, InstallP mz_bool res = mz_zip_reader_extract_to_file(&archive, stat.m_file_index, dest_zip_file.c_str(), 0); BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", extract %1% from plugin zip %2%\n") % dest_file % stat.m_filename; if (res == 0) { - mz_zip_error zip_error = mz_zip_get_last_error(&archive); - BOOST_LOG_TRIVIAL(error) << "[install_plugin]Archive read error:" << mz_zip_get_error_string(zip_error) << std::endl; - close_zip_reader(&archive); - if (pro_fn) { - pro_fn(InstallStatusUnzipFailed, 0, cancel); +#ifdef WIN32 + std::wstring new_dest_zip_file = boost::locale::conv::utf_to_utf(dest_path.generic_string()); + res = mz_zip_reader_extract_to_file_w(&archive, stat.m_file_index, new_dest_zip_file.c_str(), 0); +#endif + if (res == 0) { + mz_zip_error zip_error = mz_zip_get_last_error(&archive); + BOOST_LOG_TRIVIAL(error) << "[install_plugin]Archive read error:" << mz_zip_get_error_string(zip_error) << std::endl; + close_zip_reader(&archive); + if (pro_fn) { pro_fn(InstallStatusUnzipFailed, 0, cancel); } + return InstallStatusUnzipFailed; } - return InstallStatusUnzipFailed; } else { if (pro_fn) {