34 #ifndef GRPCXX_IMPL_CODEGEN_ASYNC_STREAM_H 35 #define GRPCXX_IMPL_CODEGEN_ASYNC_STREAM_H 46 class CompletionQueue;
85 virtual void Read(R* msg,
void* tag) = 0;
103 virtual void Write(
const W& msg,
void* tag) = 0;
117 const W& request,
void* tag)
118 : context_(context), call_(channel->CreateCall(method, context, cq)) {
119 init_ops_.set_output_tag(tag);
120 init_ops_.SendInitialMetadata(context->send_initial_metadata_,
121 context->initial_metadata_flags());
124 init_ops_.ClientSendClose();
125 call_.PerformOps(&init_ops_);
131 meta_ops_.set_output_tag(tag);
132 meta_ops_.RecvInitialMetadata(context_);
133 call_.PerformOps(&meta_ops_);
137 read_ops_.set_output_tag(tag);
138 if (!context_->initial_metadata_received_) {
139 read_ops_.RecvInitialMetadata(context_);
141 read_ops_.RecvMessage(msg);
142 call_.PerformOps(&read_ops_);
146 finish_ops_.set_output_tag(tag);
147 if (!context_->initial_metadata_received_) {
148 finish_ops_.RecvInitialMetadata(context_);
150 finish_ops_.ClientRecvStatus(context_, status);
151 call_.PerformOps(&finish_ops_);
173 virtual void WritesDone(
void* tag) = 0;
182 R* response,
void* tag)
183 : context_(context), call_(channel->CreateCall(method, context, cq)) {
184 finish_ops_.RecvMessage(response);
185 finish_ops_.AllowNoMessage();
187 init_ops_.set_output_tag(tag);
188 init_ops_.SendInitialMetadata(context->send_initial_metadata_,
189 context->initial_metadata_flags());
190 call_.PerformOps(&init_ops_);
196 meta_ops_.set_output_tag(tag);
197 meta_ops_.RecvInitialMetadata(context_);
198 call_.PerformOps(&meta_ops_);
202 write_ops_.set_output_tag(tag);
205 call_.PerformOps(&write_ops_);
209 writes_done_ops_.set_output_tag(tag);
210 writes_done_ops_.ClientSendClose();
211 call_.PerformOps(&writes_done_ops_);
215 finish_ops_.set_output_tag(tag);
216 if (!context_->initial_metadata_received_) {
217 finish_ops_.RecvInitialMetadata(context_);
219 finish_ops_.ClientRecvStatus(context_, status);
220 call_.PerformOps(&finish_ops_);
236 template <
class W,
class R>
245 virtual void WritesDone(
void* tag) = 0;
248 template <
class W,
class R>
255 : context_(context), call_(channel->CreateCall(method, context, cq)) {
256 init_ops_.set_output_tag(tag);
257 init_ops_.SendInitialMetadata(context->send_initial_metadata_,
258 context->initial_metadata_flags());
259 call_.PerformOps(&init_ops_);
265 meta_ops_.set_output_tag(tag);
266 meta_ops_.RecvInitialMetadata(context_);
267 call_.PerformOps(&meta_ops_);
271 read_ops_.set_output_tag(tag);
272 if (!context_->initial_metadata_received_) {
273 read_ops_.RecvInitialMetadata(context_);
275 read_ops_.RecvMessage(msg);
276 call_.PerformOps(&read_ops_);
280 write_ops_.set_output_tag(tag);
283 call_.PerformOps(&write_ops_);
287 writes_done_ops_.set_output_tag(tag);
288 writes_done_ops_.ClientSendClose();
289 call_.PerformOps(&writes_done_ops_);
293 finish_ops_.set_output_tag(tag);
294 if (!context_->initial_metadata_received_) {
295 finish_ops_.RecvInitialMetadata(context_);
297 finish_ops_.ClientRecvStatus(context_, status);
298 call_.PerformOps(&finish_ops_);
312 template <
class W,
class R>
316 virtual void Finish(
const W& msg,
const Status& status,
void* tag) = 0;
318 virtual void FinishWithError(
const Status& status,
void* tag) = 0;
321 template <
class W,
class R>
325 : call_(nullptr, nullptr, nullptr), ctx_(ctx) {}
330 meta_ops_.set_output_tag(tag);
331 meta_ops_.SendInitialMetadata(ctx_->initial_metadata_,
332 ctx_->initial_metadata_flags());
333 if (ctx_->compression_level_set()) {
334 meta_ops_.set_compression_level(ctx_->compression_level());
336 ctx_->sent_initial_metadata_ =
true;
337 call_.PerformOps(&meta_ops_);
341 read_ops_.set_output_tag(tag);
342 read_ops_.RecvMessage(msg);
343 call_.PerformOps(&read_ops_);
347 finish_ops_.set_output_tag(tag);
348 if (!ctx_->sent_initial_metadata_) {
349 finish_ops_.SendInitialMetadata(ctx_->initial_metadata_,
350 ctx_->initial_metadata_flags());
351 if (ctx_->compression_level_set()) {
352 finish_ops_.set_compression_level(ctx_->compression_level());
354 ctx_->sent_initial_metadata_ =
true;
358 finish_ops_.ServerSendStatus(ctx_->trailing_metadata_,
359 finish_ops_.SendMessage(msg));
361 finish_ops_.ServerSendStatus(ctx_->trailing_metadata_, status);
363 call_.PerformOps(&finish_ops_);
368 finish_ops_.set_output_tag(tag);
369 if (!ctx_->sent_initial_metadata_) {
370 finish_ops_.SendInitialMetadata(ctx_->initial_metadata_,
371 ctx_->initial_metadata_flags());
372 if (ctx_->compression_level_set()) {
373 finish_ops_.set_compression_level(ctx_->compression_level());
375 ctx_->sent_initial_metadata_ =
true;
377 finish_ops_.ServerSendStatus(ctx_->trailing_metadata_, status);
378 call_.PerformOps(&finish_ops_);
397 virtual void Finish(
const Status& status,
void* tag) = 0;
404 : call_(nullptr, nullptr, nullptr), ctx_(ctx) {}
409 meta_ops_.set_output_tag(tag);
410 meta_ops_.SendInitialMetadata(ctx_->initial_metadata_,
411 ctx_->initial_metadata_flags());
412 if (ctx_->compression_level_set()) {
413 meta_ops_.set_compression_level(ctx_->compression_level());
415 ctx_->sent_initial_metadata_ =
true;
416 call_.PerformOps(&meta_ops_);
420 write_ops_.set_output_tag(tag);
421 if (!ctx_->sent_initial_metadata_) {
422 write_ops_.SendInitialMetadata(ctx_->initial_metadata_,
423 ctx_->initial_metadata_flags());
424 if (ctx_->compression_level_set()) {
425 write_ops_.set_compression_level(ctx_->compression_level());
427 ctx_->sent_initial_metadata_ =
true;
431 call_.PerformOps(&write_ops_);
435 finish_ops_.set_output_tag(tag);
436 if (!ctx_->sent_initial_metadata_) {
437 finish_ops_.SendInitialMetadata(ctx_->initial_metadata_,
438 ctx_->initial_metadata_flags());
439 if (ctx_->compression_level_set()) {
440 finish_ops_.set_compression_level(ctx_->compression_level());
442 ctx_->sent_initial_metadata_ =
true;
444 finish_ops_.ServerSendStatus(ctx_->trailing_metadata_, status);
445 call_.PerformOps(&finish_ops_);
459 template <
class W,
class R>
464 virtual void Finish(
const Status& status,
void* tag) = 0;
467 template <
class W,
class R>
472 : call_(nullptr, nullptr, nullptr), ctx_(ctx) {}
477 meta_ops_.set_output_tag(tag);
478 meta_ops_.SendInitialMetadata(ctx_->initial_metadata_,
479 ctx_->initial_metadata_flags());
480 if (ctx_->compression_level_set()) {
481 meta_ops_.set_compression_level(ctx_->compression_level());
483 ctx_->sent_initial_metadata_ =
true;
484 call_.PerformOps(&meta_ops_);
488 read_ops_.set_output_tag(tag);
489 read_ops_.RecvMessage(msg);
490 call_.PerformOps(&read_ops_);
494 write_ops_.set_output_tag(tag);
495 if (!ctx_->sent_initial_metadata_) {
496 write_ops_.SendInitialMetadata(ctx_->initial_metadata_,
497 ctx_->initial_metadata_flags());
498 if (ctx_->compression_level_set()) {
499 write_ops_.set_compression_level(ctx_->compression_level());
501 ctx_->sent_initial_metadata_ =
true;
505 call_.PerformOps(&write_ops_);
509 finish_ops_.set_output_tag(tag);
510 if (!ctx_->sent_initial_metadata_) {
511 finish_ops_.SendInitialMetadata(ctx_->initial_metadata_,
512 ctx_->initial_metadata_flags());
513 if (ctx_->compression_level_set()) {
514 finish_ops_.set_compression_level(ctx_->compression_level());
516 ctx_->sent_initial_metadata_ =
true;
518 finish_ops_.ServerSendStatus(ctx_->trailing_metadata_, status);
519 call_.PerformOps(&finish_ops_);
523 friend class ::grpc::Server;
537 #endif // GRPCXX_IMPL_CODEGEN_ASYNC_STREAM_H Common interface for all client side asynchronous streaming.
Definition: async_stream.h:49
Definition: async_stream.h:249
void SendInitialMetadata(void *tag) GRPC_OVERRIDE
Definition: async_stream.h:474
void Write(const W &msg, void *tag) GRPC_OVERRIDE
Request the writing of msg with identifying tag tag.
Definition: async_stream.h:201
void WritesDone(void *tag) GRPC_OVERRIDE
Signal the client is done with the writes.
Definition: async_stream.h:208
void Read(R *msg, void *tag) GRPC_OVERRIDE
Read a message of type R into msg.
Definition: async_stream.h:487
void SendInitialMetadata(void *tag) GRPC_OVERRIDE
Definition: async_stream.h:406
#define GPR_CODEGEN_ASSERT(x)
Codegen specific version of GPR_ASSERT.
Definition: core_codegen_interface.h:97
void ReadInitialMetadata(void *tag) GRPC_OVERRIDE
Request notification of the reading of the initial metadata.
Definition: async_stream.h:262
Definition: async_stream.h:468
Definition: service_type.h:53
void Finish(const Status &status, void *tag) GRPC_OVERRIDE
Definition: async_stream.h:434
void Write(const W &msg, void *tag) GRPC_OVERRIDE
Request the writing of msg with identifying tag tag.
Definition: async_stream.h:419
Definition: async_stream.h:313
void Read(R *msg, void *tag) GRPC_OVERRIDE
Read a message of type R into msg.
Definition: async_stream.h:270
void Read(R *msg, void *tag) GRPC_OVERRIDE
Read a message of type R into msg.
Definition: async_stream.h:340
Definition: client_context.h:154
void Finish(const Status &status, void *tag) GRPC_OVERRIDE
Definition: async_stream.h:508
Definition: async_stream.h:401
ClientAsyncWriter(ChannelInterface *channel, CompletionQueue *cq, const RpcMethod &method, ClientContext *context, R *response, void *tag)
Definition: async_stream.h:180
virtual ~AsyncReaderInterface()
Definition: async_stream.h:73
ServerAsyncReaderWriter(ServerContext *ctx)
Definition: async_stream.h:471
ClientAsyncReaderWriter(ChannelInterface *channel, CompletionQueue *cq, const RpcMethod &method, ClientContext *context, void *tag)
Definition: async_stream.h:252
Definition: async_stream.h:107
void Write(const W &msg, void *tag) GRPC_OVERRIDE
Request the writing of msg with identifying tag tag.
Definition: async_stream.h:279
Client-side interface for asynchronous bi-directional streaming.
Definition: async_stream.h:237
Codegen interface for grpc::Channel.
Definition: channel_interface.h:64
ServerAsyncWriter(ServerContext *ctx)
Definition: async_stream.h:403
void ReadInitialMetadata(void *tag) GRPC_OVERRIDE
Request notification of the reading of the initial metadata.
Definition: async_stream.h:193
An interface that can be fed a sequence of messages of type W.
Definition: async_stream.h:90
Definition: async_stream.h:177
Primary implementaiton of CallOpSetInterface.
Definition: call.h:593
void FinishWithError(const Status &status, void *tag) GRPC_OVERRIDE
Definition: async_stream.h:366
Server-side interface for asynchronous bi-directional streaming.
Definition: async_stream.h:460
Definition: server_context.h:91
A thin wrapper around grpc_completion_queue (see / src/core/surface/completion_queue.h).
Definition: completion_queue.h:97
#define GRPC_FINAL
Definition: config.h:72
virtual ~ClientAsyncStreamingInterface()
Definition: async_stream.h:51
void Finish(Status *status, void *tag) GRPC_OVERRIDE
Indicate that the stream is to be finished and request notification Should not be used concurrently w...
Definition: async_stream.h:214
virtual void ReadInitialMetadata(void *tag)=0
Request notification of the reading of the initial metadata.
Definition: rpc_method.h:43
void Finish(Status *status, void *tag) GRPC_OVERRIDE
Indicate that the stream is to be finished and request notification Should not be used concurrently w...
Definition: async_stream.h:145
Did it work? If it didn't, why?
Definition: status.h:45
void Finish(const W &msg, const Status &status, void *tag) GRPC_OVERRIDE
Definition: async_stream.h:346
void Write(const W &msg, void *tag) GRPC_OVERRIDE
Request the writing of msg with identifying tag tag.
Definition: async_stream.h:493
virtual void Finish(Status *status, void *tag)=0
Indicate that the stream is to be finished and request notification Should not be used concurrently w...
void SendInitialMetadata(void *tag) GRPC_OVERRIDE
Definition: async_stream.h:327
Definition: async_stream.h:394
void Read(R *msg, void *tag) GRPC_OVERRIDE
Read a message of type R into msg.
Definition: async_stream.h:136
Definition: async_stream.h:111
virtual ~AsyncWriterInterface()
Definition: async_stream.h:92
#define GRPC_OVERRIDE
Definition: config.h:78
void Finish(Status *status, void *tag) GRPC_OVERRIDE
Indicate that the stream is to be finished and request notification Should not be used concurrently w...
Definition: async_stream.h:292
Definition: async_stream.h:322
void WritesDone(void *tag) GRPC_OVERRIDE
Signal the client is done with the writes.
Definition: async_stream.h:286
ClientAsyncReader(ChannelInterface *channel, CompletionQueue *cq, const RpcMethod &method, ClientContext *context, const W &request, void *tag)
Create a stream and write the first request out.
Definition: async_stream.h:115
ServerAsyncReader(ServerContext *ctx)
Definition: async_stream.h:324
An interface that yields a sequence of messages of type R.
Definition: async_stream.h:71
void ReadInitialMetadata(void *tag) GRPC_OVERRIDE
Request notification of the reading of the initial metadata.
Definition: async_stream.h:128
Common interface for client side asynchronous writing.
Definition: async_stream.h:166