// Code generated by kaitai-struct-compiler from a .ksy source file. DO NOT EDIT.
import (
"github.com/kaitai-io/kaitai_struct_go_runtime/kaitai"
"bytes"
"io"
)
/**
* ZIP is a popular archive file format, introduced in 1989 by Phil Katz
* and originally implemented in PKZIP utility by PKWARE.
*
* Thanks to solid support of it in most desktop environments and
* operating systems, and algorithms / specs availability in public
* domain, it quickly became tool of choice for implementing file
* containers.
*
* For example, Java .jar files, OpenDocument, Office Open XML, EPUB files
* are actually ZIP archives.
* @see Source
* @see Source
*/
type Zip_Compression int
const (
Zip_Compression__None Zip_Compression = 0
Zip_Compression__Shrunk Zip_Compression = 1
Zip_Compression__Reduced1 Zip_Compression = 2
Zip_Compression__Reduced2 Zip_Compression = 3
Zip_Compression__Reduced3 Zip_Compression = 4
Zip_Compression__Reduced4 Zip_Compression = 5
Zip_Compression__Imploded Zip_Compression = 6
Zip_Compression__Deflated Zip_Compression = 8
Zip_Compression__EnhancedDeflated Zip_Compression = 9
Zip_Compression__PkwareDclImploded Zip_Compression = 10
Zip_Compression__Bzip2 Zip_Compression = 12
Zip_Compression__Lzma Zip_Compression = 14
Zip_Compression__IbmTerse Zip_Compression = 18
Zip_Compression__IbmLz77Z Zip_Compression = 19
Zip_Compression__Zstandard Zip_Compression = 93
Zip_Compression__Mp3 Zip_Compression = 94
Zip_Compression__Xz Zip_Compression = 95
Zip_Compression__Jpeg Zip_Compression = 96
Zip_Compression__Wavpack Zip_Compression = 97
Zip_Compression__Ppmd Zip_Compression = 98
Zip_Compression__AexEncryptionMarker Zip_Compression = 99
)
type Zip_ExtraCodes int
const (
Zip_ExtraCodes__Zip64 Zip_ExtraCodes = 1
Zip_ExtraCodes__AvInfo Zip_ExtraCodes = 7
Zip_ExtraCodes__Os2 Zip_ExtraCodes = 9
Zip_ExtraCodes__Ntfs Zip_ExtraCodes = 10
Zip_ExtraCodes__Openvms Zip_ExtraCodes = 12
Zip_ExtraCodes__PkwareUnix Zip_ExtraCodes = 13
Zip_ExtraCodes__FileStreamAndForkDescriptors Zip_ExtraCodes = 14
Zip_ExtraCodes__PatchDescriptor Zip_ExtraCodes = 15
Zip_ExtraCodes__Pkcs7 Zip_ExtraCodes = 20
Zip_ExtraCodes__X509CertIdAndSignatureForFile Zip_ExtraCodes = 21
Zip_ExtraCodes__X509CertIdForCentralDir Zip_ExtraCodes = 22
Zip_ExtraCodes__StrongEncryptionHeader Zip_ExtraCodes = 23
Zip_ExtraCodes__RecordManagementControls Zip_ExtraCodes = 24
Zip_ExtraCodes__Pkcs7EncRecipCertList Zip_ExtraCodes = 25
Zip_ExtraCodes__IbmS390Uncomp Zip_ExtraCodes = 101
Zip_ExtraCodes__IbmS390Comp Zip_ExtraCodes = 102
Zip_ExtraCodes__Poszip4690 Zip_ExtraCodes = 18064
Zip_ExtraCodes__ExtendedTimestamp Zip_ExtraCodes = 21589
Zip_ExtraCodes__Beos Zip_ExtraCodes = 25922
Zip_ExtraCodes__AsiUnix Zip_ExtraCodes = 30062
Zip_ExtraCodes__InfozipUnix Zip_ExtraCodes = 30805
Zip_ExtraCodes__InfozipUnixVarSize Zip_ExtraCodes = 30837
Zip_ExtraCodes__AexEncryption Zip_ExtraCodes = 39169
Zip_ExtraCodes__ApacheCommonsCompress Zip_ExtraCodes = 41246
Zip_ExtraCodes__MicrosoftOpenPackagingGrowthHint Zip_ExtraCodes = 41504
Zip_ExtraCodes__SmsQdos Zip_ExtraCodes = 64842
)
type Zip struct {
Sections []*Zip_PkSection
_io *kaitai.Stream
_root *Zip
_parent interface{}
}
func NewZip() *Zip {
return &Zip{
}
}
func (this *Zip) Read(io *kaitai.Stream, parent interface{}, root *Zip) (err error) {
this._io = io
this._parent = parent
this._root = root
for i := 1;; i++ {
tmp1, err := this._io.EOF()
if err != nil {
return err
}
if tmp1 {
break
}
tmp2 := NewZip_PkSection()
err = tmp2.Read(this._io, this, this._root)
if err != nil {
return err
}
this.Sections = append(this.Sections, tmp2)
}
return err
}
type Zip_LocalFile struct {
Header *Zip_LocalFileHeader
Body []byte
_io *kaitai.Stream
_root *Zip
_parent *Zip_PkSection
}
func NewZip_LocalFile() *Zip_LocalFile {
return &Zip_LocalFile{
}
}
func (this *Zip_LocalFile) Read(io *kaitai.Stream, parent *Zip_PkSection, root *Zip) (err error) {
this._io = io
this._parent = parent
this._root = root
tmp3 := NewZip_LocalFileHeader()
err = tmp3.Read(this._io, this, this._root)
if err != nil {
return err
}
this.Header = tmp3
tmp4, err := this._io.ReadBytes(int(this.Header.LenBodyCompressed))
if err != nil {
return err
}
tmp4 = tmp4
this.Body = tmp4
return err
}
type Zip_DataDescriptor struct {
Crc32 uint32
LenBodyCompressed uint32
LenBodyUncompressed uint32
_io *kaitai.Stream
_root *Zip
_parent *Zip_PkSection
}
func NewZip_DataDescriptor() *Zip_DataDescriptor {
return &Zip_DataDescriptor{
}
}
func (this *Zip_DataDescriptor) Read(io *kaitai.Stream, parent *Zip_PkSection, root *Zip) (err error) {
this._io = io
this._parent = parent
this._root = root
tmp5, err := this._io.ReadU4le()
if err != nil {
return err
}
this.Crc32 = uint32(tmp5)
tmp6, err := this._io.ReadU4le()
if err != nil {
return err
}
this.LenBodyCompressed = uint32(tmp6)
tmp7, err := this._io.ReadU4le()
if err != nil {
return err
}
this.LenBodyUncompressed = uint32(tmp7)
return err
}
type Zip_ExtraField struct {
Code Zip_ExtraCodes
LenBody uint16
Body interface{}
_io *kaitai.Stream
_root *Zip
_parent *Zip_Extras
_raw_Body []byte
}
func NewZip_ExtraField() *Zip_ExtraField {
return &Zip_ExtraField{
}
}
func (this *Zip_ExtraField) Read(io *kaitai.Stream, parent *Zip_Extras, root *Zip) (err error) {
this._io = io
this._parent = parent
this._root = root
tmp8, err := this._io.ReadU2le()
if err != nil {
return err
}
this.Code = Zip_ExtraCodes(tmp8)
tmp9, err := this._io.ReadU2le()
if err != nil {
return err
}
this.LenBody = uint16(tmp9)
switch (this.Code) {
case Zip_ExtraCodes__Ntfs:
tmp10, err := this._io.ReadBytes(int(this.LenBody))
if err != nil {
return err
}
tmp10 = tmp10
this._raw_Body = tmp10
_io__raw_Body := kaitai.NewStream(bytes.NewReader(this._raw_Body))
tmp11 := NewZip_ExtraField_Ntfs()
err = tmp11.Read(_io__raw_Body, this, this._root)
if err != nil {
return err
}
this.Body = tmp11
case Zip_ExtraCodes__ExtendedTimestamp:
tmp12, err := this._io.ReadBytes(int(this.LenBody))
if err != nil {
return err
}
tmp12 = tmp12
this._raw_Body = tmp12
_io__raw_Body := kaitai.NewStream(bytes.NewReader(this._raw_Body))
tmp13 := NewZip_ExtraField_ExtendedTimestamp()
err = tmp13.Read(_io__raw_Body, this, this._root)
if err != nil {
return err
}
this.Body = tmp13
case Zip_ExtraCodes__InfozipUnixVarSize:
tmp14, err := this._io.ReadBytes(int(this.LenBody))
if err != nil {
return err
}
tmp14 = tmp14
this._raw_Body = tmp14
_io__raw_Body := kaitai.NewStream(bytes.NewReader(this._raw_Body))
tmp15 := NewZip_ExtraField_InfozipUnixVarSize()
err = tmp15.Read(_io__raw_Body, this, this._root)
if err != nil {
return err
}
this.Body = tmp15
default:
tmp16, err := this._io.ReadBytes(int(this.LenBody))
if err != nil {
return err
}
tmp16 = tmp16
this._raw_Body = tmp16
}
return err
}
/**
* @see Source
*/
type Zip_ExtraField_Ntfs struct {
Reserved uint32
Attributes []*Zip_ExtraField_Ntfs_Attribute
_io *kaitai.Stream
_root *Zip
_parent *Zip_ExtraField
}
func NewZip_ExtraField_Ntfs() *Zip_ExtraField_Ntfs {
return &Zip_ExtraField_Ntfs{
}
}
func (this *Zip_ExtraField_Ntfs) Read(io *kaitai.Stream, parent *Zip_ExtraField, root *Zip) (err error) {
this._io = io
this._parent = parent
this._root = root
tmp17, err := this._io.ReadU4le()
if err != nil {
return err
}
this.Reserved = uint32(tmp17)
for i := 1;; i++ {
tmp18, err := this._io.EOF()
if err != nil {
return err
}
if tmp18 {
break
}
tmp19 := NewZip_ExtraField_Ntfs_Attribute()
err = tmp19.Read(this._io, this, this._root)
if err != nil {
return err
}
this.Attributes = append(this.Attributes, tmp19)
}
return err
}
type Zip_ExtraField_Ntfs_Attribute struct {
Tag uint16
LenBody uint16
Body interface{}
_io *kaitai.Stream
_root *Zip
_parent *Zip_ExtraField_Ntfs
_raw_Body []byte
}
func NewZip_ExtraField_Ntfs_Attribute() *Zip_ExtraField_Ntfs_Attribute {
return &Zip_ExtraField_Ntfs_Attribute{
}
}
func (this *Zip_ExtraField_Ntfs_Attribute) Read(io *kaitai.Stream, parent *Zip_ExtraField_Ntfs, root *Zip) (err error) {
this._io = io
this._parent = parent
this._root = root
tmp20, err := this._io.ReadU2le()
if err != nil {
return err
}
this.Tag = uint16(tmp20)
tmp21, err := this._io.ReadU2le()
if err != nil {
return err
}
this.LenBody = uint16(tmp21)
switch (this.Tag) {
case 1:
tmp22, err := this._io.ReadBytes(int(this.LenBody))
if err != nil {
return err
}
tmp22 = tmp22
this._raw_Body = tmp22
_io__raw_Body := kaitai.NewStream(bytes.NewReader(this._raw_Body))
tmp23 := NewZip_ExtraField_Ntfs_Attribute1()
err = tmp23.Read(_io__raw_Body, this, this._root)
if err != nil {
return err
}
this.Body = tmp23
default:
tmp24, err := this._io.ReadBytes(int(this.LenBody))
if err != nil {
return err
}
tmp24 = tmp24
this._raw_Body = tmp24
}
return err
}
type Zip_ExtraField_Ntfs_Attribute1 struct {
LastModTime uint64
LastAccessTime uint64
CreationTime uint64
_io *kaitai.Stream
_root *Zip
_parent *Zip_ExtraField_Ntfs_Attribute
}
func NewZip_ExtraField_Ntfs_Attribute1() *Zip_ExtraField_Ntfs_Attribute1 {
return &Zip_ExtraField_Ntfs_Attribute1{
}
}
func (this *Zip_ExtraField_Ntfs_Attribute1) Read(io *kaitai.Stream, parent *Zip_ExtraField_Ntfs_Attribute, root *Zip) (err error) {
this._io = io
this._parent = parent
this._root = root
tmp25, err := this._io.ReadU8le()
if err != nil {
return err
}
this.LastModTime = uint64(tmp25)
tmp26, err := this._io.ReadU8le()
if err != nil {
return err
}
this.LastAccessTime = uint64(tmp26)
tmp27, err := this._io.ReadU8le()
if err != nil {
return err
}
this.CreationTime = uint64(tmp27)
return err
}
/**
* @see Source
*/
type Zip_ExtraField_ExtendedTimestamp struct {
Flags *Zip_ExtraField_ExtendedTimestamp_InfoFlags
ModTime uint32
AccessTime uint32
CreateTime uint32
_io *kaitai.Stream
_root *Zip
_parent *Zip_ExtraField
_raw_Flags []byte
}
func NewZip_ExtraField_ExtendedTimestamp() *Zip_ExtraField_ExtendedTimestamp {
return &Zip_ExtraField_ExtendedTimestamp{
}
}
func (this *Zip_ExtraField_ExtendedTimestamp) Read(io *kaitai.Stream, parent *Zip_ExtraField, root *Zip) (err error) {
this._io = io
this._parent = parent
this._root = root
tmp28, err := this._io.ReadBytes(int(1))
if err != nil {
return err
}
tmp28 = tmp28
this._raw_Flags = tmp28
_io__raw_Flags := kaitai.NewStream(bytes.NewReader(this._raw_Flags))
tmp29 := NewZip_ExtraField_ExtendedTimestamp_InfoFlags()
err = tmp29.Read(_io__raw_Flags, this, this._root)
if err != nil {
return err
}
this.Flags = tmp29
if (this.Flags.HasModTime) {
tmp30, err := this._io.ReadU4le()
if err != nil {
return err
}
this.ModTime = uint32(tmp30)
}
if (this.Flags.HasAccessTime) {
tmp31, err := this._io.ReadU4le()
if err != nil {
return err
}
this.AccessTime = uint32(tmp31)
}
if (this.Flags.HasCreateTime) {
tmp32, err := this._io.ReadU4le()
if err != nil {
return err
}
this.CreateTime = uint32(tmp32)
}
return err
}
/**
* Unix timestamp
*/
/**
* Unix timestamp
*/
/**
* Unix timestamp
*/
type Zip_ExtraField_ExtendedTimestamp_InfoFlags struct {
HasModTime bool
HasAccessTime bool
HasCreateTime bool
Reserved uint64
_io *kaitai.Stream
_root *Zip
_parent *Zip_ExtraField_ExtendedTimestamp
}
func NewZip_ExtraField_ExtendedTimestamp_InfoFlags() *Zip_ExtraField_ExtendedTimestamp_InfoFlags {
return &Zip_ExtraField_ExtendedTimestamp_InfoFlags{
}
}
func (this *Zip_ExtraField_ExtendedTimestamp_InfoFlags) Read(io *kaitai.Stream, parent *Zip_ExtraField_ExtendedTimestamp, root *Zip) (err error) {
this._io = io
this._parent = parent
this._root = root
tmp33, err := this._io.ReadBitsIntLe(1)
if err != nil {
return err
}
this.HasModTime = tmp33 != 0
tmp34, err := this._io.ReadBitsIntLe(1)
if err != nil {
return err
}
this.HasAccessTime = tmp34 != 0
tmp35, err := this._io.ReadBitsIntLe(1)
if err != nil {
return err
}
this.HasCreateTime = tmp35 != 0
tmp36, err := this._io.ReadBitsIntLe(5)
if err != nil {
return err
}
this.Reserved = tmp36
return err
}
/**
* @see Source
*/
type Zip_ExtraField_InfozipUnixVarSize struct {
Version uint8
LenUid uint8
Uid []byte
LenGid uint8
Gid []byte
_io *kaitai.Stream
_root *Zip
_parent *Zip_ExtraField
}
func NewZip_ExtraField_InfozipUnixVarSize() *Zip_ExtraField_InfozipUnixVarSize {
return &Zip_ExtraField_InfozipUnixVarSize{
}
}
func (this *Zip_ExtraField_InfozipUnixVarSize) Read(io *kaitai.Stream, parent *Zip_ExtraField, root *Zip) (err error) {
this._io = io
this._parent = parent
this._root = root
tmp37, err := this._io.ReadU1()
if err != nil {
return err
}
this.Version = tmp37
tmp38, err := this._io.ReadU1()
if err != nil {
return err
}
this.LenUid = tmp38
tmp39, err := this._io.ReadBytes(int(this.LenUid))
if err != nil {
return err
}
tmp39 = tmp39
this.Uid = tmp39
tmp40, err := this._io.ReadU1()
if err != nil {
return err
}
this.LenGid = tmp40
tmp41, err := this._io.ReadBytes(int(this.LenGid))
if err != nil {
return err
}
tmp41 = tmp41
this.Gid = tmp41
return err
}
/**
* Version of this extra field, currently 1
*/
/**
* Size of UID field
*/
/**
* UID (User ID) for a file
*/
/**
* Size of GID field
*/
/**
* GID (Group ID) for a file
*/
/**
* @see - 4.3.12
*/
type Zip_CentralDirEntry struct {
VersionMadeBy uint16
VersionNeededToExtract uint16
Flags uint16
CompressionMethod Zip_Compression
FileModTime *DosDatetime
Crc32 uint32
LenBodyCompressed uint32
LenBodyUncompressed uint32
LenFileName uint16
LenExtra uint16
LenComment uint16
DiskNumberStart uint16
IntFileAttr uint16
ExtFileAttr uint32
OfsLocalHeader int32
FileName string
Extra *Zip_Extras
Comment string
_io *kaitai.Stream
_root *Zip
_parent *Zip_PkSection
_raw_FileModTime []byte
_raw_Extra []byte
_f_localHeader bool
localHeader *Zip_PkSection
}
func NewZip_CentralDirEntry() *Zip_CentralDirEntry {
return &Zip_CentralDirEntry{
}
}
func (this *Zip_CentralDirEntry) Read(io *kaitai.Stream, parent *Zip_PkSection, root *Zip) (err error) {
this._io = io
this._parent = parent
this._root = root
tmp42, err := this._io.ReadU2le()
if err != nil {
return err
}
this.VersionMadeBy = uint16(tmp42)
tmp43, err := this._io.ReadU2le()
if err != nil {
return err
}
this.VersionNeededToExtract = uint16(tmp43)
tmp44, err := this._io.ReadU2le()
if err != nil {
return err
}
this.Flags = uint16(tmp44)
tmp45, err := this._io.ReadU2le()
if err != nil {
return err
}
this.CompressionMethod = Zip_Compression(tmp45)
tmp46, err := this._io.ReadBytes(int(4))
if err != nil {
return err
}
tmp46 = tmp46
this._raw_FileModTime = tmp46
_io__raw_FileModTime := kaitai.NewStream(bytes.NewReader(this._raw_FileModTime))
tmp47 := NewDosDatetime()
err = tmp47.Read(_io__raw_FileModTime, this, nil)
if err != nil {
return err
}
this.FileModTime = tmp47
tmp48, err := this._io.ReadU4le()
if err != nil {
return err
}
this.Crc32 = uint32(tmp48)
tmp49, err := this._io.ReadU4le()
if err != nil {
return err
}
this.LenBodyCompressed = uint32(tmp49)
tmp50, err := this._io.ReadU4le()
if err != nil {
return err
}
this.LenBodyUncompressed = uint32(tmp50)
tmp51, err := this._io.ReadU2le()
if err != nil {
return err
}
this.LenFileName = uint16(tmp51)
tmp52, err := this._io.ReadU2le()
if err != nil {
return err
}
this.LenExtra = uint16(tmp52)
tmp53, err := this._io.ReadU2le()
if err != nil {
return err
}
this.LenComment = uint16(tmp53)
tmp54, err := this._io.ReadU2le()
if err != nil {
return err
}
this.DiskNumberStart = uint16(tmp54)
tmp55, err := this._io.ReadU2le()
if err != nil {
return err
}
this.IntFileAttr = uint16(tmp55)
tmp56, err := this._io.ReadU4le()
if err != nil {
return err
}
this.ExtFileAttr = uint32(tmp56)
tmp57, err := this._io.ReadS4le()
if err != nil {
return err
}
this.OfsLocalHeader = int32(tmp57)
tmp58, err := this._io.ReadBytes(int(this.LenFileName))
if err != nil {
return err
}
tmp58 = tmp58
this.FileName = string(tmp58)
tmp59, err := this._io.ReadBytes(int(this.LenExtra))
if err != nil {
return err
}
tmp59 = tmp59
this._raw_Extra = tmp59
_io__raw_Extra := kaitai.NewStream(bytes.NewReader(this._raw_Extra))
tmp60 := NewZip_Extras()
err = tmp60.Read(_io__raw_Extra, this, this._root)
if err != nil {
return err
}
this.Extra = tmp60
tmp61, err := this._io.ReadBytes(int(this.LenComment))
if err != nil {
return err
}
tmp61 = tmp61
this.Comment = string(tmp61)
return err
}
func (this *Zip_CentralDirEntry) LocalHeader() (v *Zip_PkSection, err error) {
if (this._f_localHeader) {
return this.localHeader, nil
}
_pos, err := this._io.Pos()
if err != nil {
return nil, err
}
_, err = this._io.Seek(int64(this.OfsLocalHeader), io.SeekStart)
if err != nil {
return nil, err
}
tmp62 := NewZip_PkSection()
err = tmp62.Read(this._io, this, this._root)
if err != nil {
return nil, err
}
this.localHeader = tmp62
_, err = this._io.Seek(_pos, io.SeekStart)
if err != nil {
return nil, err
}
this._f_localHeader = true
this._f_localHeader = true
return this.localHeader, nil
}
type Zip_PkSection struct {
Magic []byte
SectionType uint16
Body interface{}
_io *kaitai.Stream
_root *Zip
_parent interface{}
}
func NewZip_PkSection() *Zip_PkSection {
return &Zip_PkSection{
}
}
func (this *Zip_PkSection) Read(io *kaitai.Stream, parent interface{}, root *Zip) (err error) {
this._io = io
this._parent = parent
this._root = root
tmp63, err := this._io.ReadBytes(int(2))
if err != nil {
return err
}
tmp63 = tmp63
this.Magic = tmp63
if !(bytes.Equal(this.Magic, []uint8{80, 75})) {
return kaitai.NewValidationNotEqualError([]uint8{80, 75}, this.Magic, this._io, "/types/pk_section/seq/0")
}
tmp64, err := this._io.ReadU2le()
if err != nil {
return err
}
this.SectionType = uint16(tmp64)
switch (this.SectionType) {
case 513:
tmp65 := NewZip_CentralDirEntry()
err = tmp65.Read(this._io, this, this._root)
if err != nil {
return err
}
this.Body = tmp65
case 1027:
tmp66 := NewZip_LocalFile()
err = tmp66.Read(this._io, this, this._root)
if err != nil {
return err
}
this.Body = tmp66
case 1541:
tmp67 := NewZip_EndOfCentralDir()
err = tmp67.Read(this._io, this, this._root)
if err != nil {
return err
}
this.Body = tmp67
case 2055:
tmp68 := NewZip_DataDescriptor()
err = tmp68.Read(this._io, this, this._root)
if err != nil {
return err
}
this.Body = tmp68
}
return err
}
type Zip_Extras struct {
Entries []*Zip_ExtraField
_io *kaitai.Stream
_root *Zip
_parent interface{}
}
func NewZip_Extras() *Zip_Extras {
return &Zip_Extras{
}
}
func (this *Zip_Extras) Read(io *kaitai.Stream, parent interface{}, root *Zip) (err error) {
this._io = io
this._parent = parent
this._root = root
for i := 1;; i++ {
tmp69, err := this._io.EOF()
if err != nil {
return err
}
if tmp69 {
break
}
tmp70 := NewZip_ExtraField()
err = tmp70.Read(this._io, this, this._root)
if err != nil {
return err
}
this.Entries = append(this.Entries, tmp70)
}
return err
}
type Zip_LocalFileHeader struct {
Version uint16
Flags *Zip_LocalFileHeader_GpFlags
CompressionMethod Zip_Compression
FileModTime *DosDatetime
Crc32 uint32
LenBodyCompressed uint32
LenBodyUncompressed uint32
LenFileName uint16
LenExtra uint16
FileName string
Extra *Zip_Extras
_io *kaitai.Stream
_root *Zip
_parent *Zip_LocalFile
_raw_Flags []byte
_raw_FileModTime []byte
_raw_Extra []byte
}
func NewZip_LocalFileHeader() *Zip_LocalFileHeader {
return &Zip_LocalFileHeader{
}
}
func (this *Zip_LocalFileHeader) Read(io *kaitai.Stream, parent *Zip_LocalFile, root *Zip) (err error) {
this._io = io
this._parent = parent
this._root = root
tmp71, err := this._io.ReadU2le()
if err != nil {
return err
}
this.Version = uint16(tmp71)
tmp72, err := this._io.ReadBytes(int(2))
if err != nil {
return err
}
tmp72 = tmp72
this._raw_Flags = tmp72
_io__raw_Flags := kaitai.NewStream(bytes.NewReader(this._raw_Flags))
tmp73 := NewZip_LocalFileHeader_GpFlags()
err = tmp73.Read(_io__raw_Flags, this, this._root)
if err != nil {
return err
}
this.Flags = tmp73
tmp74, err := this._io.ReadU2le()
if err != nil {
return err
}
this.CompressionMethod = Zip_Compression(tmp74)
tmp75, err := this._io.ReadBytes(int(4))
if err != nil {
return err
}
tmp75 = tmp75
this._raw_FileModTime = tmp75
_io__raw_FileModTime := kaitai.NewStream(bytes.NewReader(this._raw_FileModTime))
tmp76 := NewDosDatetime()
err = tmp76.Read(_io__raw_FileModTime, this, nil)
if err != nil {
return err
}
this.FileModTime = tmp76
tmp77, err := this._io.ReadU4le()
if err != nil {
return err
}
this.Crc32 = uint32(tmp77)
tmp78, err := this._io.ReadU4le()
if err != nil {
return err
}
this.LenBodyCompressed = uint32(tmp78)
tmp79, err := this._io.ReadU4le()
if err != nil {
return err
}
this.LenBodyUncompressed = uint32(tmp79)
tmp80, err := this._io.ReadU2le()
if err != nil {
return err
}
this.LenFileName = uint16(tmp80)
tmp81, err := this._io.ReadU2le()
if err != nil {
return err
}
this.LenExtra = uint16(tmp81)
tmp82, err := this._io.ReadBytes(int(this.LenFileName))
if err != nil {
return err
}
tmp82 = tmp82
this.FileName = string(tmp82)
tmp83, err := this._io.ReadBytes(int(this.LenExtra))
if err != nil {
return err
}
tmp83 = tmp83
this._raw_Extra = tmp83
_io__raw_Extra := kaitai.NewStream(bytes.NewReader(this._raw_Extra))
tmp84 := NewZip_Extras()
err = tmp84.Read(_io__raw_Extra, this, this._root)
if err != nil {
return err
}
this.Extra = tmp84
return err
}
/**
* @see - 4.4.4
* @see Local file headers
*/
type Zip_LocalFileHeader_GpFlags_DeflateMode int
const (
Zip_LocalFileHeader_GpFlags_DeflateMode__Normal Zip_LocalFileHeader_GpFlags_DeflateMode = 0
Zip_LocalFileHeader_GpFlags_DeflateMode__Maximum Zip_LocalFileHeader_GpFlags_DeflateMode = 1
Zip_LocalFileHeader_GpFlags_DeflateMode__Fast Zip_LocalFileHeader_GpFlags_DeflateMode = 2
Zip_LocalFileHeader_GpFlags_DeflateMode__SuperFast Zip_LocalFileHeader_GpFlags_DeflateMode = 3
)
type Zip_LocalFileHeader_GpFlags struct {
FileEncrypted bool
CompOptionsRaw uint64
HasDataDescriptor bool
Reserved1 bool
CompPatchedData bool
StrongEncrypt bool
Reserved2 uint64
LangEncoding bool
Reserved3 bool
MaskHeaderValues bool
Reserved4 uint64
_io *kaitai.Stream
_root *Zip
_parent *Zip_LocalFileHeader
_f_deflatedMode bool
deflatedMode Zip_LocalFileHeader_GpFlags_DeflateMode
_f_implodedDictByteSize bool
implodedDictByteSize int
_f_implodedNumSfTrees bool
implodedNumSfTrees int8
_f_lzmaHasEosMarker bool
lzmaHasEosMarker bool
}
func NewZip_LocalFileHeader_GpFlags() *Zip_LocalFileHeader_GpFlags {
return &Zip_LocalFileHeader_GpFlags{
}
}
func (this *Zip_LocalFileHeader_GpFlags) Read(io *kaitai.Stream, parent *Zip_LocalFileHeader, root *Zip) (err error) {
this._io = io
this._parent = parent
this._root = root
tmp85, err := this._io.ReadBitsIntLe(1)
if err != nil {
return err
}
this.FileEncrypted = tmp85 != 0
tmp86, err := this._io.ReadBitsIntLe(2)
if err != nil {
return err
}
this.CompOptionsRaw = tmp86
tmp87, err := this._io.ReadBitsIntLe(1)
if err != nil {
return err
}
this.HasDataDescriptor = tmp87 != 0
tmp88, err := this._io.ReadBitsIntLe(1)
if err != nil {
return err
}
this.Reserved1 = tmp88 != 0
tmp89, err := this._io.ReadBitsIntLe(1)
if err != nil {
return err
}
this.CompPatchedData = tmp89 != 0
tmp90, err := this._io.ReadBitsIntLe(1)
if err != nil {
return err
}
this.StrongEncrypt = tmp90 != 0
tmp91, err := this._io.ReadBitsIntLe(4)
if err != nil {
return err
}
this.Reserved2 = tmp91
tmp92, err := this._io.ReadBitsIntLe(1)
if err != nil {
return err
}
this.LangEncoding = tmp92 != 0
tmp93, err := this._io.ReadBitsIntLe(1)
if err != nil {
return err
}
this.Reserved3 = tmp93 != 0
tmp94, err := this._io.ReadBitsIntLe(1)
if err != nil {
return err
}
this.MaskHeaderValues = tmp94 != 0
tmp95, err := this._io.ReadBitsIntLe(2)
if err != nil {
return err
}
this.Reserved4 = tmp95
return err
}
func (this *Zip_LocalFileHeader_GpFlags) DeflatedMode() (v Zip_LocalFileHeader_GpFlags_DeflateMode, err error) {
if (this._f_deflatedMode) {
return this.deflatedMode, nil
}
if ( ((this._parent.CompressionMethod == Zip_Compression__Deflated) || (this._parent.CompressionMethod == Zip_Compression__EnhancedDeflated)) ) {
this.deflatedMode = Zip_LocalFileHeader_GpFlags_DeflateMode(Zip_LocalFileHeader_GpFlags_DeflateMode(this.CompOptionsRaw))
}
this._f_deflatedMode = true
return this.deflatedMode, nil
}
/**
* 8KiB or 4KiB in bytes
*/
func (this *Zip_LocalFileHeader_GpFlags) ImplodedDictByteSize() (v int, err error) {
if (this._f_implodedDictByteSize) {
return this.implodedDictByteSize, nil
}
if (this._parent.CompressionMethod == Zip_Compression__Imploded) {
var tmp96 int8;
if ((this.CompOptionsRaw & 1) != 0) {
tmp96 = 8
} else {
tmp96 = 4
}
this.implodedDictByteSize = int((tmp96 * 1024))
}
this._f_implodedDictByteSize = true
return this.implodedDictByteSize, nil
}
func (this *Zip_LocalFileHeader_GpFlags) ImplodedNumSfTrees() (v int8, err error) {
if (this._f_implodedNumSfTrees) {
return this.implodedNumSfTrees, nil
}
if (this._parent.CompressionMethod == Zip_Compression__Imploded) {
var tmp97 int8;
if ((this.CompOptionsRaw & 2) != 0) {
tmp97 = 3
} else {
tmp97 = 2
}
this.implodedNumSfTrees = int8(tmp97)
}
this._f_implodedNumSfTrees = true
return this.implodedNumSfTrees, nil
}
func (this *Zip_LocalFileHeader_GpFlags) LzmaHasEosMarker() (v bool, err error) {
if (this._f_lzmaHasEosMarker) {
return this.lzmaHasEosMarker, nil
}
if (this._parent.CompressionMethod == Zip_Compression__Lzma) {
this.lzmaHasEosMarker = bool((this.CompOptionsRaw & 1) != 0)
}
this._f_lzmaHasEosMarker = true
return this.lzmaHasEosMarker, nil
}
/**
* internal; access derived value instances instead
*/
type Zip_EndOfCentralDir struct {
DiskOfEndOfCentralDir uint16
DiskOfCentralDir uint16
NumCentralDirEntriesOnDisk uint16
NumCentralDirEntriesTotal uint16
LenCentralDir uint32
OfsCentralDir uint32
LenComment uint16
Comment string
_io *kaitai.Stream
_root *Zip
_parent *Zip_PkSection
}
func NewZip_EndOfCentralDir() *Zip_EndOfCentralDir {
return &Zip_EndOfCentralDir{
}
}
func (this *Zip_EndOfCentralDir) Read(io *kaitai.Stream, parent *Zip_PkSection, root *Zip) (err error) {
this._io = io
this._parent = parent
this._root = root
tmp98, err := this._io.ReadU2le()
if err != nil {
return err
}
this.DiskOfEndOfCentralDir = uint16(tmp98)
tmp99, err := this._io.ReadU2le()
if err != nil {
return err
}
this.DiskOfCentralDir = uint16(tmp99)
tmp100, err := this._io.ReadU2le()
if err != nil {
return err
}
this.NumCentralDirEntriesOnDisk = uint16(tmp100)
tmp101, err := this._io.ReadU2le()
if err != nil {
return err
}
this.NumCentralDirEntriesTotal = uint16(tmp101)
tmp102, err := this._io.ReadU4le()
if err != nil {
return err
}
this.LenCentralDir = uint32(tmp102)
tmp103, err := this._io.ReadU4le()
if err != nil {
return err
}
this.OfsCentralDir = uint32(tmp103)
tmp104, err := this._io.ReadU2le()
if err != nil {
return err
}
this.LenComment = uint16(tmp104)
tmp105, err := this._io.ReadBytes(int(this.LenComment))
if err != nil {
return err
}
tmp105 = tmp105
this.Comment = string(tmp105)
return err
}