source: subversion/applications/utils/amf/amf_lib.rb @ 17331

Last change on this file since 17331 was 13609, checked in by richard, 11 years ago

example of calling amf_controller from outside Flash

File size: 2.3 KB
Line 
1
2# ====================================================================
3# AMF write subroutines
4
5# ----- putdata         envelope data into AMF writeable form
6# ----- encodevalue     pack variables as AMF
7
8def putdata(index,n)
9        d =encodestring(index+"/onResult")
10        d+=encodestring("null")
11        d+=[-1].pack("N")
12        d+=encodevalue(n)
13end
14
15def encodevalue(n)
16        case n.class.to_s
17                when 'Array'
18                        a=10.chr+encodelong(n.length)
19                        n.each do |b|
20                                a+=encodevalue(b)
21                        end
22                        return a
23                when 'Hash'
24                        a=3.chr
25                        n.each do |k,v|
26                                a+=encodestring(k)+encodevalue(v)
27                        end
28                        return a+0.chr+0.chr+9.chr
29                when 'String'
30                        return 2.chr+encodestring(n)
31                when 'Bignum','Fixnum','Float'
32                        return 0.chr+encodedouble(n)
33                when 'NilClass'
34                        return 5.chr;
35        end
36end
37
38# ----- encodestring    encode string with two-byte length
39# ----- encodedouble    encode number as eight-byte double precision float
40# ----- encodelong              encode number as four-byte long
41
42def encodestring(n)
43        a,b=n.size.divmod(256)
44        a.chr+b.chr+n
45end
46
47def encodedouble(n)
48        [n].pack('G')
49end
50
51def encodelong(n)
52        [n].pack('L')
53end
54
55# ====================================================================
56# Read subroutines
57
58# ----- getint          return two-byte integer
59# ----- getlong         return four-byte long
60# ----- getstring       return string with two-byte length
61# ----- getdouble       return eight-byte double-precision float
62# ----- getobject       return object/hash
63# ----- getarray        return numeric array
64
65def getint(s)
66        s.getc*256+s.getc
67end
68
69def getlong(s)
70        ((s.getc*256+s.getc)*256+s.getc)*256+s.getc
71end
72
73def getstring(s)
74        len=s.getc*256+s.getc
75        s.read(len)
76end
77
78def getdouble(s)
79        a=s.read(8).unpack('G')                 # G big-endian, E little-endian
80        a[0]
81end
82
83def getarray(s)
84        len=getlong(s)
85        arr=[]
86        for i in (0..len-1)
87                arr[i]=getvalue(s)
88        end
89        arr
90end
91
92def getobject(s)
93        arr={}
94        while (key=getstring(s))
95                if (key=='') then break end
96                arr[key]=getvalue(s)
97        end
98        s.getc          # skip the 9 'end of object' value
99        arr
100end
101
102# ----- getvalue        parse and get value
103
104def getvalue(s)
105        case s.getc
106                when 0; return getdouble(s)                     # number
107                when 1; return s.getc                           # boolean
108                when 2; return getstring(s)                     # string
109                when 3; return getobject(s)                     # object/hash
110                when 5; return nil                                      # null
111                when 6; return nil                                      # undefined
112                when 8; s.read(4)                                       # mixedArray
113                                return getobject(s)                     #  |
114                when 10;return getarray(s)                      # array
115                else;   return nil                                      # error
116        end
117end
Note: See TracBrowser for help on using the repository browser.