protobuf 2.2.5-java
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.
- data/.gitignore +17 -0
- data/.travis.yml +9 -0
- data/.yardopts +5 -0
- data/Gemfile +3 -0
- data/README.md +316 -0
- data/Rakefile +29 -0
- data/UPGRADING.md +60 -0
- data/bin/rpc_server +5 -0
- data/bin/rprotoc +62 -0
- data/examples/addressbook.pb.rb +55 -0
- data/examples/addressbook.proto +24 -0
- data/examples/reading_a_message.rb +32 -0
- data/examples/writing_a_message.rb +46 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/code_generator.h +142 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/command_line_interface.h +318 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_enum.h +99 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_enum_field.h +103 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_extension.h +85 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_field.h +167 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_file.h +98 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_generator.h +72 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_helpers.h +159 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_message.h +170 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_message_field.h +102 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_primitive_field.h +103 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_service.h +118 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_string_field.h +104 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_test_bad_identifiers.pb.h +2721 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/importer.h +303 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_enum.h +84 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_enum_field.h +121 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_extension.h +77 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_field.h +108 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_file.h +101 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_generator.h +72 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_helpers.h +213 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_message.h +109 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_message_field.h +134 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_primitive_field.h +121 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_service.h +113 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_string_field.h +120 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/mock_code_generator.h +113 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/package_info.h +64 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/parser.h +434 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/plugin.h +73 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/plugin.pb.h +790 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/python/python_generator.h +156 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/subprocess.h +108 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/zip_writer.h +93 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/descriptor.h +1367 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/descriptor.pb.h +5223 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/descriptor_database.h +366 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/dynamic_message.h +136 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/extension_set.h +904 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/generated_message_reflection.h +424 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/generated_message_util.h +82 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/io/coded_stream.h +1102 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/io/coded_stream_inl.h +64 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/io/gzip_stream.h +207 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/io/package_info.h +54 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/io/printer.h +136 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/io/tokenizer.h +313 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/io/zero_copy_stream.h +238 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/io/zero_copy_stream_impl.h +357 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/io/zero_copy_stream_impl_lite.h +340 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/message.h +692 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/message_lite.h +239 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/package_info.h +64 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/reflection_ops.h +80 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/repeated_field.h +1295 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/service.h +291 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/stubs/common.h +1211 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/stubs/hash.h +220 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/stubs/map-util.h +119 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/stubs/once.h +123 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/stubs/stl_util-inl.h +121 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/stubs/strutil.h +457 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/stubs/substitute.h +170 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/test_util.h +174 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/test_util_lite.h +101 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/testing/file.h +83 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/testing/googletest.h +98 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/text_format.h +285 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest.pb.h +11915 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest_custom_options.pb.h +2895 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest_embed_optimize_for.pb.h +211 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest_empty.pb.h +56 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest_import.pb.h +188 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest_import_lite.pb.h +151 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest_lite.pb.h +4752 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest_lite_imports_nonlite.pb.h +150 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest_mset.pb.h +816 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest_no_generic_services.pb.h +197 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest_optimize_for.pb.h +403 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unknown_field_set.h +268 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/wire_format.h +304 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/wire_format_lite.h +620 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/wire_format_lite_inl.h +774 -0
- data/ext/ruby_generator/Makefile +10 -0
- data/ext/ruby_generator/RubyGenerator.cpp +450 -0
- data/ext/ruby_generator/RubyGenerator.h +199 -0
- data/ext/ruby_generator/extconf.rb +36 -0
- data/ext/ruby_generator/protoc-ruby +0 -0
- data/lib/protobuf/cli.rb +188 -0
- data/lib/protobuf/enum.rb +58 -0
- data/lib/protobuf/enum_value.rb +59 -0
- data/lib/protobuf/evented.rb +22 -0
- data/lib/protobuf/exceptions.rb +11 -0
- data/lib/protobuf/ext/eventmachine.rb +14 -0
- data/lib/protobuf/field/base_field.rb +240 -0
- data/lib/protobuf/field/bool_field.rb +36 -0
- data/lib/protobuf/field/bytes_field.rb +38 -0
- data/lib/protobuf/field/double_field.rb +19 -0
- data/lib/protobuf/field/enum_field.rb +50 -0
- data/lib/protobuf/field/extension_fields.rb +32 -0
- data/lib/protobuf/field/field_array.rb +65 -0
- data/lib/protobuf/field/fixed32_field.rb +19 -0
- data/lib/protobuf/field/fixed64_field.rb +22 -0
- data/lib/protobuf/field/float_field.rb +31 -0
- data/lib/protobuf/field/int32_field.rb +12 -0
- data/lib/protobuf/field/int64_field.rb +12 -0
- data/lib/protobuf/field/integer_field.rb +19 -0
- data/lib/protobuf/field/message_field.rb +53 -0
- data/lib/protobuf/field/sfixed32_field.rb +21 -0
- data/lib/protobuf/field/sfixed64_field.rb +24 -0
- data/lib/protobuf/field/signed_integer_field.rb +23 -0
- data/lib/protobuf/field/sint32_field.rb +12 -0
- data/lib/protobuf/field/sint64_field.rb +12 -0
- data/lib/protobuf/field/string_field.rb +14 -0
- data/lib/protobuf/field/uint32_field.rb +12 -0
- data/lib/protobuf/field/uint64_field.rb +12 -0
- data/lib/protobuf/field/varint_field.rb +61 -0
- data/lib/protobuf/field.rb +57 -0
- data/lib/protobuf/logger.rb +86 -0
- data/lib/protobuf/message/decoder.rb +83 -0
- data/lib/protobuf/message/encoder.rb +48 -0
- data/lib/protobuf/message/extend.rb +8 -0
- data/lib/protobuf/message/message.rb +1 -0
- data/lib/protobuf/message.rb +320 -0
- data/lib/protobuf/rpc/buffer.rb +79 -0
- data/lib/protobuf/rpc/client.rb +166 -0
- data/lib/protobuf/rpc/connector.rb +19 -0
- data/lib/protobuf/rpc/connectors/base.rb +38 -0
- data/lib/protobuf/rpc/connectors/common.rb +156 -0
- data/lib/protobuf/rpc/connectors/em_client.rb +84 -0
- data/lib/protobuf/rpc/connectors/eventmachine.rb +87 -0
- data/lib/protobuf/rpc/connectors/socket.rb +73 -0
- data/lib/protobuf/rpc/connectors/zmq.rb +69 -0
- data/lib/protobuf/rpc/error/client_error.rb +31 -0
- data/lib/protobuf/rpc/error/server_error.rb +43 -0
- data/lib/protobuf/rpc/error.rb +25 -0
- data/lib/protobuf/rpc/rpc.pb.rb +118 -0
- data/lib/protobuf/rpc/server.rb +89 -0
- data/lib/protobuf/rpc/servers/evented/server.rb +41 -0
- data/lib/protobuf/rpc/servers/evented_runner.rb +21 -0
- data/lib/protobuf/rpc/servers/socket/server.rb +111 -0
- data/lib/protobuf/rpc/servers/socket/worker.rb +66 -0
- data/lib/protobuf/rpc/servers/socket_runner.rb +27 -0
- data/lib/protobuf/rpc/servers/zmq/broker.rb +87 -0
- data/lib/protobuf/rpc/servers/zmq/server.rb +50 -0
- data/lib/protobuf/rpc/servers/zmq/util.rb +27 -0
- data/lib/protobuf/rpc/servers/zmq/worker.rb +60 -0
- data/lib/protobuf/rpc/servers/zmq_runner.rb +25 -0
- data/lib/protobuf/rpc/service.rb +173 -0
- data/lib/protobuf/rpc/service_dispatcher.rb +130 -0
- data/lib/protobuf/rpc/service_filters.rb +267 -0
- data/lib/protobuf/rpc/stat.rb +83 -0
- data/lib/protobuf/socket.rb +22 -0
- data/lib/protobuf/version.rb +4 -0
- data/lib/protobuf/wire_type.rb +10 -0
- data/lib/protobuf/zmq.rb +21 -0
- data/lib/protobuf.rb +86 -0
- data/proto/rpc.pb.rb +48 -0
- data/proto/rpc.proto +73 -0
- data/protobuf.gemspec +44 -0
- data/spec/benchmark/tasks.rb +179 -0
- data/spec/functional/embedded_service_spec.rb +7 -0
- data/spec/functional/evented_server_spec.rb +64 -0
- data/spec/functional/socket_server_spec.rb +58 -0
- data/spec/functional/zmq_server_spec.rb +58 -0
- data/spec/lib/protobuf/cli_spec.rb +212 -0
- data/spec/lib/protobuf/enum_spec.rb +98 -0
- data/spec/lib/protobuf/enum_value_spec.rb +15 -0
- data/spec/lib/protobuf/logger_spec.rb +131 -0
- data/spec/lib/protobuf/message/encoder_spec.rb +19 -0
- data/spec/lib/protobuf/message_spec.rb +209 -0
- data/spec/lib/protobuf/rpc/client_spec.rb +158 -0
- data/spec/lib/protobuf/rpc/connector_spec.rb +32 -0
- data/spec/lib/protobuf/rpc/connectors/base_spec.rb +50 -0
- data/spec/lib/protobuf/rpc/connectors/common_spec.rb +128 -0
- data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +36 -0
- data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +22 -0
- data/spec/lib/protobuf/rpc/servers/evented_server_spec.rb +18 -0
- data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +43 -0
- data/spec/lib/protobuf/rpc/servers/zmq/broker_spec.rb +35 -0
- data/spec/lib/protobuf/rpc/servers/zmq/server_spec.rb +41 -0
- data/spec/lib/protobuf/rpc/servers/zmq/util_spec.rb +45 -0
- data/spec/lib/protobuf/rpc/servers/zmq/worker_spec.rb +44 -0
- data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +116 -0
- data/spec/lib/protobuf/rpc/service_filters_spec.rb +451 -0
- data/spec/lib/protobuf/rpc/service_spec.rb +165 -0
- data/spec/lib/protobuf_spec.rb +62 -0
- data/spec/spec_helper.rb +51 -0
- data/spec/support/all.rb +6 -0
- data/spec/support/server.rb +101 -0
- data/spec/support/test/enum.pb.rb +34 -0
- data/spec/support/test/enum.proto +12 -0
- data/spec/support/test/resource.pb.rb +58 -0
- data/spec/support/test/resource.proto +31 -0
- data/spec/support/test/resource_service.rb +14 -0
- data/spec/support/test_app_file.rb +2 -0
- data/spec/support/tolerance_matcher.rb +40 -0
- data/test/data/data.bin +3 -0
- data/test/data/data_source.py +14 -0
- data/test/data/types.bin +0 -0
- data/test/data/types_source.py +22 -0
- data/test/data/unk.png +0 -0
- data/test/proto/addressbook.pb.rb +66 -0
- data/test/proto/addressbook.proto +33 -0
- data/test/proto/addressbook_base.pb.rb +58 -0
- data/test/proto/addressbook_base.proto +26 -0
- data/test/proto/addressbook_ext.pb.rb +20 -0
- data/test/proto/addressbook_ext.proto +6 -0
- data/test/proto/collision.pb.rb +17 -0
- data/test/proto/collision.proto +5 -0
- data/test/proto/ext_collision.pb.rb +24 -0
- data/test/proto/ext_collision.proto +8 -0
- data/test/proto/ext_range.pb.rb +22 -0
- data/test/proto/ext_range.proto +7 -0
- data/test/proto/float_default.proto +10 -0
- data/test/proto/lowercase.pb.rb +30 -0
- data/test/proto/lowercase.proto +9 -0
- data/test/proto/merge.pb.rb +39 -0
- data/test/proto/merge.proto +15 -0
- data/test/proto/nested.pb.rb +30 -0
- data/test/proto/nested.proto +9 -0
- data/test/proto/optional_field.pb.rb +35 -0
- data/test/proto/optional_field.proto +12 -0
- data/test/proto/packed.pb.rb +22 -0
- data/test/proto/packed.proto +6 -0
- data/test/proto/rpc.proto +6 -0
- data/test/proto/types.pb.rb +84 -0
- data/test/proto/types.proto +37 -0
- data/test/test_addressbook.rb +56 -0
- data/test/test_enum_value.rb +41 -0
- data/test/test_extension.rb +36 -0
- data/test/test_lowercase.rb +11 -0
- data/test/test_message.rb +128 -0
- data/test/test_optional_field.rb +103 -0
- data/test/test_packed_field.rb +40 -0
- data/test/test_parse.rb +15 -0
- data/test/test_repeated_types.rb +132 -0
- data/test/test_serialize.rb +61 -0
- data/test/test_standard_message.rb +96 -0
- data/test/test_types.rb +226 -0
- metadata +461 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
require 'protobuf/wire_type'
|
|
2
|
+
require 'protobuf/exceptions'
|
|
3
|
+
|
|
4
|
+
module Protobuf
|
|
5
|
+
|
|
6
|
+
module Decoder
|
|
7
|
+
|
|
8
|
+
module_function
|
|
9
|
+
|
|
10
|
+
# Read bytes from +stream+ and pass to +message+ object.
|
|
11
|
+
def decode(stream, message)
|
|
12
|
+
until stream.eof?
|
|
13
|
+
tag, wire_type = read_key(stream)
|
|
14
|
+
bytes =
|
|
15
|
+
case wire_type
|
|
16
|
+
when WireType::VARINT then
|
|
17
|
+
read_varint(stream)
|
|
18
|
+
when WireType::FIXED64 then
|
|
19
|
+
read_fixed64(stream)
|
|
20
|
+
when WireType::LENGTH_DELIMITED then
|
|
21
|
+
read_length_delimited(stream)
|
|
22
|
+
when WireType::START_GROUP then
|
|
23
|
+
read_start_group(stream)
|
|
24
|
+
when WireType::END_GROUP then
|
|
25
|
+
read_end_group(stream)
|
|
26
|
+
when WireType::FIXED32 then
|
|
27
|
+
read_fixed32(stream)
|
|
28
|
+
else
|
|
29
|
+
raise InvalidWireType, wire_type
|
|
30
|
+
end
|
|
31
|
+
message.set_field(tag, bytes)
|
|
32
|
+
end
|
|
33
|
+
message
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Read key pair (tag and wire-type) from +stream+.
|
|
37
|
+
def read_key(stream)
|
|
38
|
+
bits = read_varint(stream)
|
|
39
|
+
wire_type = bits & 0x07
|
|
40
|
+
tag = bits >> 3
|
|
41
|
+
[tag, wire_type]
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Read varint integer value from +stream+.
|
|
45
|
+
def read_varint(stream)
|
|
46
|
+
read_method = stream.respond_to?(:readbyte) ? :readbyte : :readchar
|
|
47
|
+
value = index = 0
|
|
48
|
+
begin
|
|
49
|
+
byte = stream.__send__(read_method)
|
|
50
|
+
value |= (byte & 0x7f) << (7 * index)
|
|
51
|
+
index += 1
|
|
52
|
+
end while (byte & 0x80).nonzero?
|
|
53
|
+
value
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Read 32-bit string value from +stream+.
|
|
57
|
+
def read_fixed32(stream)
|
|
58
|
+
stream.read(4)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Read 64-bit string value from +stream+.
|
|
62
|
+
def read_fixed64(stream)
|
|
63
|
+
stream.read(8)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Read length-delimited string value from +stream+.
|
|
67
|
+
def read_length_delimited(stream)
|
|
68
|
+
value_length = read_varint(stream)
|
|
69
|
+
stream.read(value_length)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Not implemented.
|
|
73
|
+
def read_start_group(stream)
|
|
74
|
+
raise NotImplementedError, 'Group is deprecated.'
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Not implemented.
|
|
78
|
+
def read_end_group(stream)
|
|
79
|
+
raise NotImplementedError, 'Group is deprecated.'
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
end
|
|
83
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
require 'protobuf/wire_type'
|
|
2
|
+
require 'protobuf/exceptions'
|
|
3
|
+
|
|
4
|
+
module Protobuf
|
|
5
|
+
|
|
6
|
+
module Encoder
|
|
7
|
+
|
|
8
|
+
module_function
|
|
9
|
+
|
|
10
|
+
# Encode +message+ and write to +stream+.
|
|
11
|
+
def encode(stream, message)
|
|
12
|
+
# FIXME make this not as ghetto
|
|
13
|
+
unless message.initialized?
|
|
14
|
+
raise NotInitializedError, "Message #{message.class.name} is not initialized (one or more fields is improperly set): #{JSON.parse(message.to_json)}"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
message.each_field do |field, value|
|
|
18
|
+
next unless message.has_field?(field.name)
|
|
19
|
+
|
|
20
|
+
if field.repeated?
|
|
21
|
+
if field.packed?
|
|
22
|
+
key = (field.tag << 3) | WireType::LENGTH_DELIMITED
|
|
23
|
+
packed_value = value.map {|val| field.encode(val) }.join
|
|
24
|
+
stream.write(Field::VarintField.encode(key))
|
|
25
|
+
stream.write(Field::VarintField.encode(packed_value.size))
|
|
26
|
+
stream.write(packed_value)
|
|
27
|
+
else
|
|
28
|
+
value.each do |val|
|
|
29
|
+
write_pair(stream, field, val)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
else
|
|
33
|
+
write_pair(stream, field, value)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Encode key and value, and write to +stream+.
|
|
39
|
+
def write_pair(stream, field, value)
|
|
40
|
+
key = (field.tag << 3) | field.wire_type
|
|
41
|
+
key_bytes = Field::VarintField.encode(key)
|
|
42
|
+
stream.write(key_bytes)
|
|
43
|
+
bytes = field.encode(value)
|
|
44
|
+
stream.write(bytes)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'protobuf/message' # Need to get rid of this
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
require 'set'
|
|
2
|
+
require 'protobuf/field'
|
|
3
|
+
require 'protobuf/enum'
|
|
4
|
+
require 'protobuf/message/decoder'
|
|
5
|
+
require 'protobuf/message/encoder'
|
|
6
|
+
|
|
7
|
+
module Protobuf
|
|
8
|
+
class Message
|
|
9
|
+
##
|
|
10
|
+
# Error Classes
|
|
11
|
+
#
|
|
12
|
+
class FieldNotDefinedError < StandardError; end
|
|
13
|
+
|
|
14
|
+
##
|
|
15
|
+
# Constants
|
|
16
|
+
#
|
|
17
|
+
STRING_ENCODING = "ASCII-8BIT".freeze
|
|
18
|
+
|
|
19
|
+
##
|
|
20
|
+
# Class Methods
|
|
21
|
+
#
|
|
22
|
+
def self.all_fields
|
|
23
|
+
@all_fields ||= begin
|
|
24
|
+
all_fields_array = []
|
|
25
|
+
max_fields = fields.size > extension_fields.size ? fields.size : extension_fields.size
|
|
26
|
+
max_fields.times do |field_number|
|
|
27
|
+
all_fields_array << (fields[field_number] || extension_fields[field_number])
|
|
28
|
+
end
|
|
29
|
+
all_fields_array.compact!
|
|
30
|
+
all_fields_array
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Define a field. Don't use this method directly.
|
|
35
|
+
def self.define_field(rule, type, fname, tag, options)
|
|
36
|
+
field_array = options[:extension] ? extension_fields : fields
|
|
37
|
+
field_name_hash = options[:extension] ? extension_field_name_to_tag : field_name_to_tag
|
|
38
|
+
|
|
39
|
+
if field_array[tag]
|
|
40
|
+
raise TagCollisionError, %!{Field number #{tag} has already been used in "#{self.name}" by field "#{fname}".!
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
field_definition = Field.build(self, rule, type, fname, tag, options)
|
|
44
|
+
field_name_hash[fname] = tag
|
|
45
|
+
field_array[tag] = field_definition
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Reserve field numbers for extensions. Don't use this method directly.
|
|
49
|
+
def self.extensions(range)
|
|
50
|
+
extension_fields.add_range(range)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def self.extension_field_name_to_tag
|
|
54
|
+
@extension_fields_by_name ||= {}
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# An extension field object.
|
|
58
|
+
def self.extension_fields
|
|
59
|
+
@extension_fields ||= ::Protobuf::Field::ExtensionFields.new
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def self.extension_tag?(tag)
|
|
63
|
+
extension_fields.include_tag?(tag)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# A collection of field object.
|
|
67
|
+
def self.fields
|
|
68
|
+
@fields ||= []
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def self.field_name_to_tag
|
|
72
|
+
@field_name_to_tag ||= {}
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def self.get_ext_field_by_name(name)
|
|
76
|
+
# Check if the name has been used before, if not then set it to the sym value
|
|
77
|
+
extension_fields[extension_field_name_to_tag[name.to_sym]]
|
|
78
|
+
rescue TypeError, NoMethodError => e
|
|
79
|
+
name = 'nil' if name.nil?
|
|
80
|
+
raise FieldNotDefinedError.new("Field '#{name}' is not defined on message '#{self.name}'")
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def self.get_ext_field_by_tag(tag)
|
|
84
|
+
extension_fields[tag]
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Find a field object by +name+.
|
|
88
|
+
def self.get_field_by_name(name)
|
|
89
|
+
# Check if the name has been used before, if not then set it to the sym value
|
|
90
|
+
fields[field_name_to_tag[name.to_sym]]
|
|
91
|
+
rescue TypeError, NoMethodError => e
|
|
92
|
+
name = 'nil' if name.nil?
|
|
93
|
+
raise FieldNotDefinedError.new("Field '#{name}' is not defined on message '#{self.name}'")
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Find a field object by +tag+ number.
|
|
97
|
+
def self.get_field_by_tag(tag)
|
|
98
|
+
fields[tag]
|
|
99
|
+
rescue TypeError => e
|
|
100
|
+
tag = tag.nil? ? 'nil' : tag.to_s
|
|
101
|
+
raise FieldNotDefinedError.new("Tag '#{tag}' does not reference a message field for '#{self.name}'")
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# Define a optional field. Don't use this method directly.
|
|
105
|
+
def self.optional(type, name, tag, options = {})
|
|
106
|
+
define_field(:optional, type, name, tag, options)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# Define a repeated field. Don't use this method directly.
|
|
110
|
+
def self.repeated(type, name, tag, options = {})
|
|
111
|
+
define_field(:repeated, type, name, tag, options)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Define a required field. Don't use this method directly.
|
|
115
|
+
def self.required(type, name, tag, options = {})
|
|
116
|
+
define_field(:required, type, name, tag, options)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
##
|
|
120
|
+
# Constructor
|
|
121
|
+
#
|
|
122
|
+
def initialize(values = {})
|
|
123
|
+
@values = {}
|
|
124
|
+
values = values.to_hash
|
|
125
|
+
values.each { |name, val| self[name] = val unless val.nil? }
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
##
|
|
129
|
+
# Public Instance Methods
|
|
130
|
+
#
|
|
131
|
+
def all_fields
|
|
132
|
+
self.class.all_fields
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def clear!
|
|
136
|
+
@values.delete_if do |_, value|
|
|
137
|
+
if value.is_a?(Field::FieldArray)
|
|
138
|
+
value.clear
|
|
139
|
+
false
|
|
140
|
+
else
|
|
141
|
+
true
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
self
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def clone
|
|
148
|
+
copy_to(super, :clone)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def dup
|
|
152
|
+
copy_to(super, :dup)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# Iterate over a field collection.
|
|
156
|
+
# message.each_field do |field_object, value|
|
|
157
|
+
# # do something
|
|
158
|
+
# end
|
|
159
|
+
def each_field
|
|
160
|
+
all_fields.each do |field|
|
|
161
|
+
value = __send__(field.name)
|
|
162
|
+
yield(field, value)
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
# Returns extension fields. See Message#fields method.
|
|
167
|
+
def extension_fields
|
|
168
|
+
self.class.extension_fields
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
def fields
|
|
172
|
+
self.class.fields
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def get_ext_field_by_name(name) # :nodoc:
|
|
176
|
+
self.class.get_ext_field_by_name(name)
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
def get_ext_field_by_tag(tag) # :nodoc:
|
|
180
|
+
self.class.get_ext_field_by_tag(tag)
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
# Returns field object or +nil+.
|
|
184
|
+
def get_field_by_name(name)
|
|
185
|
+
self.class.get_field_by_name(name)
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
# Returns field object or +nil+.
|
|
189
|
+
def get_field_by_tag(tag)
|
|
190
|
+
self.class.get_field_by_tag(tag)
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
def has_field?(name)
|
|
194
|
+
@values.has_key?(name)
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
def initialized?
|
|
198
|
+
all_fields.all? { |field| field.initialized?(self) }
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
def inspect
|
|
202
|
+
to_hash.inspect
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
def parse_from_string(string)
|
|
206
|
+
parse_from(StringIO.new(string))
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
def parse_from(stream)
|
|
210
|
+
Decoder.decode(stream, self)
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
def respond_to_has?(key)
|
|
214
|
+
self.respond_to?(key) && self.has_field?(key)
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
def respond_to_has_and_present?(key)
|
|
218
|
+
self.respond_to_has?(key) &&
|
|
219
|
+
(self.__send__(key).present? || [true, false].include?(self.__send__(key)))
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
def serialize_to(stream)
|
|
223
|
+
Encoder.encode(stream, self)
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
def serialize_to_string(string='')
|
|
227
|
+
io = StringIO.new(string)
|
|
228
|
+
serialize_to(io)
|
|
229
|
+
result = io.string
|
|
230
|
+
result.force_encoding(::Protobuf::Message::STRING_ENCODING) if result.respond_to?(:force_encoding)
|
|
231
|
+
result
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
def set_field(tag, bytes)
|
|
235
|
+
field = (get_field_by_tag(tag) || get_ext_field_by_tag(tag))
|
|
236
|
+
field.set(self, bytes) if field
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
# Return a hash-representation of the given fields for this message type.
|
|
240
|
+
def to_hash
|
|
241
|
+
result = Hash.new
|
|
242
|
+
|
|
243
|
+
@values.keys.each do |field_name|
|
|
244
|
+
value = __send__(field_name)
|
|
245
|
+
hashed_value = value.respond_to?(:to_hash_value) ? value.to_hash_value : value
|
|
246
|
+
result.merge!(field_name => hashed_value)
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
return result
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
def to_json
|
|
253
|
+
to_hash.to_json
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
def ==(obj)
|
|
257
|
+
return false unless obj.is_a?(self.class)
|
|
258
|
+
each_field do |field, value|
|
|
259
|
+
return false unless value == obj.__send__(field.name)
|
|
260
|
+
end
|
|
261
|
+
true
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
def [](name)
|
|
265
|
+
if field = get_field_by_name(name) || get_ext_field_by_name(name)
|
|
266
|
+
__send__(field.name)
|
|
267
|
+
else
|
|
268
|
+
raise NoMethodError, "No such field: #{name.inspect}"
|
|
269
|
+
end
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
def []=(name, value)
|
|
273
|
+
if field = get_field_by_name(name) || get_ext_field_by_name(name)
|
|
274
|
+
__send__(field.setter_method_name, value)
|
|
275
|
+
else
|
|
276
|
+
raise NoMethodError, "No such field: #{name.inspect}"
|
|
277
|
+
end
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
##
|
|
281
|
+
# Instance Aliases
|
|
282
|
+
#
|
|
283
|
+
alias_method :to_hash_value, :to_hash
|
|
284
|
+
alias_method :to_s, :serialize_to_string
|
|
285
|
+
alias_method :responds_to_has?, :respond_to_has?
|
|
286
|
+
alias_method :respond_to_and_has?, :respond_to_has?
|
|
287
|
+
alias_method :responds_to_and_has?, :respond_to_has?
|
|
288
|
+
alias_method :respond_to_has_present?, :respond_to_has_and_present?
|
|
289
|
+
alias_method :respond_to_and_has_present?, :respond_to_has_and_present?
|
|
290
|
+
alias_method :respond_to_and_has_and_present?, :respond_to_has_and_present?
|
|
291
|
+
alias_method :responds_to_has_present?, :respond_to_has_and_present?
|
|
292
|
+
alias_method :responds_to_and_has_present?, :respond_to_has_and_present?
|
|
293
|
+
alias_method :responds_to_and_has_and_present?, :respond_to_has_and_present?
|
|
294
|
+
|
|
295
|
+
##
|
|
296
|
+
# Private Instance Methods
|
|
297
|
+
#
|
|
298
|
+
private
|
|
299
|
+
|
|
300
|
+
def copy_to(object, method)
|
|
301
|
+
duplicate = proc { |obj|
|
|
302
|
+
case obj
|
|
303
|
+
when Message, String then obj.__send__(method)
|
|
304
|
+
else obj
|
|
305
|
+
end
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
object.__send__(:initialize)
|
|
309
|
+
@values.each do |name, value|
|
|
310
|
+
if value.is_a?(Field::FieldArray)
|
|
311
|
+
object.__send__(name).replace(value.map {|v| duplicate.call(v)})
|
|
312
|
+
else
|
|
313
|
+
object.__send__("#{name}=", duplicate.call(value))
|
|
314
|
+
end
|
|
315
|
+
end
|
|
316
|
+
object
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
end
|
|
320
|
+
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
module Protobuf
|
|
2
|
+
module Rpc
|
|
3
|
+
class Buffer
|
|
4
|
+
|
|
5
|
+
attr_accessor :mode, :data, :size
|
|
6
|
+
|
|
7
|
+
MODES = [:read, :write]
|
|
8
|
+
|
|
9
|
+
# constantize this so we don't re-initialize the regex every time we need it
|
|
10
|
+
SIZE_REGEX = /^\d+-/
|
|
11
|
+
|
|
12
|
+
def initialize(mode=:read)
|
|
13
|
+
@flush = false
|
|
14
|
+
@data = ""
|
|
15
|
+
@size = 0
|
|
16
|
+
self.mode = mode
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def mode=(mode)
|
|
20
|
+
if MODES.include?(mode)
|
|
21
|
+
@mode = mode
|
|
22
|
+
else
|
|
23
|
+
@mode = :read
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def write(force_mode=true)
|
|
28
|
+
if force_mode and reading?
|
|
29
|
+
mode = :write
|
|
30
|
+
elsif not force_mode and reading?
|
|
31
|
+
raise = 'You chose to write the buffer when in read mode'
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
@size = @data.length
|
|
35
|
+
"#{@size}-#{@data}"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def <<(data)
|
|
39
|
+
@data << data
|
|
40
|
+
if reading?
|
|
41
|
+
get_data_size
|
|
42
|
+
check_for_flush
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def set_data(data)
|
|
47
|
+
@data = data.is_a?(::Protobuf::Message) ? data.serialize_to_string : data.to_s
|
|
48
|
+
@size = @data.size
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def reading?
|
|
52
|
+
mode == :read
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def writing?
|
|
56
|
+
mode == :write
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def flushed?
|
|
60
|
+
@flush
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def get_data_size
|
|
64
|
+
if @size == 0 || @data.match(SIZE_REGEX)
|
|
65
|
+
sliced_size = @data.slice!(SIZE_REGEX)
|
|
66
|
+
@size = sliced_size.gsub('-', '').to_i unless sliced_size.nil?
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
private
|
|
71
|
+
|
|
72
|
+
def check_for_flush
|
|
73
|
+
if !@size.nil? && @data.length == @size
|
|
74
|
+
@flush = true
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
require 'forwardable'
|
|
2
|
+
require 'protobuf'
|
|
3
|
+
require 'protobuf/logger'
|
|
4
|
+
require 'protobuf/rpc/error'
|
|
5
|
+
require 'protobuf/rpc/connector'
|
|
6
|
+
|
|
7
|
+
module Protobuf
|
|
8
|
+
module Rpc
|
|
9
|
+
class Client
|
|
10
|
+
extend Forwardable
|
|
11
|
+
include Protobuf::Logger::LogMethods
|
|
12
|
+
|
|
13
|
+
delegate [:options, :complete_cb, :success_cb, :failure_cb] => :@connector
|
|
14
|
+
attr_reader :connector
|
|
15
|
+
|
|
16
|
+
# Create a new client with default options (defined in ClientConnection)
|
|
17
|
+
# See Service#client for a more convenient way to create a client, as well
|
|
18
|
+
# as Client#method_missing defined below.
|
|
19
|
+
#
|
|
20
|
+
# request = WidgetFindRequest.new
|
|
21
|
+
# client = Client.new({
|
|
22
|
+
# :service => WidgetService,
|
|
23
|
+
# :method => "find",
|
|
24
|
+
# :request_type => "WidgetFindRequest",
|
|
25
|
+
# :response_type => "WidgetList",
|
|
26
|
+
# :request => request
|
|
27
|
+
# })
|
|
28
|
+
#
|
|
29
|
+
def initialize(options = {})
|
|
30
|
+
raise "Invalid client configuration. Service must be defined." if options[:service].nil?
|
|
31
|
+
@connector = Connector.connector_for_client.new(options)
|
|
32
|
+
log_debug { sign_message("Initialized with options: #{options.inspect}") }
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def log_signature
|
|
36
|
+
@_log_signature ||= "client-#{self.class}"
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Set a complete callback on the client to return the object (self).
|
|
40
|
+
#
|
|
41
|
+
# client = Client.new(:service => WidgetService)
|
|
42
|
+
# client.on_complete {|obj| ... }
|
|
43
|
+
#
|
|
44
|
+
def on_complete(&complete_cb)
|
|
45
|
+
@connector.complete_cb = complete_cb
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def on_complete=(callable)
|
|
49
|
+
if callable != nil && !callable.respond_to?(:call) && callable.arity != 1
|
|
50
|
+
raise "callable must take a single argument and respond to :call"
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
@connector.complete_cb = callable
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Set a failure callback on the client to return the
|
|
57
|
+
# error returned by the service, if any. If this callback
|
|
58
|
+
# is called, success_cb will NOT be called.
|
|
59
|
+
#
|
|
60
|
+
# client = Client.new(:service => WidgetService)
|
|
61
|
+
# client.on_failure {|err| ... }
|
|
62
|
+
#
|
|
63
|
+
def on_failure(&failure_cb)
|
|
64
|
+
@connector.failure_cb = failure_cb
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def on_failure=(callable)
|
|
68
|
+
if callable != nil && !callable.respond_to?(:call) && callable.arity != 1
|
|
69
|
+
raise "Callable must take a single argument and respond to :call"
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
@connector.failure_cb = callable
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Set a success callback on the client to return the
|
|
76
|
+
# successful response from the service when it is returned.
|
|
77
|
+
# If this callback is called, failure_cb will NOT be called.
|
|
78
|
+
#
|
|
79
|
+
# client = Client.new(:service => WidgetService)
|
|
80
|
+
# client.on_success {|res| ... }
|
|
81
|
+
#
|
|
82
|
+
def on_success(&success_cb)
|
|
83
|
+
@connector.success_cb = success_cb
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def on_success=(callable)
|
|
87
|
+
if callable != nil && !callable.respond_to?(:call) && callable.arity != 1
|
|
88
|
+
raise "Callable must take a single argument and respond to :call"
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
@connector.success_cb = callable
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# Provides a mechanism to call the service method against the client
|
|
95
|
+
# which will automatically setup the service_class and method_name
|
|
96
|
+
# in the wrapper protobuf request.
|
|
97
|
+
#
|
|
98
|
+
# # The :find method is not defined by Client which will trigger method_missing
|
|
99
|
+
# Client.new(:service => WidgetService).find do |c|
|
|
100
|
+
# # This block will be invoked before the request is made
|
|
101
|
+
# # `c` in this case is the client object you created above
|
|
102
|
+
# c.on_success {|res| ... }
|
|
103
|
+
# c.on_failure {|err| ... }
|
|
104
|
+
# end
|
|
105
|
+
#
|
|
106
|
+
def method_missing(method_name, *params)
|
|
107
|
+
service = options[:service]
|
|
108
|
+
unless service.rpc_method?(method_name)
|
|
109
|
+
log_error { sign_message("#{service.name}##{method_name.to_s} not rpc method, passing to super") }
|
|
110
|
+
super(method_name, *params)
|
|
111
|
+
else
|
|
112
|
+
log_debug { sign_message("#{service.name}##{method_name.to_s}") }
|
|
113
|
+
rpc = service.rpcs[method_name.to_sym]
|
|
114
|
+
|
|
115
|
+
options[:request_type] = rpc.request_type
|
|
116
|
+
log_debug { sign_message("Request Type: #{options[:request_type].name}") }
|
|
117
|
+
|
|
118
|
+
options[:response_type] = rpc.response_type
|
|
119
|
+
log_debug { sign_message("Response Type: #{options[:response_type].name}") }
|
|
120
|
+
|
|
121
|
+
options[:method] = method_name.to_s
|
|
122
|
+
options[:request] = params[0].is_a?(Hash) ? options[:request_type].new(params[0]) : params[0]
|
|
123
|
+
log_debug { sign_message("Request Data: #{options[:request].inspect}") }
|
|
124
|
+
|
|
125
|
+
# Call client to setup on_success and on_failure event callbacks
|
|
126
|
+
if block_given?
|
|
127
|
+
log_debug { sign_message("client setup callback given, invoking") }
|
|
128
|
+
yield(self)
|
|
129
|
+
else
|
|
130
|
+
log_debug { sign_message("no block given for callbacks") }
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
send_request
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# Send the request to the service through eventmachine.
|
|
138
|
+
# This method is usually never called directly
|
|
139
|
+
# but is invoked by method_missing (see docs above).
|
|
140
|
+
#
|
|
141
|
+
# request = WidgetFindRequest.new
|
|
142
|
+
# client = Client.new({
|
|
143
|
+
# :service => WidgetService,
|
|
144
|
+
# :method => "find",
|
|
145
|
+
# :request_type => "WidgetFindRequest",
|
|
146
|
+
# :response_type => "WidgetList",
|
|
147
|
+
# :request => request
|
|
148
|
+
# })
|
|
149
|
+
#
|
|
150
|
+
# client.on_success do |res|
|
|
151
|
+
# res.widgets.each{|w| puts w.inspect }
|
|
152
|
+
# end
|
|
153
|
+
#
|
|
154
|
+
# client.on_failure do |err|
|
|
155
|
+
# puts err.message
|
|
156
|
+
# end
|
|
157
|
+
#
|
|
158
|
+
# client.send_request
|
|
159
|
+
#
|
|
160
|
+
def send_request
|
|
161
|
+
@connector.send_request
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end
|