grpc 0.13.0 → 0.13.1.pre1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (155) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -0
  3. data/Makefile +1114 -937
  4. data/include/grpc/census.h +71 -89
  5. data/include/grpc/compression.h +7 -7
  6. data/include/grpc/grpc.h +65 -68
  7. data/include/grpc/grpc_security.h +38 -38
  8. data/include/grpc/impl/codegen/alloc.h +7 -7
  9. data/include/grpc/impl/codegen/byte_buffer.h +13 -13
  10. data/include/grpc/impl/codegen/grpc_types.h +7 -2
  11. data/include/grpc/impl/codegen/log.h +5 -5
  12. data/include/grpc/impl/codegen/port_platform.h +14 -6
  13. data/include/grpc/impl/codegen/slice.h +15 -15
  14. data/include/grpc/impl/codegen/slice_buffer.h +17 -17
  15. data/include/grpc/impl/codegen/sync.h +26 -22
  16. data/include/grpc/impl/codegen/time.h +22 -24
  17. data/include/grpc/support/avl.h +9 -8
  18. data/include/grpc/support/cmdline.h +12 -12
  19. data/include/grpc/support/cpu.h +2 -2
  20. data/include/grpc/support/histogram.h +22 -22
  21. data/include/grpc/support/host_port.h +2 -2
  22. data/include/grpc/support/log_win32.h +1 -1
  23. data/include/grpc/support/string_util.h +2 -2
  24. data/include/grpc/support/subprocess.h +5 -5
  25. data/include/grpc/support/thd.h +9 -9
  26. data/include/grpc/support/useful.h +3 -1
  27. data/src/core/census/context.c +64 -85
  28. data/src/core/census/grpc_filter.c +2 -2
  29. data/src/core/census/mlog.c +600 -0
  30. data/src/core/census/mlog.h +95 -0
  31. data/src/core/channel/channel_args.c +67 -6
  32. data/src/core/channel/channel_args.h +7 -1
  33. data/src/core/channel/client_channel.c +26 -36
  34. data/src/core/channel/client_uchannel.c +1 -1
  35. data/src/core/channel/http_client_filter.c +2 -2
  36. data/src/core/channel/http_server_filter.c +2 -2
  37. data/src/core/channel/subchannel_call_holder.c +5 -7
  38. data/src/core/client_config/connector.c +3 -2
  39. data/src/core/client_config/connector.h +2 -2
  40. data/src/core/client_config/lb_policies/load_balancer_api.c +163 -0
  41. data/src/core/client_config/lb_policies/load_balancer_api.h +85 -0
  42. data/src/core/client_config/lb_policies/pick_first.c +10 -11
  43. data/src/core/client_config/lb_policies/round_robin.c +7 -8
  44. data/src/core/client_config/lb_policy.c +3 -3
  45. data/src/core/client_config/lb_policy.h +3 -2
  46. data/src/core/client_config/subchannel.c +51 -21
  47. data/src/core/client_config/subchannel.h +15 -6
  48. data/src/core/client_config/subchannel_index.c +261 -0
  49. data/src/core/client_config/subchannel_index.h +77 -0
  50. data/src/core/compression/{algorithm.c → compression_algorithm.c} +0 -0
  51. data/src/core/httpcli/httpcli.c +13 -11
  52. data/src/core/httpcli/httpcli.h +3 -2
  53. data/src/core/httpcli/httpcli_security_connector.c +7 -7
  54. data/src/core/iomgr/fd_posix.c +4 -2
  55. data/src/core/iomgr/iocp_windows.c +10 -6
  56. data/src/core/iomgr/iocp_windows.h +9 -2
  57. data/src/core/iomgr/iomgr.c +18 -2
  58. data/src/core/iomgr/iomgr_internal.h +5 -1
  59. data/src/core/iomgr/pollset.h +9 -10
  60. data/src/core/iomgr/pollset_multipoller_with_epoll.c +1 -0
  61. data/src/core/iomgr/pollset_multipoller_with_poll_posix.c +10 -5
  62. data/src/core/iomgr/pollset_posix.c +30 -35
  63. data/src/core/iomgr/pollset_posix.h +10 -6
  64. data/src/core/iomgr/pollset_set.h +3 -9
  65. data/src/core/iomgr/pollset_set_posix.c +23 -3
  66. data/src/core/iomgr/pollset_set_posix.h +2 -18
  67. data/src/core/iomgr/pollset_set_windows.c +3 -3
  68. data/src/core/iomgr/pollset_set_windows.h +2 -2
  69. data/src/core/iomgr/pollset_windows.c +24 -21
  70. data/src/core/iomgr/pollset_windows.h +1 -5
  71. data/src/core/iomgr/tcp_client_posix.c +7 -5
  72. data/src/core/iomgr/tcp_posix.c +4 -2
  73. data/src/core/iomgr/tcp_server_windows.c +1 -2
  74. data/src/core/iomgr/timer.c +2 -3
  75. data/src/core/iomgr/timer.h +21 -1
  76. data/src/core/iomgr/timer_heap.c +10 -12
  77. data/src/core/iomgr/udp_server.c +5 -4
  78. data/src/core/iomgr/udp_server.h +1 -0
  79. data/src/core/iomgr/workqueue_posix.c +1 -0
  80. data/src/core/iomgr/workqueue_posix.h +3 -1
  81. data/src/core/proto/grpc/lb/v0/load_balancer.pb.c +119 -0
  82. data/src/core/proto/grpc/lb/v0/load_balancer.pb.h +182 -0
  83. data/src/core/security/{base64.c → b64.c} +1 -1
  84. data/src/core/security/{base64.h → b64.h} +1 -1
  85. data/src/core/security/client_auth_filter.c +0 -1
  86. data/src/core/security/credentials.c +12 -5
  87. data/src/core/security/credentials.h +3 -3
  88. data/src/core/security/google_default_credentials.c +24 -19
  89. data/src/core/security/handshake.c +15 -7
  90. data/src/core/security/handshake.h +2 -1
  91. data/src/core/security/json_token.c +1 -1
  92. data/src/core/security/jwt_verifier.c +1 -1
  93. data/src/core/security/security_connector.c +84 -64
  94. data/src/core/security/security_connector.h +42 -22
  95. data/src/core/security/security_context.c +8 -3
  96. data/src/core/security/server_auth_filter.c +2 -2
  97. data/src/core/security/server_secure_chttp2.c +7 -7
  98. data/src/core/support/avl.c +2 -2
  99. data/src/core/support/env_linux.c +17 -0
  100. data/src/core/support/{file.c → load_file.c} +2 -2
  101. data/src/core/support/{file.h → load_file.h} +4 -12
  102. data/src/core/support/sync.c +6 -1
  103. data/src/core/support/time_posix.c +1 -1
  104. data/src/core/{iomgr/timer_internal.h → support/tmpfile.h} +17 -23
  105. data/src/core/support/{file_posix.c → tmpfile_posix.c} +2 -2
  106. data/src/core/support/{file_win32.c → tmpfile_win32.c} +2 -2
  107. data/src/core/surface/alarm.c +3 -2
  108. data/src/core/surface/call.c +102 -52
  109. data/src/core/surface/channel_create.c +1 -1
  110. data/src/core/surface/completion_queue.c +73 -41
  111. data/src/core/surface/init.c +4 -0
  112. data/src/core/surface/lame_client.c +1 -2
  113. data/src/core/surface/secure_channel_create.c +6 -7
  114. data/src/core/surface/server.c +13 -5
  115. data/src/core/surface/validate_metadata.c +1 -1
  116. data/src/core/surface/version.c +1 -1
  117. data/src/core/transport/chttp2/internal.h +22 -10
  118. data/src/core/transport/chttp2/parsing.c +3 -3
  119. data/src/core/transport/chttp2/stream_lists.c +39 -21
  120. data/src/core/transport/chttp2/writing.c +19 -28
  121. data/src/core/transport/chttp2_transport.c +80 -37
  122. data/src/core/transport/metadata.c +8 -0
  123. data/src/core/transport/static_metadata.c +17 -17
  124. data/src/core/transport/static_metadata.h +3 -3
  125. data/src/core/transport/transport.c +2 -1
  126. data/src/core/transport/transport.h +12 -5
  127. data/src/ruby/ext/grpc/extconf.rb +1 -0
  128. data/src/ruby/ext/grpc/rb_call.c +6 -0
  129. data/src/ruby/ext/grpc/rb_call_credentials.c +12 -14
  130. data/src/ruby/ext/grpc/rb_channel.c +8 -14
  131. data/src/ruby/ext/grpc/rb_channel_credentials.c +11 -12
  132. data/src/ruby/ext/grpc/rb_grpc.c +19 -18
  133. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  134. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +8 -2
  135. data/src/ruby/lib/grpc/core/time_consts.rb +2 -2
  136. data/src/ruby/lib/grpc/errors.rb +2 -2
  137. data/src/ruby/lib/grpc/generic/rpc_server.rb +58 -39
  138. data/src/ruby/lib/grpc/version.rb +1 -1
  139. data/src/ruby/pb/README.md +2 -2
  140. data/src/ruby/pb/generate_proto_ruby.sh +2 -2
  141. data/src/ruby/pb/grpc/health/checker.rb +11 -11
  142. data/src/ruby/pb/grpc/health/v1/health.rb +28 -0
  143. data/src/ruby/pb/grpc/health/{v1alpha → v1}/health_services.rb +4 -4
  144. data/src/ruby/spec/client_server_spec.rb +2 -1
  145. data/src/ruby/spec/generic/rpc_server_spec.rb +3 -22
  146. data/src/ruby/spec/pb/health/checker_spec.rb +22 -36
  147. data/third_party/nanopb/pb.h +547 -0
  148. data/third_party/nanopb/pb_common.c +97 -0
  149. data/third_party/nanopb/pb_common.h +42 -0
  150. data/third_party/nanopb/pb_decode.c +1319 -0
  151. data/third_party/nanopb/pb_decode.h +149 -0
  152. data/third_party/nanopb/pb_encode.c +690 -0
  153. data/third_party/nanopb/pb_encode.h +154 -0
  154. metadata +32 -16
  155. data/src/ruby/pb/grpc/health/v1alpha/health.rb +0 -29
