123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- #include <exception>
- #include "miniz_extension.hpp"
- #if defined(_MSC_VER) || defined(__MINGW64__)
- #include "boost/nowide/cstdio.hpp"
- #endif
- #include "I18N.hpp"
- //! macro used to mark string used at localization,
- //! return same string
- #define L(s) Slic3r::I18N::translate(s)
- namespace Slic3r {
- namespace {
- bool open_zip(mz_zip_archive *zip, const char *fname, bool isread)
- {
- if (!zip) return false;
- const char *mode = isread ? "rb" : "wb";
- FILE *f = nullptr;
- #if defined(_MSC_VER) || defined(__MINGW64__)
- f = boost::nowide::fopen(fname, mode);
- #elif defined(__GNUC__) && defined(_LARGEFILE64_SOURCE)
- f = fopen64(fname, mode);
- #else
- f = fopen(fname, mode);
- #endif
- if (!f) {
- zip->m_last_error = MZ_ZIP_FILE_OPEN_FAILED;
- return false;
- }
- bool res = false;
- if (isread)
- {
- res = mz_zip_reader_init_cfile(zip, f, 0, 0);
- if (!res)
- // if we get here it means we tried to open a non-zip file
- // we need to close the file here because the call to mz_zip_get_cfile() made into close_zip() returns a null pointer
- // see: https://github.com/prusa3d/PrusaSlicer/issues/3536
- fclose(f);
- }
- else
- res = mz_zip_writer_init_cfile(zip, f, 0);
- return res;
- }
- bool close_zip(mz_zip_archive *zip, bool isread)
- {
- bool ret = false;
- if (zip) {
- FILE *f = mz_zip_get_cfile(zip);
- ret = bool(isread ? mz_zip_reader_end(zip)
- : mz_zip_writer_end(zip));
- if (f) fclose(f);
- }
- return ret;
- }
- }
- bool open_zip_reader(mz_zip_archive *zip, const std::string &fname)
- {
- return open_zip(zip, fname.c_str(), true);
- }
- bool open_zip_writer(mz_zip_archive *zip, const std::string &fname)
- {
- return open_zip(zip, fname.c_str(), false);
- }
- bool close_zip_reader(mz_zip_archive *zip) { return close_zip(zip, true); }
- bool close_zip_writer(mz_zip_archive *zip) { return close_zip(zip, false); }
- MZ_Archive::MZ_Archive()
- {
- mz_zip_zero_struct(&arch);
- }
- std::string MZ_Archive::get_errorstr(mz_zip_error mz_err)
- {
- switch (mz_err)
- {
- case MZ_ZIP_NO_ERROR:
- return "no error";
- case MZ_ZIP_UNDEFINED_ERROR:
- return L("undefined error");
- case MZ_ZIP_TOO_MANY_FILES:
- return L("too many files");
- case MZ_ZIP_FILE_TOO_LARGE:
- return L("file too large");
- case MZ_ZIP_UNSUPPORTED_METHOD:
- return L("unsupported method");
- case MZ_ZIP_UNSUPPORTED_ENCRYPTION:
- return L("unsupported encryption");
- case MZ_ZIP_UNSUPPORTED_FEATURE:
- return L("unsupported feature");
- case MZ_ZIP_FAILED_FINDING_CENTRAL_DIR:
- return L("failed finding central directory");
- case MZ_ZIP_NOT_AN_ARCHIVE:
- return L("not a ZIP archive");
- case MZ_ZIP_INVALID_HEADER_OR_CORRUPTED:
- return L("invalid header or archive is corrupted");
- case MZ_ZIP_UNSUPPORTED_MULTIDISK:
- return L("unsupported multidisk archive");
- case MZ_ZIP_DECOMPRESSION_FAILED:
- return L("decompression failed or archive is corrupted");
- case MZ_ZIP_COMPRESSION_FAILED:
- return L("compression failed");
- case MZ_ZIP_UNEXPECTED_DECOMPRESSED_SIZE:
- return L("unexpected decompressed size");
- case MZ_ZIP_CRC_CHECK_FAILED:
- return L("CRC-32 check failed");
- case MZ_ZIP_UNSUPPORTED_CDIR_SIZE:
- return L("unsupported central directory size");
- case MZ_ZIP_ALLOC_FAILED:
- return L("allocation failed");
- case MZ_ZIP_FILE_OPEN_FAILED:
- return L("file open failed");
- case MZ_ZIP_FILE_CREATE_FAILED:
- return L("file create failed");
- case MZ_ZIP_FILE_WRITE_FAILED:
- return L("file write failed");
- case MZ_ZIP_FILE_READ_FAILED:
- return L("file read failed");
- case MZ_ZIP_FILE_CLOSE_FAILED:
- return L("file close failed");
- case MZ_ZIP_FILE_SEEK_FAILED:
- return L("file seek failed");
- case MZ_ZIP_FILE_STAT_FAILED:
- return L("file stat failed");
- case MZ_ZIP_INVALID_PARAMETER:
- return L("invalid parameter");
- case MZ_ZIP_INVALID_FILENAME:
- return L("invalid filename");
- case MZ_ZIP_BUF_TOO_SMALL:
- return L("buffer too small");
- case MZ_ZIP_INTERNAL_ERROR:
- return L("internal error");
- case MZ_ZIP_FILE_NOT_FOUND:
- return L("file not found");
- case MZ_ZIP_ARCHIVE_TOO_LARGE:
- return L("archive is too large");
- case MZ_ZIP_VALIDATION_FAILED:
- return L("validation failed");
- case MZ_ZIP_WRITE_CALLBACK_FAILED:
- return L("write calledback failed");
- default:
- break;
- }
- return "unknown error";
- }
- } // namespace Slic3r
|