protobuf 2.2.5-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (256) hide show
  1. data/.gitignore +17 -0
  2. data/.travis.yml +9 -0
  3. data/.yardopts +5 -0
  4. data/Gemfile +3 -0
  5. data/README.md +316 -0
  6. data/Rakefile +29 -0
  7. data/UPGRADING.md +60 -0
  8. data/bin/rpc_server +5 -0
  9. data/bin/rprotoc +62 -0
  10. data/examples/addressbook.pb.rb +55 -0
  11. data/examples/addressbook.proto +24 -0
  12. data/examples/reading_a_message.rb +32 -0
  13. data/examples/writing_a_message.rb +46 -0
  14. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/code_generator.h +142 -0
  15. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/command_line_interface.h +318 -0
  16. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_enum.h +99 -0
  17. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_enum_field.h +103 -0
  18. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_extension.h +85 -0
  19. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_field.h +167 -0
  20. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_file.h +98 -0
  21. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_generator.h +72 -0
  22. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_helpers.h +159 -0
  23. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_message.h +170 -0
  24. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_message_field.h +102 -0
  25. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_primitive_field.h +103 -0
  26. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_service.h +118 -0
  27. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_string_field.h +104 -0
  28. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_test_bad_identifiers.pb.h +2721 -0
  29. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/importer.h +303 -0
  30. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_enum.h +84 -0
  31. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_enum_field.h +121 -0
  32. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_extension.h +77 -0
  33. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_field.h +108 -0
  34. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_file.h +101 -0
  35. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_generator.h +72 -0
  36. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_helpers.h +213 -0
  37. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_message.h +109 -0
  38. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_message_field.h +134 -0
  39. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_primitive_field.h +121 -0
  40. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_service.h +113 -0
  41. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_string_field.h +120 -0
  42. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/mock_code_generator.h +113 -0
  43. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/package_info.h +64 -0
  44. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/parser.h +434 -0
  45. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/plugin.h +73 -0
  46. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/plugin.pb.h +790 -0
  47. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/python/python_generator.h +156 -0
  48. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/subprocess.h +108 -0
  49. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/zip_writer.h +93 -0
  50. data/ext/protobuf-2.4.1/src/google/protobuf/descriptor.h +1367 -0
  51. data/ext/protobuf-2.4.1/src/google/protobuf/descriptor.pb.h +5223 -0
  52. data/ext/protobuf-2.4.1/src/google/protobuf/descriptor_database.h +366 -0
  53. data/ext/protobuf-2.4.1/src/google/protobuf/dynamic_message.h +136 -0
  54. data/ext/protobuf-2.4.1/src/google/protobuf/extension_set.h +904 -0
  55. data/ext/protobuf-2.4.1/src/google/protobuf/generated_message_reflection.h +424 -0
  56. data/ext/protobuf-2.4.1/src/google/protobuf/generated_message_util.h +82 -0
  57. data/ext/protobuf-2.4.1/src/google/protobuf/io/coded_stream.h +1102 -0
  58. data/ext/protobuf-2.4.1/src/google/protobuf/io/coded_stream_inl.h +64 -0
  59. data/ext/protobuf-2.4.1/src/google/protobuf/io/gzip_stream.h +207 -0
  60. data/ext/protobuf-2.4.1/src/google/protobuf/io/package_info.h +54 -0
  61. data/ext/protobuf-2.4.1/src/google/protobuf/io/printer.h +136 -0
  62. data/ext/protobuf-2.4.1/src/google/protobuf/io/tokenizer.h +313 -0
  63. data/ext/protobuf-2.4.1/src/google/protobuf/io/zero_copy_stream.h +238 -0
  64. data/ext/protobuf-2.4.1/src/google/protobuf/io/zero_copy_stream_impl.h +357 -0
  65. data/ext/protobuf-2.4.1/src/google/protobuf/io/zero_copy_stream_impl_lite.h +340 -0
  66. data/ext/protobuf-2.4.1/src/google/protobuf/message.h +692 -0
  67. data/ext/protobuf-2.4.1/src/google/protobuf/message_lite.h +239 -0
  68. data/ext/protobuf-2.4.1/src/google/protobuf/package_info.h +64 -0
  69. data/ext/protobuf-2.4.1/src/google/protobuf/reflection_ops.h +80 -0
  70. data/ext/protobuf-2.4.1/src/google/protobuf/repeated_field.h +1295 -0
  71. data/ext/protobuf-2.4.1/src/google/protobuf/service.h +291 -0
  72. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/common.h +1211 -0
  73. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/hash.h +220 -0
  74. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/map-util.h +119 -0
  75. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/once.h +123 -0
  76. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/stl_util-inl.h +121 -0
  77. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/strutil.h +457 -0
  78. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/substitute.h +170 -0
  79. data/ext/protobuf-2.4.1/src/google/protobuf/test_util.h +174 -0
  80. data/ext/protobuf-2.4.1/src/google/protobuf/test_util_lite.h +101 -0
  81. data/ext/protobuf-2.4.1/src/google/protobuf/testing/file.h +83 -0
  82. data/ext/protobuf-2.4.1/src/google/protobuf/testing/googletest.h +98 -0
  83. data/ext/protobuf-2.4.1/src/google/protobuf/text_format.h +285 -0
  84. data/ext/protobuf-2.4.1/src/google/protobuf/unittest.pb.h +11915 -0
  85. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_custom_options.pb.h +2895 -0
  86. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_embed_optimize_for.pb.h +211 -0
  87. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_empty.pb.h +56 -0
  88. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_import.pb.h +188 -0
  89. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_import_lite.pb.h +151 -0
  90. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_lite.pb.h +4752 -0
  91. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_lite_imports_nonlite.pb.h +150 -0
  92. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_mset.pb.h +816 -0
  93. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_no_generic_services.pb.h +197 -0
  94. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_optimize_for.pb.h +403 -0
  95. data/ext/protobuf-2.4.1/src/google/protobuf/unknown_field_set.h +268 -0
  96. data/ext/protobuf-2.4.1/src/google/protobuf/wire_format.h +304 -0
  97. data/ext/protobuf-2.4.1/src/google/protobuf/wire_format_lite.h +620 -0
  98. data/ext/protobuf-2.4.1/src/google/protobuf/wire_format_lite_inl.h +774 -0
  99. data/ext/ruby_generator/Makefile +10 -0
  100. data/ext/ruby_generator/RubyGenerator.cpp +450 -0
  101. data/ext/ruby_generator/RubyGenerator.h +199 -0
  102. data/ext/ruby_generator/extconf.rb +36 -0
  103. data/ext/ruby_generator/protoc-ruby +0 -0
  104. data/lib/protobuf/cli.rb +188 -0
  105. data/lib/protobuf/enum.rb +58 -0
  106. data/lib/protobuf/enum_value.rb +59 -0
  107. data/lib/protobuf/evented.rb +22 -0
  108. data/lib/protobuf/exceptions.rb +11 -0
  109. data/lib/protobuf/ext/eventmachine.rb +14 -0
  110. data/lib/protobuf/field/base_field.rb +240 -0
  111. data/lib/protobuf/field/bool_field.rb +36 -0
  112. data/lib/protobuf/field/bytes_field.rb +38 -0
  113. data/lib/protobuf/field/double_field.rb +19 -0
  114. data/lib/protobuf/field/enum_field.rb +50 -0
  115. data/lib/protobuf/field/extension_fields.rb +32 -0
  116. data/lib/protobuf/field/field_array.rb +65 -0
  117. data/lib/protobuf/field/fixed32_field.rb +19 -0
  118. data/lib/protobuf/field/fixed64_field.rb +22 -0
  119. data/lib/protobuf/field/float_field.rb +31 -0
  120. data/lib/protobuf/field/int32_field.rb +12 -0
  121. data/lib/protobuf/field/int64_field.rb +12 -0
  122. data/lib/protobuf/field/integer_field.rb +19 -0
  123. data/lib/protobuf/field/message_field.rb +53 -0
  124. data/lib/protobuf/field/sfixed32_field.rb +21 -0
  125. data/lib/protobuf/field/sfixed64_field.rb +24 -0
  126. data/lib/protobuf/field/signed_integer_field.rb +23 -0
  127. data/lib/protobuf/field/sint32_field.rb +12 -0
  128. data/lib/protobuf/field/sint64_field.rb +12 -0
  129. data/lib/protobuf/field/string_field.rb +14 -0
  130. data/lib/protobuf/field/uint32_field.rb +12 -0
  131. data/lib/protobuf/field/uint64_field.rb +12 -0
  132. data/lib/protobuf/field/varint_field.rb +61 -0
  133. data/lib/protobuf/field.rb +57 -0
  134. data/lib/protobuf/logger.rb +86 -0
  135. data/lib/protobuf/message/decoder.rb +83 -0
  136. data/lib/protobuf/message/encoder.rb +48 -0
  137. data/lib/protobuf/message/extend.rb +8 -0
  138. data/lib/protobuf/message/message.rb +1 -0
  139. data/lib/protobuf/message.rb +320 -0
  140. data/lib/protobuf/rpc/buffer.rb +79 -0
  141. data/lib/protobuf/rpc/client.rb +166 -0
  142. data/lib/protobuf/rpc/connector.rb +19 -0
  143. data/lib/protobuf/rpc/connectors/base.rb +38 -0
  144. data/lib/protobuf/rpc/connectors/common.rb +156 -0
  145. data/lib/protobuf/rpc/connectors/em_client.rb +84 -0
  146. data/lib/protobuf/rpc/connectors/eventmachine.rb +87 -0
  147. data/lib/protobuf/rpc/connectors/socket.rb +73 -0
  148. data/lib/protobuf/rpc/connectors/zmq.rb +69 -0
  149. data/lib/protobuf/rpc/error/client_error.rb +31 -0
  150. data/lib/protobuf/rpc/error/server_error.rb +43 -0
  151. data/lib/protobuf/rpc/error.rb +25 -0
  152. data/lib/protobuf/rpc/rpc.pb.rb +118 -0
  153. data/lib/protobuf/rpc/server.rb +89 -0
  154. data/lib/protobuf/rpc/servers/evented/server.rb +41 -0
  155. data/lib/protobuf/rpc/servers/evented_runner.rb +21 -0
  156. data/lib/protobuf/rpc/servers/socket/server.rb +111 -0
  157. data/lib/protobuf/rpc/servers/socket/worker.rb +66 -0
  158. data/lib/protobuf/rpc/servers/socket_runner.rb +27 -0
  159. data/lib/protobuf/rpc/servers/zmq/broker.rb +87 -0
  160. data/lib/protobuf/rpc/servers/zmq/server.rb +50 -0
  161. data/lib/protobuf/rpc/servers/zmq/util.rb +27 -0
  162. data/lib/protobuf/rpc/servers/zmq/worker.rb +60 -0
  163. data/lib/protobuf/rpc/servers/zmq_runner.rb +25 -0
  164. data/lib/protobuf/rpc/service.rb +173 -0
  165. data/lib/protobuf/rpc/service_dispatcher.rb +130 -0
  166. data/lib/protobuf/rpc/service_filters.rb +267 -0
  167. data/lib/protobuf/rpc/stat.rb +83 -0
  168. data/lib/protobuf/socket.rb +22 -0
  169. data/lib/protobuf/version.rb +4 -0
  170. data/lib/protobuf/wire_type.rb +10 -0
  171. data/lib/protobuf/zmq.rb +21 -0
  172. data/lib/protobuf.rb +86 -0
  173. data/proto/rpc.pb.rb +48 -0
  174. data/proto/rpc.proto +73 -0
  175. data/protobuf.gemspec +44 -0
  176. data/spec/benchmark/tasks.rb +179 -0
  177. data/spec/functional/embedded_service_spec.rb +7 -0
  178. data/spec/functional/evented_server_spec.rb +64 -0
  179. data/spec/functional/socket_server_spec.rb +58 -0
  180. data/spec/functional/zmq_server_spec.rb +58 -0
  181. data/spec/lib/protobuf/cli_spec.rb +212 -0
  182. data/spec/lib/protobuf/enum_spec.rb +98 -0
  183. data/spec/lib/protobuf/enum_value_spec.rb +15 -0
  184. data/spec/lib/protobuf/logger_spec.rb +131 -0
  185. data/spec/lib/protobuf/message/encoder_spec.rb +19 -0
  186. data/spec/lib/protobuf/message_spec.rb +209 -0
  187. data/spec/lib/protobuf/rpc/client_spec.rb +158 -0
  188. data/spec/lib/protobuf/rpc/connector_spec.rb +32 -0
  189. data/spec/lib/protobuf/rpc/connectors/base_spec.rb +50 -0
  190. data/spec/lib/protobuf/rpc/connectors/common_spec.rb +128 -0
  191. data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +36 -0
  192. data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +22 -0
  193. data/spec/lib/protobuf/rpc/servers/evented_server_spec.rb +18 -0
  194. data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +43 -0
  195. data/spec/lib/protobuf/rpc/servers/zmq/broker_spec.rb +35 -0
  196. data/spec/lib/protobuf/rpc/servers/zmq/server_spec.rb +41 -0
  197. data/spec/lib/protobuf/rpc/servers/zmq/util_spec.rb +45 -0
  198. data/spec/lib/protobuf/rpc/servers/zmq/worker_spec.rb +44 -0
  199. data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +116 -0
  200. data/spec/lib/protobuf/rpc/service_filters_spec.rb +451 -0
  201. data/spec/lib/protobuf/rpc/service_spec.rb +165 -0
  202. data/spec/lib/protobuf_spec.rb +62 -0
  203. data/spec/spec_helper.rb +51 -0
  204. data/spec/support/all.rb +6 -0
  205. data/spec/support/server.rb +101 -0
  206. data/spec/support/test/enum.pb.rb +34 -0
  207. data/spec/support/test/enum.proto +12 -0
  208. data/spec/support/test/resource.pb.rb +58 -0
  209. data/spec/support/test/resource.proto +31 -0
  210. data/spec/support/test/resource_service.rb +14 -0
  211. data/spec/support/test_app_file.rb +2 -0
  212. data/spec/support/tolerance_matcher.rb +40 -0
  213. data/test/data/data.bin +3 -0
  214. data/test/data/data_source.py +14 -0
  215. data/test/data/types.bin +0 -0
  216. data/test/data/types_source.py +22 -0
  217. data/test/data/unk.png +0 -0
  218. data/test/proto/addressbook.pb.rb +66 -0
  219. data/test/proto/addressbook.proto +33 -0
  220. data/test/proto/addressbook_base.pb.rb +58 -0
  221. data/test/proto/addressbook_base.proto +26 -0
  222. data/test/proto/addressbook_ext.pb.rb +20 -0
  223. data/test/proto/addressbook_ext.proto +6 -0
  224. data/test/proto/collision.pb.rb +17 -0
  225. data/test/proto/collision.proto +5 -0
  226. data/test/proto/ext_collision.pb.rb +24 -0
  227. data/test/proto/ext_collision.proto +8 -0
  228. data/test/proto/ext_range.pb.rb +22 -0
  229. data/test/proto/ext_range.proto +7 -0
  230. data/test/proto/float_default.proto +10 -0
  231. data/test/proto/lowercase.pb.rb +30 -0
  232. data/test/proto/lowercase.proto +9 -0
  233. data/test/proto/merge.pb.rb +39 -0
  234. data/test/proto/merge.proto +15 -0
  235. data/test/proto/nested.pb.rb +30 -0
  236. data/test/proto/nested.proto +9 -0
  237. data/test/proto/optional_field.pb.rb +35 -0
  238. data/test/proto/optional_field.proto +12 -0
  239. data/test/proto/packed.pb.rb +22 -0
  240. data/test/proto/packed.proto +6 -0
  241. data/test/proto/rpc.proto +6 -0
  242. data/test/proto/types.pb.rb +84 -0
  243. data/test/proto/types.proto +37 -0
  244. data/test/test_addressbook.rb +56 -0
  245. data/test/test_enum_value.rb +41 -0
  246. data/test/test_extension.rb +36 -0
  247. data/test/test_lowercase.rb +11 -0
  248. data/test/test_message.rb +128 -0
  249. data/test/test_optional_field.rb +103 -0
  250. data/test/test_packed_field.rb +40 -0
  251. data/test/test_parse.rb +15 -0
  252. data/test/test_repeated_types.rb +132 -0
  253. data/test/test_serialize.rb +61 -0
  254. data/test/test_standard_message.rb +96 -0
  255. data/test/test_types.rb +226 -0
  256. metadata +461 -0
