fromArchive static method

Future<ZipPackage?> fromArchive(
  1. File file
)

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;
}