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.
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,357 @@
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
+ // This file contains common implementations of the interfaces defined in
36
+ // zero_copy_stream.h which are only included in the full (non-lite)
37
+ // protobuf library. These implementations include Unix file descriptors
38
+ // and C++ iostreams. See also: zero_copy_stream_impl_lite.h
39
+
40
+ #ifndef GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_H__
41
+ #define GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_H__
42
+
43
+ #include <string>
44
+ #include <iosfwd>
45
+ #include <google/protobuf/io/zero_copy_stream.h>
46
+ #include <google/protobuf/io/zero_copy_stream_impl_lite.h>
47
+ #include <google/protobuf/stubs/common.h>
48
+
49
+
50
+ namespace google {
51
+ namespace protobuf {
52
+ namespace io {
53
+
54
+
55
+ // ===================================================================
56
+
57
+ // A ZeroCopyInputStream which reads from a file descriptor.
58
+ //
59
+ // FileInputStream is preferred over using an ifstream with IstreamInputStream.
60
+ // The latter will introduce an extra layer of buffering, harming performance.
61
+ // Also, it's conceivable that FileInputStream could someday be enhanced
62
+ // to use zero-copy file descriptors on OSs which support them.
63
+ class LIBPROTOBUF_EXPORT FileInputStream : public ZeroCopyInputStream {
64
+ public:
65
+ // Creates a stream that reads from the given Unix file descriptor.
66
+ // If a block_size is given, it specifies the number of bytes that
67
+ // should be read and returned with each call to Next(). Otherwise,
68
+ // a reasonable default is used.
69
+ explicit FileInputStream(int file_descriptor, int block_size = -1);
70
+ ~FileInputStream();
71
+
72
+ // Flushes any buffers and closes the underlying file. Returns false if
73
+ // an error occurs during the process; use GetErrno() to examine the error.
74
+ // Even if an error occurs, the file descriptor is closed when this returns.
75
+ bool Close();
76
+
77
+ // By default, the file descriptor is not closed when the stream is
78
+ // destroyed. Call SetCloseOnDelete(true) to change that. WARNING:
79
+ // This leaves no way for the caller to detect if close() fails. If
80
+ // detecting close() errors is important to you, you should arrange
81
+ // to close the descriptor yourself.
82
+ void SetCloseOnDelete(bool value) { copying_input_.SetCloseOnDelete(value); }
83
+
84
+ // If an I/O error has occurred on this file descriptor, this is the
85
+ // errno from that error. Otherwise, this is zero. Once an error
86
+ // occurs, the stream is broken and all subsequent operations will
87
+ // fail.
88
+ int GetErrno() { return copying_input_.GetErrno(); }
89
+
90
+ // implements ZeroCopyInputStream ----------------------------------
91
+ bool Next(const void** data, int* size);
92
+ void BackUp(int count);
93
+ bool Skip(int count);
94
+ int64 ByteCount() const;
95
+
96
+ private:
97
+ class LIBPROTOBUF_EXPORT CopyingFileInputStream : public CopyingInputStream {
98
+ public:
99
+ CopyingFileInputStream(int file_descriptor);
100
+ ~CopyingFileInputStream();
101
+
102
+ bool Close();
103
+ void SetCloseOnDelete(bool value) { close_on_delete_ = value; }
104
+ int GetErrno() { return errno_; }
105
+
106
+ // implements CopyingInputStream ---------------------------------
107
+ int Read(void* buffer, int size);
108
+ int Skip(int count);
109
+
110
+ private:
111
+ // The file descriptor.
112
+ const int file_;
113
+ bool close_on_delete_;
114
+ bool is_closed_;
115
+
116
+ // The errno of the I/O error, if one has occurred. Otherwise, zero.
117
+ int errno_;
118
+
119
+ // Did we try to seek once and fail? If so, we assume this file descriptor
120
+ // doesn't support seeking and won't try again.
121
+ bool previous_seek_failed_;
122
+
123
+ GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingFileInputStream);
124
+ };
125
+
126
+ CopyingFileInputStream copying_input_;
127
+ CopyingInputStreamAdaptor impl_;
128
+
129
+ GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileInputStream);
130
+ };
131
+
132
+ // ===================================================================
133
+
134
+ // A ZeroCopyOutputStream which writes to a file descriptor.
135
+ //
136
+ // FileOutputStream is preferred over using an ofstream with
137
+ // OstreamOutputStream. The latter will introduce an extra layer of buffering,
138
+ // harming performance. Also, it's conceivable that FileOutputStream could
139
+ // someday be enhanced to use zero-copy file descriptors on OSs which
140
+ // support them.
141
+ class LIBPROTOBUF_EXPORT FileOutputStream : public ZeroCopyOutputStream {
142
+ public:
143
+ // Creates a stream that writes to the given Unix file descriptor.
144
+ // If a block_size is given, it specifies the size of the buffers
145
+ // that should be returned by Next(). Otherwise, a reasonable default
146
+ // is used.
147
+ explicit FileOutputStream(int file_descriptor, int block_size = -1);
148
+ ~FileOutputStream();
149
+
150
+ // Flushes any buffers and closes the underlying file. Returns false if
151
+ // an error occurs during the process; use GetErrno() to examine the error.
152
+ // Even if an error occurs, the file descriptor is closed when this returns.
153
+ bool Close();
154
+
155
+ // Flushes FileOutputStream's buffers but does not close the
156
+ // underlying file. No special measures are taken to ensure that
157
+ // underlying operating system file object is synchronized to disk.
158
+ bool Flush();
159
+
160
+ // By default, the file descriptor is not closed when the stream is
161
+ // destroyed. Call SetCloseOnDelete(true) to change that. WARNING:
162
+ // This leaves no way for the caller to detect if close() fails. If
163
+ // detecting close() errors is important to you, you should arrange
164
+ // to close the descriptor yourself.
165
+ void SetCloseOnDelete(bool value) { copying_output_.SetCloseOnDelete(value); }
166
+
167
+ // If an I/O error has occurred on this file descriptor, this is the
168
+ // errno from that error. Otherwise, this is zero. Once an error
169
+ // occurs, the stream is broken and all subsequent operations will
170
+ // fail.
171
+ int GetErrno() { return copying_output_.GetErrno(); }
172
+
173
+ // implements ZeroCopyOutputStream ---------------------------------
174
+ bool Next(void** data, int* size);
175
+ void BackUp(int count);
176
+ int64 ByteCount() const;
177
+
178
+ private:
179
+ class LIBPROTOBUF_EXPORT CopyingFileOutputStream : public CopyingOutputStream {
180
+ public:
181
+ CopyingFileOutputStream(int file_descriptor);
182
+ ~CopyingFileOutputStream();
183
+
184
+ bool Close();
185
+ void SetCloseOnDelete(bool value) { close_on_delete_ = value; }
186
+ int GetErrno() { return errno_; }
187
+
188
+ // implements CopyingOutputStream --------------------------------
189
+ bool Write(const void* buffer, int size);
190
+
191
+ private:
192
+ // The file descriptor.
193
+ const int file_;
194
+ bool close_on_delete_;
195
+ bool is_closed_;
196
+
197
+ // The errno of the I/O error, if one has occurred. Otherwise, zero.
198
+ int errno_;
199
+
200
+ GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingFileOutputStream);
201
+ };
202
+
203
+ CopyingFileOutputStream copying_output_;
204
+ CopyingOutputStreamAdaptor impl_;
205
+
206
+ GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileOutputStream);
207
+ };
208
+
209
+ // ===================================================================
210
+
211
+ // A ZeroCopyInputStream which reads from a C++ istream.
212
+ //
213
+ // Note that for reading files (or anything represented by a file descriptor),
214
+ // FileInputStream is more efficient.
215
+ class LIBPROTOBUF_EXPORT IstreamInputStream : public ZeroCopyInputStream {
216
+ public:
217
+ // Creates a stream that reads from the given C++ istream.
218
+ // If a block_size is given, it specifies the number of bytes that
219
+ // should be read and returned with each call to Next(). Otherwise,
220
+ // a reasonable default is used.
221
+ explicit IstreamInputStream(istream* stream, int block_size = -1);
222
+ ~IstreamInputStream();
223
+
224
+ // implements ZeroCopyInputStream ----------------------------------
225
+ bool Next(const void** data, int* size);
226
+ void BackUp(int count);
227
+ bool Skip(int count);
228
+ int64 ByteCount() const;
229
+
230
+ private:
231
+ class LIBPROTOBUF_EXPORT CopyingIstreamInputStream : public CopyingInputStream {
232
+ public:
233
+ CopyingIstreamInputStream(istream* input);
234
+ ~CopyingIstreamInputStream();
235
+
236
+ // implements CopyingInputStream ---------------------------------
237
+ int Read(void* buffer, int size);
238
+ // (We use the default implementation of Skip().)
239
+
240
+ private:
241
+ // The stream.
242
+ istream* input_;
243
+
244
+ GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingIstreamInputStream);
245
+ };
246
+
247
+ CopyingIstreamInputStream copying_input_;
248
+ CopyingInputStreamAdaptor impl_;
249
+
250
+ GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(IstreamInputStream);
251
+ };
252
+
253
+ // ===================================================================
254
+
255
+ // A ZeroCopyOutputStream which writes to a C++ ostream.
256
+ //
257
+ // Note that for writing files (or anything represented by a file descriptor),
258
+ // FileOutputStream is more efficient.
259
+ class LIBPROTOBUF_EXPORT OstreamOutputStream : public ZeroCopyOutputStream {
260
+ public:
261
+ // Creates a stream that writes to the given C++ ostream.
262
+ // If a block_size is given, it specifies the size of the buffers
263
+ // that should be returned by Next(). Otherwise, a reasonable default
264
+ // is used.
265
+ explicit OstreamOutputStream(ostream* stream, int block_size = -1);
266
+ ~OstreamOutputStream();
267
+
268
+ // implements ZeroCopyOutputStream ---------------------------------
269
+ bool Next(void** data, int* size);
270
+ void BackUp(int count);
271
+ int64 ByteCount() const;
272
+
273
+ private:
274
+ class LIBPROTOBUF_EXPORT CopyingOstreamOutputStream : public CopyingOutputStream {
275
+ public:
276
+ CopyingOstreamOutputStream(ostream* output);
277
+ ~CopyingOstreamOutputStream();
278
+
279
+ // implements CopyingOutputStream --------------------------------
280
+ bool Write(const void* buffer, int size);
281
+
282
+ private:
283
+ // The stream.
284
+ ostream* output_;
285
+
286
+ GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingOstreamOutputStream);
287
+ };
288
+
289
+ CopyingOstreamOutputStream copying_output_;
290
+ CopyingOutputStreamAdaptor impl_;
291
+
292
+ GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(OstreamOutputStream);
293
+ };
294
+
295
+ // ===================================================================
296
+
297
+ // A ZeroCopyInputStream which reads from several other streams in sequence.
298
+ // ConcatenatingInputStream is unable to distinguish between end-of-stream
299
+ // and read errors in the underlying streams, so it assumes any errors mean
300
+ // end-of-stream. So, if the underlying streams fail for any other reason,
301
+ // ConcatenatingInputStream may do odd things. It is suggested that you do
302
+ // not use ConcatenatingInputStream on streams that might produce read errors
303
+ // other than end-of-stream.
304
+ class LIBPROTOBUF_EXPORT ConcatenatingInputStream : public ZeroCopyInputStream {
305
+ public:
306
+ // All streams passed in as well as the array itself must remain valid
307
+ // until the ConcatenatingInputStream is destroyed.
308
+ ConcatenatingInputStream(ZeroCopyInputStream* const streams[], int count);
309
+ ~ConcatenatingInputStream();
310
+
311
+ // implements ZeroCopyInputStream ----------------------------------
312
+ bool Next(const void** data, int* size);
313
+ void BackUp(int count);
314
+ bool Skip(int count);
315
+ int64 ByteCount() const;
316
+
317
+
318
+ private:
319
+ // As streams are retired, streams_ is incremented and count_ is
320
+ // decremented.
321
+ ZeroCopyInputStream* const* streams_;
322
+ int stream_count_;
323
+ int64 bytes_retired_; // Bytes read from previous streams.
324
+
325
+ GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ConcatenatingInputStream);
326
+ };
327
+
328
+ // ===================================================================
329
+
330
+ // A ZeroCopyInputStream which wraps some other stream and limits it to
331
+ // a particular byte count.
332
+ class LIBPROTOBUF_EXPORT LimitingInputStream : public ZeroCopyInputStream {
333
+ public:
334
+ LimitingInputStream(ZeroCopyInputStream* input, int64 limit);
335
+ ~LimitingInputStream();
336
+
337
+ // implements ZeroCopyInputStream ----------------------------------
338
+ bool Next(const void** data, int* size);
339
+ void BackUp(int count);
340
+ bool Skip(int count);
341
+ int64 ByteCount() const;
342
+
343
+
344
+ private:
345
+ ZeroCopyInputStream* input_;
346
+ int64 limit_; // Decreases as we go, becomes negative if we overshoot.
347
+
348
+ GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(LimitingInputStream);
349
+ };
350
+
351
+ // ===================================================================
352
+
353
+ } // namespace io
354
+ } // namespace protobuf
355
+
356
+ } // namespace google
357
+ #endif // GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_H__
@@ -0,0 +1,340 @@
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
+ // This file contains common implementations of the interfaces defined in
36
+ // zero_copy_stream.h which are included in the "lite" protobuf library.
37
+ // These implementations cover I/O on raw arrays and strings, as well as
38
+ // adaptors which make it easy to implement streams based on traditional
39
+ // streams. Of course, many users will probably want to write their own
40
+ // implementations of these interfaces specific to the particular I/O
41
+ // abstractions they prefer to use, but these should cover the most common
42
+ // cases.
43
+
44
+ #ifndef GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_LITE_H__
45
+ #define GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_LITE_H__
46
+
47
+ #include <string>
48
+ #include <iosfwd>
49
+ #include <google/protobuf/io/zero_copy_stream.h>
50
+ #include <google/protobuf/stubs/common.h>
51
+
52
+
53
+ namespace google {
54
+ namespace protobuf {
55
+ namespace io {
56
+
57
+ // ===================================================================
58
+
59
+ // A ZeroCopyInputStream backed by an in-memory array of bytes.
60
+ class LIBPROTOBUF_EXPORT ArrayInputStream : public ZeroCopyInputStream {
61
+ public:
62
+ // Create an InputStream that returns the bytes pointed to by "data".
63
+ // "data" remains the property of the caller but must remain valid until
64
+ // the stream is destroyed. If a block_size is given, calls to Next()
65
+ // will return data blocks no larger than the given size. Otherwise, the
66
+ // first call to Next() returns the entire array. block_size is mainly
67
+ // useful for testing; in production you would probably never want to set
68
+ // it.
69
+ ArrayInputStream(const void* data, int size, int block_size = -1);
70
+ ~ArrayInputStream();
71
+
72
+ // implements ZeroCopyInputStream ----------------------------------
73
+ bool Next(const void** data, int* size);
74
+ void BackUp(int count);
75
+ bool Skip(int count);
76
+ int64 ByteCount() const;
77
+
78
+
79
+ private:
80
+ const uint8* const data_; // The byte array.
81
+ const int size_; // Total size of the array.
82
+ const int block_size_; // How many bytes to return at a time.
83
+
84
+ int position_;
85
+ int last_returned_size_; // How many bytes we returned last time Next()
86
+ // was called (used for error checking only).
87
+
88
+ GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ArrayInputStream);
89
+ };
90
+
91
+ // ===================================================================
92
+
93
+ // A ZeroCopyOutputStream backed by an in-memory array of bytes.
94
+ class LIBPROTOBUF_EXPORT ArrayOutputStream : public ZeroCopyOutputStream {
95
+ public:
96
+ // Create an OutputStream that writes to the bytes pointed to by "data".
97
+ // "data" remains the property of the caller but must remain valid until
98
+ // the stream is destroyed. If a block_size is given, calls to Next()
99
+ // will return data blocks no larger than the given size. Otherwise, the
100
+ // first call to Next() returns the entire array. block_size is mainly
101
+ // useful for testing; in production you would probably never want to set
102
+ // it.
103
+ ArrayOutputStream(void* data, int size, int block_size = -1);
104
+ ~ArrayOutputStream();
105
+
106
+ // implements ZeroCopyOutputStream ---------------------------------
107
+ bool Next(void** data, int* size);
108
+ void BackUp(int count);
109
+ int64 ByteCount() const;
110
+
111
+ private:
112
+ uint8* const data_; // The byte array.
113
+ const int size_; // Total size of the array.
114
+ const int block_size_; // How many bytes to return at a time.
115
+
116
+ int position_;
117
+ int last_returned_size_; // How many bytes we returned last time Next()
118
+ // was called (used for error checking only).
119
+
120
+ GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ArrayOutputStream);
121
+ };
122
+
123
+ // ===================================================================
124
+
125
+ // A ZeroCopyOutputStream which appends bytes to a string.
126
+ class LIBPROTOBUF_EXPORT StringOutputStream : public ZeroCopyOutputStream {
127
+ public:
128
+ // Create a StringOutputStream which appends bytes to the given string.
129
+ // The string remains property of the caller, but it MUST NOT be accessed
130
+ // in any way until the stream is destroyed.
131
+ //
132
+ // Hint: If you call target->reserve(n) before creating the stream,
133
+ // the first call to Next() will return at least n bytes of buffer
134
+ // space.
135
+ explicit StringOutputStream(string* target);
136
+ ~StringOutputStream();
137
+
138
+ // implements ZeroCopyOutputStream ---------------------------------
139
+ bool Next(void** data, int* size);
140
+ void BackUp(int count);
141
+ int64 ByteCount() const;
142
+
143
+ private:
144
+ static const int kMinimumSize = 16;
145
+
146
+ string* target_;
147
+
148
+ GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(StringOutputStream);
149
+ };
150
+
151
+ // Note: There is no StringInputStream. Instead, just create an
152
+ // ArrayInputStream as follows:
153
+ // ArrayInputStream input(str.data(), str.size());
154
+
155
+ // ===================================================================
156
+
157
+ // A generic traditional input stream interface.
158
+ //
159
+ // Lots of traditional input streams (e.g. file descriptors, C stdio
160
+ // streams, and C++ iostreams) expose an interface where every read
161
+ // involves copying bytes into a buffer. If you want to take such an
162
+ // interface and make a ZeroCopyInputStream based on it, simply implement
163
+ // CopyingInputStream and then use CopyingInputStreamAdaptor.
164
+ //
165
+ // CopyingInputStream implementations should avoid buffering if possible.
166
+ // CopyingInputStreamAdaptor does its own buffering and will read data
167
+ // in large blocks.
168
+ class LIBPROTOBUF_EXPORT CopyingInputStream {
169
+ public:
170
+ virtual ~CopyingInputStream();
171
+
172
+ // Reads up to "size" bytes into the given buffer. Returns the number of
173
+ // bytes read. Read() waits until at least one byte is available, or
174
+ // returns zero if no bytes will ever become available (EOF), or -1 if a
175
+ // permanent read error occurred.
176
+ virtual int Read(void* buffer, int size) = 0;
177
+
178
+ // Skips the next "count" bytes of input. Returns the number of bytes
179
+ // actually skipped. This will always be exactly equal to "count" unless
180
+ // EOF was reached or a permanent read error occurred.
181
+ //
182
+ // The default implementation just repeatedly calls Read() into a scratch
183
+ // buffer.
184
+ virtual int Skip(int count);
185
+ };
186
+
187
+ // A ZeroCopyInputStream which reads from a CopyingInputStream. This is
188
+ // useful for implementing ZeroCopyInputStreams that read from traditional
189
+ // streams. Note that this class is not really zero-copy.
190
+ //
191
+ // If you want to read from file descriptors or C++ istreams, this is
192
+ // already implemented for you: use FileInputStream or IstreamInputStream
193
+ // respectively.
194
+ class LIBPROTOBUF_EXPORT CopyingInputStreamAdaptor : public ZeroCopyInputStream {
195
+ public:
196
+ // Creates a stream that reads from the given CopyingInputStream.
197
+ // If a block_size is given, it specifies the number of bytes that
198
+ // should be read and returned with each call to Next(). Otherwise,
199
+ // a reasonable default is used. The caller retains ownership of
200
+ // copying_stream unless SetOwnsCopyingStream(true) is called.
201
+ explicit CopyingInputStreamAdaptor(CopyingInputStream* copying_stream,
202
+ int block_size = -1);
203
+ ~CopyingInputStreamAdaptor();
204
+
205
+ // Call SetOwnsCopyingStream(true) to tell the CopyingInputStreamAdaptor to
206
+ // delete the underlying CopyingInputStream when it is destroyed.
207
+ void SetOwnsCopyingStream(bool value) { owns_copying_stream_ = value; }
208
+
209
+ // implements ZeroCopyInputStream ----------------------------------
210
+ bool Next(const void** data, int* size);
211
+ void BackUp(int count);
212
+ bool Skip(int count);
213
+ int64 ByteCount() const;
214
+
215
+ private:
216
+ // Insures that buffer_ is not NULL.
217
+ void AllocateBufferIfNeeded();
218
+ // Frees the buffer and resets buffer_used_.
219
+ void FreeBuffer();
220
+
221
+ // The underlying copying stream.
222
+ CopyingInputStream* copying_stream_;
223
+ bool owns_copying_stream_;
224
+
225
+ // True if we have seen a permenant error from the underlying stream.
226
+ bool failed_;
227
+
228
+ // The current position of copying_stream_, relative to the point where
229
+ // we started reading.
230
+ int64 position_;
231
+
232
+ // Data is read into this buffer. It may be NULL if no buffer is currently
233
+ // in use. Otherwise, it points to an array of size buffer_size_.
234
+ scoped_array<uint8> buffer_;
235
+ const int buffer_size_;
236
+
237
+ // Number of valid bytes currently in the buffer (i.e. the size last
238
+ // returned by Next()). 0 <= buffer_used_ <= buffer_size_.
239
+ int buffer_used_;
240
+
241
+ // Number of bytes in the buffer which were backed up over by a call to
242
+ // BackUp(). These need to be returned again.
243
+ // 0 <= backup_bytes_ <= buffer_used_
244
+ int backup_bytes_;
245
+
246
+ GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingInputStreamAdaptor);
247
+ };
248
+
249
+ // ===================================================================
250
+
251
+ // A generic traditional output stream interface.
252
+ //
253
+ // Lots of traditional output streams (e.g. file descriptors, C stdio
254
+ // streams, and C++ iostreams) expose an interface where every write
255
+ // involves copying bytes from a buffer. If you want to take such an
256
+ // interface and make a ZeroCopyOutputStream based on it, simply implement
257
+ // CopyingOutputStream and then use CopyingOutputStreamAdaptor.
258
+ //
259
+ // CopyingOutputStream implementations should avoid buffering if possible.
260
+ // CopyingOutputStreamAdaptor does its own buffering and will write data
261
+ // in large blocks.
262
+ class LIBPROTOBUF_EXPORT CopyingOutputStream {
263
+ public:
264
+ virtual ~CopyingOutputStream();
265
+
266
+ // Writes "size" bytes from the given buffer to the output. Returns true
267
+ // if successful, false on a write error.
268
+ virtual bool Write(const void* buffer, int size) = 0;
269
+ };
270
+
271
+ // A ZeroCopyOutputStream which writes to a CopyingOutputStream. This is
272
+ // useful for implementing ZeroCopyOutputStreams that write to traditional
273
+ // streams. Note that this class is not really zero-copy.
274
+ //
275
+ // If you want to write to file descriptors or C++ ostreams, this is
276
+ // already implemented for you: use FileOutputStream or OstreamOutputStream
277
+ // respectively.
278
+ class LIBPROTOBUF_EXPORT CopyingOutputStreamAdaptor : public ZeroCopyOutputStream {
279
+ public:
280
+ // Creates a stream that writes to the given Unix file descriptor.
281
+ // If a block_size is given, it specifies the size of the buffers
282
+ // that should be returned by Next(). Otherwise, a reasonable default
283
+ // is used.
284
+ explicit CopyingOutputStreamAdaptor(CopyingOutputStream* copying_stream,
285
+ int block_size = -1);
286
+ ~CopyingOutputStreamAdaptor();
287
+
288
+ // Writes all pending data to the underlying stream. Returns false if a
289
+ // write error occurred on the underlying stream. (The underlying
290
+ // stream itself is not necessarily flushed.)
291
+ bool Flush();
292
+
293
+ // Call SetOwnsCopyingStream(true) to tell the CopyingOutputStreamAdaptor to
294
+ // delete the underlying CopyingOutputStream when it is destroyed.
295
+ void SetOwnsCopyingStream(bool value) { owns_copying_stream_ = value; }
296
+
297
+ // implements ZeroCopyOutputStream ---------------------------------
298
+ bool Next(void** data, int* size);
299
+ void BackUp(int count);
300
+ int64 ByteCount() const;
301
+
302
+ private:
303
+ // Write the current buffer, if it is present.
304
+ bool WriteBuffer();
305
+ // Insures that buffer_ is not NULL.
306
+ void AllocateBufferIfNeeded();
307
+ // Frees the buffer.
308
+ void FreeBuffer();
309
+
310
+ // The underlying copying stream.
311
+ CopyingOutputStream* copying_stream_;
312
+ bool owns_copying_stream_;
313
+
314
+ // True if we have seen a permenant error from the underlying stream.
315
+ bool failed_;
316
+
317
+ // The current position of copying_stream_, relative to the point where
318
+ // we started writing.
319
+ int64 position_;
320
+
321
+ // Data is written from this buffer. It may be NULL if no buffer is
322
+ // currently in use. Otherwise, it points to an array of size buffer_size_.
323
+ scoped_array<uint8> buffer_;
324
+ const int buffer_size_;
325
+
326
+ // Number of valid bytes currently in the buffer (i.e. the size last
327
+ // returned by Next()). When BackUp() is called, we just reduce this.
328
+ // 0 <= buffer_used_ <= buffer_size_.
329
+ int buffer_used_;
330
+
331
+ GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingOutputStreamAdaptor);
332
+ };
333
+
334
+ // ===================================================================
335
+
336
+ } // namespace io
337
+ } // namespace protobuf
338
+
339
+ } // namespace google
340
+ #endif // GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_LITE_H__