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;
L sortedFileHeaders = sortedByComparator(zipModel.getCentralDirectory().getFileHeaders(), (o1, o2) -> {
if (eq(o1.getFileName(), o2.getFileName())) ret 0;
ret cmp(o1.getOffsetLocalHeader(), o2.getOffsetLocalHeader());
});
for iFileHeader over sortedFileHeaders: {
var fileHeaer = fileHeaders.get(iFileHeader);
long lengthOfCurrentEntry = getOffsetOfNextEntry(sortedFileHeaders, iFileHeader, zipModel) - outputStream.getFilePointer();
if (!fileFilter.get(fileHeader.getFileName())) {
updateHeaders(sortedFileHeaders, fileHeader, lengthOfCurrentEntry);
if (!zipModel.getCentralDirectory().getFileHeaders().remove(fileHeader)) {
throw new ZipException("Could not remove entry from list of central directory headers");
}
--iFileHeader;
currentFileCopyPointer += lengthOfCurrentEntry;
} else {
// copy complete entry without any changes
currentFileCopyPointer += copyFile(inputStream, outputStream,
currentFileCopyPointer,
lengthOfCurrentEntry, progressMonitor,
buildConfig().getBufferSize());
}
}
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;
}
void updateHeaders(List sortedFileHeaders, FileHeader fileHeaderThatWasRemoved,
long offsetToSubtract) throws ZipException {
updateOffsetsForAllSubsequentFileHeaders(sortedFileHeaders, zipModel, fileHeaderThatWasRemoved, safeNegate(offsetToSubtract));
var endOfCDR = zipModel.getEndOfCentralDirectoryRecord();
endOfCDR.setOffsetOfStartOfCentralDirectory(
endOfCDR.getOffsetOfStartOfCentralDirectory() - offsetToSubtract);
endOfCDR.setTotalNumberOfEntriesInCentralDirectory(
endOfCDR.getTotalNumberOfEntriesInCentralDirectory() - 1);
if (endOfCDR.getTotalNumberOfEntriesInCentralDirectoryOnThisDisk() > 0)
endOfCDR.setTotalNumberOfEntriesInCentralDirectoryOnThisDisk(
endOfCDR.getTotalNumberOfEntriesInCentralDirectoryOnThisDisk() - 1);
if (zipModel.isZip64Format()) {
zipModel.getZip64EndOfCentralDirectoryRecord().setOffsetStartCentralDirectoryWRTStartDiskNumber(
zipModel.getZip64EndOfCentralDirectoryRecord().getOffsetStartCentralDirectoryWRTStartDiskNumber() - offsetToSubtract);
zipModel.getZip64EndOfCentralDirectoryRecord().setTotalNumberOfEntriesInCentralDirectoryOnThisDisk(
zipModel.getZip64EndOfCentralDirectoryRecord().getTotalNumberOfEntriesInCentralDirectory() - 1);
zipModel.getZip64EndOfCentralDirectoryLocator().setOffsetZip64EndOfCentralDirectoryRecord(
zipModel.getZip64EndOfCentralDirectoryLocator().getOffsetZip64EndOfCentralDirectoryRecord() - offsetToSubtract);
}
}
Zip4jConfig buildConfig() {
return new Zip4jConfig(charset, bufferSize);
}
int getIndexOfFileHeader(List allFileHeaders, FileHeader fileHeaderForIndex) throws ZipException {
for (int i = 0; i < allFileHeaders.size(); i++) {
FileHeader fileHeader = allFileHeaders.get(i);
if (fileHeader.equals(fileHeaderForIndex)) {
return i;
}
}
throw new ZipException("Could not find file header in list of central directory file headers");
}
void updateOffsetsForAllSubsequentFileHeaders(List sortedFileHeaders, ZipModel zipModel,
FileHeader fileHeaderModified, long offsetToAdd) throws ZipException {
int indexOfFileHeader = getIndexOfFileHeader(sortedFileHeaders, fileHeaderModified);
if (indexOfFileHeader == -1) {
throw new ZipException("Could not locate modified file header in zipModel");
}
for (int i = indexOfFileHeader + 1; i < sortedFileHeaders.size(); i++) {
FileHeader fileHeaderToUpdate = sortedFileHeaders.get(i);
fileHeaderToUpdate.setOffsetLocalHeader(fileHeaderToUpdate.getOffsetLocalHeader() + offsetToAdd);
if (zipModel.isZip64Format()
&& fileHeaderToUpdate.getZip64ExtendedInfo() != null
&& fileHeaderToUpdate.getZip64ExtendedInfo().getOffsetLocalHeader() != -1) {
fileHeaderToUpdate.getZip64ExtendedInfo().setOffsetLocalHeader(
fileHeaderToUpdate.getZip64ExtendedInfo().getOffsetLocalHeader() + offsetToAdd
);
}
}
}
}