Warning: session_start(): open(/var/lib/php/sessions/sess_c3acbiarlvdmco66s1g0bcoff7, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
!include once #1034352 // zip4j
import java.nio.charset.Charset;
srecord noeq Zip4j_CopySubSetOfZipFile(File zipIn, File zipOut, IPred fileFilter) {
delegate ProgressMonitor to net.lingala.zip4j.progress.
ZipModel zipModel;
new HeaderWriter headerWriter;
new ProgressMonitor progressMonitor;
int bufferSize = InternalZipConstants.BUFF_SIZE;
Charset charset;
run {
try (var randomAccessFile = new RandomAccessFile(zipIn, RandomAccessFileMode.READ.getValue())) {
zipModel = new HeaderReader().readAllHeaders(randomAccessFile, buildConfig());
zipModel.setZipFile(zipIn);
}
temp outputStream = new SplitOutputStream(zipOut);
temp inputStream = new RandomAccessFile(zipModel.getZipFile(), RandomAccessFileMode.READ.getValue());
long currentFileCopyPointer = 0, runningOffset = 0;
L sortedFileHeaders = sortedByComparator(zipModel.getCentralDirectory().getFileHeaders(), (o1, o2) -> {
if (eq(o1.getFileName(), o2.getFileName())) ret 0;
ret cmp(o1.getOffsetLocalHeader(), o2.getOffsetLocalHeader());
});
new L filteredFileHeaders;
for iFileHeader over sortedFileHeaders: {
var fileHeader = sortedFileHeaders.get(iFileHeader);
long lengthOfCurrentEntry = getOffsetOfNextEntry(sortedFileHeaders, iFileHeader, zipModel) - outputStream.getFilePointer();
if (!fileFilter.get(fileHeader.getFileName())) {
runningOffset -= lengthOfCurrentEntry;
currentFileCopyPointer += lengthOfCurrentEntry;
} else {
addOffsetToFileHeader(fileHeader, runningOffset);
filteredFileHeaders.add(fileHeader);
// copy complete entry without any changes
currentFileCopyPointer += copyFile(inputStream, outputStream,
currentFileCopyPointer,
lengthOfCurrentEntry, progressMonitor,
buildConfig().getBufferSize());
}
}
var endOfCDR = zipModel.getEndOfCentralDirectoryRecord();
endOfCDR.setTotalNumberOfEntriesInCentralDirectory(l(filteredFileHeaders));
endOfCDR.setTotalNumberOfEntriesInCentralDirectoryOnThisDisk(l(filteredFileHeaders));
if (zipModel.isZip64Format()) {
zipModel.getZip64EndOfCentralDirectoryRecord().setOffsetStartCentralDirectoryWRTStartDiskNumber(
zipModel.getZip64EndOfCentralDirectoryRecord().getOffsetStartCentralDirectoryWRTStartDiskNumber() + runningOffset);
zipModel.getZip64EndOfCentralDirectoryRecord().setTotalNumberOfEntriesInCentralDirectoryOnThisDisk(l(filteredFileHeaders));
zipModel.getZip64EndOfCentralDirectoryLocator().setOffsetZip64EndOfCentralDirectoryRecord(
zipModel.getZip64EndOfCentralDirectoryLocator().getOffsetZip64EndOfCentralDirectoryRecord() + runningOffset);
}
zipModel.getCentralDirectory().setFileHeaders(filteredFileHeaders);
headerWriter.finalizeZipFile(zipModel, outputStream, buildConfig().getCharset());
}
long getOffsetOfNextEntry(L sortedFileHeaders,
int indexOfFileHeader, ZipModel zipModel) throws ZipException {
if (indexOfFileHeader == sortedFileHeaders.size() - 1)
ret HeaderUtil.getOffsetStartOfCentralDirectory(zipModel);
else
ret sortedFileHeaders.get(indexOfFileHeader + 1).getOffsetLocalHeader();
}
long copyFile(RandomAccessFile randomAccessFile,
OutputStream outputStream, long start, long length,
ProgressMonitor progressMonitor, int bufferSize) throws IOException {
net.lingala.zip4j.util.FileUtils.copyFile(randomAccessFile, outputStream, start, start + length, progressMonitor, bufferSize);
ret length;
}
Zip4jConfig buildConfig() {
return new Zip4jConfig(charset, bufferSize);
}
void addOffsetToFileHeader(FileHeader fileHeader, long offsetToAdd) {
fileHeader.setOffsetLocalHeader(fileHeader.getOffsetLocalHeader() + offsetToAdd);
if (zipModel.isZip64Format()
&& fileHeader.getZip64ExtendedInfo() != null
&& fileHeader.getZip64ExtendedInfo().getOffsetLocalHeader() != -1)
fileHeader.getZip64ExtendedInfo().setOffsetLocalHeader(
fileHeader.getZip64ExtendedInfo().getOffsetLocalHeader() + offsetToAdd
);
}
}