fromArchive static method
Implementation
static Future<ZipPackage?> fromArchive(File file) async {
if (!(await file.exists())) return null;
final zp = ZipPackage(file);
final entries = <ZipLocalFile>[];
final cds = <ZipCentralDirectory>[];
try {
LazyArchive _archive = await LazyZipDecoder().decodeBuffer(file);
for (LazyArchiveFile archiveFile in _archive) {
if (archiveFile.isFile) {
final ZipLocalFile f = ZipLocalFile(0x0403);
f.offsetStart = archiveFile.header.file.offsetStart;
f.offsetEnd = archiveFile.header.file.offsetEnd;
f.versionToExtract = archiveFile.header.versionNeededToExtract;
f.generalFlag = archiveFile.header.generalPurposeBitFlag;
f.compressionMethod = archiveFile.header.compressionMethod;
f.lastModTime = archiveFile.header.lastModifiedFileTime;
f.lastModDate = archiveFile.header.lastModifiedFileDate;
f.crc32 = archiveFile.header.crc32;
f.compressedSize = archiveFile.header.compressedSize;
f.uncompressedSize = archiveFile.header.uncompressedSize;
f.filenameSize = archiveFile.header.filename.length;
f.extraFieldSize = archiveFile.header.extraField.length;
f.filename = archiveFile.header.filename;
f.extraField = archiveFile.header.extraField;
entries.add(f);
} else {
final ZipCentralDirectory cd = ZipCentralDirectory(0x0201);
cd.offsetStart = archiveFile.header.localHeaderOffset;
cd.offsetEnd = cd.offsetStart + archiveFile.header.uncompressedSize;
cd.versionMade = archiveFile.header.versionMadeBy;
cd.commentLength = archiveFile.header.fileComment.length;
cd.comment = archiveFile.header.fileComment;
cd.diskNumberStart = archiveFile.header.diskNumberStart;
cd.internalAttributes = archiveFile.header.internalFileAttributes;
cd.externalAttributes = archiveFile.header.externalFileAttributes;
cd.relativeOffset = archiveFile.header.localHeaderOffset;
cds.add(cd);
}
}
} on Exception catch (e, stacktrace) {
Fimber.d("Error loading epub", ex: e, stacktrace: stacktrace);
return null;
}
zp.entries = Map.fromEntries(entries.map((f) => MapEntry(f.filename, f)));
zp.centralDirectories = cds;
return zp;
}