60 lines
1.4 KiB
C++
60 lines
1.4 KiB
C++
|
#include "miniz_extension.hpp"
|
||
|
|
||
|
#if defined(_MSC_VER) || defined(__MINGW64__)
|
||
|
#include "boost/nowide/cstdio.hpp"
|
||
|
#endif
|
||
|
|
||
|
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;
|
||
|
}
|
||
|
|
||
|
return isread ? mz_zip_reader_init_cfile(zip, f, 0, 0)
|
||
|
: mz_zip_writer_init_cfile(zip, f, 0);
|
||
|
}
|
||
|
|
||
|
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); }
|
||
|
|
||
|
}
|