34 #ifndef GRPCXX_IMPL_RPC_SERVICE_METHOD_H
35 #define GRPCXX_IMPL_RPC_SERVICE_METHOD_H
50 class StreamContextInterface;
75 template <
class ServiceType,
class RequestType,
class ResponseType>
82 : func_(func), service_(service) {}
87 param.request, &req, param.max_message_size);
90 status = func_(service_, param.server_context, &req, &rsp);
93 GPR_ASSERT(!param.server_context->sent_initial_metadata_);
96 ops.SendInitialMetadata(param.server_context->initial_metadata_);
98 status = ops.SendMessage(rsp);
100 ops.ServerSendStatus(param.server_context->trailing_metadata_, status);
101 param.call->PerformOps(&ops);
102 param.call->cq()->Pluck(&ops);
108 ResponseType*)> func_;
110 ServiceType* service_;
114 template <
class ServiceType,
class RequestType,
class ResponseType>
115 class ClientStreamingHandler :
public MethodHandler {
120 ServiceType* service)
121 : func_(func), service_(service) {}
126 Status status = func_(service_, param.server_context, &reader, &rsp);
128 GPR_ASSERT(!param.server_context->sent_initial_metadata_);
131 ops.SendInitialMetadata(param.server_context->initial_metadata_);
133 status = ops.SendMessage(rsp);
135 ops.ServerSendStatus(param.server_context->trailing_metadata_, status);
136 param.call->PerformOps(&ops);
137 param.call->cq()->Pluck(&ops);
141 std::function<Status(ServiceType*, ServerContext*, ServerReader<RequestType>*,
142 ResponseType*)> func_;
143 ServiceType* service_;
147 template <
class ServiceType,
class RequestType,
class ResponseType>
148 class ServerStreamingHandler :
public MethodHandler {
153 ServiceType* service)
154 : func_(func), service_(service) {}
159 param.request, &req, param.max_message_size);
163 status = func_(service_, param.server_context, &req, &writer);
167 if (!param.server_context->sent_initial_metadata_) {
168 ops.SendInitialMetadata(param.server_context->initial_metadata_);
170 ops.ServerSendStatus(param.server_context->trailing_metadata_, status);
171 param.call->PerformOps(&ops);
172 param.call->cq()->Pluck(&ops);
178 ServiceType* service_;
182 template <
class ServiceType,
class RequestType,
class ResponseType>
183 class BidiStreamingHandler :
public MethodHandler {
189 ServiceType* service)
190 : func_(func), service_(service) {}
194 param.server_context);
195 Status status = func_(service_, param.server_context, &stream);
198 if (!param.server_context->sent_initial_metadata_) {
199 ops.SendInitialMetadata(param.server_context->initial_metadata_);
201 ops.ServerSendStatus(param.server_context->trailing_metadata_, status);
202 param.call->PerformOps(&ops);
203 param.call->cq()->Pluck(&ops);
209 ServiceType* service_;
218 if (!context->sent_initial_metadata_) {
219 ops->SendInitialMetadata(context->initial_metadata_);
220 context->sent_initial_metadata_ =
true;
222 ops->ServerSendStatus(context->trailing_metadata_, status);
227 FillOps(param.server_context, &ops);
228 param.call->PerformOps(&ops);
229 param.call->cq()->Pluck(&ops);
239 :
RpcMethod(name, type), handler_(handler) {}
244 std::unique_ptr<MethodHandler> handler_;
257 GPR_ASSERT(methods_.size() <= INT_MAX);
258 return (
int)methods_.size();
262 std::vector<std::unique_ptr<RpcServiceMethod>> methods_;
267 #endif // GRPCXX_IMPL_RPC_SERVICE_METHOD_H
Definition: rpc_service_method.h:55
void AddMethod(RpcServiceMethod *method)
Definition: rpc_service_method.h:252
RpcServiceMethod * GetMethod(int i)
Definition: rpc_service_method.h:254
ClientStreamingHandler(std::function< Status(ServiceType *, ServerContext *, ServerReader< RequestType > *, ResponseType *)> func, ServiceType *service)
Definition: rpc_service_method.h:117
void RunHandler(const HandlerParameter ¶m)
Definition: rpc_service_method.h:225
ServerStreamingHandler(std::function< Status(ServiceType *, ServerContext *, const RequestType *, ServerWriter< ResponseType > *)> func, ServiceType *service)
Definition: rpc_service_method.h:150
int max_message_size
Definition: rpc_service_method.h:69
static void FillOps(ServerContext *context, T *ops)
Definition: rpc_service_method.h:216
ServerContext * server_context
Definition: rpc_service_method.h:66
RpcType
Definition: rpc_method.h:45
Call * call
Definition: rpc_service_method.h:65
void RunHandler(const HandlerParameter ¶m)
Definition: rpc_service_method.h:156
#define GRPC_FINAL
Definition: config.h:71
void RunHandler(const HandlerParameter ¶m)
Definition: rpc_service_method.h:123
Definition: completion_queue.h:55
Definition: rpc_service_method.h:234
Defines how to serialize and deserialize some type.
Definition: serialization_traits.h:64
Definition: rpc_service_method.h:213
Definition: rpc_service_method.h:249
virtual void RunHandler(const HandlerParameter ¶m)=0
void RunHandler(const HandlerParameter ¶m)
Definition: rpc_service_method.h:192
Definition: completion_queue.h:61
RpcMethodHandler(std::function< Status(ServiceType *, ServerContext *, const RequestType *, ResponseType *)> func, ServiceType *service)
Definition: rpc_service_method.h:78
virtual ~MethodHandler()
Definition: rpc_service_method.h:57
Primary implementaiton of CallOpSetInterface.
Definition: call.h:501
Definition: server_context.h:89
void RunHandler(const HandlerParameter ¶m)
Definition: rpc_service_method.h:84
Definition: completion_queue.h:57
Definition: rpc_method.h:43
BidiStreamingHandler(std::function< Status(ServiceType *, ServerContext *, ServerReaderWriter< ResponseType, RequestType > *)> func, ServiceType *service)
Definition: rpc_service_method.h:185
Server-side interface for bi-directional streaming.
Definition: completion_queue.h:59
bool ok() const
Is the status OK?
Definition: status.h:67
Definition: rpc_service_method.h:58
Did it work? If it didn't, why?
Definition: status.h:45
Operation is not implemented or not supported/enabled in this service.
Definition: status_code_enum.h:130
HandlerParameter(Call *c, ServerContext *context, grpc_byte_buffer *req, int max_size)
Definition: rpc_service_method.h:59
const char * name() const
Definition: rpc_method.h:61
MethodHandler * handler()
Definition: rpc_service_method.h:241
int GetMethodCount() const
Definition: rpc_service_method.h:255
grpc_byte_buffer * request
Definition: rpc_service_method.h:68
RpcServiceMethod(const char *name, RpcMethod::RpcType type, MethodHandler *handler)
Definition: rpc_service_method.h:237