Warning: session_start(): open(/var/lib/php/sessions/sess_rdcab9q8judbv328d53l8mles8, 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_MergeZipFilesWithFilter(File zipOut) is AutoCloseable {
delegate ProgressMonitor to net.lingala.zip4j.progress.
ZipModel zipModel;
new ZipModel zipModelOut;
SplitOutputStream outputStream;
new HeaderWriter headerWriter;
new ProgressMonitor progressMonitor;
int bufferSize = InternalZipConstants.BUFF_SIZE;
Charset charset;
new L filteredFileHeaders;
close {
dispose outputStream;
}
void init {
if (outputStream == null)
outputStream = new SplitOutputStream(zipOut);
}
void addZipFile(File zipIn, IPred fileFilter) {
init();
try (var randomAccessFile = new RandomAccessFile(zipIn, RandomAccessFileMode.READ.getValue())) {
zipModel = new HeaderReader().readAllHeaders(randomAccessFile, buildConfig());
zipModel.setZipFile(zipIn);
}
temp inputStream = new RandomAccessFile(
zipModel.getZipFile(), RandomAccessFileMode.READ.getValue());
long currentFileCopyPointer = 0;
long runningOffset = outputStream.getFilePointer();
L sortedFileHeaders = sortedByComparator(zipModel.getCentralDirectory().getFileHeaders(), (o1, o2) -> {
if (eq(o1.getFileName(), o2.getFileName())) ret 0;
ret cmp(o1.getOffsetLocalHeader(), o2.getOffsetLocalHeader());
});
int count = 0;
for iFileHeader over sortedFileHeaders: {
var fileHeader = sortedFileHeaders.get(iFileHeader);
var fileHeaderOffset = fileHeader.getOffsetLocalHeader();
var nextOffset = getOffsetOfNextEntry(sortedFileHeaders, iFileHeader, zipModel);
long fp = outputStream.getFilePointer();
long lengthOfCurrentEntry = nextOffset + runningOffset - fp;
if (count++ < 10)
printVars(+fileHeaderOffset, +nextOffset, +runningOffset, +lengthOfCurrentEntry, +fp);
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));
}
void finish {
zipModelOut.getCentralDirectory().setFileHeaders(filteredFileHeaders);
headerWriter.finalizeZipFile(zipModelOut, outputStream, buildConfig().getCharset());
close();
}
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
);
}
}