// // // Copyright 2015 gRPC authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // #ifndef GRPCPP_SUPPORT_METHOD_HANDLER_H #define GRPCPP_SUPPORT_METHOD_HANDLER_H #include <grpc/byte_buffer.h> #include <grpc/support/log.h> #include <grpcpp/impl/rpc_service_method.h> #include <grpcpp/support/byte_buffer.h> #include <grpcpp/support/sync_stream.h> namespace grpc { namespace internal { // Invoke the method handler, fill in the status, and // return whether or not we finished safely (without an exception). // Note that exception handling is 0-cost in most compiler/library // implementations (except when an exception is actually thrown), // so this process doesn't require additional overhead in the common case. // Additionally, we don't need to return if we caught an exception or not; // the handling is the same in either case. template <class Callable> ::grpc::Status CatchingFunctionHandler(Callable&& handler) { … } /// A helper function with reduced templating to do the common work needed to /// actually send the server response. Uses non-const parameter for Status since /// this should only ever be called from the end of the RunHandler method. template <class ResponseType> void UnaryRunHandlerHelper(const MethodHandler::HandlerParameter& param, ResponseType* rsp, grpc::Status& status) { … } /// A helper function with reduced templating to do deserializing. template <class RequestType> void* UnaryDeserializeHelper(grpc_byte_buffer* req, grpc::Status* status, RequestType* request) { … } /// A wrapper class of an application provided rpc method handler. template <class ServiceType, class RequestType, class ResponseType, class BaseRequestType = RequestType, class BaseResponseType = ResponseType> class RpcMethodHandler : public grpc::internal::MethodHandler { … }; /// A wrapper class of an application provided client streaming handler. template <class ServiceType, class RequestType, class ResponseType> class ClientStreamingHandler : public grpc::internal::MethodHandler { … }; /// A wrapper class of an application provided server streaming handler. template <class ServiceType, class RequestType, class ResponseType> class ServerStreamingHandler : public grpc::internal::MethodHandler { … }; /// A wrapper class of an application provided bidi-streaming handler. /// This also applies to server-streamed implementation of a unary method /// with the additional requirement that such methods must have done a /// write for status to be ok /// Since this is used by more than 1 class, the service is not passed in. /// Instead, it is expected to be an implicitly-captured argument of func /// (through bind or something along those lines) template <class Streamer, bool WriteNeeded> class TemplatedBidiStreamingHandler : public grpc::internal::MethodHandler { … }; template <class ServiceType, class RequestType, class ResponseType> class BidiStreamingHandler : public TemplatedBidiStreamingHandler< ServerReaderWriter<ResponseType, RequestType>, false> { … }; template <class RequestType, class ResponseType> class StreamedUnaryHandler : public TemplatedBidiStreamingHandler< ServerUnaryStreamer<RequestType, ResponseType>, true> { … }; template <class RequestType, class ResponseType> class SplitServerStreamingHandler : public TemplatedBidiStreamingHandler< ServerSplitStreamer<RequestType, ResponseType>, false> { … }; /// General method handler class for errors that prevent real method use /// e.g., handle unknown method by returning UNIMPLEMENTED error. template <grpc::StatusCode code> class ErrorMethodHandler : public grpc::internal::MethodHandler { … }; UnknownMethodHandler; ResourceExhaustedHandler; } // namespace internal } // namespace grpc #endif // GRPCPP_SUPPORT_METHOD_HANDLER_H