Files
SWCompression/Sources/7-Zip/7zCoderInfo.swift
T
Timofey Solomko 44f33bf02a Make bit reader and writer functions' parameters concrete classes
Previously, it was almost always protocols, which in some cases didn't make sense.
2018-01-07 22:27:36 +03:00

62 lines
1.5 KiB
Swift

// Copyright (c) 2018 Timofey Solomko
// Licensed under MIT License
//
// See LICENSE for license information
import Foundation
import BitByteData
class SevenZipCoderInfo {
let numFolders: Int
let external: UInt8
private(set) var folders = [SevenZipFolder]()
init() {
numFolders = 0
external = 0
}
init(_ bitReader: MsbBitReader) throws {
var type = bitReader.byte()
guard type == 0x0B else { throw SevenZipError.internalStructureError }
numFolders = bitReader.szMbd()
external = bitReader.byte()
guard external == 0
else { throw SevenZipError.externalNotSupported }
for _ in 0..<numFolders {
folders.append(try SevenZipFolder(bitReader))
}
type = bitReader.byte()
guard type == 0x0C else { throw SevenZipError.internalStructureError }
for folder in folders {
for _ in 0..<folder.totalOutputStreams {
folder.unpackSizes.append(bitReader.szMbd())
}
}
type = bitReader.byte()
if type == 0x0A {
let definedBits = bitReader.defBits(count: numFolders)
bitReader.align()
for i in 0..<numFolders where definedBits[i] == 1 {
folders[i].crc = bitReader.uint32()
}
type = bitReader.byte()
}
if type != 0x00 {
throw SevenZipError.internalStructureError
}
}
}