@@ -0,0 +1,291 @@
1
+ // Protocol Buffers - Google's data interchange format
2
+ // Copyright 2008 Google Inc. All rights reserved.
3
+ // http://code.google.com/p/protobuf/
4
+ //
5
+ // Redistribution and use in source and binary forms, with or without
6
+ // modification, are permitted provided that the following conditions are
7
+ // met:
8
+ //
9
+ // * Redistributions of source code must retain the above copyright
10
+ // notice, this list of conditions and the following disclaimer.
11
+ // * Redistributions in binary form must reproduce the above
12
+ // copyright notice, this list of conditions and the following disclaimer
13
+ // in the documentation and/or other materials provided with the
14
+ // distribution.
15
+ // * Neither the name of Google Inc. nor the names of its
16
+ // contributors may be used to endorse or promote products derived from
17
+ // this software without specific prior written permission.
18
+ //
19
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+
31
+ // Author: kenton@google.com (Kenton Varda)
32
+ // Based on original Protocol Buffers design by
33
+ // Sanjay Ghemawat, Jeff Dean, and others.
34
+ //
35
+ // DEPRECATED: This module declares the abstract interfaces underlying proto2
36
+ // RPC services. These are intented to be independent of any particular RPC
37
+ // implementation, so that proto2 services can be used on top of a variety
38
+ // of implementations. Starting with version 2.3.0, RPC implementations should
39
+ // not try to build on these, but should instead provide code generator plugins
40
+ // which generate code specific to the particular RPC implementation. This way
41
+ // the generated code can be more appropriate for the implementation in use
42
+ // and can avoid unnecessary layers of indirection.
43
+ //
44
+ //
45
+ // When you use the protocol compiler to compile a service definition, it
46
+ // generates two classes: An abstract interface for the service (with
47
+ // methods matching the service definition) and a "stub" implementation.
48
+ // A stub is just a type-safe wrapper around an RpcChannel which emulates a
49
+ // local implementation of the service.
50
+ //
51
+ // For example, the service definition:
52
+ // service MyService {
53
+ // rpc Foo(MyRequest) returns(MyResponse);
54
+ // }
55
+ // will generate abstract interface "MyService" and class "MyService::Stub".
56
+ // You could implement a MyService as follows:
57
+ // class MyServiceImpl : public MyService {
58
+ // public:
59
+ // MyServiceImpl() {}
60
+ // ~MyServiceImpl() {}
61
+ //
62
+ // // implements MyService ---------------------------------------
63
+ //
64
+ // void Foo(google::protobuf::RpcController* controller,
65
+ // const MyRequest* request,
66
+ // MyResponse* response,
67
+ // Closure* done) {
68
+ // // ... read request and fill in response ...
69
+ // done->Run();
70
+ // }
71
+ // };
72
+ // You would then register an instance of MyServiceImpl with your RPC server
73
+ // implementation. (How to do that depends on the implementation.)
74
+ //
75
+ // To call a remote MyServiceImpl, first you need an RpcChannel connected to it.
76
+ // How to construct a channel depends, again, on your RPC implementation.
77
+ // Here we use a hypothentical "MyRpcChannel" as an example:
78
+ // MyRpcChannel channel("rpc:hostname:1234/myservice");
79
+ // MyRpcController controller;
80
+ // MyServiceImpl::Stub stub(&channel);
81
+ // FooRequest request;
82
+ // FooRespnose response;
83
+ //
84
+ // // ... fill in request ...
85
+ //
86
+ // stub.Foo(&controller, request, &response, NewCallback(HandleResponse));
87
+ //
88
+ // On Thread-Safety:
89
+ //
90
+ // Different RPC implementations may make different guarantees about what
91
+ // threads they may run callbacks on, and what threads the application is
92
+ // allowed to use to call the RPC system. Portable software should be ready
93
+ // for callbacks to be called on any thread, but should not try to call the
94
+ // RPC system from any thread except for the ones on which it received the
95
+ // callbacks. Realistically, though, simple software will probably want to
96
+ // use a single-threaded RPC system while high-end software will want to
97
+ // use multiple threads. RPC implementations should provide multiple
98
+ // choices.
99
+
100
+ #ifndef GOOGLE_PROTOBUF_SERVICE_H__
101
+ #define GOOGLE_PROTOBUF_SERVICE_H__
102
+
103
+ #include <string>
104
+ #include <google/protobuf/stubs/common.h>
105
+
106
+ namespace google {
107
+ namespace protobuf {
108
+
109
+ // Defined in this file.
110
+ class Service;
111
+ class RpcController;
112
+ class RpcChannel;
113
+
114
+ // Defined in other files.
115
+ class Descriptor; // descriptor.h
116
+ class ServiceDescriptor; // descriptor.h
117
+ class MethodDescriptor; // descriptor.h
118
+ class Message; // message.h
119
+
120
+ // Abstract base interface for protocol-buffer-based RPC services. Services
121
+ // themselves are abstract interfaces (implemented either by servers or as
122
+ // stubs), but they subclass this base interface. The methods of this
123
+ // interface can be used to call the methods of the Service without knowing
124
+ // its exact type at compile time (analogous to Reflection).
125
+ class LIBPROTOBUF_EXPORT Service {
126
+ public:
127
+ inline Service() {}
128
+ virtual ~Service();
129
+
130
+ // When constructing a stub, you may pass STUB_OWNS_CHANNEL as the second
131
+ // parameter to the constructor to tell it to delete its RpcChannel when
132
+ // destroyed.
133
+ enum ChannelOwnership {
134
+ STUB_OWNS_CHANNEL,
135
+ STUB_DOESNT_OWN_CHANNEL
136
+ };
137
+
138
+ // Get the ServiceDescriptor describing this service and its methods.
139
+ virtual const ServiceDescriptor* GetDescriptor() = 0;
140
+
141
+ // Call a method of the service specified by MethodDescriptor. This is
142
+ // normally implemented as a simple switch() that calls the standard
143
+ // definitions of the service's methods.
144
+ //
145
+ // Preconditions:
146
+ // * method->service() == GetDescriptor()
147
+ // * request and response are of the exact same classes as the objects
148
+ // returned by GetRequestPrototype(method) and
149
+ // GetResponsePrototype(method).
150
+ // * After the call has started, the request must not be modified and the
151
+ // response must not be accessed at all until "done" is called.
152
+ // * "controller" is of the correct type for the RPC implementation being
153
+ // used by this Service. For stubs, the "correct type" depends on the
154
+ // RpcChannel which the stub is using. Server-side Service
155
+ // implementations are expected to accept whatever type of RpcController
156
+ // the server-side RPC implementation uses.
157
+ //
158
+ // Postconditions:
159
+ // * "done" will be called when the method is complete. This may be
160
+ // before CallMethod() returns or it may be at some point in the future.
161
+ // * If the RPC succeeded, "response" contains the response returned by
162
+ // the server.
163
+ // * If the RPC failed, "response"'s contents are undefined. The
164
+ // RpcController can be queried to determine if an error occurred and
165
+ // possibly to get more information about the error.
166
+ virtual void CallMethod(const MethodDescriptor* method,
167
+ RpcController* controller,
168
+ const Message* request,
169
+ Message* response,
170
+ Closure* done) = 0;
171
+
172
+ // CallMethod() requires that the request and response passed in are of a
173
+ // particular subclass of Message. GetRequestPrototype() and
174
+ // GetResponsePrototype() get the default instances of these required types.
175
+ // You can then call Message::New() on these instances to construct mutable
176
+ // objects which you can then pass to CallMethod().
177
+ //
178
+ // Example:
179
+ // const MethodDescriptor* method =
180
+ // service->GetDescriptor()->FindMethodByName("Foo");
181
+ // Message* request = stub->GetRequestPrototype (method)->New();
182
+ // Message* response = stub->GetResponsePrototype(method)->New();
183
+ // request->ParseFromString(input);
184
+ // service->CallMethod(method, *request, response, callback);
185
+ virtual const Message& GetRequestPrototype(
186
+ const MethodDescriptor* method) const = 0;
187
+ virtual const Message& GetResponsePrototype(
188
+ const MethodDescriptor* method) const = 0;
189
+
190
+ private:
191
+ GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Service);
192
+ };
193
+
194
+ // An RpcController mediates a single method call. The primary purpose of
195
+ // the controller is to provide a way to manipulate settings specific to the
196
+ // RPC implementation and to find out about RPC-level errors.
197
+ //
198
+ // The methods provided by the RpcController interface are intended to be a
199
+ // "least common denominator" set of features which we expect all
200
+ // implementations to support. Specific implementations may provide more
201
+ // advanced features (e.g. deadline propagation).
202
+ class LIBPROTOBUF_EXPORT RpcController {
203
+ public:
204
+ inline RpcController() {}
205
+ virtual ~RpcController();
206
+
207
+ // Client-side methods ---------------------------------------------
208
+ // These calls may be made from the client side only. Their results
209
+ // are undefined on the server side (may crash).
210
+
211
+ // Resets the RpcController to its initial state so that it may be reused in
212
+ // a new call. Must not be called while an RPC is in progress.
213
+ virtual void Reset() = 0;
214
+
215
+ // After a call has finished, returns true if the call failed. The possible
216
+ // reasons for failure depend on the RPC implementation. Failed() must not
217
+ // be called before a call has finished. If Failed() returns true, the
218
+ // contents of the response message are undefined.
219
+ virtual bool Failed() const = 0;
220
+
221
+ // If Failed() is true, returns a human-readable description of the error.
222
+ virtual string ErrorText() const = 0;
223
+
224
+ // Advises the RPC system that the caller desires that the RPC call be
225
+ // canceled. The RPC system may cancel it immediately, may wait awhile and
226
+ // then cancel it, or may not even cancel the call at all. If the call is
227
+ // canceled, the "done" callback will still be called and the RpcController
228
+ // will indicate that the call failed at that time.
229
+ virtual void StartCancel() = 0;
230
+
231
+ // Server-side methods ---------------------------------------------
232
+ // These calls may be made from the server side only. Their results
233
+ // are undefined on the client side (may crash).
234
+
235
+ // Causes Failed() to return true on the client side. "reason" will be
236
+ // incorporated into the message returned by ErrorText(). If you find
237
+ // you need to return machine-readable information about failures, you
238
+ // should incorporate it into your response protocol buffer and should
239
+ // NOT call SetFailed().
240
+ virtual void SetFailed(const string& reason) = 0;
241
+
242
+ // If true, indicates that the client canceled the RPC, so the server may
243
+ // as well give up on replying to it. The server should still call the
244
+ // final "done" callback.
245
+ virtual bool IsCanceled() const = 0;
246
+
247
+ // Asks that the given callback be called when the RPC is canceled. The
248
+ // callback will always be called exactly once. If the RPC completes without
249
+ // being canceled, the callback will be called after completion. If the RPC
250
+ // has already been canceled when NotifyOnCancel() is called, the callback
251
+ // will be called immediately.
252
+ //
253
+ // NotifyOnCancel() must be called no more than once per request.
254
+ virtual void NotifyOnCancel(Closure* callback) = 0;
255
+
256
+ private:
257
+ GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RpcController);
258
+ };
259
+
260
+ // Abstract interface for an RPC channel. An RpcChannel represents a
261
+ // communication line to a Service which can be used to call that Service's
262
+ // methods. The Service may be running on another machine. Normally, you
263
+ // should not call an RpcChannel directly, but instead construct a stub Service
264
+ // wrapping it. Example:
265
+ // RpcChannel* channel = new MyRpcChannel("remotehost.example.com:1234");
266
+ // MyService* service = new MyService::Stub(channel);
267
+ // service->MyMethod(request, &response, callback);
268
+ class LIBPROTOBUF_EXPORT RpcChannel {
269
+ public:
270
+ inline RpcChannel() {}
271
+ virtual ~RpcChannel();
272
+
273
+ // Call the given method of the remote service. The signature of this
274
+ // procedure looks the same as Service::CallMethod(), but the requirements
275
+ // are less strict in one important way: the request and response objects
276
+ // need not be of any specific class as long as their descriptors are
277
+ // method->input_type() and method->output_type().
278
+ virtual void CallMethod(const MethodDescriptor* method,
279
+ RpcController* controller,
280
+ const Message* request,
281
+ Message* response,
282
+ Closure* done) = 0;
283
+
284
+ private:
285
+ GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RpcChannel);
286
+ };
287
+
288
+ } // namespace protobuf
289
+
290
+ } // namespace google
291
+ #endif // GOOGLE_PROTOBUF_SERVICE_H__