// // // 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_SYNC_STREAM_H #define GRPCPP_SUPPORT_SYNC_STREAM_H #include <grpc/support/log.h> #include <grpcpp/client_context.h> #include <grpcpp/completion_queue.h> #include <grpcpp/impl/call.h> #include <grpcpp/impl/codegen/channel_interface.h> #include <grpcpp/impl/service_type.h> #include <grpcpp/server_context.h> #include <grpcpp/support/status.h> namespace grpc { namespace internal { /// Common interface for all synchronous client side streaming. class ClientStreamingInterface { … }; /// Common interface for all synchronous server side streaming. class ServerStreamingInterface { … }; /// An interface that yields a sequence of messages of type \a R. template <class R> class ReaderInterface { … }; /// An interface that can be fed a sequence of messages of type \a W. template <class W> class WriterInterface { … }; } // namespace internal /// Client-side interface for streaming reads of message of type \a R. template <class R> class ClientReaderInterface : public internal::ClientStreamingInterface, public internal::ReaderInterface<R> { … }; namespace internal { template <class R> class ClientReaderFactory { … }; } // namespace internal /// Synchronous (blocking) client-side API for doing server-streaming RPCs, /// where the stream of messages coming from the server has messages /// of type \a R. template <class R> class ClientReader final : public ClientReaderInterface<R> { … }; /// Client-side interface for streaming writes of message type \a W. template <class W> class ClientWriterInterface : public internal::ClientStreamingInterface, public internal::WriterInterface<W> { … }; namespace internal { template <class W> class ClientWriterFactory { … }; } // namespace internal /// Synchronous (blocking) client-side API for doing client-streaming RPCs, /// where the outgoing message stream coming from the client has messages of /// type \a W. template <class W> class ClientWriter : public ClientWriterInterface<W> { … }; /// Client-side interface for bi-directional streaming with /// client-to-server stream messages of type \a W and /// server-to-client stream messages of type \a R. template <class W, class R> class ClientReaderWriterInterface : public internal::ClientStreamingInterface, public internal::WriterInterface<W>, public internal::ReaderInterface<R> { … }; namespace internal { template <class W, class R> class ClientReaderWriterFactory { … }; } // namespace internal /// Synchronous (blocking) client-side API for bi-directional streaming RPCs, /// where the outgoing message stream coming from the client has messages of /// type \a W, and the incoming messages stream coming from the server has /// messages of type \a R. template <class W, class R> class ClientReaderWriter final : public ClientReaderWriterInterface<W, R> { … }; /// Server-side interface for streaming reads of message of type \a R. template <class R> class ServerReaderInterface : public internal::ServerStreamingInterface, public internal::ReaderInterface<R> { … }; /// Synchronous (blocking) server-side API for doing client-streaming RPCs, /// where the incoming message stream coming from the client has messages of /// type \a R. template <class R> class ServerReader final : public ServerReaderInterface<R> { … }; /// Server-side interface for streaming writes of message of type \a W. template <class W> class ServerWriterInterface : public internal::ServerStreamingInterface, public internal::WriterInterface<W> { … }; /// Synchronous (blocking) server-side API for doing for doing a /// server-streaming RPCs, where the outgoing message stream coming from the /// server has messages of type \a W. template <class W> class ServerWriter final : public ServerWriterInterface<W> { … }; /// Server-side interface for bi-directional streaming. template <class W, class R> class ServerReaderWriterInterface : public internal::ServerStreamingInterface, public internal::WriterInterface<W>, public internal::ReaderInterface<R> { … }; /// Actual implementation of bi-directional streaming namespace internal { template <class W, class R> class ServerReaderWriterBody final { … }; } // namespace internal /// Synchronous (blocking) server-side API for a bidirectional /// streaming call, where the incoming message stream coming from the client has /// messages of type \a R, and the outgoing message streaming coming from /// the server has messages of type \a W. template <class W, class R> class ServerReaderWriter final : public ServerReaderWriterInterface<W, R> { … }; /// A class to represent a flow-controlled unary call. This is something /// of a hybrid between conventional unary and streaming. This is invoked /// through a unary call on the client side, but the server responds to it /// as though it were a single-ping-pong streaming call. The server can use /// the \a NextMessageSize method to determine an upper-bound on the size of /// the message. A key difference relative to streaming: ServerUnaryStreamer /// must have exactly 1 Read and exactly 1 Write, in that order, to function /// correctly. Otherwise, the RPC is in error. template <class RequestType, class ResponseType> class ServerUnaryStreamer final : public ServerReaderWriterInterface<ResponseType, RequestType> { … }; /// A class to represent a flow-controlled server-side streaming call. /// This is something of a hybrid between server-side and bidi streaming. /// This is invoked through a server-side streaming call on the client side, /// but the server responds to it as though it were a bidi streaming call that /// must first have exactly 1 Read and then any number of Writes. template <class RequestType, class ResponseType> class ServerSplitStreamer final : public ServerReaderWriterInterface<ResponseType, RequestType> { … }; } // namespace grpc #endif // GRPCPP_SUPPORT_SYNC_STREAM_H