@@ -29,5 +29,5 @@
29
29
 
30
30
  # GRPC contains the General RPC module.
31
31
  module GRPC
32
- VERSION = '0.13.0'
32
+ VERSION = '0.13.1.pre1'
33
33
  end
@@ -11,7 +11,7 @@ The code is is generated using the protoc (> 3.0.0.alpha.1) and the
11
11
  grpc_ruby_plugin. These must be installed to regenerate the IDL defined
12
12
  classes, but that's not necessary just to use them.
13
13
 
14
- health_check/v1alpha
14
+ health_check/v1
15
15
  --------------------
16
16
 
17
17
  This package defines the surface of a simple health check service that gRPC
@@ -20,7 +20,7 @@ re-generate the surface.
20
20
 
21
21
  ```bash
22
22
  $ # (from this directory)
23
- $ protoc -I ../../proto ../../proto/grpc/health/v1alpha/health.proto \
23
+ $ protoc -I ../../proto ../../proto/grpc/health/v1/health.proto \
24
24
  --grpc_out=. \
25
25
  --ruby_out=. \
26
26
  --plugin=protoc-gen-grpc=`which grpc_ruby_plugin`
@@ -1,5 +1,5 @@
1
1
  #!/bin/sh
2
- # Copyright 2015, Google Inc.
2
+ # Copyright 2015-2016, Google Inc.
3
3
  # All rights reserved.
4
4
  #
5
5
  # Redistribution and use in source and binary forms, with or without
@@ -35,7 +35,7 @@ cd $(dirname $0)/../../..
35
35
  PROTOC=bins/opt/protobuf/protoc
36
36
  PLUGIN=protoc-gen-grpc=bins/opt/grpc_ruby_plugin
37
37
 
38
- $PROTOC -I src/proto src/proto/grpc/health/v1alpha/health.proto \
38
+ $PROTOC -I src/proto src/proto/grpc/health/v1/health.proto \
39
39
  --grpc_out=src/ruby/pb \
40
40
  --ruby_out=src/ruby/pb \
41
41
  --plugin=$PLUGIN
@@ -1,4 +1,4 @@
1
- # Copyright 2015, Google Inc.
1
+ # Copyright 2015-2016, Google Inc.
2
2
  # All rights reserved.
3
3
  #
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -28,7 +28,7 @@
28
28
  # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
29
 
30
30
  require 'grpc'
31
- require 'grpc/health/v1alpha/health_services'
31
+ require 'grpc/health/v1/health_services'
32
32
  require 'thread'
33
33
 
34
34
  module Grpc
@@ -36,9 +36,9 @@ module Grpc
36
36
  # service.
37
37
  module Health
38
38
  # Checker is implementation of the schema-specified health checking service.
39
- class Checker < V1alpha::Health::Service
39
+ class Checker < V1::Health::Service
40
40
  StatusCodes = GRPC::Core::StatusCodes
41
- HealthCheckResponse = V1alpha::HealthCheckResponse
41
+ HealthCheckResponse = V1::HealthCheckResponse
42
42
 
43
43
  # Initializes the statuses of participating services
44
44
  def initialize
@@ -50,20 +50,20 @@ module Grpc
50
50
  def check(req, _call)
51
51
  status = nil
52
52
  @status_mutex.synchronize do
53
- status = @statuses["#{req.host}/#{req.service}"]
53
+ status = @statuses["#{req.service}"]
54
54
  end
55
55
  fail GRPC::BadStatus, StatusCodes::NOT_FOUND if status.nil?
56
56
  HealthCheckResponse.new(status: status)
57
57
  end
58
58
 
59
- # Adds the health status for a given host and service.
60
- def add_status(host, service, status)
61
- @status_mutex.synchronize { @statuses["#{host}/#{service}"] = status }
59
+ # Adds the health status for a given service.
60
+ def add_status(service, status)
61
+ @status_mutex.synchronize { @statuses["#{service}"] = status }
62
62
  end
63
63
 
64
- # Clears the status for the given host or service.
65
- def clear_status(host, service)
66
- @status_mutex.synchronize { @statuses.delete("#{host}/#{service}") }
64
+ # Clears the status for the given service.
65
+ def clear_status(service)
66
+ @status_mutex.synchronize { @statuses.delete("#{service}") }
67
67
  end
68
68
 
69
69
  # Clears alls the statuses.
@@ -0,0 +1,28 @@
1
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
2
+ # source: grpc/health/v1/health.proto
3
+
4
+ require 'google/protobuf'
5
+
6
+ Google::Protobuf::DescriptorPool.generated_pool.build do
7
+ add_message "grpc.health.v1.HealthCheckRequest" do
8
+ optional :service, :string, 1
9
+ end
10
+ add_message "grpc.health.v1.HealthCheckResponse" do
11
+ optional :status, :enum, 1, "grpc.health.v1.HealthCheckResponse.ServingStatus"
12
+ end
13
+ add_enum "grpc.health.v1.HealthCheckResponse.ServingStatus" do
14
+ value :UNKNOWN, 0
15
+ value :SERVING, 1
16
+ value :NOT_SERVING, 2
17
+ end
18
+ end
19
+
20
+ module Grpc
21
+ module Health
22
+ module V1
23
+ HealthCheckRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.health.v1.HealthCheckRequest").msgclass
24
+ HealthCheckResponse = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.health.v1.HealthCheckResponse").msgclass
25
+ HealthCheckResponse::ServingStatus = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.health.v1.HealthCheckResponse.ServingStatus").enummodule
26
+ end
27
+ end
28
+ end
@@ -1,12 +1,12 @@
1
1
  # Generated by the protocol buffer compiler. DO NOT EDIT!
2
- # Source: grpc/health/v1alpha/health.proto for package 'grpc.health.v1alpha'
2
+ # Source: grpc/health/v1/health.proto for package 'grpc.health.v1'
3
3
 
4
4
  require 'grpc'
5
- require 'grpc/health/v1alpha/health'
5
+ require 'grpc/health/v1/health'
6
6
 
7
7
  module Grpc
8
8
  module Health
9
- module V1alpha
9
+ module V1
10
10
  module Health
11
11
 
12
12
  # TODO: add proto service documentation here
@@ -16,7 +16,7 @@ module Grpc
16
16
 
17
17
  self.marshal_class_method = :encode
18
18
  self.unmarshal_class_method = :decode
19
- self.service_name = 'grpc.health.v1alpha.Health'
19
+ self.service_name = 'grpc.health.v1.Health'
20
20
 
21
21
  rpc :Check, HealthCheckRequest, HealthCheckResponse
22
22
  end
@@ -1,4 +1,4 @@
1
- # Copyright 2015, Google Inc.
1
+ # Copyright 2015-2016, Google Inc.
2
2
  # All rights reserved.
3
3
  #
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -198,6 +198,7 @@ shared_examples 'basic GRPC message delivery is OK' do
198
198
  # confirm the client can receive the server response and status.
199
199
  client_ops = {
200
200
  CallOps::SEND_CLOSE_FROM_CLIENT => nil,
201
+ CallOps::RECV_INITIAL_METADATA => nil,
201
202
  CallOps::RECV_MESSAGE => nil,
202
203
  CallOps::RECV_STATUS_ON_CLIENT => nil
203
204
  }
@@ -1,4 +1,4 @@
1
- # Copyright 2015, Google Inc.
1
+ # Copyright 2015-2016, Google Inc.
2
2
  # All rights reserved.
3
3
  #
4
4
  # Redistribution and use in source and binary forms, with or without
@@ -220,19 +220,10 @@ describe GRPC::RpcServer do
220
220
  @srv = RpcServer.new(**opts)
221
221
  end
222
222
 
223
- after(:each) do
224
- @srv.stop
225
- end
226
-
227
223
  it 'starts out false' do
228
224
  expect(@srv.stopped?).to be(false)
229
225
  end
230
226
 
231
- it 'stays false after a #stop is called before #run' do
232
- @srv.stop
233
- expect(@srv.stopped?).to be(false)
234
- end
235
-
236
227
  it 'stays false after the server starts running', server: true do
237
228
  @srv.handle(EchoService)
238
229
  t = Thread.new { @srv.run }
@@ -247,8 +238,8 @@ describe GRPC::RpcServer do
247
238
  t = Thread.new { @srv.run }
248
239
  @srv.wait_till_running
249
240
  @srv.stop
250
- expect(@srv.stopped?).to be(true)
251
241
  t.join
242
+ expect(@srv.stopped?).to be(true)
252
243
  end
253
244
  end
254
245
 
@@ -266,9 +257,7 @@ describe GRPC::RpcServer do
266
257
  server_override: @server
267
258
  }
268
259
  r = RpcServer.new(**opts)
269
- r.run
270
- expect(r.running?).to be(false)
271
- r.stop
260
+ expect { r.run }.to raise_error(RuntimeError)
272
261
  end
273
262
 
274
263
  it 'is true after run is called with a registered service' do
@@ -293,10 +282,6 @@ describe GRPC::RpcServer do
293
282
  @srv = RpcServer.new(**@opts)
294
283
  end
295
284
 
296
- after(:each) do
297
- @srv.stop
298
- end
299
-
300
285
  it 'raises if #run has already been called' do
301
286
  @srv.handle(EchoService)
302
287
  t = Thread.new { @srv.run }
@@ -528,10 +513,6 @@ describe GRPC::RpcServer do
528
513
  @srv = RpcServer.new(**server_opts)
529
514
  end
530
515
 
531
- after(:each) do
532
- @srv.stop
533
- end
534
-
535
516
  it 'should be added to BadStatus when requests fail', server: true do
536
517
  service = FailingService.new
537
518
  @srv.handle(service)
@@ -28,7 +28,7 @@
28
28
  # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
29
 
30
30
  require 'grpc'
31
- require 'grpc/health/v1alpha/health'
31
+ require 'grpc/health/v1/health'
32
32
  require 'grpc/health/checker'
33
33
  require 'open3'
34
34
  require 'tmpdir'
@@ -43,7 +43,7 @@ describe 'Health protobuf code generation' do
43
43
  skip 'protoc || grpc_ruby_plugin missing, cannot verify health code-gen'
44
44
  else
45
45
  it 'should already be loaded indirectly i.e, used by the other specs' do
46
- expect(require('grpc/health/v1alpha/health_services')).to be(false)
46
+ expect(require('grpc/health/v1/health_services')).to be(false)
47
47
  end
48
48
 
49
49
  it 'should have the same content as created by code generation' do
@@ -52,7 +52,7 @@ describe 'Health protobuf code generation' do
52
52
 
53
53
  # Get the current content
54
54
  service_path = File.join(root_dir, 'ruby', 'pb', 'grpc',
55
- 'health', 'v1alpha', 'health_services.rb')
55
+ 'health', 'v1', 'health_services.rb')
56
56
  want = nil
57
57
  File.open(service_path) { |f| want = f.read }
58
58
 
@@ -61,12 +61,12 @@ describe 'Health protobuf code generation' do
61
61
  plugin = plugin.strip
62
62
  got = nil
63
63
  Dir.mktmpdir do |tmp_dir|
64
- gen_out = File.join(tmp_dir, 'grpc', 'health', 'v1alpha',
64
+ gen_out = File.join(tmp_dir, 'grpc', 'health', 'v1',
65
65
  'health_services.rb')
66
66
  pid = spawn(
67
67
  'protoc',
68
68
  '-I.',
69
- 'grpc/health/v1alpha/health.proto',
69
+ 'grpc/health/v1/health.proto',
70
70
  "--grpc_out=#{tmp_dir}",
71
71
  "--plugin=protoc-gen-grpc=#{plugin}",
72
72
  chdir: pb_dir)
@@ -81,27 +81,17 @@ end
81
81
 
82
82
  describe Grpc::Health::Checker do
83
83
  StatusCodes = GRPC::Core::StatusCodes
84
- ServingStatus = Grpc::Health::V1alpha::HealthCheckResponse::ServingStatus
85
- HCResp = Grpc::Health::V1alpha::HealthCheckResponse
86
- HCReq = Grpc::Health::V1alpha::HealthCheckRequest
84
+ ServingStatus = Grpc::Health::V1::HealthCheckResponse::ServingStatus
85
+ HCResp = Grpc::Health::V1::HealthCheckResponse
86
+ HCReq = Grpc::Health::V1::HealthCheckRequest
87
87
  success_tests =
88
88
  [
89
89
  {
90
- desc: 'neither host or service are specified',
91
- host: '',
90
+ desc: 'the service is not specified',
92
91
  service: ''
93
92
  }, {
94
- desc: 'only the host is specified',
95
- host: 'test-fake-host',
96
- service: ''
97
- }, {
98
- desc: 'the host and service are specified',
99
- host: 'test-fake-host',
93
+ desc: 'the service is specified',
100
94
  service: 'fake-service-1'
101
- }, {
102
- desc: 'only the service is specified',
103
- host: '',
104
- service: 'fake-service-2'
105
95
  }
106
96
  ]
107
97
 
@@ -114,9 +104,8 @@ describe Grpc::Health::Checker do
114
104
  context 'method `add_status` and `check`' do
115
105
  success_tests.each do |t|
116
106
  it "should succeed when #{t[:desc]}" do
117
- subject.add_status(t[:host], t[:service], ServingStatus::NOT_SERVING)
118
- got = subject.check(HCReq.new(host: t[:host], service: t[:service]),
119
- nil)
107
+ subject.add_status(t[:service], ServingStatus::NOT_SERVING)
108
+ got = subject.check(HCReq.new(service: t[:service]), nil)
120
109
  want = HCResp.new(status: ServingStatus::NOT_SERVING)
121
110
  expect(got).to eq(want)
122
111
  end
@@ -127,7 +116,7 @@ describe Grpc::Health::Checker do
127
116
  success_tests.each do |t|
128
117
  it "should fail with NOT_FOUND when #{t[:desc]}" do
129
118
  blk = proc do
130
- subject.check(HCReq.new(host: t[:host], service: t[:service]), nil)
119
+ subject.check(HCReq.new(service: t[:service]), nil)
131
120
  end
132
121
  expected_msg = /#{StatusCodes::NOT_FOUND}/
133
122
  expect(&blk).to raise_error GRPC::BadStatus, expected_msg
@@ -138,16 +127,14 @@ describe Grpc::Health::Checker do
138
127
  context 'method `clear_status`' do
139
128
  success_tests.each do |t|
140
129
  it "should fail after clearing status when #{t[:desc]}" do
141
- subject.add_status(t[:host], t[:service], ServingStatus::NOT_SERVING)
142
- got = subject.check(HCReq.new(host: t[:host], service: t[:service]),
143
- nil)
130
+ subject.add_status(t[:service], ServingStatus::NOT_SERVING)
131
+ got = subject.check(HCReq.new(service: t[:service]), nil)
144
132
  want = HCResp.new(status: ServingStatus::NOT_SERVING)
145
133
  expect(got).to eq(want)
146
134
 
147
- subject.clear_status(t[:host], t[:service])
135
+ subject.clear_status(t[:service])
148
136
  blk = proc do
149
- subject.check(HCReq.new(host: t[:host], service: t[:service]),
150
- nil)
137
+ subject.check(HCReq.new(service: t[:service]), nil)
151
138
  end
152
139
  expected_msg = /#{StatusCodes::NOT_FOUND}/
153
140
  expect(&blk).to raise_error GRPC::BadStatus, expected_msg
@@ -158,9 +145,8 @@ describe Grpc::Health::Checker do
158
145
  context 'method `clear_all`' do
159
146
  it 'should return NOT_FOUND after being invoked' do
160
147
  success_tests.each do |t|
161
- subject.add_status(t[:host], t[:service], ServingStatus::NOT_SERVING)
162
- got = subject.check(HCReq.new(host: t[:host], service: t[:service]),
163
- nil)
148
+ subject.add_status(t[:service], ServingStatus::NOT_SERVING)
149
+ got = subject.check(HCReq.new(service: t[:service]), nil)
164
150
  want = HCResp.new(status: ServingStatus::NOT_SERVING)
165
151
  expect(got).to eq(want)
166
152
  end
@@ -169,7 +155,7 @@ describe Grpc::Health::Checker do
169
155
 
170
156
  success_tests.each do |t|
171
157
  blk = proc do
172
- subject.check(HCReq.new(host: t[:host], service: t[:service]), nil)
158
+ subject.check(HCReq.new(service: t[:service]), nil)
173
159
  end
174
160
  expected_msg = /#{StatusCodes::NOT_FOUND}/
175
161
  expect(&blk).to raise_error GRPC::BadStatus, expected_msg
@@ -203,7 +189,7 @@ describe Grpc::Health::Checker do
203
189
 
204
190
  it 'should receive the correct status', server: true do
205
191
  @srv.handle(subject)
206
- subject.add_status('', '', ServingStatus::NOT_SERVING)
192
+ subject.add_status('', ServingStatus::NOT_SERVING)
207
193
  t = Thread.new { @srv.run }
208
194
  @srv.wait_till_running
209
195
 
@@ -221,7 +207,7 @@ describe Grpc::Health::Checker do
221
207
  @srv.wait_till_running
222
208
  blk = proc do
223
209
  stub = CheckerStub.new(@host, :this_channel_is_insecure, **@client_opts)
224
- stub.check(HCReq.new(host: 'unknown', service: 'unknown'))
210
+ stub.check(HCReq.new(service: 'unknown'))
225
211
  end
226
212
  expected_msg = /#{StatusCodes::NOT_FOUND}/
227
213
  expect(&blk).to raise_error GRPC::BadStatus, expected_msg
@@ -0,0 +1,547 @@
1
+ /* Common parts of the nanopb library. Most of these are quite low-level
2
+ * stuff. For the high-level interface, see pb_encode.h and pb_decode.h.
3
+ */
4
+
5
+ #ifndef PB_H_INCLUDED
6
+ #define PB_H_INCLUDED
7
+
8
+ /*****************************************************************
9
+ * Nanopb compilation time options. You can change these here by *
10
+ * uncommenting the lines, or on the compiler command line. *
11
+ *****************************************************************/
12
+
13
+ /* Enable support for dynamically allocated fields */
14
+ /* #define PB_ENABLE_MALLOC 1 */
15
+
16
+ /* Define this if your CPU architecture is big endian, i.e. it
17
+ * stores the most-significant byte first. */
18
+ /* #define __BIG_ENDIAN__ 1 */
19
+
20
+ /* Define this if your CPU / compiler combination does not support
21
+ * unaligned memory access to packed structures. */
22
+ /* #define PB_NO_PACKED_STRUCTS 1 */
23
+
24
+ /* Increase the number of required fields that are tracked.
25
+ * A compiler warning will tell if you need this. */
26
+ /* #define PB_MAX_REQUIRED_FIELDS 256 */
27
+
28
+ /* Add support for tag numbers > 255 and fields larger than 255 bytes. */
29
+ /* #define PB_FIELD_16BIT 1 */
30
+
31
+ /* Add support for tag numbers > 65536 and fields larger than 65536 bytes. */
32
+ /* #define PB_FIELD_32BIT 1 */
33
+
34
+ /* Disable support for error messages in order to save some code space. */
35
+ /* #define PB_NO_ERRMSG 1 */
36
+
37
+ /* Disable support for custom streams (support only memory buffers). */
38
+ /* #define PB_BUFFER_ONLY 1 */
39
+
40
+ /* Switch back to the old-style callback function signature.
41
+ * This was the default until nanopb-0.2.1. */
42
+ /* #define PB_OLD_CALLBACK_STYLE */
43
+
44
+
45
+ /******************************************************************
46
+ * You usually don't need to change anything below this line. *
47
+ * Feel free to look around and use the defined macros, though. *
48
+ ******************************************************************/
49
+
50
+
51
+ /* Version of the nanopb library. Just in case you want to check it in
52
+ * your own program. */
53
+ #define NANOPB_VERSION nanopb-0.3.5-dev
54
+
55
+ /* Include all the system headers needed by nanopb. You will need the
56
+ * definitions of the following:
57
+ * - strlen, memcpy, memset functions
58
+ * - [u]int8_t, [u]int16_t, [u]int32_t, [u]int64_t
59
+ * - size_t
60
+ * - bool
61
+ *
62
+ * If you don't have the standard header files, you can instead provide
63
+ * a custom header that defines or includes all this. In that case,
64
+ * define PB_SYSTEM_HEADER to the path of this file.
65
+ */
66
+ #ifdef PB_SYSTEM_HEADER
67
+ #include PB_SYSTEM_HEADER
68
+ #else
69
+ #include <stdint.h>
70
+ #include <stddef.h>
71
+ #include <stdbool.h>
72
+ #include <string.h>
73
+
74
+ #ifdef PB_ENABLE_MALLOC
75
+ #include <stdlib.h>
76
+ #endif
77
+ #endif
78
+
79
+ /* Macro for defining packed structures (compiler dependent).
80
+ * This just reduces memory requirements, but is not required.
81
+ */
82
+ #if defined(PB_NO_PACKED_STRUCTS)
83
+ /* Disable struct packing */
84
+ # define PB_PACKED_STRUCT_START
85
+ # define PB_PACKED_STRUCT_END
86
+ # define pb_packed
87
+ #elif defined(__GNUC__) || defined(__clang__)
88
+ /* For GCC and clang */
89
+ # define PB_PACKED_STRUCT_START
90
+ # define PB_PACKED_STRUCT_END
91
+ # define pb_packed __attribute__((packed))
92
+ #elif defined(__ICCARM__) || defined(__CC_ARM)
93
+ /* For IAR ARM and Keil MDK-ARM compilers */
94
+ # define PB_PACKED_STRUCT_START _Pragma("pack(push, 1)")
95
+ # define PB_PACKED_STRUCT_END _Pragma("pack(pop)")
96
+ # define pb_packed
97
+ #elif defined(_MSC_VER) && (_MSC_VER >= 1500)
98
+ /* For Microsoft Visual C++ */
99
+ # define PB_PACKED_STRUCT_START __pragma(pack(push, 1))
100
+ # define PB_PACKED_STRUCT_END __pragma(pack(pop))
101
+ # define pb_packed
102
+ #else
103
+ /* Unknown compiler */
104
+ # define PB_PACKED_STRUCT_START
105
+ # define PB_PACKED_STRUCT_END
106
+ # define pb_packed
107
+ #endif
108
+
109
+ /* Handly macro for suppressing unreferenced-parameter compiler warnings. */
110
+ #ifndef PB_UNUSED
111
+ #define PB_UNUSED(x) (void)(x)
112
+ #endif
113
+
114
+ /* Compile-time assertion, used for checking compatible compilation options.
115
+ * If this does not work properly on your compiler, use
116
+ * #define PB_NO_STATIC_ASSERT to disable it.
117
+ *
118
+ * But before doing that, check carefully the error message / place where it
119
+ * comes from to see if the error has a real cause. Unfortunately the error
120
+ * message is not always very clear to read, but you can see the reason better
121
+ * in the place where the PB_STATIC_ASSERT macro was called.
122
+ */
123
+ #ifndef PB_NO_STATIC_ASSERT
124
+ #ifndef PB_STATIC_ASSERT
125
+ #define PB_STATIC_ASSERT(COND,MSG) typedef char PB_STATIC_ASSERT_MSG(MSG, __LINE__, __COUNTER__)[(COND)?1:-1];
126
+ #define PB_STATIC_ASSERT_MSG(MSG, LINE, COUNTER) PB_STATIC_ASSERT_MSG_(MSG, LINE, COUNTER)
127
+ #define PB_STATIC_ASSERT_MSG_(MSG, LINE, COUNTER) pb_static_assertion_##MSG##LINE##COUNTER
128
+ #endif
129
+ #else
130
+ #define PB_STATIC_ASSERT(COND,MSG)
131
+ #endif
132
+
133
+ /* Number of required fields to keep track of. */
134
+ #ifndef PB_MAX_REQUIRED_FIELDS
135
+ #define PB_MAX_REQUIRED_FIELDS 64
136
+ #endif
137
+
138
+ #if PB_MAX_REQUIRED_FIELDS < 64
139
+ #error You should not lower PB_MAX_REQUIRED_FIELDS from the default value (64).
140
+ #endif
141
+
142
+ /* List of possible field types. These are used in the autogenerated code.
143
+ * Least-significant 4 bits tell the scalar type
144
+ * Most-significant 4 bits specify repeated/required/packed etc.
145
+ */
146
+
147
+ typedef uint8_t pb_type_t;
148
+
149
+ /**** Field data types ****/
150
+
151
+ /* Numeric types */
152
+ #define PB_LTYPE_VARINT 0x00 /* int32, int64, enum, bool */
153
+ #define PB_LTYPE_UVARINT 0x01 /* uint32, uint64 */
154
+ #define PB_LTYPE_SVARINT 0x02 /* sint32, sint64 */
155
+ #define PB_LTYPE_FIXED32 0x03 /* fixed32, sfixed32, float */
156
+ #define PB_LTYPE_FIXED64 0x04 /* fixed64, sfixed64, double */
157
+
158
+ /* Marker for last packable field type. */
159
+ #define PB_LTYPE_LAST_PACKABLE 0x04
160
+
161
+ /* Byte array with pre-allocated buffer.
162
+ * data_size is the length of the allocated PB_BYTES_ARRAY structure. */
163
+ #define PB_LTYPE_BYTES 0x05
164
+
165
+ /* String with pre-allocated buffer.
166
+ * data_size is the maximum length. */
167
+ #define PB_LTYPE_STRING 0x06
168
+
169
+ /* Submessage
170
+ * submsg_fields is pointer to field descriptions */
171
+ #define PB_LTYPE_SUBMESSAGE 0x07
172
+
173
+ /* Extension pseudo-field
174
+ * The field contains a pointer to pb_extension_t */
175
+ #define PB_LTYPE_EXTENSION 0x08
176
+
177
+ /* Number of declared LTYPES */
178
+ #define PB_LTYPES_COUNT 9
179
+ #define PB_LTYPE_MASK 0x0F
180
+
181
+ /**** Field repetition rules ****/
182
+
183
+ #define PB_HTYPE_REQUIRED 0x00
184
+ #define PB_HTYPE_OPTIONAL 0x10
185
+ #define PB_HTYPE_REPEATED 0x20
186
+ #define PB_HTYPE_ONEOF 0x30
187
+ #define PB_HTYPE_MASK 0x30
188
+
189
+ /**** Field allocation types ****/
190
+
191
+ #define PB_ATYPE_STATIC 0x00
192
+ #define PB_ATYPE_POINTER 0x80
193
+ #define PB_ATYPE_CALLBACK 0x40
194
+ #define PB_ATYPE_MASK 0xC0
195
+
196
+ #define PB_ATYPE(x) ((x) & PB_ATYPE_MASK)
197
+ #define PB_HTYPE(x) ((x) & PB_HTYPE_MASK)
198
+ #define PB_LTYPE(x) ((x) & PB_LTYPE_MASK)
199
+
200
+ /* Data type used for storing sizes of struct fields
201
+ * and array counts.
202
+ */
203
+ #if defined(PB_FIELD_32BIT)
204
+ #define PB_SIZE_MAX ((uint32_t)-1)
205
+ typedef uint32_t pb_size_t;
206
+ typedef int32_t pb_ssize_t;
207
+ #elif defined(PB_FIELD_16BIT)
208
+ #define PB_SIZE_MAX ((uint16_t)-1)
209
+ typedef uint16_t pb_size_t;
210
+ typedef int16_t pb_ssize_t;
211
+ #else
212
+ #define PB_SIZE_MAX ((uint8_t)-1)
213
+ typedef uint8_t pb_size_t;
214
+ typedef int8_t pb_ssize_t;
215
+ #endif
216
+
217
+ /* This structure is used in auto-generated constants
218
+ * to specify struct fields.
219
+ * You can change field sizes if you need structures
220
+ * larger than 256 bytes or field tags larger than 256.
221
+ * The compiler should complain if your .proto has such
222
+ * structures. Fix that by defining PB_FIELD_16BIT or
223
+ * PB_FIELD_32BIT.
224
+ */
225
+ PB_PACKED_STRUCT_START
226
+ typedef struct pb_field_s pb_field_t;
227
+ struct pb_field_s {
228
+ pb_size_t tag;
229
+ pb_type_t type;
230
+ pb_size_t data_offset; /* Offset of field data, relative to previous field. */
231
+ pb_ssize_t size_offset; /* Offset of array size or has-boolean, relative to data */
232
+ pb_size_t data_size; /* Data size in bytes for a single item */
233
+ pb_size_t array_size; /* Maximum number of entries in array */
234
+
235
+ /* Field definitions for submessage
236
+ * OR default value for all other non-array, non-callback types
237
+ * If null, then field will zeroed. */
238
+ const void *ptr;
239
+ } pb_packed;
240
+ PB_PACKED_STRUCT_END
241
+
242
+ /* Make sure that the standard integer types are of the expected sizes.
243
+ * All kinds of things may break otherwise.. atleast all fixed* types.
244
+ *
245
+ * If you get errors here, it probably means that your stdint.h is not
246
+ * correct for your platform.
247
+ */
248
+ PB_STATIC_ASSERT(sizeof(int8_t) == 1, INT8_T_WRONG_SIZE)
249
+ PB_STATIC_ASSERT(sizeof(uint8_t) == 1, UINT8_T_WRONG_SIZE)
250
+ PB_STATIC_ASSERT(sizeof(int16_t) == 2, INT16_T_WRONG_SIZE)
251
+ PB_STATIC_ASSERT(sizeof(uint16_t) == 2, UINT16_T_WRONG_SIZE)
252
+ PB_STATIC_ASSERT(sizeof(int32_t) == 4, INT32_T_WRONG_SIZE)
253
+ PB_STATIC_ASSERT(sizeof(uint32_t) == 4, UINT32_T_WRONG_SIZE)
254
+ PB_STATIC_ASSERT(sizeof(int64_t) == 8, INT64_T_WRONG_SIZE)
255
+ PB_STATIC_ASSERT(sizeof(uint64_t) == 8, UINT64_T_WRONG_SIZE)
256
+
257
+ /* This structure is used for 'bytes' arrays.
258
+ * It has the number of bytes in the beginning, and after that an array.
259
+ * Note that actual structs used will have a different length of bytes array.
260
+ */
261
+ #define PB_BYTES_ARRAY_T(n) struct { pb_size_t size; uint8_t bytes[n]; }
262
+ #define PB_BYTES_ARRAY_T_ALLOCSIZE(n) ((size_t)n + offsetof(pb_bytes_array_t, bytes))
263
+
264
+ struct pb_bytes_array_s {
265
+ pb_size_t size;
266
+ uint8_t bytes[1];
267
+ };
268
+ typedef struct pb_bytes_array_s pb_bytes_array_t;
269
+
270
+ /* This structure is used for giving the callback function.
271
+ * It is stored in the message structure and filled in by the method that
272
+ * calls pb_decode.
273
+ *
274
+ * The decoding callback will be given a limited-length stream
275
+ * If the wire type was string, the length is the length of the string.
276
+ * If the wire type was a varint/fixed32/fixed64, the length is the length
277
+ * of the actual value.
278
+ * The function may be called multiple times (especially for repeated types,
279
+ * but also otherwise if the message happens to contain the field multiple
280
+ * times.)
281
+ *
282
+ * The encoding callback will receive the actual output stream.
283
+ * It should write all the data in one call, including the field tag and
284
+ * wire type. It can write multiple fields.
285
+ *
286
+ * The callback can be null if you want to skip a field.
287
+ */
288
+ typedef struct pb_istream_s pb_istream_t;
289
+ typedef struct pb_ostream_s pb_ostream_t;
290
+ typedef struct pb_callback_s pb_callback_t;
291
+ struct pb_callback_s {
292
+ #ifdef PB_OLD_CALLBACK_STYLE
293
+ /* Deprecated since nanopb-0.2.1 */
294
+ union {
295
+ bool (*decode)(pb_istream_t *stream, const pb_field_t *field, void *arg);
296
+ bool (*encode)(pb_ostream_t *stream, const pb_field_t *field, const void *arg);
297
+ } funcs;
298
+ #else
299
+ /* New function signature, which allows modifying arg contents in callback. */
300
+ union {
301
+ bool (*decode)(pb_istream_t *stream, const pb_field_t *field, void **arg);
302
+ bool (*encode)(pb_ostream_t *stream, const pb_field_t *field, void * const *arg);
303
+ } funcs;
304
+ #endif
305
+
306
+ /* Free arg for use by callback */
307
+ void *arg;
308
+ };
309
+
310
+ /* Wire types. Library user needs these only in encoder callbacks. */
311
+ typedef enum {
312
+ PB_WT_VARINT = 0,
313
+ PB_WT_64BIT = 1,
314
+ PB_WT_STRING = 2,
315
+ PB_WT_32BIT = 5
316
+ } pb_wire_type_t;
317
+
318
+ /* Structure for defining the handling of unknown/extension fields.
319
+ * Usually the pb_extension_type_t structure is automatically generated,
320
+ * while the pb_extension_t structure is created by the user. However,
321
+ * if you want to catch all unknown fields, you can also create a custom
322
+ * pb_extension_type_t with your own callback.
323
+ */
324
+ typedef struct pb_extension_type_s pb_extension_type_t;
325
+ typedef struct pb_extension_s pb_extension_t;
326
+ struct pb_extension_type_s {
327
+ /* Called for each unknown field in the message.
328
+ * If you handle the field, read off all of its data and return true.
329
+ * If you do not handle the field, do not read anything and return true.
330
+ * If you run into an error, return false.
331
+ * Set to NULL for default handler.
332
+ */
333
+ bool (*decode)(pb_istream_t *stream, pb_extension_t *extension,
334
+ uint32_t tag, pb_wire_type_t wire_type);
335
+
336
+ /* Called once after all regular fields have been encoded.
337
+ * If you have something to write, do so and return true.
338
+ * If you do not have anything to write, just return true.
339
+ * If you run into an error, return false.
340
+ * Set to NULL for default handler.
341
+ */
342
+ bool (*encode)(pb_ostream_t *stream, const pb_extension_t *extension);
343
+
344
+ /* Free field for use by the callback. */
345
+ const void *arg;
346
+ };
347
+
348
+ struct pb_extension_s {
349
+ /* Type describing the extension field. Usually you'll initialize
350
+ * this to a pointer to the automatically generated structure. */
351
+ const pb_extension_type_t *type;
352
+
353
+ /* Destination for the decoded data. This must match the datatype
354
+ * of the extension field. */
355
+ void *dest;
356
+
357
+ /* Pointer to the next extension handler, or NULL.
358
+ * If this extension does not match a field, the next handler is
359
+ * automatically called. */
360
+ pb_extension_t *next;
361
+
362
+ /* The decoder sets this to true if the extension was found.
363
+ * Ignored for encoding. */
364
+ bool found;
365
+ };
366
+
367
+ /* Memory allocation functions to use. You can define pb_realloc and
368
+ * pb_free to custom functions if you want. */
369
+ #ifdef PB_ENABLE_MALLOC
370
+ # ifndef pb_realloc
371
+ # define pb_realloc(ptr, size) realloc(ptr, size)
372
+ # endif
373
+ # ifndef pb_free
374
+ # define pb_free(ptr) free(ptr)
375
+ # endif
376
+ #endif
377
+
378
+ /* This is used to inform about need to regenerate .pb.h/.pb.c files. */
379
+ #define PB_PROTO_HEADER_VERSION 30
380
+
381
+ /* These macros are used to declare pb_field_t's in the constant array. */
382
+ /* Size of a structure member, in bytes. */
383
+ #define pb_membersize(st, m) (sizeof ((st*)0)->m)
384
+ /* Number of entries in an array. */
385
+ #define pb_arraysize(st, m) (pb_membersize(st, m) / pb_membersize(st, m[0]))
386
+ /* Delta from start of one member to the start of another member. */
387
+ #define pb_delta(st, m1, m2) ((int)offsetof(st, m1) - (int)offsetof(st, m2))
388
+ /* Marks the end of the field list */
389
+ #define PB_LAST_FIELD {0,(pb_type_t) 0,0,0,0,0,0}
390
+
391
+ /* Macros for filling in the data_offset field */
392
+ /* data_offset for first field in a message */
393
+ #define PB_DATAOFFSET_FIRST(st, m1, m2) (offsetof(st, m1))
394
+ /* data_offset for subsequent fields */
395
+ #define PB_DATAOFFSET_OTHER(st, m1, m2) (offsetof(st, m1) - offsetof(st, m2) - pb_membersize(st, m2))
396
+ /* Choose first/other based on m1 == m2 (deprecated, remains for backwards compatibility) */
397
+ #define PB_DATAOFFSET_CHOOSE(st, m1, m2) (int)(offsetof(st, m1) == offsetof(st, m2) \
398
+ ? PB_DATAOFFSET_FIRST(st, m1, m2) \
399
+ : PB_DATAOFFSET_OTHER(st, m1, m2))
400
+
401
+ /* Required fields are the simplest. They just have delta (padding) from
402
+ * previous field end, and the size of the field. Pointer is used for
403
+ * submessages and default values.
404
+ */
405
+ #define PB_REQUIRED_STATIC(tag, st, m, fd, ltype, ptr) \
406
+ {tag, PB_ATYPE_STATIC | PB_HTYPE_REQUIRED | ltype, \
407
+ fd, 0, pb_membersize(st, m), 0, ptr}
408
+
409
+ /* Optional fields add the delta to the has_ variable. */
410
+ #define PB_OPTIONAL_STATIC(tag, st, m, fd, ltype, ptr) \
411
+ {tag, PB_ATYPE_STATIC | PB_HTYPE_OPTIONAL | ltype, \
412
+ fd, \
413
+ pb_delta(st, has_ ## m, m), \
414
+ pb_membersize(st, m), 0, ptr}
415
+
416
+ /* Repeated fields have a _count field and also the maximum number of entries. */
417
+ #define PB_REPEATED_STATIC(tag, st, m, fd, ltype, ptr) \
418
+ {tag, PB_ATYPE_STATIC | PB_HTYPE_REPEATED | ltype, \
419
+ fd, \
420
+ pb_delta(st, m ## _count, m), \
421
+ pb_membersize(st, m[0]), \
422
+ pb_arraysize(st, m), ptr}
423
+
424
+ /* Allocated fields carry the size of the actual data, not the pointer */
425
+ #define PB_REQUIRED_POINTER(tag, st, m, fd, ltype, ptr) \
426
+ {tag, PB_ATYPE_POINTER | PB_HTYPE_REQUIRED | ltype, \
427
+ fd, 0, pb_membersize(st, m[0]), 0, ptr}
428
+
429
+ /* Optional fields don't need a has_ variable, as information would be redundant */
430
+ #define PB_OPTIONAL_POINTER(tag, st, m, fd, ltype, ptr) \
431
+ {tag, PB_ATYPE_POINTER | PB_HTYPE_OPTIONAL | ltype, \
432
+ fd, 0, pb_membersize(st, m[0]), 0, ptr}
433
+
434
+ /* Repeated fields have a _count field and a pointer to array of pointers */
435
+ #define PB_REPEATED_POINTER(tag, st, m, fd, ltype, ptr) \
436
+ {tag, PB_ATYPE_POINTER | PB_HTYPE_REPEATED | ltype, \
437
+ fd, pb_delta(st, m ## _count, m), \
438
+ pb_membersize(st, m[0]), 0, ptr}
439
+
440
+ /* Callbacks are much like required fields except with special datatype. */
441
+ #define PB_REQUIRED_CALLBACK(tag, st, m, fd, ltype, ptr) \
442
+ {tag, PB_ATYPE_CALLBACK | PB_HTYPE_REQUIRED | ltype, \
443
+ fd, 0, pb_membersize(st, m), 0, ptr}
444
+
445
+ #define PB_OPTIONAL_CALLBACK(tag, st, m, fd, ltype, ptr) \
446
+ {tag, PB_ATYPE_CALLBACK | PB_HTYPE_OPTIONAL | ltype, \
447
+ fd, 0, pb_membersize(st, m), 0, ptr}
448
+
449
+ #define PB_REPEATED_CALLBACK(tag, st, m, fd, ltype, ptr) \
450
+ {tag, PB_ATYPE_CALLBACK | PB_HTYPE_REPEATED | ltype, \
451
+ fd, 0, pb_membersize(st, m), 0, ptr}
452
+
453
+ /* Optional extensions don't have the has_ field, as that would be redundant. */
454
+ #define PB_OPTEXT_STATIC(tag, st, m, fd, ltype, ptr) \
455
+ {tag, PB_ATYPE_STATIC | PB_HTYPE_OPTIONAL | ltype, \
456
+ 0, \
457
+ 0, \
458
+ pb_membersize(st, m), 0, ptr}
459
+
460
+ #define PB_OPTEXT_POINTER(tag, st, m, fd, ltype, ptr) \
461
+ PB_OPTIONAL_POINTER(tag, st, m, fd, ltype, ptr)
462
+
463
+ #define PB_OPTEXT_CALLBACK(tag, st, m, fd, ltype, ptr) \
464
+ PB_OPTIONAL_CALLBACK(tag, st, m, fd, ltype, ptr)
465
+
466
+ /* The mapping from protobuf types to LTYPEs is done using these macros. */
467
+ #define PB_LTYPE_MAP_BOOL PB_LTYPE_VARINT
468
+ #define PB_LTYPE_MAP_BYTES PB_LTYPE_BYTES
469
+ #define PB_LTYPE_MAP_DOUBLE PB_LTYPE_FIXED64
470
+ #define PB_LTYPE_MAP_ENUM PB_LTYPE_VARINT
471
+ #define PB_LTYPE_MAP_UENUM PB_LTYPE_UVARINT
472
+ #define PB_LTYPE_MAP_FIXED32 PB_LTYPE_FIXED32
473
+ #define PB_LTYPE_MAP_FIXED64 PB_LTYPE_FIXED64
474
+ #define PB_LTYPE_MAP_FLOAT PB_LTYPE_FIXED32
475
+ #define PB_LTYPE_MAP_INT32 PB_LTYPE_VARINT
476
+ #define PB_LTYPE_MAP_INT64 PB_LTYPE_VARINT
477
+ #define PB_LTYPE_MAP_MESSAGE PB_LTYPE_SUBMESSAGE
478
+ #define PB_LTYPE_MAP_SFIXED32 PB_LTYPE_FIXED32
479
+ #define PB_LTYPE_MAP_SFIXED64 PB_LTYPE_FIXED64
480
+ #define PB_LTYPE_MAP_SINT32 PB_LTYPE_SVARINT
481
+ #define PB_LTYPE_MAP_SINT64 PB_LTYPE_SVARINT
482
+ #define PB_LTYPE_MAP_STRING PB_LTYPE_STRING
483
+ #define PB_LTYPE_MAP_UINT32 PB_LTYPE_UVARINT
484
+ #define PB_LTYPE_MAP_UINT64 PB_LTYPE_UVARINT
485
+ #define PB_LTYPE_MAP_EXTENSION PB_LTYPE_EXTENSION
486
+
487
+ /* This is the actual macro used in field descriptions.
488
+ * It takes these arguments:
489
+ * - Field tag number
490
+ * - Field type: BOOL, BYTES, DOUBLE, ENUM, UENUM, FIXED32, FIXED64,
491
+ * FLOAT, INT32, INT64, MESSAGE, SFIXED32, SFIXED64
492
+ * SINT32, SINT64, STRING, UINT32, UINT64 or EXTENSION
493
+ * - Field rules: REQUIRED, OPTIONAL or REPEATED
494
+ * - Allocation: STATIC or CALLBACK
495
+ * - Placement: FIRST or OTHER, depending on if this is the first field in structure.
496
+ * - Message name
497
+ * - Field name
498
+ * - Previous field name (or field name again for first field)
499
+ * - Pointer to default value or submsg fields.
500
+ */
501
+
502
+ #define PB_FIELD(tag, type, rules, allocation, placement, message, field, prevfield, ptr) \
503
+ PB_ ## rules ## _ ## allocation(tag, message, field, \
504
+ PB_DATAOFFSET_ ## placement(message, field, prevfield), \
505
+ PB_LTYPE_MAP_ ## type, ptr)
506
+
507
+ /* Field description for oneof fields. This requires taking into account the
508
+ * union name also, that's why a separate set of macros is needed.
509
+ */
510
+ #define PB_ONEOF_STATIC(u, tag, st, m, fd, ltype, ptr) \
511
+ {tag, PB_ATYPE_STATIC | PB_HTYPE_ONEOF | ltype, \
512
+ fd, pb_delta(st, which_ ## u, u.m), \
513
+ pb_membersize(st, u.m), 0, ptr}
514
+
515
+ #define PB_ONEOF_POINTER(u, tag, st, m, fd, ltype, ptr) \
516
+ {tag, PB_ATYPE_POINTER | PB_HTYPE_ONEOF | ltype, \
517
+ fd, pb_delta(st, which_ ## u, u.m), \
518
+ pb_membersize(st, u.m[0]), 0, ptr}
519
+
520
+ #define PB_ONEOF_FIELD(union_name, tag, type, rules, allocation, placement, message, field, prevfield, ptr) \
521
+ PB_ ## rules ## _ ## allocation(union_name, tag, message, field, \
522
+ PB_DATAOFFSET_ ## placement(message, union_name.field, prevfield), \
523
+ PB_LTYPE_MAP_ ## type, ptr)
524
+
525
+ /* These macros are used for giving out error messages.
526
+ * They are mostly a debugging aid; the main error information
527
+ * is the true/false return value from functions.
528
+ * Some code space can be saved by disabling the error
529
+ * messages if not used.
530
+ *
531
+ * PB_SET_ERROR() sets the error message if none has been set yet.
532
+ * msg must be a constant string literal.
533
+ * PB_GET_ERROR() always returns a pointer to a string.
534
+ * PB_RETURN_ERROR() sets the error and returns false from current
535
+ * function.
536
+ */
537
+ #ifdef PB_NO_ERRMSG
538
+ #define PB_SET_ERROR(stream, msg) PB_UNUSED(stream)
539
+ #define PB_GET_ERROR(stream) "(errmsg disabled)"
540
+ #else
541
+ #define PB_SET_ERROR(stream, msg) (stream->errmsg = (stream)->errmsg ? (stream)->errmsg : (msg))
542
+ #define PB_GET_ERROR(stream) ((stream)->errmsg ? (stream)->errmsg : "(none)")
543
+ #endif
544
+
545
+ #define PB_RETURN_ERROR(stream, msg) return PB_SET_ERROR(stream, msg), false
546
+
547
+ #endif