34 #ifndef GRPCXX_ASYNC_UNARY_CALL_H
35 #define GRPCXX_ASYNC_UNARY_CALL_H
37 #include <grpc++/channel_interface.h>
38 #include <grpc++/client_context.h>
39 #include <grpc++/completion_queue.h>
40 #include <grpc++/server_context.h>
41 #include <grpc++/impl/call.h>
42 #include <grpc++/impl/service_type.h>
43 #include <grpc++/status.h>
44 #include <grpc/support/log.h>
52 virtual void ReadInitialMetadata(
void* tag) = 0;
53 virtual void Finish(R* msg,
Status* status,
void* tag) = 0;
63 const grpc::protobuf::Message&
request)
64 : context_(context), call_(channel->CreateCall(method, context, cq)) {
65 init_buf_.AddSendInitialMetadata(&context->send_initial_metadata_);
66 init_buf_.AddSendMessage(request);
67 init_buf_.AddClientSendClose();
68 call_.PerformOps(&init_buf_);
71 void ReadInitialMetadata(
void* tag) {
72 GPR_ASSERT(!context_->initial_metadata_received_);
75 meta_buf_.AddRecvInitialMetadata(context_);
76 call_.PerformOps(&meta_buf_);
79 void Finish(R* msg, Status* status,
void* tag) {
80 finish_buf_.Reset(tag);
81 if (!context_->initial_metadata_received_) {
82 finish_buf_.AddRecvInitialMetadata(context_);
84 finish_buf_.AddRecvMessage(msg);
85 finish_buf_.AddClientRecvStatus(context_, status);
86 call_.PerformOps(&finish_buf_);
90 ClientContext* context_;
92 SneakyCallOpBuffer init_buf_;
93 CallOpBuffer meta_buf_;
94 CallOpBuffer finish_buf_;
99 :
public ServerAsyncStreamingInterface {
101 explicit ServerAsyncResponseWriter(ServerContext* ctx)
102 : call_(nullptr, nullptr, nullptr), ctx_(ctx) {}
104 void SendInitialMetadata(
void* tag) GRPC_OVERRIDE {
105 GPR_ASSERT(!ctx_->sent_initial_metadata_);
107 meta_buf_.Reset(tag);
108 meta_buf_.AddSendInitialMetadata(&ctx_->initial_metadata_);
109 ctx_->sent_initial_metadata_ =
true;
110 call_.PerformOps(&meta_buf_);
113 void Finish(
const W& msg,
const Status& status,
void* tag) {
114 finish_buf_.Reset(tag);
115 if (!ctx_->sent_initial_metadata_) {
116 finish_buf_.AddSendInitialMetadata(&ctx_->initial_metadata_);
117 ctx_->sent_initial_metadata_ =
true;
121 finish_buf_.AddSendMessage(msg);
123 finish_buf_.AddServerSendStatus(&ctx_->trailing_metadata_, status);
124 call_.PerformOps(&finish_buf_);
127 void FinishWithError(
const Status& status,
void* tag) {
128 GPR_ASSERT(!status.IsOk());
129 finish_buf_.Reset(tag);
130 if (!ctx_->sent_initial_metadata_) {
131 finish_buf_.AddSendInitialMetadata(&ctx_->initial_metadata_);
132 ctx_->sent_initial_metadata_ =
true;
134 finish_buf_.AddServerSendStatus(&ctx_->trailing_metadata_, status);
135 call_.PerformOps(&finish_buf_);
139 void BindCall(
Call* call) GRPC_OVERRIDE { call_ = *call; }
143 CallOpBuffer meta_buf_;
144 CallOpBuffer finish_buf_;
149 #endif // GRPCXX_ASYNC_UNARY_CALL_H
Definition: completion_queue.h:76
Definition: channel_interface.h:52
Definition: client_context.h:70
Definition: client_context.h:72
Definition: proto_utils.cc:45
Definition: async_unary_call.h:49
Definition: rpc_method.h:39
Definition: channel_create.c:62