mirror of https://bitbucket.org/ausocean/av.git
Implemented boolean properties (although our rtmp implementation does not seem to require it at present).
This commit is contained in:
parent
2105339657
commit
b31c65001e
|
@ -210,6 +210,8 @@ func EncodeBoolean(buf []byte, val bool) ([]byte, error) {
|
||||||
buf[0] = typeBoolean
|
buf[0] = typeBoolean
|
||||||
if val {
|
if val {
|
||||||
buf[1] = 1
|
buf[1] = 1
|
||||||
|
} else {
|
||||||
|
buf[1] = 0
|
||||||
}
|
}
|
||||||
if len(buf) == 2 {
|
if len(buf) == 2 {
|
||||||
return nil, ErrEndOfBuffer
|
return nil, ErrEndOfBuffer
|
||||||
|
@ -277,14 +279,13 @@ func PropEncode(p *Property, buf []byte) ([]byte, error) {
|
||||||
buf = buf[len(p.Name):]
|
buf = buf[len(p.Name):]
|
||||||
}
|
}
|
||||||
|
|
||||||
var err error
|
|
||||||
switch p.Type {
|
switch p.Type {
|
||||||
case typeNumber:
|
case typeNumber:
|
||||||
buf, err = EncodeNumber(buf, p.Number)
|
return EncodeNumber(buf, p.Number)
|
||||||
case typeBoolean:
|
case typeBoolean:
|
||||||
buf, err = EncodeBoolean(buf, p.Number != 0)
|
return EncodeBoolean(buf, p.Number != 0)
|
||||||
case typeString:
|
case typeString:
|
||||||
buf, err = EncodeString(buf, p.String)
|
return EncodeString(buf, p.String)
|
||||||
case TypeNull:
|
case TypeNull:
|
||||||
if len(buf) < 2 {
|
if len(buf) < 2 {
|
||||||
return nil, ErrShortBuffer
|
return nil, ErrShortBuffer
|
||||||
|
@ -292,15 +293,15 @@ func PropEncode(p *Property, buf []byte) ([]byte, error) {
|
||||||
buf[0] = TypeNull
|
buf[0] = TypeNull
|
||||||
buf = buf[1:]
|
buf = buf[1:]
|
||||||
case TypeObject:
|
case TypeObject:
|
||||||
buf, err = Encode(&p.Object, buf)
|
return Encode(&p.Object, buf)
|
||||||
case typeEcmaArray:
|
case typeEcmaArray:
|
||||||
buf, err = EncodeEcmaArray(&p.Object, buf)
|
return EncodeEcmaArray(&p.Object, buf)
|
||||||
case typeStrictArray:
|
case typeStrictArray:
|
||||||
buf, err = EncodeArray(&p.Object, buf)
|
return EncodeArray(&p.Object, buf)
|
||||||
default:
|
default:
|
||||||
buf, err = nil, ErrInvalidType
|
return nil, ErrInvalidType
|
||||||
}
|
}
|
||||||
return buf, err
|
return buf, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// PropDecode decodes a property, returning the number of bytes consumed from the supplied buffer.
|
// PropDecode decodes a property, returning the number of bytes consumed from the supplied buffer.
|
||||||
|
@ -341,7 +342,11 @@ func PropDecode(prop *Property, buf []byte, decodeName bool) (int, error) {
|
||||||
buf = buf[8:]
|
buf = buf[8:]
|
||||||
|
|
||||||
case typeBoolean:
|
case typeBoolean:
|
||||||
return 0, ErrUnimplemented
|
if len(buf) < 1 {
|
||||||
|
return 0, ErrShortBuffer
|
||||||
|
}
|
||||||
|
prop.Number = float64(uint8(buf[0]))
|
||||||
|
buf = buf[1:]
|
||||||
|
|
||||||
case typeString:
|
case typeString:
|
||||||
n := DecodeInt16(buf[:2])
|
n := DecodeInt16(buf[:2])
|
||||||
|
|
|
@ -186,12 +186,35 @@ func TestObject(t *testing.T) {
|
||||||
t.Errorf("Decode of object failed")
|
t.Errorf("Decode of object failed")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Change the object's property to a boolean.
|
||||||
|
obj1.Props[0].Type = typeBoolean
|
||||||
|
obj1.Props[0].Number = 1
|
||||||
|
|
||||||
|
// Re-encode it
|
||||||
|
enc = buf[:]
|
||||||
|
enc, err = Encode(&obj1, enc)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Encode of object failed")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Re-decode it.
|
||||||
|
dec = buf[1:]
|
||||||
|
_, err = Decode(&dobj1, dec, false)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Decode of object failed with error: %v", err)
|
||||||
|
}
|
||||||
|
if dobj1.Props[0].Number != 1 {
|
||||||
|
t.Errorf("Decoded wrong boolean value")
|
||||||
|
}
|
||||||
|
|
||||||
// Construct a more complicated object.
|
// Construct a more complicated object.
|
||||||
var obj2 Object
|
var obj2 Object
|
||||||
for i, _ := range testStrings {
|
for i, _ := range testStrings {
|
||||||
obj2.Props = append(obj2.Props, Property{Type: typeString, String: testStrings[i]})
|
obj2.Props = append(obj2.Props, Property{Type: typeString, String: testStrings[i]})
|
||||||
obj2.Props = append(obj2.Props, Property{Type: typeNumber, Number: float64(testNumbers[i])})
|
obj2.Props = append(obj2.Props, Property{Type: typeNumber, Number: float64(testNumbers[i])})
|
||||||
}
|
}
|
||||||
|
obj2.Props = append(obj2.Props, Property{Type: typeBoolean, Number: 0})
|
||||||
|
obj2.Props = append(obj2.Props, Property{Type: typeBoolean, Number: 1})
|
||||||
|
|
||||||
// Encode it.
|
// Encode it.
|
||||||
enc = buf[:]
|
enc = buf[:]
|
||||||
|
@ -205,7 +228,7 @@ func TestObject(t *testing.T) {
|
||||||
var dobj2 Object
|
var dobj2 Object
|
||||||
_, err = Decode(&dobj2, dec, false)
|
_, err = Decode(&dobj2, dec, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("Decode of object failed")
|
t.Errorf("Decode of object failed with error: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find some properties that exist.
|
// Find some properties that exist.
|
||||||
|
@ -223,6 +246,14 @@ func TestObject(t *testing.T) {
|
||||||
if prop.Number != 1 {
|
if prop.Number != 1 {
|
||||||
t.Errorf("GetProp(1) returned wrong Property")
|
t.Errorf("GetProp(1) returned wrong Property")
|
||||||
}
|
}
|
||||||
|
prop, err = obj2.GetProp("", 9)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("GetProp(9) failed")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if prop.Type != typeBoolean && prop.Number != 1 {
|
||||||
|
t.Errorf("GetProp(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.GetProp("", 10)
|
||||||
|
|
Loading…
Reference in New Issue