ENH:add mz_zip_reader_extract_to_file_w api

to solove plugin install failed problem by special wide char
jira: none
Change-Id: Ic7d3efe3fdf852387650abf9df65803da9e46a60
(cherry picked from commit b68ad03717a63675fef2f3ef73d4058bf311adea)
This commit is contained in:
zhou.xu 2024-04-26 15:07:27 +08:00 committed by Lane.Wei
parent 83cf11fc4b
commit 660b407742
3 changed files with 59 additions and 8 deletions

View File

@ -2987,6 +2987,14 @@ extern "C" {
#include <sys/stat.h>
#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 <sys/utime.h>
#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)
{

View File

@ -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. */

View File

@ -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<wchar_t>(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) {