ZipFileHeader constructor

ZipFileHeader([
  1. InputStreamBase? input
])

Implementation

ZipFileHeader([InputStreamBase? input]) {
  if (input != null) {
    versionMadeBy = input.readUint16();
    versionNeededToExtract = input.readUint16();
    generalPurposeBitFlag = input.readUint16();
    compressionMethod = input.readUint16();
    lastModifiedFileTime = input.readUint16();
    lastModifiedFileDate = input.readUint16();
    crc32 = input.readUint32();
    compressedSize = input.readUint32();
    uncompressedSize = input.readUint32();
    final fnameLen = input.readUint16();
    final extraLen = input.readUint16();
    final commentLen = input.readUint16();
    diskNumberStart = input.readUint16();
    internalFileAttributes = input.readUint16();
    externalFileAttributes = input.readUint32();
    localHeaderOffset = input.readUint32();

    if (fnameLen > 0) {
      filename = input.readString(size: fnameLen);
    }

    if (extraLen > 0) {
      final extraBytes = input.readBytes(extraLen);
      extraField = extraBytes.toUint8List();

      final extra = InputStream(extraField);
      while (!extra.isEOS) {
        final id = extra.readUint16();
        var size = extra.readUint16();
        final extraBytes = extra.readBytes(size);
        if (id == 1) {
          // Zip64 extended information
          // The following is the layout of the zip64 extended
          // information "extra" block. If one of the size or
          // offset fields in the Local or Central directory
          // record is too small to hold the required data,
          // a Zip64 extended information record is created.
          // The order of the fields in the zip64 extended
          // information record is fixed, but the fields MUST
          // only appear if the corresponding Local or Central
          // directory record field is set to 0xFFFF or 0xFFFFFFFF.
          // Original
          // Size       8 bytes    Original uncompressed file size
          // Compressed
          // Size       8 bytes    Size of compressed data
          // Relative Header
          // Offset     8 bytes    Offset of local header record
          // Disk Start
          // Number     4 bytes    Number of the disk on which
          // this file starts
          if (size >= 8 && uncompressedSize == 0xFFFFFFFF) {
            uncompressedSize = extraBytes.readUint64();
            size -= 8;
          }
          if (size >= 8 && compressedSize == 0xFFFFFFFF) {
            compressedSize = extraBytes.readUint64();
            size -= 8;
          }
          if (size >= 8 && localHeaderOffset == 0xFFFFFFFF) {
            localHeaderOffset = extraBytes.readUint64();
            size -= 8;
          }
          if (size >= 4 && diskNumberStart == 0xFFFF) {
            diskNumberStart = extraBytes.readUint32();
            size -= 4;
          }
        }
      }
    }

    if (commentLen > 0) {
      fileComment = input.readString(size: commentLen);
    }
  }
}