Added type-specific wrappers for amf.Object.GetProperty, namely GetNumber, GetString and GetObject.

This commit is contained in:
scruzin 2019-01-12 18:43:51 +10:30
parent 5b94ddfbe9
commit 32c281d2dc
3 changed files with 58 additions and 31 deletions

View File

@ -473,19 +473,51 @@ func Decode(obj *Object, buf []byte, decodeName bool) (int, error) {
return sz - len(buf), nil return sz - len(buf), nil
} }
// GetProp returns an object's property, either by its index when idx is non-negative, or by its name otherwise. // GetProperty returns a property, either by its index when idx is non-negative, or by its name otherwise.
// If the requested property is not found an ErrPropertyNotFound error is returned. // If the requested property is not found or the type does not match, an ErrPropertyNotFound error is returned.
func (obj *Object) GetProp(name string, idx int) (*Property, error) { func (obj *Object) GetProperty(name string, idx int, typ uint8) (*Property, error) {
var prop *Property
if idx >= 0 { if idx >= 0 {
if idx < len(obj.Properties) { if idx < len(obj.Properties) {
return &obj.Properties[idx], nil prop = &obj.Properties[idx]
} }
} else { } else {
for i, p := range obj.Properties { for i, p := range obj.Properties {
if p.Name == name { if p.Name == name {
return &obj.Properties[i], nil prop = &obj.Properties[i]
break
} }
} }
} }
if prop == nil || prop.Type != typ {
return nil, ErrPropertyNotFound return nil, ErrPropertyNotFound
}
return prop, nil
}
// GetNumber is a wrapper for GetProperty that returns a Number property's value, if any.
func (obj *Object) GetNumber(name string, idx int) (float64, error) {
prop, err := obj.GetProperty(name, idx, typeNumber)
if err != nil {
return 0, err
}
return prop.Number, nil
}
// GetString is a wrapper for GetProperty that returns a String property's value, if any.
func (obj *Object) GetString(name string, idx int) (string, error) {
prop, err := obj.GetProperty(name, idx, typeString)
if err != nil {
return "", err
}
return prop.String, nil
}
// GetObject is a wrapper for GetProperty that returns an Object property's value, if any.
func (obj *Object) GetObject(name string, idx int) (*Object, error) {
prop, err := obj.GetProperty(name, idx, TypeObject)
if err != nil {
return nil, err
}
return &prop.Object, nil
} }

View File

@ -232,32 +232,32 @@ func TestObject(t *testing.T) {
} }
// Find some properties that exist. // Find some properties that exist.
prop, err := obj2.GetProp("", 2) prop, err := obj2.GetProperty("", 2, typeString)
if err != nil { if err != nil {
t.Errorf("GetProp(2) failed") t.Errorf("GetProperty(2) failed")
} }
if prop.String != "foo" { if prop.String != "foo" {
t.Errorf("GetProp(2) returned wrong Property") t.Errorf("GetProperty(2) returned wrong Property")
} }
prop, err = obj2.GetProp("", 3) prop, err = obj2.GetProperty("", 3, typeNumber)
if err != nil { if err != nil {
t.Errorf("GetProp(1) failed") t.Errorf("GetProperty(1) failed")
} }
if prop.Number != 1 { if prop.Number != 1 {
t.Errorf("GetProp(1) returned wrong Property") t.Errorf("GetProperty(1) returned wrong Property")
} }
prop, err = obj2.GetProp("", 9) prop, err = obj2.GetProperty("", 9, typeBoolean)
if err != nil { if err != nil {
t.Errorf("GetProp(9) failed") t.Errorf("GetProperty(9) failed")
return return
} }
if prop.Type != typeBoolean && prop.Number != 1 { if prop.Number != 1 {
t.Errorf("GetProp(9) returned wrong Property") t.Errorf("GetProperty(9) returned wrong Property")
} }
// Try to find one that doesn't exist. // Try to find one that doesn't exist.
prop, err = obj2.GetProp("", 10) prop, err = obj2.GetProperty("", 10, TypeObject)
if err != ErrPropertyNotFound { if err != ErrPropertyNotFound {
t.Errorf("GetProp(10) failed") t.Errorf("GetProperty(10) failed")
} }
} }

View File

@ -686,16 +686,14 @@ func handleInvoke(s *Session, body []byte) error {
return err return err
} }
prop, err := obj.GetProp("", 0) meth, err := obj.GetString("", 0)
if err != nil { if err != nil {
return err return err
} }
meth := prop.String txn, err := obj.GetNumber("", 1)
prop, err = obj.GetProp("", 1)
if err != nil { if err != nil {
return err return err
} }
txn := prop.Number
s.log(DebugLevel, pkg+"invoking method "+meth) s.log(DebugLevel, pkg+"invoking method "+meth)
switch meth { switch meth {
@ -736,15 +734,15 @@ func handleInvoke(s *Session, body []byte) error {
} }
case avCreatestream: case avCreatestream:
prop, err = obj.GetProp("", 3) n, err := obj.GetNumber("", 3)
if err != nil { if err != nil {
return err return err
} }
s.streamID = int32(prop.Number) s.streamID = int32(n)
if s.link.protocol&featureWrite == 0 { if s.link.protocol&featureWrite == 0 {
return errNotWritable return errNotWritable
} }
err := sendPublish(s) err = sendPublish(s)
if err != nil { if err != nil {
return err return err
} }
@ -777,21 +775,18 @@ func handleInvoke(s *Session, body []byte) error {
s.log(FatalLevel, pkg+"unsupported method avClose") s.log(FatalLevel, pkg+"unsupported method avClose")
case avOnStatus: case avOnStatus:
prop, err = obj.GetProp("", 3) obj2, err := obj.GetObject("", 3)
if err != nil { if err != nil {
return err return err
} }
obj2 := prop.Object code, err := obj2.GetString(avCode, -1)
prop, err = obj2.GetProp(avCode, -1)
if err != nil { if err != nil {
return err return err
} }
code := prop.String level, err := obj2.GetString(avLevel, -1)
prop, err = obj2.GetProp(avLevel, -1)
if err != nil { if err != nil {
return err return err
} }
level := prop.String
s.log(DebugLevel, pkg+"onStatus", "code", code, "level", level) s.log(DebugLevel, pkg+"onStatus", "code", code, "level", level)
switch code { switch code {