diff --git a/include/grpc++/impl/codegen/completion_queue.h b/include/grpc++/impl/codegen/completion_queue.h index 1d00bf2d1bf58cad7402ad6d72ffd1583d4839e1..95ece77ce5c2207417ef4e7dae997809cad0d05c 100644 --- a/include/grpc++/impl/codegen/completion_queue.h +++ b/include/grpc++/impl/codegen/completion_queue.h @@ -69,9 +69,7 @@ class ServerReader; template <class W> class ServerWriter; template <class W, class R> -class ServerReaderWriter; -template <class Req, class Resp> -class FCUnary; +class ServerReaderWriterInterface; template <class ServiceType, class RequestType, class ResponseType> class RpcMethodHandler; template <class ServiceType, class RequestType, class ResponseType> @@ -182,9 +180,7 @@ class CompletionQueue : private GrpcLibraryCodegen { template <class W> friend class ::grpc::ServerWriter; template <class W, class R> - friend class ::grpc::ServerReaderWriter; - template <class Req, class Resp> - friend class ::grpc::FCUnary; + friend class ::grpc::ServerReaderWriterInterface; template <class ServiceType, class RequestType, class ResponseType> friend class RpcMethodHandler; template <class ServiceType, class RequestType, class ResponseType> diff --git a/include/grpc++/impl/codegen/fc_unary.h b/include/grpc++/impl/codegen/fc_unary.h index 768443912b8d4877595907b9a2bb9e66630bfffc..9dbc4024bf14a4f1a50312532c11ae9a4869d477 100644 --- a/include/grpc++/impl/codegen/fc_unary.h +++ b/include/grpc++/impl/codegen/fc_unary.h @@ -37,11 +37,10 @@ #include <grpc++/impl/codegen/call.h> #include <grpc++/impl/codegen/completion_queue.h> #include <grpc++/impl/codegen/core_codegen_interface.h> -#include <grpc++/impl/codegen/method_handler_impl.h> #include <grpc++/impl/codegen/server_context.h> +#include <grpc++/impl/codegen/sync_stream.h> namespace grpc { - /// 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 @@ -52,51 +51,32 @@ namespace grpc { /// and exactly 1 Write, in that order, to function correctly. /// Otherwise, the RPC is in error. template <class RequestType, class ResponseType> - class FCUnary GRPC_FINAL { - public: - FCUnary(Call* call, ServerContext* ctx): call_(call), ctx_(ctx), read_done_(false), write_done_(false) {} + class FCUnary GRPC_FINAL : public ServerReaderWriterInterface<ResponseType, RequestType> { +public: + FCUnary(Call* call, ServerContext* ctx): ServerReaderWriterInterface<ResponseType,RequestType>(call, ctx) , read_done_(false), write_done_(false) {} + ~FCUnary() {} - bool NextMessageSize(uint32_t *sz) { - *sz = call_->max_message_size(); - return true; - } - bool Read(RequestType *request) { + + bool Read(RequestType *request) GRPC_OVERRIDE { if (read_done_) { return false; } read_done_ = true; - CallOpSet<CallOpRecvMessage<RequestType>> ops; - ops.RecvMessage(request); - call_->PerformOps(&ops); - return call_->cq()->Pluck(&ops) && ops.got_message; + return ServerReaderWriterInterface<ResponseType,RequestType>::Read(request); } - bool Write(const ResponseType& response) {return Write(response, WriteOptions());} - bool Write(const ResponseType& response, const WriteOptions& options) { + + using WriterInterface<ResponseType>::Write; + bool Write(const ResponseType& response, const WriteOptions& options) GRPC_OVERRIDE { if (write_done_ || !read_done_) { return false; } write_done_ = true; - CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage> ops; - if (!ops.SendMessage(response, options).ok()) { - return false; - } - if (!ctx_->sent_initial_metadata_) { - ops.SendInitialMetadata(ctx_->initial_metadata_, - ctx_->initial_metadata_flags()); - ctx_->sent_initial_metadata_ = true; - } else { - return false; - } - call_->PerformOps(&ops); - return call_->cq()->Pluck(&ops); + return ServerReaderWriterInterface<ResponseType,RequestType>::Write(response, options); } private: - Call* const call_; - ServerContext* const ctx_; bool read_done_; bool write_done_; }; - } // namespace grpc #endif // GRPCXX_IMPL_CODEGEN_FC_UNARY_H diff --git a/include/grpc++/impl/codegen/server_context.h b/include/grpc++/impl/codegen/server_context.h index e1d7e980a1642a33deeba7cdc08fd6c18cb47ffc..aadae893ad36e48aa79095449586b542721b56e4 100644 --- a/include/grpc++/impl/codegen/server_context.h +++ b/include/grpc++/impl/codegen/server_context.h @@ -66,9 +66,7 @@ class ServerReader; template <class W> class ServerWriter; template <class W, class R> -class ServerReaderWriter; -template <class Req, class Resp> -class FCUnary; +class ServerReaderWriterInterface; template <class ServiceType, class RequestType, class ResponseType> class RpcMethodHandler; template <class ServiceType, class RequestType, class ResponseType> @@ -187,9 +185,7 @@ class ServerContext { template <class W> friend class ::grpc::ServerWriter; template <class W, class R> - friend class ::grpc::ServerReaderWriter; - template <class Req, class Resp> - friend class ::grpc::FCUnary; + friend class ::grpc::ServerReaderWriterInterface; template <class ServiceType, class RequestType, class ResponseType> friend class RpcMethodHandler; template <class ServiceType, class RequestType, class ResponseType> diff --git a/include/grpc++/impl/codegen/sync_stream.h b/include/grpc++/impl/codegen/sync_stream.h index 31da2cbbe96eb53e48312d1dcf1f5f3bcb1ad3d5..2e63479961f9f26cf9ba6579ebc6129e9249b148 100644 --- a/include/grpc++/impl/codegen/sync_stream.h +++ b/include/grpc++/impl/codegen/sync_stream.h @@ -429,12 +429,11 @@ class ServerWriter GRPC_FINAL : public WriterInterface<W> { /// Server-side interface for bi-directional streaming. template <class W, class R> -class ServerReaderWriter GRPC_FINAL : public WriterInterface<W>, - public ReaderInterface<R> { - public: - ServerReaderWriter(Call* call, ServerContext* ctx) : call_(call), ctx_(ctx) {} - - void SendInitialMetadata() { +class ServerReaderWriterInterface : public WriterInterface<W>, + public ReaderInterface<R> { +public: + ServerReaderWriterInterface(Call* call, ServerContext* ctx) : call_(call), ctx_(ctx) {} + virtual void SendInitialMetadata() { GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); CallOpSet<CallOpSendInitialMetadata> ops; @@ -448,12 +447,12 @@ class ServerReaderWriter GRPC_FINAL : public WriterInterface<W>, call_->cq()->Pluck(&ops); } - bool NextMessageSize(uint32_t *sz) GRPC_OVERRIDE { + virtual bool NextMessageSize(uint32_t *sz) GRPC_OVERRIDE { *sz = call_->max_message_size(); return true; } - bool Read(R* msg) GRPC_OVERRIDE { + virtual bool Read(R* msg) GRPC_OVERRIDE { CallOpSet<CallOpRecvMessage<R>> ops; ops.RecvMessage(msg); call_->PerformOps(&ops); @@ -461,7 +460,7 @@ class ServerReaderWriter GRPC_FINAL : public WriterInterface<W>, } using WriterInterface<W>::Write; - bool Write(const W& msg, const WriteOptions& options) GRPC_OVERRIDE { + virtual bool Write(const W& msg, const WriteOptions& options) GRPC_OVERRIDE { CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage> ops; if (!ops.SendMessage(msg, options).ok()) { return false; @@ -477,12 +476,17 @@ class ServerReaderWriter GRPC_FINAL : public WriterInterface<W>, call_->PerformOps(&ops); return call_->cq()->Pluck(&ops); } - - private: +private: Call* const call_; ServerContext* const ctx_; }; +template <class W, class R> +class ServerReaderWriter GRPC_FINAL : public ServerReaderWriterInterface<W,R> { +public: + ServerReaderWriter(Call* call, ServerContext* ctx) : ServerReaderWriterInterface<W,R>(call, ctx) {} +}; + } // namespace grpc #endif // GRPCXX_IMPL_CODEGEN_SYNC_STREAM_H diff --git a/src/compiler/cpp_generator.cc b/src/compiler/cpp_generator.cc index dcf995ff61aae1831a30f1908b7a898bc650a1fb..d587023c65b55db1f7e70a77ce8eebf4a021b90a 100644 --- a/src/compiler/cpp_generator.cc +++ b/src/compiler/cpp_generator.cc @@ -131,6 +131,7 @@ grpc::string GetHeaderIncludes(File *file, const Parameters ¶ms) { "grpc++/impl/codegen/async_stream.h", "grpc++/impl/codegen/async_unary_call.h", "grpc++/impl/codegen/fc_unary.h", + "grpc++/impl/codegen/method_handler_impl.h", "grpc++/impl/codegen/proto_utils.h", "grpc++/impl/codegen/rpc_method.h", "grpc++/impl/codegen/service_type.h",