// // // Copyright 2018 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_SERVER_CALLBACK_H #define GRPCPP_SUPPORT_SERVER_CALLBACK_H #include <atomic> #include <functional> #include <type_traits> #include <grpcpp/impl/call.h> #include <grpcpp/impl/call_op_set.h> #include <grpcpp/impl/sync.h> #include <grpcpp/support/callback_common.h> #include <grpcpp/support/config.h> #include <grpcpp/support/message_allocator.h> #include <grpcpp/support/status.h> namespace grpc { // Declare base class of all reactors as internal namespace internal { // Forward declarations template <class Request, class Response> class CallbackUnaryHandler; template <class Request, class Response> class CallbackClientStreamingHandler; template <class Request, class Response> class CallbackServerStreamingHandler; template <class Request, class Response> class CallbackBidiHandler; class ServerReactor { … }; /// The base class of ServerCallbackUnary etc. class ServerCallbackCall { … }; template <class Request, class Response> class DefaultMessageHolder : public MessageHolder<Request, Response> { … }; } // namespace internal // Forward declarations class ServerUnaryReactor; template <class Request> class ServerReadReactor; template <class Response> class ServerWriteReactor; template <class Request, class Response> class ServerBidiReactor; // NOTE: The actual call/stream object classes are provided as API only to // support mocking. There are no implementations of these class interfaces in // the API. class ServerCallbackUnary : public internal::ServerCallbackCall { … }; template <class Request> class ServerCallbackReader : public internal::ServerCallbackCall { … }; template <class Response> class ServerCallbackWriter : public internal::ServerCallbackCall { … }; template <class Request, class Response> class ServerCallbackReaderWriter : public internal::ServerCallbackCall { … }; // The following classes are the reactor interfaces that are to be implemented // by the user, returned as the output parameter of the method handler for a // callback method. Note that none of the classes are pure; all reactions have a // default empty reaction so that the user class only needs to override those // reactions that it cares about. The reaction methods will be invoked by the // library in response to the completion of various operations. Reactions must // not include blocking operations (such as blocking I/O, starting synchronous // RPCs, or waiting on condition variables). Reactions may be invoked // concurrently, except that OnDone is called after all others (assuming proper // API usage). The reactor may not be deleted until OnDone is called. /// \a ServerBidiReactor is the interface for a bidirectional streaming RPC. template <class Request, class Response> class ServerBidiReactor : public internal::ServerReactor { … }; /// \a ServerReadReactor is the interface for a client-streaming RPC. template <class Request> class ServerReadReactor : public internal::ServerReactor { … }; /// \a ServerWriteReactor is the interface for a server-streaming RPC. template <class Response> class ServerWriteReactor : public internal::ServerReactor { … }; class ServerUnaryReactor : public internal::ServerReactor { … }; namespace internal { template <class Base> class FinishOnlyReactor : public Base { … }; UnimplementedUnaryReactor; UnimplementedReadReactor; UnimplementedWriteReactor; UnimplementedBidiReactor; } // namespace internal // TODO(vjpai): Remove namespace experimental when last known users are migrated // off. namespace experimental { ServerBidiReactor; } // namespace experimental } // namespace grpc #endif // GRPCPP_SUPPORT_SERVER_CALLBACK_H