mrpin-rocketamf 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/rocketamf/pure/deserializer.rb +174 -163
- data/lib/rocketamf/pure/serializer.rb +3 -3
- data/mrpin-rocketamf.gemspec +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4e8a83878828c26ef9906a0b891828dcf688dff8
|
4
|
+
data.tar.gz: 8b58e2eb9a56aa6686f4e37358536eea50d111d6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4e12c5efe65968313ab9251f589421e7967507d1d9c892f3ddf76c73da9df996b3157ce458c7c5e56f0d0868e4b2198ffd9085718533e039daed179ed7f938ed
|
7
|
+
data.tar.gz: 755b54807d0f1f0fbb20ec1b95f3fb4f09cd62d5a820e8d021b5bab951e9c380aea99952fb713ec492d9d7d02be1b6000c3997996874c8642a4295f7bb1e0906
|
@@ -9,7 +9,7 @@ module RocketAMF
|
|
9
9
|
# Pass in the class mapper instance to use when deserializing. This
|
10
10
|
# enables better caching behavior in the class mapper and allows
|
11
11
|
# one to change mappings between deserialization attempts.
|
12
|
-
def initialize
|
12
|
+
def initialize(class_mapper)
|
13
13
|
@class_mapper = class_mapper
|
14
14
|
end
|
15
15
|
|
@@ -17,93 +17,99 @@ module RocketAMF
|
|
17
17
|
# be a string or StringIO object. If you pass a StringIO object,
|
18
18
|
# it will have its position updated to the end of the deserialized
|
19
19
|
# data.
|
20
|
-
def deserialize
|
21
|
-
|
20
|
+
def deserialize(version, source)
|
21
|
+
result = []
|
22
|
+
|
22
23
|
@version = version
|
23
24
|
|
24
|
-
if StringIO
|
25
|
+
if source.is_a?(StringIO)
|
25
26
|
@source = source
|
26
27
|
elsif source
|
27
28
|
@source = StringIO.new(source)
|
28
29
|
elsif @source.nil?
|
29
|
-
raise AMFError,
|
30
|
+
raise AMFError, 'no source to deserialize'
|
30
31
|
end
|
31
32
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
33
|
+
case @version
|
34
|
+
when 0
|
35
|
+
until @source.eof?
|
36
|
+
@ref_cache = []
|
37
|
+
result << amf0_deserialize
|
38
|
+
end
|
39
|
+
when 3
|
40
|
+
until @source.eof?
|
41
|
+
@string_cache = []
|
42
|
+
@object_cache = []
|
43
|
+
@trait_cache = []
|
44
|
+
result << amf3_deserialize
|
45
|
+
end
|
46
|
+
else
|
47
|
+
raise ArgumentError, "unsupported version #{version}"
|
40
48
|
end
|
49
|
+
|
50
|
+
result
|
41
51
|
end
|
42
52
|
|
43
53
|
# Reads an object from the deserializer's stream and returns it.
|
44
54
|
def read_object
|
45
|
-
|
46
|
-
return amf0_deserialize
|
47
|
-
else
|
48
|
-
return amf3_deserialize
|
49
|
-
end
|
55
|
+
@version == 0 ? amf0_deserialize : amf3_deserialize
|
50
56
|
end
|
51
57
|
|
52
58
|
private
|
53
59
|
include RocketAMF::Pure::ReadIOHelpers
|
54
60
|
|
55
|
-
def amf0_deserialize
|
61
|
+
def amf0_deserialize(type = nil)
|
56
62
|
type = read_int8 @source unless type
|
57
63
|
case type
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
64
|
+
when AMF0_NUMBER_MARKER
|
65
|
+
amf0_read_number
|
66
|
+
when AMF0_BOOLEAN_MARKER
|
67
|
+
amf0_read_boolean
|
68
|
+
when AMF0_STRING_MARKER
|
69
|
+
amf0_read_string
|
70
|
+
when AMF0_OBJECT_MARKER
|
71
|
+
amf0_read_object
|
72
|
+
when AMF0_NULL_MARKER
|
73
|
+
nil
|
74
|
+
when AMF0_UNDEFINED_MARKER
|
75
|
+
nil
|
76
|
+
when AMF0_REFERENCE_MARKER
|
77
|
+
amf0_read_reference
|
78
|
+
when AMF0_HASH_MARKER
|
79
|
+
amf0_read_hash
|
80
|
+
when AMF0_STRICT_ARRAY_MARKER
|
81
|
+
amf0_read_array
|
82
|
+
when AMF0_DATE_MARKER
|
83
|
+
amf0_read_date
|
84
|
+
when AMF0_LONG_STRING_MARKER
|
85
|
+
amf0_read_string true
|
86
|
+
when AMF0_UNSUPPORTED_MARKER
|
87
|
+
nil
|
88
|
+
when AMF0_XML_MARKER
|
89
|
+
amf0_read_string true
|
90
|
+
when AMF0_TYPED_OBJECT_MARKER
|
91
|
+
amf0_read_typed_object
|
92
|
+
when AMF0_AMF3_MARKER
|
93
|
+
deserialize(3, nil)
|
94
|
+
else
|
95
|
+
raise AMFError, "Invalid type: #{type}"
|
90
96
|
end
|
91
97
|
end
|
92
98
|
|
93
99
|
def amf0_read_number
|
94
|
-
|
95
|
-
(
|
100
|
+
result = read_double @source
|
101
|
+
(result.is_a?(Float) && result.nan?) ? nil : result # check for NaN and convert them to nil
|
96
102
|
end
|
97
103
|
|
98
104
|
def amf0_read_boolean
|
99
105
|
read_int8(@source) != 0
|
100
106
|
end
|
101
107
|
|
102
|
-
def amf0_read_string
|
103
|
-
len
|
104
|
-
|
105
|
-
|
106
|
-
|
108
|
+
def amf0_read_string(long=false)
|
109
|
+
len = long ? read_word32_network(@source) : read_word16_network(@source)
|
110
|
+
result = @source.read(len)
|
111
|
+
result.force_encoding('UTF-8') if result.respond_to?(:force_encoding)
|
112
|
+
result
|
107
113
|
end
|
108
114
|
|
109
115
|
def amf0_read_reference
|
@@ -112,26 +118,26 @@ module RocketAMF
|
|
112
118
|
end
|
113
119
|
|
114
120
|
def amf0_read_array
|
115
|
-
len
|
116
|
-
|
117
|
-
@ref_cache <<
|
121
|
+
len = read_word32_network(@source)
|
122
|
+
result = []
|
123
|
+
@ref_cache << result
|
118
124
|
|
119
125
|
0.upto(len - 1) do
|
120
|
-
|
126
|
+
result << amf0_deserialize
|
121
127
|
end
|
122
|
-
|
128
|
+
result
|
123
129
|
end
|
124
130
|
|
125
131
|
def amf0_read_date
|
126
132
|
seconds = read_double(@source).to_f/1000
|
127
|
-
time
|
128
|
-
tz
|
133
|
+
time = Time.at(seconds)
|
134
|
+
tz = read_word16_network(@source) # Unused
|
129
135
|
time
|
130
136
|
end
|
131
137
|
|
132
|
-
def amf0_read_props
|
138
|
+
def amf0_read_props(obj = {})
|
133
139
|
while true
|
134
|
-
key
|
140
|
+
key = amf0_read_string
|
135
141
|
type = read_int8 @source
|
136
142
|
break if type == AMF0_OBJECT_END_MARKER
|
137
143
|
obj[key] = amf0_deserialize(type)
|
@@ -160,7 +166,7 @@ module RocketAMF
|
|
160
166
|
def amf0_read_typed_object
|
161
167
|
# Create object to add to ref cache
|
162
168
|
class_name = amf0_read_string
|
163
|
-
obj
|
169
|
+
obj = @class_mapper.get_ruby_obj class_name
|
164
170
|
@ref_cache << obj
|
165
171
|
|
166
172
|
# Populate object
|
@@ -172,52 +178,52 @@ module RocketAMF
|
|
172
178
|
def amf3_deserialize
|
173
179
|
type = read_int8 @source
|
174
180
|
case type
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
181
|
+
when AMF3_UNDEFINED_MARKER
|
182
|
+
nil
|
183
|
+
when AMF3_NULL_MARKER
|
184
|
+
nil
|
185
|
+
when AMF3_FALSE_MARKER
|
186
|
+
false
|
187
|
+
when AMF3_TRUE_MARKER
|
188
|
+
true
|
189
|
+
when AMF3_INTEGER_MARKER
|
190
|
+
amf3_read_integer
|
191
|
+
when AMF3_DOUBLE_MARKER
|
192
|
+
amf3_read_number
|
193
|
+
when AMF3_STRING_MARKER
|
194
|
+
amf3_read_string
|
195
|
+
when AMF3_XML_DOC_MARKER, AMF3_XML_MARKER
|
196
|
+
amf3_read_xml
|
197
|
+
when AMF3_DATE_MARKER
|
198
|
+
amf3_read_date
|
199
|
+
when AMF3_ARRAY_MARKER
|
200
|
+
amf3_read_array
|
201
|
+
when AMF3_OBJECT_MARKER
|
202
|
+
amf3_read_object
|
203
|
+
when AMF3_BYTE_ARRAY_MARKER
|
204
|
+
amf3_read_byte_array
|
205
|
+
when AMF3_VECTOR_INT_MARKER, AMF3_VECTOR_UINT_MARKER, AMF3_VECTOR_DOUBLE_MARKER, AMF3_VECTOR_OBJECT_MARKER
|
206
|
+
amf3_read_vector type
|
207
|
+
when AMF3_DICT_MARKER
|
208
|
+
amf3_read_dict
|
209
|
+
else
|
210
|
+
raise AMFError, "Invalid type: #{type}"
|
205
211
|
end
|
206
212
|
end
|
207
213
|
|
208
214
|
def amf3_read_integer
|
209
|
-
n
|
210
|
-
b
|
215
|
+
n = 0
|
216
|
+
b = read_word8(@source) || 0
|
211
217
|
result = 0
|
212
218
|
|
213
219
|
while ((b & 0x80) != 0 && n < 3)
|
214
220
|
result = result << 7
|
215
221
|
result = result | (b & 0x7f)
|
216
|
-
b
|
217
|
-
n
|
222
|
+
b = read_word8(@source) || 0
|
223
|
+
n = n + 1
|
218
224
|
end
|
219
225
|
|
220
|
-
if
|
226
|
+
if n < 3
|
221
227
|
result = result << 7
|
222
228
|
result = result | b
|
223
229
|
else
|
@@ -226,7 +232,7 @@ module RocketAMF
|
|
226
232
|
result = result | b
|
227
233
|
|
228
234
|
#Check if the integer should be negative
|
229
|
-
if
|
235
|
+
if result > MAX_INTEGER
|
230
236
|
result -= (1 << 29)
|
231
237
|
end
|
232
238
|
end
|
@@ -239,7 +245,7 @@ module RocketAMF
|
|
239
245
|
end
|
240
246
|
|
241
247
|
def amf3_read_string
|
242
|
-
type
|
248
|
+
type = amf3_read_integer
|
243
249
|
is_reference = (type & 0x01) == 0
|
244
250
|
|
245
251
|
if is_reference
|
@@ -247,10 +253,10 @@ module RocketAMF
|
|
247
253
|
return @string_cache[reference]
|
248
254
|
else
|
249
255
|
length = type >> 1
|
250
|
-
str
|
256
|
+
str = ''
|
251
257
|
if length > 0
|
252
258
|
str = @source.read(length)
|
253
|
-
str.force_encoding(
|
259
|
+
str.force_encoding('UTF-8') if str.respond_to?(:force_encoding)
|
254
260
|
@string_cache << str
|
255
261
|
end
|
256
262
|
return str
|
@@ -258,26 +264,30 @@ module RocketAMF
|
|
258
264
|
end
|
259
265
|
|
260
266
|
def amf3_read_xml
|
261
|
-
|
267
|
+
result = nil
|
268
|
+
|
269
|
+
type = amf3_read_integer
|
262
270
|
is_reference = (type & 0x01) == 0
|
263
271
|
|
264
272
|
if is_reference
|
265
273
|
reference = type >> 1
|
266
|
-
|
274
|
+
result = @object_cache[reference]
|
267
275
|
else
|
268
276
|
length = type >> 1
|
269
|
-
str
|
277
|
+
str = ""
|
270
278
|
if length > 0
|
271
279
|
str = @source.read(length)
|
272
280
|
str.force_encoding("UTF-8") if str.respond_to?(:force_encoding)
|
273
281
|
@object_cache << str
|
274
282
|
end
|
275
|
-
|
283
|
+
result = str
|
276
284
|
end
|
285
|
+
|
286
|
+
result
|
277
287
|
end
|
278
288
|
|
279
289
|
def amf3_read_byte_array
|
280
|
-
type
|
290
|
+
type = amf3_read_integer
|
281
291
|
is_reference = (type & 0x01) == 0
|
282
292
|
|
283
293
|
if is_reference
|
@@ -285,65 +295,66 @@ module RocketAMF
|
|
285
295
|
return @object_cache[reference]
|
286
296
|
else
|
287
297
|
length = type >> 1
|
288
|
-
obj
|
298
|
+
obj = StringIO.new @source.read(length)
|
289
299
|
@object_cache << obj
|
290
300
|
obj
|
291
301
|
end
|
292
302
|
end
|
293
303
|
|
294
304
|
def amf3_read_array
|
295
|
-
type
|
305
|
+
type = amf3_read_integer
|
296
306
|
is_reference = (type & 0x01) == 0
|
297
307
|
|
298
308
|
if is_reference
|
299
309
|
reference = type >> 1
|
300
310
|
return @object_cache[reference]
|
301
311
|
else
|
302
|
-
length
|
312
|
+
length = type >> 1
|
303
313
|
property_name = amf3_read_string
|
304
|
-
array
|
314
|
+
array = property_name.length > 0 ? {} : []
|
305
315
|
@object_cache << array
|
306
316
|
|
307
317
|
while property_name.length > 0
|
308
|
-
value
|
318
|
+
value = amf3_deserialize
|
309
319
|
array[property_name] = value
|
310
|
-
property_name
|
320
|
+
property_name = amf3_read_string
|
311
321
|
end
|
312
|
-
0.upto(length - 1) {|i| array[i] = amf3_deserialize }
|
322
|
+
0.upto(length - 1) { |i| array[i] = amf3_deserialize }
|
313
323
|
|
314
324
|
array
|
315
325
|
end
|
316
326
|
end
|
317
327
|
|
318
328
|
def amf3_read_object
|
319
|
-
type
|
329
|
+
type = amf3_read_integer
|
320
330
|
is_reference = (type & 0x01) == 0
|
321
331
|
|
322
332
|
if is_reference
|
323
333
|
reference = type >> 1
|
324
334
|
return @object_cache[reference]
|
325
335
|
else
|
326
|
-
class_type
|
336
|
+
class_type = type >> 1
|
327
337
|
class_is_reference = (class_type & 0x01) == 0
|
328
338
|
|
329
339
|
if class_is_reference
|
330
340
|
reference = class_type >> 1
|
331
|
-
traits
|
341
|
+
traits = @trait_cache[reference]
|
332
342
|
else
|
333
|
-
externalizable
|
334
|
-
dynamic
|
343
|
+
externalizable = (class_type & 0x02) != 0
|
344
|
+
dynamic = (class_type & 0x04) != 0
|
335
345
|
attribute_count = class_type >> 3
|
336
|
-
class_name
|
346
|
+
class_name = amf3_read_string
|
337
347
|
|
338
348
|
class_attributes = []
|
339
|
-
attribute_count.times{class_attributes << amf3_read_string} # Read class members
|
340
|
-
|
341
|
-
traits =
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
349
|
+
attribute_count.times { class_attributes << amf3_read_string } # Read class members
|
350
|
+
|
351
|
+
traits =
|
352
|
+
{
|
353
|
+
class_name: class_name,
|
354
|
+
members: class_attributes,
|
355
|
+
externalizable: externalizable,
|
356
|
+
dynamic: dynamic
|
357
|
+
}
|
347
358
|
@trait_cache << traits
|
348
359
|
end
|
349
360
|
|
@@ -362,15 +373,15 @@ module RocketAMF
|
|
362
373
|
else
|
363
374
|
props = {}
|
364
375
|
traits[:members].each do |key|
|
365
|
-
value
|
376
|
+
value = amf3_deserialize
|
366
377
|
props[key] = value
|
367
378
|
end
|
368
379
|
|
369
380
|
dynamic_props = nil
|
370
381
|
if traits[:dynamic]
|
371
382
|
dynamic_props = {}
|
372
|
-
while (key = amf3_read_string) && key.length != 0
|
373
|
-
value
|
383
|
+
while (key = amf3_read_string) && key.length != 0 do # read next key
|
384
|
+
value = amf3_deserialize
|
374
385
|
dynamic_props[key] = value
|
375
386
|
end
|
376
387
|
end
|
@@ -382,21 +393,21 @@ module RocketAMF
|
|
382
393
|
end
|
383
394
|
|
384
395
|
def amf3_read_date
|
385
|
-
type
|
396
|
+
type = amf3_read_integer
|
386
397
|
is_reference = (type & 0x01) == 0
|
387
398
|
if is_reference
|
388
399
|
reference = type >> 1
|
389
400
|
return @object_cache[reference]
|
390
401
|
else
|
391
402
|
seconds = read_double(@source).to_f/1000
|
392
|
-
time
|
403
|
+
time = Time.at(seconds)
|
393
404
|
@object_cache << time
|
394
405
|
time
|
395
406
|
end
|
396
407
|
end
|
397
408
|
|
398
409
|
def amf3_read_dict
|
399
|
-
type
|
410
|
+
type = amf3_read_integer
|
400
411
|
is_reference = (type & 0x01) == 0
|
401
412
|
if is_reference
|
402
413
|
reference = type >> 1
|
@@ -404,7 +415,7 @@ module RocketAMF
|
|
404
415
|
else
|
405
416
|
dict = {}
|
406
417
|
@object_cache << dict
|
407
|
-
length
|
418
|
+
length = type >> 1
|
408
419
|
weak_keys = read_int8 @source # Ignore: Not supported in ruby
|
409
420
|
0.upto(length - 1) do |i|
|
410
421
|
dict[amf3_deserialize] = amf3_deserialize
|
@@ -414,7 +425,7 @@ module RocketAMF
|
|
414
425
|
end
|
415
426
|
|
416
427
|
def amf3_read_vector vector_type
|
417
|
-
type
|
428
|
+
type = amf3_read_integer
|
418
429
|
is_reference = (type & 0x01) == 0
|
419
430
|
if is_reference
|
420
431
|
reference = type >> 1
|
@@ -422,30 +433,30 @@ module RocketAMF
|
|
422
433
|
else
|
423
434
|
vec = []
|
424
435
|
@object_cache << vec
|
425
|
-
length
|
436
|
+
length = type >> 1
|
426
437
|
fixed_vector = read_int8 @source # Ignore
|
427
438
|
case vector_type
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
439
|
+
when AMF3_VECTOR_INT_MARKER
|
440
|
+
0.upto(length - 1) do |i|
|
441
|
+
int = read_word32_network(@source)
|
442
|
+
int = int - 2**32 if int > MAX_INTEGER
|
443
|
+
vec << int
|
444
|
+
end
|
445
|
+
when AMF3_VECTOR_UINT_MARKER
|
446
|
+
0.upto(length - 1) do |i|
|
447
|
+
vec << read_word32_network(@source)
|
448
|
+
puts vec[i].to_s(2)
|
449
|
+
end
|
450
|
+
when AMF3_VECTOR_DOUBLE_MARKER
|
451
|
+
0.upto(length - 1) do |i|
|
452
|
+
vec << amf3_read_number
|
453
|
+
end
|
454
|
+
when AMF3_VECTOR_OBJECT_MARKER
|
455
|
+
vector_class = amf3_read_string # Ignore
|
456
|
+
puts vector_class
|
457
|
+
0.upto(length - 1) do |i|
|
458
|
+
vec << amf3_deserialize
|
459
|
+
end
|
449
460
|
end
|
450
461
|
vec
|
451
462
|
end
|
@@ -357,7 +357,7 @@ module RocketAMF
|
|
357
357
|
class_name = is_default ? "__default__" : traits[:class_name]
|
358
358
|
|
359
359
|
# Write out traits
|
360
|
-
if
|
360
|
+
if class_name && @trait_cache[class_name] != nil
|
361
361
|
@stream << pack_integer(@trait_cache[class_name] << 2 | 0x01)
|
362
362
|
else
|
363
363
|
@trait_cache.add_obj class_name if class_name
|
@@ -370,8 +370,8 @@ module RocketAMF
|
|
370
370
|
@stream << pack_integer(header)
|
371
371
|
|
372
372
|
# Write out class name
|
373
|
-
if class_name ==
|
374
|
-
amf3_write_utf8_vr(
|
373
|
+
if class_name == '__default__'
|
374
|
+
amf3_write_utf8_vr('')
|
375
375
|
else
|
376
376
|
amf3_write_utf8_vr(class_name.to_s)
|
377
377
|
end
|
data/mrpin-rocketamf.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mrpin-rocketamf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jacob Henry
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2014-08-
|
13
|
+
date: 2014-08-23 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rake-compiler
|