Skip to content

Commit

Permalink
Fix Marshaling of Dialogue
Browse files Browse the repository at this point in the history
  • Loading branch information
linouxis9 committed Apr 4, 2024
1 parent 6a024d8 commit fcfbaf0
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 14 deletions.
26 changes: 26 additions & 0 deletions codec_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,32 @@ var testcases = []struct {
return v, nil
},
}, {
description: "Dialogue/AARQ/UserInformation",
structured: tcap.NewDialogue(
1, 1, // OID, Version
tcap.NewAARQ(
// Version, Context, ContextVersion
1, tcap.AnyTimeInfoEnquiryContext, 3,
tcap.NewIE(0xBE, []byte{0xde, 0xad, 0xbe, 0xef}),
),
[]byte{0xde, 0xad, 0xbe, 0xef},
),
serialized: []byte{
0x6b, 0x28, 0x28, 0x26, 0x06, 0x07, 0x00, 0x11, 0x86, 0x05, 0x01, 0x01, 0x01, 0xa0, 0x17, 0x60,
0x15, 0x80, 0x02, 0x07, 0x80, 0xa1, 0x09, 0x06, 0x07, 0x04, 0x00, 0x00, 0x01, 0x00, 0x1d, 0x03,
0xbe, 0x04, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef,
},
parseFunc: func(b []byte) (serializable, error) {
v, err := tcap.ParseDialogue(b)
if err != nil {
return nil, err
}
// clear unnecessary payload
v.SingleAsn1Type.Value = nil

return v, nil
},
}, {
description: "Dialogue/AARE",
structured: tcap.NewDialogue(
1, 1, // OID, Version
Expand Down
3 changes: 2 additions & 1 deletion dialogue-pdu.go
Original file line number Diff line number Diff line change
Expand Up @@ -700,13 +700,14 @@ func (d *DialoguePDU) ContextVersion() string {

// String returns DialoguePDU in human readable string.
func (d *DialoguePDU) String() string {
return fmt.Sprintf("{Type: %#x, Length: %d, ProtocolVersion: %v, ApplicationContextName: %v, Result: %v, ResultSourceDiagnostic: %v, AbortSource: %v}",
return fmt.Sprintf("{Type: %#x, Length: %d, ProtocolVersion: %v, ApplicationContextName: %v, Result: %v, ResultSourceDiagnostic: %v, AbortSource: %v, UserInformation: %v}",
d.Type,
d.Length,
d.ProtocolVersion,
d.ApplicationContextName,
d.Result,
d.ResultSourceDiagnostic,
d.AbortSource,
d.UserInformation,
)
}
34 changes: 21 additions & 13 deletions dialogue.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,21 +76,26 @@ func (d *Dialogue) MarshalTo(b []byte) error {
offset += field.MarshalLen()
}

if field := d.SingleAsn1Type; field != nil {
if err := field.MarshalTo(b[offset : offset+field.MarshalLen()]); err != nil {
return err
}
offset += field.MarshalLen()
if d.SingleAsn1Type == nil {
copy(b[offset:], d.Payload)
return nil
}

if field := d.DialoguePDU; field != nil {
if err := field.MarshalTo(b[offset : offset+field.MarshalLen()]); err != nil {
d.SingleAsn1Type.Value = make([]byte, field.MarshalLen())
if err := field.MarshalTo(d.SingleAsn1Type.Value); err != nil {
return err
}
offset += field.MarshalLen()
}

d.SingleAsn1Type.SetLength()
if err := d.SingleAsn1Type.MarshalTo(b[offset : offset+d.SingleAsn1Type.MarshalLen()]); err != nil {
return err
}
offset += d.SingleAsn1Type.MarshalLen()

copy(b[offset:], d.Payload)

return nil
}

Expand Down Expand Up @@ -188,19 +193,22 @@ func (d *Dialogue) MarshalLen() int {
if field := d.ObjectIdentifier; field != nil {
l += field.MarshalLen()
}
if field := d.SingleAsn1Type; field != nil {
l += field.MarshalLen()
}
if field := d.DialoguePDU; field != nil {
l += field.MarshalLen()
l += field.MarshalLen() + 2 // 2 = singleAsn1Type IE Header
}
l += len(d.Payload)

return l
return l + len(d.Payload)
}

// SetLength sets the length in Length field.
func (d *Dialogue) SetLength() {
if d.ObjectIdentifier != nil {
d.ObjectIdentifier.SetLength()
}
if d.DialoguePDU != nil {
d.DialoguePDU.SetLength()
}

d.Length = uint8(d.MarshalLen() - 2)
d.ExternalLength = uint8(d.MarshalLen() - 4)
}
Expand Down
1 change: 1 addition & 0 deletions tcap.go
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ func Parse(b []byte) (*TCAP, error) {
if err := t.UnmarshalBinary(b); err != nil {
return nil, err
}

return t, nil
}

Expand Down

0 comments on commit fcfbaf0

Please sign in to comment.