// 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"
)
/**
* Direct Internet Message Encapsulation (DIME)
* is an old Microsoft specification for sending and receiving
* SOAP messages along with additional attachments,
* like binary files, XML fragments, and even other
* SOAP messages, using standard transport protocols like HTTP.
*
* Sample file: `curl -LO
* https://github.com/kaitai-io/kaitai_struct_formats/files/5894723/scanner_withoptions.dump.gz
* && gunzip scanner_withoptions.dump.gz`
* @see Source
* @see Source
* @see Source
*/
type DimeMessage_TypeFormats int
const (
DimeMessage_TypeFormats__Unchanged DimeMessage_TypeFormats = 0
DimeMessage_TypeFormats__MediaType DimeMessage_TypeFormats = 1
DimeMessage_TypeFormats__AbsoluteUri DimeMessage_TypeFormats = 2
DimeMessage_TypeFormats__Unknown DimeMessage_TypeFormats = 3
DimeMessage_TypeFormats__None DimeMessage_TypeFormats = 4
)
type DimeMessage struct {
Records []*DimeMessage_Record
_io *kaitai.Stream
_root *DimeMessage
_parent interface{}
}
func NewDimeMessage() *DimeMessage {
return &DimeMessage{
}
}
func (this *DimeMessage) Read(io *kaitai.Stream, parent interface{}, root *DimeMessage) (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 := NewDimeMessage_Record()
err = tmp2.Read(this._io, this, this._root)
if err != nil {
return err
}
this.Records = append(this.Records, tmp2)
}
return err
}
/**
* padding to the next 4-byte boundary
*/
type DimeMessage_Padding struct {
BoundaryPadding []byte
_io *kaitai.Stream
_root *DimeMessage
_parent *DimeMessage_Record
}
func NewDimeMessage_Padding() *DimeMessage_Padding {
return &DimeMessage_Padding{
}
}
func (this *DimeMessage_Padding) Read(io *kaitai.Stream, parent *DimeMessage_Record, root *DimeMessage) (err error) {
this._io = io
this._parent = parent
this._root = root
tmp4, err := this._io.Pos()
if err != nil {
return err
}
tmp3 := -(tmp4) % 4
if tmp3 < 0 {
tmp3 += 4
}
tmp5, err := this._io.ReadBytes(int(tmp3))
if err != nil {
return err
}
tmp5 = tmp5
this.BoundaryPadding = tmp5
return err
}
/**
* the option field of the record
*/
type DimeMessage_OptionField struct {
OptionElements []*DimeMessage_OptionElement
_io *kaitai.Stream
_root *DimeMessage
_parent *DimeMessage_Record
}
func NewDimeMessage_OptionField() *DimeMessage_OptionField {
return &DimeMessage_OptionField{
}
}
func (this *DimeMessage_OptionField) Read(io *kaitai.Stream, parent *DimeMessage_Record, root *DimeMessage) (err error) {
this._io = io
this._parent = parent
this._root = root
for i := 1;; i++ {
tmp6, err := this._io.EOF()
if err != nil {
return err
}
if tmp6 {
break
}
tmp7 := NewDimeMessage_OptionElement()
err = tmp7.Read(this._io, this, this._root)
if err != nil {
return err
}
this.OptionElements = append(this.OptionElements, tmp7)
}
return err
}
/**
* one element of the option field
*/
type DimeMessage_OptionElement struct {
ElementFormat uint16
LenElement uint16
ElementData []byte
_io *kaitai.Stream
_root *DimeMessage
_parent *DimeMessage_OptionField
}
func NewDimeMessage_OptionElement() *DimeMessage_OptionElement {
return &DimeMessage_OptionElement{
}
}
func (this *DimeMessage_OptionElement) Read(io *kaitai.Stream, parent *DimeMessage_OptionField, root *DimeMessage) (err error) {
this._io = io
this._parent = parent
this._root = root
tmp8, err := this._io.ReadU2be()
if err != nil {
return err
}
this.ElementFormat = uint16(tmp8)
tmp9, err := this._io.ReadU2be()
if err != nil {
return err
}
this.LenElement = uint16(tmp9)
tmp10, err := this._io.ReadBytes(int(this.LenElement))
if err != nil {
return err
}
tmp10 = tmp10
this.ElementData = tmp10
return err
}
/**
* each individual fragment of the message
*/
type DimeMessage_Record struct {
Version uint64
IsFirstRecord bool
IsLastRecord bool
IsChunkRecord bool
TypeFormat DimeMessage_TypeFormats
Reserved uint64
LenOptions uint16
LenId uint16
LenType uint16
LenData uint32
Options *DimeMessage_OptionField
OptionsPadding *DimeMessage_Padding
Id string
IdPadding *DimeMessage_Padding
Type string
TypePadding *DimeMessage_Padding
Data []byte
DataPadding *DimeMessage_Padding
_io *kaitai.Stream
_root *DimeMessage
_parent *DimeMessage
_raw_Options []byte
}
func NewDimeMessage_Record() *DimeMessage_Record {
return &DimeMessage_Record{
}
}
func (this *DimeMessage_Record) Read(io *kaitai.Stream, parent *DimeMessage, root *DimeMessage) (err error) {
this._io = io
this._parent = parent
this._root = root
tmp11, err := this._io.ReadBitsIntBe(5)
if err != nil {
return err
}
this.Version = tmp11
tmp12, err := this._io.ReadBitsIntBe(1)
if err != nil {
return err
}
this.IsFirstRecord = tmp12 != 0
tmp13, err := this._io.ReadBitsIntBe(1)
if err != nil {
return err
}
this.IsLastRecord = tmp13 != 0
tmp14, err := this._io.ReadBitsIntBe(1)
if err != nil {
return err
}
this.IsChunkRecord = tmp14 != 0
tmp15, err := this._io.ReadBitsIntBe(4)
if err != nil {
return err
}
this.TypeFormat = DimeMessage_TypeFormats(tmp15)
tmp16, err := this._io.ReadBitsIntBe(4)
if err != nil {
return err
}
this.Reserved = tmp16
this._io.AlignToByte()
tmp17, err := this._io.ReadU2be()
if err != nil {
return err
}
this.LenOptions = uint16(tmp17)
tmp18, err := this._io.ReadU2be()
if err != nil {
return err
}
this.LenId = uint16(tmp18)
tmp19, err := this._io.ReadU2be()
if err != nil {
return err
}
this.LenType = uint16(tmp19)
tmp20, err := this._io.ReadU4be()
if err != nil {
return err
}
this.LenData = uint32(tmp20)
tmp21, err := this._io.ReadBytes(int(this.LenOptions))
if err != nil {
return err
}
tmp21 = tmp21
this._raw_Options = tmp21
_io__raw_Options := kaitai.NewStream(bytes.NewReader(this._raw_Options))
tmp22 := NewDimeMessage_OptionField()
err = tmp22.Read(_io__raw_Options, this, this._root)
if err != nil {
return err
}
this.Options = tmp22
tmp23 := NewDimeMessage_Padding()
err = tmp23.Read(this._io, this, this._root)
if err != nil {
return err
}
this.OptionsPadding = tmp23
tmp24, err := this._io.ReadBytes(int(this.LenId))
if err != nil {
return err
}
tmp24 = tmp24
this.Id = string(tmp24)
tmp25 := NewDimeMessage_Padding()
err = tmp25.Read(this._io, this, this._root)
if err != nil {
return err
}
this.IdPadding = tmp25
tmp26, err := this._io.ReadBytes(int(this.LenType))
if err != nil {
return err
}
tmp26 = tmp26
this.Type = string(tmp26)
tmp27 := NewDimeMessage_Padding()
err = tmp27.Read(this._io, this, this._root)
if err != nil {
return err
}
this.TypePadding = tmp27
tmp28, err := this._io.ReadBytes(int(this.LenData))
if err != nil {
return err
}
tmp28 = tmp28
this.Data = tmp28
tmp29 := NewDimeMessage_Padding()
err = tmp29.Read(this._io, this, this._root)
if err != nil {
return err
}
this.DataPadding = tmp29
return err
}
/**
* DIME format version (always 1)
*/
/**
* Set if this is the first record in the message
*/
/**
* Set if this is the last record in the message
*/
/**
* Set if the file contained in this record is chunked into multiple records
*/
/**
* Indicates the structure and format of the value of the TYPE field
*/
/**
* Reserved for future use
*/
/**
* Length of the Options field
*/
/**
* Length of the ID field
*/
/**
* Length of the Type field
*/
/**
* Length of the Data field
*/
/**
* Unique identifier of the file (set in the first record of file)
*/
/**
* Specified type in the format set with type_format
*/
/**
* The file data
*/