PatcherError FileUtils::mzAddFile(zipFile zf, const std::string &name, const std::string &path) { // Copy file into archive std::ifstream file(path, std::ios::binary); if (file.fail()) { return PatcherError::createIOError( ErrorCode::FileOpenError, path); } file.seekg(0, std::ios::end); auto size = file.tellg(); file.seekg(0, std::ios::beg); bool zip64 = (uint64_t) size >= ((1ull << 32) - 1); zip_fileinfo zi; memset(&zi, 0, sizeof(zi)); mzGetFileTime(path, &zi.tmz_date, &zi.dosDate); int ret = zipOpenNewFileInZip2_64( zf, // file name.c_str(), // filename &zi, // zip_fileinfo nullptr, // extrafield_local 0, // size_extrafield_local nullptr, // extrafield_global 0, // size_extrafield_global nullptr, // comment Z_DEFLATED, // method Z_DEFAULT_COMPRESSION, // level 0, // raw zip64 // zip64 ); if (ret != ZIP_OK) { FLOGW("minizip: Failed to add file (error code: {}): {}", ret, path); return PatcherError::createArchiveError( ErrorCode::ArchiveWriteDataError, name); } // Write data to file char buf[32768]; std::streamsize n; while (!file.eof()) { file.read(buf, 32768); n = file.gcount(); ret = zipWriteInFileInZip(zf, buf, n); if (ret != ZIP_OK) { FLOGW("minizip: Failed to write data (error code: {}): {}", ret, path); zipCloseFileInZip(zf); return PatcherError::createArchiveError( ErrorCode::ArchiveWriteDataError, name); } } if (file.bad()) { zipCloseFileInZip(zf); return PatcherError::createIOError( ErrorCode::FileReadError, path); } zipCloseFileInZip(zf); return PatcherError(); }
ErrorCode FileUtils::mzAddFile(zipFile zf, const std::string &name, const std::string &path) { // Copy file into archive io::File file; if (!file.open(path, io::File::OpenRead)) { FLOGE("%s: Failed to open for reading: %s", path.c_str(), file.errorString().c_str()); return ErrorCode::FileOpenError; } uint64_t size; file.seek(0, io::File::SeekEnd); file.tell(&size); file.seek(0, io::File::SeekBegin); bool zip64 = size >= ((1ull << 32) - 1); zip_fileinfo zi; memset(&zi, 0, sizeof(zi)); mzGetFileTime(path, &zi.tmz_date, &zi.dosDate); int ret = zipOpenNewFileInZip2_64( zf, // file name.c_str(), // filename &zi, // zip_fileinfo nullptr, // extrafield_local 0, // size_extrafield_local nullptr, // extrafield_global 0, // size_extrafield_global nullptr, // comment Z_DEFLATED, // method Z_DEFAULT_COMPRESSION, // level 0, // raw zip64 // zip64 ); if (ret != ZIP_OK) { FLOGW("minizip: Failed to add file (error code: %d): %s", ret, path.c_str()); return ErrorCode::ArchiveWriteDataError; } // Write data to file char buf[32768]; uint64_t bytesRead; while (file.read(buf, sizeof(buf), &bytesRead)) { ret = zipWriteInFileInZip(zf, buf, bytesRead); if (ret != ZIP_OK) { FLOGW("minizip: Failed to write data (error code: %d): %s", ret, path.c_str()); zipCloseFileInZip(zf); return ErrorCode::ArchiveWriteDataError; } } if (file.error() != io::File::ErrorEndOfFile) { zipCloseFileInZip(zf); FLOGE("%s: Failed to read file: %s", path.c_str(), file.errorString().c_str()); return ErrorCode::FileReadError; } zipCloseFileInZip(zf); return ErrorCode::NoError; }