1package amf
2
3import (
4	"io"
5)
6
7const (
8	AMF0 = 0x00
9	AMF3 = 0x03
10)
11
12const (
13	AMF0_NUMBER_MARKER         = 0x00
14	AMF0_BOOLEAN_MARKER        = 0x01
15	AMF0_STRING_MARKER         = 0x02
16	AMF0_OBJECT_MARKER         = 0x03
17	AMF0_MOVIECLIP_MARKER      = 0x04
18	AMF0_NULL_MARKER           = 0x05
19	AMF0_UNDEFINED_MARKER      = 0x06
20	AMF0_REFERENCE_MARKER      = 0x07
21	AMF0_ECMA_ARRAY_MARKER     = 0x08
22	AMF0_OBJECT_END_MARKER     = 0x09
23	AMF0_STRICT_ARRAY_MARKER   = 0x0a
24	AMF0_DATE_MARKER           = 0x0b
25	AMF0_LONG_STRING_MARKER    = 0x0c
26	AMF0_UNSUPPORTED_MARKER    = 0x0d
27	AMF0_RECORDSET_MARKER      = 0x0e
28	AMF0_XML_DOCUMENT_MARKER   = 0x0f
29	AMF0_TYPED_OBJECT_MARKER   = 0x10
30	AMF0_ACMPLUS_OBJECT_MARKER = 0x11
31)
32
33const (
34	AMF0_BOOLEAN_FALSE = 0x00
35	AMF0_BOOLEAN_TRUE  = 0x01
36	AMF0_STRING_MAX    = 65535
37	AMF3_INTEGER_MAX   = 536870911
38)
39
40const (
41	AMF3_UNDEFINED_MARKER = 0x00
42	AMF3_NULL_MARKER      = 0x01
43	AMF3_FALSE_MARKER     = 0x02
44	AMF3_TRUE_MARKER      = 0x03
45	AMF3_INTEGER_MARKER   = 0x04
46	AMF3_DOUBLE_MARKER    = 0x05
47	AMF3_STRING_MARKER    = 0x06
48	AMF3_XMLDOC_MARKER    = 0x07
49	AMF3_DATE_MARKER      = 0x08
50	AMF3_ARRAY_MARKER     = 0x09
51	AMF3_OBJECT_MARKER    = 0x0a
52	AMF3_XMLSTRING_MARKER = 0x0b
53	AMF3_BYTEARRAY_MARKER = 0x0c
54)
55
56type ExternalHandler func(*Decoder, io.Reader) (interface{}, error)
57
58type Decoder struct {
59	refCache         []interface{}
60	stringRefs       []string
61	objectRefs       []interface{}
62	traitRefs        []Trait
63	externalHandlers map[string]ExternalHandler
64}
65
66func NewDecoder() *Decoder {
67	return &Decoder{
68		externalHandlers: make(map[string]ExternalHandler),
69	}
70}
71
72func (d *Decoder) RegisterExternalHandler(name string, f ExternalHandler) {
73	d.externalHandlers[name] = f
74}
75
76type Encoder struct {
77}
78
79type Version uint8
80
81type Array []interface{}
82type Object map[string]interface{}
83
84type TypedObject struct {
85	Type   string
86	Object Object
87}
88
89type Trait struct {
90	Type           string
91	Externalizable bool
92	Dynamic        bool
93	Properties     []string
94}
95
96func NewTrait() *Trait {
97	return &Trait{}
98}
99
100func NewTypedObject() *TypedObject {
101	return &TypedObject{
102		Type:   "",
103		Object: make(Object),
104	}
105}
106