mrpin-rocketamf 1.0.4 → 2.0.0
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/README.rdoc +1 -1
- data/Rakefile +7 -7
- data/benchmark.rb +44 -37
- data/ext/rocketamf_ext/class_mapping.c +11 -11
- data/ext/rocketamf_ext/remoting.c +1 -1
- data/lib/rocketamf.rb +41 -98
- data/lib/rocketamf/constants.rb +20 -20
- data/lib/rocketamf/errors.rb +2 -0
- data/lib/rocketamf/errors/amf_error.rb +5 -0
- data/lib/rocketamf/errors/amf_error_incomplete.rb +5 -0
- data/lib/rocketamf/ext.rb +0 -6
- data/lib/rocketamf/extensions.rb +4 -4
- data/lib/rocketamf/{class_mapping.rb → mapping/class_mapping.rb} +70 -103
- data/lib/rocketamf/mapping/mapping_set.rb +63 -0
- data/lib/rocketamf/pure.rb +1 -9
- data/lib/rocketamf/pure/deserializer.rb +234 -262
- data/lib/rocketamf/pure/helpers/io_helper_base.rb +19 -0
- data/lib/rocketamf/pure/helpers/io_helper_read.rb +67 -0
- data/lib/rocketamf/pure/helpers/io_helper_write.rb +48 -0
- data/lib/rocketamf/pure/helpers/object_cache.rb +20 -0
- data/lib/rocketamf/pure/helpers/string_cache.rb +14 -0
- data/lib/rocketamf/pure/serializer.rb +138 -271
- data/lib/rocketamf/types.rb +1 -0
- data/lib/rocketamf/{values → types}/typed_hash.rb +12 -2
- data/mrpin-rocketamf.gemspec +27 -16
- data/spec/class_mapping_spec.rb +59 -52
- data/spec/deserializer_spec.rb +164 -328
- data/spec/fast_class_mapping_spec.rb +52 -46
- data/spec/helpers/class_mapping_test.rb +4 -0
- data/spec/helpers/class_mapping_test2.rb +3 -0
- data/spec/helpers/externalizable_test.rb +24 -0
- data/spec/helpers/fixtures.rb +28 -0
- data/spec/helpers/other_class.rb +4 -0
- data/spec/helpers/ruby_class.rb +4 -0
- data/spec/helpers/test_ruby_class.rb +4 -0
- data/spec/serializer_spec.rb +248 -339
- data/spec/spec_helper.rb +4 -49
- metadata +47 -53
- data/lib/rocketamf/pure/io_helpers.rb +0 -94
- data/lib/rocketamf/pure/remoting.rb +0 -117
- data/lib/rocketamf/remoting.rb +0 -196
- data/lib/rocketamf/values/messages.rb +0 -214
- data/spec/fixtures/objects/amf0-boolean.bin +0 -1
- data/spec/fixtures/objects/amf0-complex-encoded-string.bin +0 -0
- data/spec/fixtures/objects/amf0-date.bin +0 -0
- data/spec/fixtures/objects/amf0-ecma-ordinal-array.bin +0 -0
- data/spec/fixtures/objects/amf0-empty-string-key-hash.bin +0 -0
- data/spec/fixtures/objects/amf0-hash.bin +0 -0
- data/spec/fixtures/objects/amf0-null.bin +0 -1
- data/spec/fixtures/objects/amf0-number.bin +0 -0
- data/spec/fixtures/objects/amf0-object.bin +0 -0
- data/spec/fixtures/objects/amf0-ref-test.bin +0 -0
- data/spec/fixtures/objects/amf0-strict-array.bin +0 -0
- data/spec/fixtures/objects/amf0-string.bin +0 -0
- data/spec/fixtures/objects/amf0-time.bin +0 -0
- data/spec/fixtures/objects/amf0-typed-object.bin +0 -0
- data/spec/fixtures/objects/amf0-undefined.bin +0 -1
- data/spec/fixtures/objects/amf0-untyped-object.bin +0 -0
- data/spec/fixtures/objects/amf0-xml-doc.bin +0 -0
- data/spec/messages_spec.rb +0 -39
- data/spec/remoting_spec.rb +0 -196
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9d63832510464963b845035c265bbc971b411ecb
|
4
|
+
data.tar.gz: 658cafa2f6e9ec23b55d343178eeeeb1466410de
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 38481d7ea20ab45a9b3ebb9f7b339e7796a9756c93f75773f2a671fdc62d4c2109a3b92811b121a2a7cf4bd285f95f927feb0309002d77c841a7211bbe8741be
|
7
|
+
data.tar.gz: 3bed4925ed2fb064f79bb1ed8716fc65bf40a9dd51187634fb7b646bf9bd776fcf55930ffbe83547fb811a0675b6c379a8a80bf2f2c92d710f4b94a2c5f884b1
|
data/README.rdoc
CHANGED
@@ -18,7 +18,7 @@ compatible with Ruby 1.9.
|
|
18
18
|
|
19
19
|
hash = {:apple => "Apfel", :red => "Rot", :eyes => "Augen"}
|
20
20
|
File.open("amf.dat", 'w') do |f|
|
21
|
-
f.write RocketAMF.serialize(hash
|
21
|
+
f.write RocketAMF.serialize(hash) # Use AMF3 encoding to serialize
|
22
22
|
end
|
23
23
|
|
24
24
|
== LICENSE:
|
data/Rakefile
CHANGED
@@ -6,15 +6,15 @@ require 'rspec/core/rake_task'
|
|
6
6
|
require 'rake/extensiontask'
|
7
7
|
|
8
8
|
desc 'Default: run the specs.'
|
9
|
-
task :
|
9
|
+
task default: :spec
|
10
10
|
|
11
11
|
# I don't want to depend on bundler, so we do it the bundler way without it
|
12
12
|
gemspec_path = 'mrpin-rocketamf.gemspec'
|
13
|
-
spec
|
13
|
+
spec = begin
|
14
14
|
eval(File.read(File.join(File.dirname(__FILE__), gemspec_path)), TOPLEVEL_BINDING, gemspec_path)
|
15
15
|
rescue LoadError => e
|
16
16
|
original_line = e.backtrace.find { |line| line.include?(gemspec_path) }
|
17
|
-
msg
|
17
|
+
msg = "There was a LoadError while evaluating #{gemspec_path}:\n #{e.message}"
|
18
18
|
msg << " from\n #{original_line}" if original_line
|
19
19
|
msg << "\n"
|
20
20
|
puts msg
|
@@ -28,7 +28,7 @@ desc 'Generate documentation'
|
|
28
28
|
Rake::RDocTask.new(:rdoc) do |rdoc|
|
29
29
|
rdoc.rdoc_dir = 'rdoc'
|
30
30
|
rdoc.title = spec.name
|
31
|
-
rdoc.options
|
31
|
+
rdoc.options += spec.rdoc_options
|
32
32
|
rdoc.rdoc_files.include(*spec.extra_rdoc_files)
|
33
33
|
rdoc.rdoc_files.include('lib') # Don't include ext folder because no one cares
|
34
34
|
end
|
@@ -39,15 +39,15 @@ Gem::PackageTask.new(spec) do |pkg|
|
|
39
39
|
end
|
40
40
|
|
41
41
|
Rake::ExtensionTask.new('rocketamf_ext', spec) do |ext|
|
42
|
-
if RUBY_PLATFORM =~ /mswin|mingw/
|
42
|
+
if RUBY_PLATFORM =~ /mswin|mingw/
|
43
43
|
# No cross-compile on win, so compile extension to lib/1.[89]
|
44
44
|
RUBY_VERSION =~ /(\d+\.\d+)/
|
45
45
|
ext.lib_dir = "lib/#{$1}"
|
46
46
|
else
|
47
|
-
ext.cross_compile
|
47
|
+
ext.cross_compile = true
|
48
48
|
ext.cross_platform = 'x86-mingw32'
|
49
49
|
ext.cross_compiling do |gem_spec|
|
50
|
-
gem_spec.post_install_message =
|
50
|
+
gem_spec.post_install_message = 'You installed the binary version of this gem!'
|
51
51
|
end
|
52
52
|
end
|
53
53
|
#ext.config_options << '--enable-sort-props'
|
data/benchmark.rb
CHANGED
@@ -6,7 +6,7 @@ require 'rocketamf/pure/deserializer' # Only ext gets included by default if ava
|
|
6
6
|
require 'rocketamf/pure/serializer'
|
7
7
|
|
8
8
|
OBJECT_COUNT = 100000
|
9
|
-
TESTS
|
9
|
+
TESTS = 5
|
10
10
|
|
11
11
|
class TestClass
|
12
12
|
attr_accessor :prop_a, :prop_b, :prop_c, :prop_d, :prop_e
|
@@ -28,47 +28,54 @@ OBJECT_COUNT.times do
|
|
28
28
|
objs << TestClass.new.populate
|
29
29
|
end
|
30
30
|
|
31
|
-
|
31
|
+
%w(native pure).each do |type|
|
32
|
+
|
33
|
+
use_ruby_version = type == 'pure'
|
34
|
+
|
32
35
|
# Set up class mapper
|
33
|
-
|
34
|
-
|
36
|
+
class_mapper = nil
|
37
|
+
|
38
|
+
if use_ruby_version
|
39
|
+
class_mapper = RocketAMF::ClassMapping
|
35
40
|
else
|
36
|
-
RocketAMF::Ext::FastClassMapping
|
41
|
+
class_mapper = RocketAMF::Ext::FastClassMapping
|
37
42
|
end
|
38
|
-
|
39
|
-
|
43
|
+
|
44
|
+
class_mapper.define do |m|
|
45
|
+
m.map as: 'TestClass', ruby: 'TestClass'
|
40
46
|
end
|
41
47
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
min_serialize = [end_time-start_time, min_serialize].min
|
59
|
-
|
60
|
-
des = if type == "pure"
|
61
|
-
RocketAMF::Pure::Deserializer.new(cm.new)
|
62
|
-
else
|
63
|
-
RocketAMF::Ext::Deserializer.new(cm.new)
|
64
|
-
end
|
65
|
-
start_time = Time.now
|
66
|
-
temp = des.deserialize(version, out)
|
67
|
-
end_time = Time.now
|
68
|
-
puts "\tdeserialize run: #{end_time-start_time}s"
|
69
|
-
min_deserialize = [end_time-start_time, min_deserialize].min
|
48
|
+
|
49
|
+
# 2**24 is larger than anyone is ever going to run this for
|
50
|
+
min_serialize = 2**24
|
51
|
+
min_deserialize = 2**24
|
52
|
+
|
53
|
+
puts "Testing #{type} AMF3"
|
54
|
+
TESTS.times do
|
55
|
+
serializer = nil
|
56
|
+
deserializer = nil
|
57
|
+
|
58
|
+
if use_ruby_version
|
59
|
+
serializer = RocketAMF::Pure::Serializer.new(class_mapper.new)
|
60
|
+
deserializer = RocketAMF::Pure::Deserializer.new(class_mapper.new)
|
61
|
+
else
|
62
|
+
serializer = RocketAMF::Ext::Serializer.new(class_mapper.new)
|
63
|
+
deserializer = RocketAMF::Ext::Deserializer.new(class_mapper.new)
|
70
64
|
end
|
71
|
-
|
72
|
-
|
65
|
+
|
66
|
+
start_time = Time.now
|
67
|
+
out = serializer.serialize(objs)
|
68
|
+
end_time = Time.now
|
69
|
+
puts "\tserialize run: #{end_time-start_time}s"
|
70
|
+
min_serialize = [end_time-start_time, min_serialize].min
|
71
|
+
|
72
|
+
start_time = Time.now
|
73
|
+
temp = deserializer.deserialize(out)
|
74
|
+
end_time = Time.now
|
75
|
+
puts "\tdeserialize run: #{end_time-start_time}s"
|
76
|
+
min_deserialize = [end_time-start_time, min_deserialize].min
|
73
77
|
end
|
78
|
+
|
79
|
+
puts "\tminimum serialize time: #{min_serialize}s"
|
80
|
+
puts "\tminimum deserialize time: #{min_deserialize}s"
|
74
81
|
end
|
@@ -88,15 +88,15 @@ static VALUE mapset_init(VALUE self) {
|
|
88
88
|
static VALUE mapset_map_defaults(VALUE self) {
|
89
89
|
const int NUM_MAPPINGS = 9;
|
90
90
|
const char* ruby_classes[] = {
|
91
|
-
"RocketAMF::
|
92
|
-
"RocketAMF::
|
93
|
-
"RocketAMF::
|
94
|
-
"RocketAMF::
|
95
|
-
"RocketAMF::
|
96
|
-
"RocketAMF::
|
97
|
-
"RocketAMF::
|
98
|
-
"RocketAMF::
|
99
|
-
"RocketAMF::
|
91
|
+
"RocketAMF::Types::AbstractMessage",
|
92
|
+
"RocketAMF::Types::RemotingMessage",
|
93
|
+
"RocketAMF::Types::AsyncMessage",
|
94
|
+
"RocketAMF::Types::AsyncMessageExt",
|
95
|
+
"RocketAMF::Types::CommandMessage",
|
96
|
+
"RocketAMF::Types::CommandMessageExt",
|
97
|
+
"RocketAMF::Types::AcknowledgeMessage",
|
98
|
+
"RocketAMF::Types::AcknowledgeMessageExt",
|
99
|
+
"RocketAMF::Types::ErrorMessage"
|
100
100
|
};
|
101
101
|
const char* as_classes[] = {
|
102
102
|
"flex.messaging.messages.AbstractMessage",
|
@@ -309,7 +309,7 @@ static VALUE mapping_as_class_name(VALUE self, VALUE obj) {
|
|
309
309
|
*
|
310
310
|
* Instantiates a ruby object using the mapping configuration based on the
|
311
311
|
* source AS class name. If there is no mapping defined, it returns a
|
312
|
-
* <tt>RocketAMF::
|
312
|
+
* <tt>RocketAMF::Types::TypedHash</tt> with the serialized class name.
|
313
313
|
*/
|
314
314
|
static VALUE mapping_get_ruby_obj(VALUE self, VALUE name) {
|
315
315
|
CLASS_MAPPING *map;
|
@@ -475,7 +475,7 @@ void Init_rocket_amf_fast_class_mapping() {
|
|
475
475
|
rb_define_method(cFastClassMapping, "props_for_serialization", mapping_props, 1);
|
476
476
|
|
477
477
|
// Cache values
|
478
|
-
cTypedHash = rb_const_get(rb_const_get(mRocketAMF, rb_intern("
|
478
|
+
cTypedHash = rb_const_get(rb_const_get(mRocketAMF, rb_intern("Types")), rb_intern("TypedHash"));
|
479
479
|
id_use_ac = rb_intern("use_array_collection");
|
480
480
|
id_use_ac_ivar = rb_intern("@use_array_collection");
|
481
481
|
id_mappings = rb_intern("mappings");
|
@@ -180,5 +180,5 @@ void Init_rocket_amf_remoting() {
|
|
180
180
|
id_data = rb_intern("data");
|
181
181
|
cRocketAMFHeader = rb_const_get(mRocketAMF, rb_intern("Header"));
|
182
182
|
cRocketAMFMessage = rb_const_get(mRocketAMF, rb_intern("Message"));
|
183
|
-
cRocketAMFAbstractMessage = rb_const_get(rb_const_get(mRocketAMF, rb_intern("
|
183
|
+
cRocketAMFAbstractMessage = rb_const_get(rb_const_get(mRocketAMF, rb_intern("Types")), rb_intern("AbstractMessage"));
|
184
184
|
}
|
data/lib/rocketamf.rb
CHANGED
@@ -1,20 +1,31 @@
|
|
1
1
|
$:.unshift(File.dirname(__FILE__)) unless $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
2
2
|
$:.unshift "#{File.expand_path(File.dirname(__FILE__))}/rocketamf/"
|
3
|
+
$:.unshift "#{File.expand_path(File.dirname(__FILE__))}/rocketamf/types/"
|
3
4
|
|
4
|
-
require
|
5
|
-
require
|
5
|
+
require 'date'
|
6
|
+
require 'stringio'
|
7
|
+
require 'rocketamf/errors'
|
6
8
|
require 'rocketamf/extensions'
|
7
|
-
require 'rocketamf/class_mapping'
|
9
|
+
require 'rocketamf/mapping/class_mapping'
|
8
10
|
require 'rocketamf/constants'
|
9
|
-
require 'rocketamf/
|
11
|
+
require 'rocketamf/types'
|
10
12
|
|
11
|
-
|
13
|
+
|
14
|
+
#todo: implement C version
|
15
|
+
# begin
|
16
|
+
# require 'rocketamf/ext'
|
17
|
+
# rescue LoadError
|
18
|
+
|
19
|
+
require 'rocketamf/pure'
|
20
|
+
# end
|
21
|
+
|
22
|
+
# MrPin RocketAMF is a full featured AMF3 serializer and deserializer with support for
|
12
23
|
# bi-directional Flash to Ruby class mapping, custom serialization and mapping,
|
13
|
-
# remoting gateway helpers that follow
|
24
|
+
# remoting gateway helpers that follow AMF3 messaging specs, and a suite of specs
|
14
25
|
# to ensure adherence to the specification documents put out by Adobe. If the C
|
15
26
|
# components compile, then RocketAMF automatically takes advantage of them to
|
16
27
|
# provide a substantial performance benefit. In addition, RocketAMF is fully
|
17
|
-
# compatible with Ruby 1.
|
28
|
+
# compatible with Ruby 2.0, 2.1.
|
18
29
|
#
|
19
30
|
# == Performance
|
20
31
|
#
|
@@ -27,17 +38,12 @@ require 'rocketamf/remoting'
|
|
27
38
|
# some benchmarks I took using using a simple little benchmarking utility I whipped
|
28
39
|
# up, which can be found in the root of the repository.
|
29
40
|
#
|
41
|
+
#todo:change benchmark
|
30
42
|
# # 100000 objects
|
31
43
|
# # Ruby 1.8
|
32
|
-
# Testing native AMF0:
|
33
|
-
# minimum serialize time: 1.229868s
|
34
|
-
# minimum deserialize time: 0.86465s
|
35
44
|
# Testing native AMF3:
|
36
45
|
# minimum serialize time: 1.444652s
|
37
46
|
# minimum deserialize time: 0.879407s
|
38
|
-
# Testing pure AMF0:
|
39
|
-
# minimum serialize time: 25.427931s
|
40
|
-
# minimum deserialize time: 11.706084s
|
41
47
|
# Testing pure AMF3:
|
42
48
|
# minimum serialize time: 31.637864s
|
43
49
|
# minimum deserialize time: 14.773969s
|
@@ -47,9 +53,7 @@ require 'rocketamf/remoting'
|
|
47
53
|
# RocketAMF provides two main methods - <tt>serialize</tt> and <tt>deserialize</tt>.
|
48
54
|
# Deserialization takes a String or StringIO object and the AMF version if different
|
49
55
|
# from the default. Serialization takes any Ruby object and the version if different
|
50
|
-
# from the default.
|
51
|
-
# faster, but AMF3 does a better job of not sending duplicate data. Which you choose
|
52
|
-
# depends on what you need to communicate with and how much serialized size matters.
|
56
|
+
# from the default. AMF3 not sending duplicate data.
|
53
57
|
#
|
54
58
|
# == Mapping Classes Between Flash and Ruby
|
55
59
|
#
|
@@ -60,50 +64,6 @@ require 'rocketamf/remoting'
|
|
60
64
|
# replace it with a class mapper of your own devising that matches the documented
|
61
65
|
# API.
|
62
66
|
#
|
63
|
-
# == Remoting
|
64
|
-
#
|
65
|
-
# You can use RocketAMF bare to write an AMF gateway using the following code.
|
66
|
-
# In addition, you can use rack-amf (http://github.com/rubyamf/rack-amf) or
|
67
|
-
# RubyAMF (http://github.com/rubyamf/rubyamf), both of which provide rack-compliant
|
68
|
-
# AMF gateways.
|
69
|
-
#
|
70
|
-
# # helloworld.ru
|
71
|
-
# require 'rocketamf'
|
72
|
-
#
|
73
|
-
# class HelloWorldApp
|
74
|
-
# APPLICATION_AMF = 'application/x-amf'.freeze
|
75
|
-
#
|
76
|
-
# def call env
|
77
|
-
# if is_amf?(env)
|
78
|
-
# # Wrap request and response
|
79
|
-
# env['rack.input'].rewind
|
80
|
-
# request = RocketAMF::Envelope.new.populate_from_stream(env['rack.input'].read)
|
81
|
-
# response = RocketAMF::Envelope.new
|
82
|
-
#
|
83
|
-
# # Handle request
|
84
|
-
# response.each_method_call request do |method, args|
|
85
|
-
# raise "Service #{method} does not exists" unless method == 'App.helloWorld'
|
86
|
-
# 'Hello world'
|
87
|
-
# end
|
88
|
-
#
|
89
|
-
# # Pass back response
|
90
|
-
# response_str = response.serialize
|
91
|
-
# return [200, {'Content-Type' => APPLICATION_AMF, 'Content-Length' => response_str.length.to_s}, [response_str]]
|
92
|
-
# else
|
93
|
-
# return [200, {'Content-Type' => 'text/plain', 'Content-Length' => '16' }, ["Rack AMF gateway"]]
|
94
|
-
# end
|
95
|
-
# end
|
96
|
-
#
|
97
|
-
# private
|
98
|
-
# def is_amf? env
|
99
|
-
# return false unless env['CONTENT_TYPE'] == APPLICATION_AMF
|
100
|
-
# return false unless env['PATH_INFO'] == '/amf'
|
101
|
-
# return true
|
102
|
-
# end
|
103
|
-
# end
|
104
|
-
#
|
105
|
-
# run HelloWorldApp.new
|
106
|
-
#
|
107
67
|
# == Advanced Serialization (encode_amf and IExternalizable)
|
108
68
|
#
|
109
69
|
# RocketAMF provides some additional functionality to support advanced
|
@@ -129,11 +89,7 @@ require 'rocketamf/remoting'
|
|
129
89
|
#
|
130
90
|
# class VariableObject
|
131
91
|
# def encode_amf ser
|
132
|
-
#
|
133
|
-
# ser.serialize 0, true
|
134
|
-
# else
|
135
|
-
# ser.serialize 3, false
|
136
|
-
# end
|
92
|
+
# ser.serialize(false)
|
137
93
|
# end
|
138
94
|
# end
|
139
95
|
#
|
@@ -148,10 +104,6 @@ require 'rocketamf/remoting'
|
|
148
104
|
#
|
149
105
|
# class ResultSet < Array
|
150
106
|
# def encode_amf ser
|
151
|
-
# if ser.version == 0
|
152
|
-
# # Serialize as simple array in AMF0
|
153
|
-
# ser.write_array self
|
154
|
-
# else
|
155
107
|
# # Serialize as an ArrayCollection object
|
156
108
|
# # It conforms to IExternalizable, does not have any dynamic properties,
|
157
109
|
# # and has no "sealed" members. See the AMF3 specs for more details about
|
@@ -162,7 +114,6 @@ require 'rocketamf/remoting'
|
|
162
114
|
# :dynamic => false,
|
163
115
|
# :members => []
|
164
116
|
# }
|
165
|
-
# end
|
166
117
|
# end
|
167
118
|
#
|
168
119
|
# # Write self as array to stream
|
@@ -176,43 +127,35 @@ require 'rocketamf/remoting'
|
|
176
127
|
# end
|
177
128
|
# end
|
178
129
|
module RocketAMF
|
179
|
-
#todo: implement C version
|
180
|
-
# begin
|
181
|
-
# require 'rocketamf/ext'
|
182
|
-
# rescue LoadError
|
183
130
|
|
184
|
-
|
185
|
-
#
|
131
|
+
#
|
132
|
+
# Constants
|
133
|
+
#
|
134
|
+
|
135
|
+
#todo: use c version
|
136
|
+
CLASS_MAPPER = RocketAMF::ClassMapping
|
137
|
+
|
138
|
+
#
|
139
|
+
# Static methods
|
140
|
+
#
|
186
141
|
|
187
142
|
# Deserialize the AMF string _source_ of the given AMF version into a Ruby
|
188
143
|
# data structure and return it. Creates an instance of <tt>RocketAMF::Deserializer</tt>
|
189
|
-
# with a new instance of <tt>RocketAMF::
|
190
|
-
# on it with the given source
|
191
|
-
def self.deserialize
|
192
|
-
|
193
|
-
|
144
|
+
# with a new instance of <tt>RocketAMF::CLASS_MAPPER</tt> and calls deserialize
|
145
|
+
# on it with the given source, returning the result.
|
146
|
+
def self.deserialize(source)
|
147
|
+
deserializer = RocketAMF::Deserializer.new(RocketAMF::CLASS_MAPPER.new)
|
148
|
+
deserializer.deserialize(source)
|
194
149
|
end
|
195
150
|
|
196
151
|
# Serialize the given Ruby data structure _obj_ into an AMF stream using the
|
197
152
|
# given AMF version. Creates an instance of <tt>RocketAMF::Serializer</tt>
|
198
|
-
# with a new instance of <tt>RocketAMF::
|
199
|
-
# on it with the given object
|
200
|
-
def self.serialize
|
201
|
-
|
202
|
-
|
153
|
+
# with a new instance of <tt>RocketAMF::CLASS_MAPPER</tt> and calls serialize
|
154
|
+
# on it with the given object, returning the result.
|
155
|
+
def self.serialize(obj)
|
156
|
+
serializer = RocketAMF::Serializer.new(RocketAMF::CLASS_MAPPER.new)
|
157
|
+
serializer.serialize(obj)
|
203
158
|
end
|
204
159
|
|
205
|
-
# We use const_missing to define the active ClassMapper at runtime. This way,
|
206
|
-
# heavy modification of class mapping functionality is still possible without
|
207
|
-
# forcing extenders to redefine the constant.
|
208
|
-
def self.const_missing const #:nodoc:
|
209
|
-
if const == :ClassMapper
|
210
|
-
RocketAMF.const_set(:ClassMapper, RocketAMF::ClassMapping)
|
211
|
-
else
|
212
|
-
super(const)
|
213
|
-
end
|
214
|
-
end
|
215
160
|
|
216
|
-
# The base exception for AMF errors.
|
217
|
-
class AMFError < StandardError; end
|
218
161
|
end
|
data/lib/rocketamf/constants.rb
CHANGED
@@ -20,24 +20,24 @@ module RocketAMF
|
|
20
20
|
AMF0_AMF3_MARKER = 0x11 #"\021"
|
21
21
|
|
22
22
|
# AMF3 Type Markers
|
23
|
-
AMF3_UNDEFINED_MARKER =
|
24
|
-
AMF3_NULL_MARKER =
|
25
|
-
AMF3_FALSE_MARKER =
|
26
|
-
AMF3_TRUE_MARKER =
|
27
|
-
AMF3_INTEGER_MARKER =
|
28
|
-
AMF3_DOUBLE_MARKER =
|
29
|
-
AMF3_STRING_MARKER =
|
30
|
-
AMF3_XML_DOC_MARKER =
|
31
|
-
AMF3_DATE_MARKER =
|
32
|
-
AMF3_ARRAY_MARKER =
|
33
|
-
AMF3_OBJECT_MARKER =
|
34
|
-
AMF3_XML_MARKER =
|
35
|
-
AMF3_BYTE_ARRAY_MARKER =
|
36
|
-
AMF3_VECTOR_INT_MARKER =
|
37
|
-
AMF3_VECTOR_UINT_MARKER =
|
38
|
-
AMF3_VECTOR_DOUBLE_MARKER =
|
39
|
-
AMF3_VECTOR_OBJECT_MARKER =
|
40
|
-
AMF3_DICT_MARKER =
|
23
|
+
AMF3_UNDEFINED_MARKER = 0x00 #"\000"
|
24
|
+
AMF3_NULL_MARKER = 0x01 #"\001"
|
25
|
+
AMF3_FALSE_MARKER = 0x02 #"\002"
|
26
|
+
AMF3_TRUE_MARKER = 0x03 #"\003"
|
27
|
+
AMF3_INTEGER_MARKER = 0x04 #"\004"
|
28
|
+
AMF3_DOUBLE_MARKER = 0x05 #"\005"
|
29
|
+
AMF3_STRING_MARKER = 0x06 #"\006"
|
30
|
+
AMF3_XML_DOC_MARKER = 0x07 #"\a"
|
31
|
+
AMF3_DATE_MARKER = 0x08 #"\b"
|
32
|
+
AMF3_ARRAY_MARKER = 0x09 #"\t"
|
33
|
+
AMF3_OBJECT_MARKER = 0x0A #"\n"
|
34
|
+
AMF3_XML_MARKER = 0x0B #"\v"
|
35
|
+
AMF3_BYTE_ARRAY_MARKER = 0x0C #"\f"
|
36
|
+
AMF3_VECTOR_INT_MARKER = 0x0D #"\r"
|
37
|
+
AMF3_VECTOR_UINT_MARKER = 0x0E #"\016"
|
38
|
+
AMF3_VECTOR_DOUBLE_MARKER = 0x0F #"\017"
|
39
|
+
AMF3_VECTOR_OBJECT_MARKER = 0x10 #"\020"
|
40
|
+
AMF3_DICT_MARKER = 0x11 #"\021"
|
41
41
|
|
42
42
|
# Other AMF3 Markers
|
43
43
|
AMF3_EMPTY_STRING = 0x01
|
@@ -45,6 +45,6 @@ module RocketAMF
|
|
45
45
|
AMF3_CLOSE_DYNAMIC_ARRAY = 0x01
|
46
46
|
|
47
47
|
# Other Constants
|
48
|
-
MAX_INTEGER =
|
49
|
-
MIN_INTEGER = -
|
48
|
+
MAX_INTEGER = 268_435_455
|
49
|
+
MIN_INTEGER = -268_435_456
|
50
50
|
end
|