- MessageInfo(msg *packer.PackedData) *packer.MessageInfo
-}
-
-//-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
-type E2APAutoPacker struct {
- packer E2APPackerIf
-}
-
-func NewE2APAutoPacker(packer E2APPackerIf) *E2APAutoPacker {
- return &E2APAutoPacker{packer: packer}
-}
-
-// TODO improve openasn handling to reuse PDU etc...
-// Now practically decodes two times each E2/X2 message, as first round solves message type
-func (autopacker *E2APAutoPacker) UnPack(msg *packer.PackedData) (error, interface{}) {
- var err error = nil
- msgInfo := autopacker.packer.MessageInfo(msg)
- if msgInfo != nil {
- switch msgInfo.MsgType {
- case E2AP_InitiatingMessage:
- switch msgInfo.MsgId {
- case E2AP_RICSubscriptionRequest:
- unpa := autopacker.packer.NewPackerSubscriptionRequest()
- err = unpa.UnPack(msg)
- if err == nil {
- return unpa.Get()
- }
- case E2AP_RICSubscriptionDeleteRequest:
- unpa := autopacker.packer.NewPackerSubscriptionDeleteRequest()
- err = unpa.UnPack(msg)
- if err == nil {
- return unpa.Get()
- }
- default:
- err = fmt.Errorf("MsgType: E2AP_InitiatingMessage => MsgId:%d unknown", msgInfo.MsgId)
- }
- case E2AP_SuccessfulOutcome:
- switch msgInfo.MsgId {
- case E2AP_RICSubscriptionResponse:
- unpa := autopacker.packer.NewPackerSubscriptionResponse()
- err = unpa.UnPack(msg)
- if err == nil {
- return unpa.Get()
- }
- case E2AP_RICSubscriptionDeleteResponse:
- unpa := autopacker.packer.NewPackerSubscriptionDeleteResponse()
- err = unpa.UnPack(msg)
- if err == nil {
- return unpa.Get()
- }
- default:
- err = fmt.Errorf("MsgType: E2AP_SuccessfulOutcome => MsgId:%d unknown", msgInfo.MsgId)
- }
- case E2AP_UnsuccessfulOutcome:
- switch msgInfo.MsgId {
- case E2AP_RICSubscriptionFailure:
- unpa := autopacker.packer.NewPackerSubscriptionFailure()
- err = unpa.UnPack(msg)
- if err == nil {
- return unpa.Get()
- }
- case E2AP_RICSubscriptionDeleteFailure:
- unpa := autopacker.packer.NewPackerSubscriptionDeleteFailure()
- err = unpa.UnPack(msg)
- if err == nil {
- return unpa.Get()
- }
- default:
- err = fmt.Errorf("MsgType: E2AP_UnsuccessfulOutcome => MsgId:%d unknown", msgInfo.MsgId)
- }
- default:
- err = fmt.Errorf("MsgType: %d and MsgId:%d unknown", msgInfo.MsgType, msgInfo.MsgId)
- }
- } else {
- err = fmt.Errorf("MsgInfo not received")
- }
- return err, nil
-}
-
-func (autopacker *E2APAutoPacker) Pack(data interface{}, trg *packer.PackedData) (error, *packer.PackedData) {
- var err error = nil
- switch themsg := data.(type) {
- case *E2APSubscriptionRequest:
- pa := autopacker.packer.NewPackerSubscriptionRequest()
- err = pa.Set(themsg)
- if err == nil {
- return pa.Pack(trg)
- }
- case *E2APSubscriptionResponse:
- pa := autopacker.packer.NewPackerSubscriptionResponse()
- err = pa.Set(themsg)
- if err == nil {
- return pa.Pack(trg)
- }
- case *E2APSubscriptionFailure:
- pa := autopacker.packer.NewPackerSubscriptionFailure()
- err = pa.Set(themsg)
- if err == nil {
- return pa.Pack(trg)
- }
- case *E2APSubscriptionDeleteRequest:
- pa := autopacker.packer.NewPackerSubscriptionDeleteRequest()
- err = pa.Set(themsg)
- if err == nil {
- return pa.Pack(trg)
- }
- case *E2APSubscriptionDeleteResponse:
- pa := autopacker.packer.NewPackerSubscriptionDeleteResponse()
- err = pa.Set(themsg)
- if err == nil {
- return pa.Pack(trg)
- }
- case *E2APSubscriptionDeleteFailure:
- pa := autopacker.packer.NewPackerSubscriptionDeleteFailure()
- err = pa.Set(themsg)
- if err == nil {
- return pa.Pack(trg)
- }
- default:
- err = fmt.Errorf("unknown message")
- }
- return err, nil