grpc
third_party
protobuf
src
google
protobuf
protobuf/src/google/protobuf/service.h
Go to the documentation of this file.
1
// Protocol Buffers - Google's data interchange format
2
// Copyright 2008 Google Inc. All rights reserved.
3
// https://developers.google.com/protocol-buffers/
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 intended 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 hypothetical "MyRpcChannel" as an example:
78
// MyRpcChannel channel("rpc:hostname:1234/myservice");
79
// MyRpcController controller;
80
// MyServiceImpl::Stub stub(&channel);
81
// FooRequest request;
82
// FooResponse 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/callback.h>
105
#include <google/protobuf/stubs/common.h>
106
107
#ifdef SWIG
108
#error "You cannot SWIG proto headers"
109
#endif
110
111
#include <google/protobuf/port_def.inc>
112
113
namespace
google
{
114
namespace
protobuf
{
115
116
// Defined in this file.
117
class
Service;
118
class
RpcController;
119
class
RpcChannel;
120
121
// Defined in other files.
122
class
Descriptor
;
// descriptor.h
123
class
ServiceDescriptor
;
// descriptor.h
124
class
MethodDescriptor
;
// descriptor.h
125
class
Message
;
// message.h
126
127
// Abstract base interface for protocol-buffer-based RPC services. Services
128
// themselves are abstract interfaces (implemented either by servers or as
129
// stubs), but they subclass this base interface. The methods of this
130
// interface can be used to call the methods of the Service without knowing
131
// its exact type at compile time (analogous to Reflection).
132
class
PROTOBUF_EXPORT Service {
133
public
:
134
inline
Service
() {}
135
virtual
~
Service
();
136
137
// When constructing a stub, you may pass STUB_OWNS_CHANNEL as the second
138
// parameter to the constructor to tell it to delete its RpcChannel when
139
// destroyed.
140
enum
ChannelOwnership
{ STUB_OWNS_CHANNEL, STUB_DOESNT_OWN_CHANNEL };
141
142
// Get the ServiceDescriptor describing this service and its methods.
143
virtual
const
ServiceDescriptor
*
GetDescriptor
() = 0;
144
145
// Call a method of the service specified by MethodDescriptor. This is
146
// normally implemented as a simple switch() that calls the standard
147
// definitions of the service's methods.
148
//
149
// Preconditions:
150
// * method->service() == GetDescriptor()
151
// * request and response are of the exact same classes as the objects
152
// returned by GetRequestPrototype(method) and
153
// GetResponsePrototype(method).
154
// * After the call has started, the request must not be modified and the
155
// response must not be accessed at all until "done" is called.
156
// * "controller" is of the correct type for the RPC implementation being
157
// used by this Service. For stubs, the "correct type" depends on the
158
// RpcChannel which the stub is using. Server-side Service
159
// implementations are expected to accept whatever type of RpcController
160
// the server-side RPC implementation uses.
161
//
162
// Postconditions:
163
// * "done" will be called when the method is complete. This may be
164
// before CallMethod() returns or it may be at some point in the future.
165
// * If the RPC succeeded, "response" contains the response returned by
166
// the server.
167
// * If the RPC failed, "response"'s contents are undefined. The
168
// RpcController can be queried to determine if an error occurred and
169
// possibly to get more information about the error.
170
virtual
void
CallMethod(
const
MethodDescriptor
*
method
,
171
RpcController
* controller,
const
Message
*
request
,
172
Message
*
response
,
Closure
*
done
) = 0;
173
174
// CallMethod() requires that the request and response passed in are of a
175
// particular subclass of Message. GetRequestPrototype() and
176
// GetResponsePrototype() get the default instances of these required types.
177
// You can then call Message::New() on these instances to construct mutable
178
// objects which you can then pass to CallMethod().
179
//
180
// Example:
181
// const MethodDescriptor* method =
182
// service->GetDescriptor()->FindMethodByName("Foo");
183
// Message* request = stub->GetRequestPrototype (method)->New();
184
// Message* response = stub->GetResponsePrototype(method)->New();
185
// request->ParseFromString(input);
186
// service->CallMethod(method, *request, response, callback);
187
virtual
const
Message
& GetRequestPrototype(
188
const
MethodDescriptor
*
method
)
const
= 0;
189
virtual
const
Message
& GetResponsePrototype(
190
const
MethodDescriptor
*
method
)
const
= 0;
191
192
private
:
193
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS
(
Service
);
194
};
195
196
// An RpcController mediates a single method call. The primary purpose of
197
// the controller is to provide a way to manipulate settings specific to the
198
// RPC implementation and to find out about RPC-level errors.
199
//
200
// The methods provided by the RpcController interface are intended to be a
201
// "least common denominator" set of features which we expect all
202
// implementations to support. Specific implementations may provide more
203
// advanced features (e.g. deadline propagation).
204
class
PROTOBUF_EXPORT RpcController {
205
public
:
206
inline
RpcController
() {}
207
virtual
~
RpcController
();
208
209
// Client-side methods ---------------------------------------------
210
// These calls may be made from the client side only. Their results
211
// are undefined on the server side (may crash).
212
213
// Resets the RpcController to its initial state so that it may be reused in
214
// a new call. Must not be called while an RPC is in progress.
215
virtual
void
Reset
() = 0;
216
217
// After a call has finished, returns true if the call failed. The possible
218
// reasons for failure depend on the RPC implementation. Failed() must not
219
// be called before a call has finished. If Failed() returns true, the
220
// contents of the response message are undefined.
221
virtual
bool
Failed()
const
= 0;
222
223
// If Failed() is true, returns a human-readable description of the error.
224
virtual
std::string
ErrorText()
const
= 0;
225
226
// Advises the RPC system that the caller desires that the RPC call be
227
// canceled. The RPC system may cancel it immediately, may wait awhile and
228
// then cancel it, or may not even cancel the call at all. If the call is
229
// canceled, the "done" callback will still be called and the RpcController
230
// will indicate that the call failed at that time.
231
virtual
void
StartCancel() = 0;
232
233
// Server-side methods ---------------------------------------------
234
// These calls may be made from the server side only. Their results
235
// are undefined on the client side (may crash).
236
237
// Causes Failed() to return true on the client side. "reason" will be
238
// incorporated into the message returned by ErrorText(). If you find
239
// you need to return machine-readable information about failures, you
240
// should incorporate it into your response protocol buffer and should
241
// NOT call SetFailed().
242
virtual
void
SetFailed(
const
std::string
& reason) = 0;
243
244
// If true, indicates that the client canceled the RPC, so the server may
245
// as well give up on replying to it. The server should still call the
246
// final "done" callback.
247
virtual
bool
IsCanceled()
const
= 0;
248
249
// Asks that the given callback be called when the RPC is canceled. The
250
// callback will always be called exactly once. If the RPC completes without
251
// being canceled, the callback will be called after completion. If the RPC
252
// has already been canceled when NotifyOnCancel() is called, the callback
253
// will be called immediately.
254
//
255
// NotifyOnCancel() must be called no more than once per request.
256
virtual
void
NotifyOnCancel(
Closure
*
callback
) = 0;
257
258
private
:
259
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS
(
RpcController
);
260
};
261
262
// Abstract interface for an RPC channel. An RpcChannel represents a
263
// communication line to a Service which can be used to call that Service's
264
// methods. The Service may be running on another machine. Normally, you
265
// should not call an RpcChannel directly, but instead construct a stub Service
266
// wrapping it. Example:
267
// RpcChannel* channel = new MyRpcChannel("remotehost.example.com:1234");
268
// MyService* service = new MyService::Stub(channel);
269
// service->MyMethod(request, &response, callback);
270
class
PROTOBUF_EXPORT RpcChannel {
271
public
:
272
inline
RpcChannel
() {}
273
virtual
~
RpcChannel
();
274
275
// Call the given method of the remote service. The signature of this
276
// procedure looks the same as Service::CallMethod(), but the requirements
277
// are less strict in one important way: the request and response objects
278
// need not be of any specific class as long as their descriptors are
279
// method->input_type() and method->output_type().
280
virtual
void
CallMethod(
const
MethodDescriptor
*
method
,
281
RpcController
* controller,
const
Message
*
request
,
282
Message
*
response
,
Closure
*
done
) = 0;
283
284
private
:
285
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS
(
RpcChannel
);
286
};
287
288
}
// namespace protobuf
289
}
// namespace google
290
291
#include <google/protobuf/port_undef.inc>
292
293
#endif // GOOGLE_PROTOBUF_SERVICE_H__
google::protobuf::Service::ChannelOwnership
ChannelOwnership
Definition:
bloaty/third_party/protobuf/src/google/protobuf/service.h:140
google::protobuf::Closure
Definition:
bloaty/third_party/protobuf/src/google/protobuf/stubs/callback.h:73
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS
#define GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TypeName)
Definition:
bloaty/third_party/protobuf/src/google/protobuf/stubs/macros.h:40
benchmark.request
request
Definition:
benchmark.py:77
testing::internal::string
::std::string string
Definition:
bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
google::protobuf
Definition:
bloaty/third_party/protobuf/benchmarks/util/data_proto2_to_proto3_util.h:12
google::protobuf::RpcController::RpcController
RpcController()
Definition:
protobuf/src/google/protobuf/service.h:206
Descriptor
Definition:
bloaty/third_party/protobuf/ruby/ext/google/protobuf_c/protobuf.h:121
google::protobuf::ServiceDescriptor
Definition:
bloaty/third_party/protobuf/src/google/protobuf/descriptor.h:1152
mox.Reset
def Reset(*args)
Definition:
bloaty/third_party/protobuf/python/mox.py:257
grpc::protobuf::MethodDescriptor
GRPC_CUSTOM_METHODDESCRIPTOR MethodDescriptor
Definition:
include/grpcpp/impl/codegen/config_protobuf.h:87
done
struct tab * done
Definition:
bloaty/third_party/zlib/examples/enough.c:176
callback
static void callback(void *arg, int status, int timeouts, struct hostent *host)
Definition:
acountry.c:224
google::protobuf::Service::Service
Service()
Definition:
protobuf/src/google/protobuf/service.h:134
google::protobuf::MethodDescriptor
Definition:
bloaty/third_party/protobuf/src/google/protobuf/descriptor.h:1234
google::protobuf::Service
Definition:
bloaty/third_party/protobuf/src/google/protobuf/service.h:132
google::protobuf::RpcChannel
Definition:
bloaty/third_party/protobuf/src/google/protobuf/service.h:270
google::protobuf::Message
Definition:
bloaty/third_party/protobuf/src/google/protobuf/message.h:205
asyncio_get_stats.response
response
Definition:
asyncio_get_stats.py:28
google::protobuf::RpcController
Definition:
bloaty/third_party/protobuf/src/google/protobuf/service.h:204
google::protobuf::RpcChannel::RpcChannel
RpcChannel()
Definition:
protobuf/src/google/protobuf/service.h:272
grpc::protobuf::ServiceDescriptor
GRPC_CUSTOM_SERVICEDESCRIPTOR ServiceDescriptor
Definition:
include/grpcpp/impl/codegen/config_protobuf.h:88
google
Definition:
bloaty/third_party/protobuf/benchmarks/util/data_proto2_to_proto3_util.h:11
google::protobuf::python::message_descriptor::GetDescriptor
static ParentDescriptor GetDescriptor(PyContainer *self)
Definition:
bloaty/third_party/protobuf/python/google/protobuf/pyext/descriptor_containers.cc:951
Message
Definition:
protobuf/php/ext/google/protobuf/message.c:53
google::protobuf::method
const Descriptor::ReservedRange const EnumValueDescriptor method
Definition:
bloaty/third_party/protobuf/src/google/protobuf/descriptor.h:1973
grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:12