GRPC C++  0.11.0.0
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
call.h
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2015, Google Inc.
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are
8  * met:
9  *
10  * * Redistributions of source code must retain the above copyright
11  * notice, this list of conditions and the following disclaimer.
12  * * Redistributions in binary form must reproduce the above
13  * copyright notice, this list of conditions and the following disclaimer
14  * in the documentation and/or other materials provided with the
15  * distribution.
16  * * Neither the name of Google Inc. nor the names of its
17  * contributors may be used to endorse or promote products derived from
18  * this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  *
32  */
33 
34 #ifndef GRPCXX_IMPL_CALL_H
35 #define GRPCXX_IMPL_CALL_H
36 
37 #include <functional>
38 #include <memory>
39 #include <map>
40 #include <cstring>
41 
42 #include <grpc/support/alloc.h>
43 #include <grpc++/client_context.h>
46 #include <grpc++/support/config.h>
47 #include <grpc++/support/status.h>
48 
49 struct grpc_call;
50 struct grpc_op;
51 
52 namespace grpc {
53 
54 class ByteBuffer;
55 class Call;
56 
57 void FillMetadataMap(
58  grpc_metadata_array* arr,
59  std::multimap<grpc::string_ref, grpc::string_ref>* metadata);
60 grpc_metadata* FillMetadataArray(
61  const std::multimap<grpc::string, grpc::string>& metadata);
62 
64 class WriteOptions {
65  public:
66  WriteOptions() : flags_(0) {}
67  WriteOptions(const WriteOptions& other) : flags_(other.flags_) {}
68 
70  inline void Clear() { flags_ = 0; }
71 
73  inline gpr_uint32 flags() const { return flags_; }
74 
79  SetBit(GRPC_WRITE_NO_COMPRESS);
80  return *this;
81  }
82 
87  ClearBit(GRPC_WRITE_NO_COMPRESS);
88  return *this;
89  }
90 
95  inline bool get_no_compression() const {
96  return GetBit(GRPC_WRITE_NO_COMPRESS);
97  }
98 
104  SetBit(GRPC_WRITE_BUFFER_HINT);
105  return *this;
106  }
107 
113  ClearBit(GRPC_WRITE_BUFFER_HINT);
114  return *this;
115  }
116 
121  inline bool get_buffer_hint() const { return GetBit(GRPC_WRITE_BUFFER_HINT); }
122 
124  flags_ = rhs.flags_;
125  return *this;
126  }
127 
128  private:
129  void SetBit(const gpr_int32 mask) { flags_ |= mask; }
130 
131  void ClearBit(const gpr_int32 mask) { flags_ &= ~mask; }
132 
133  bool GetBit(const gpr_int32 mask) const { return flags_ & mask; }
134 
135  gpr_uint32 flags_;
136 };
137 
140 template <int I>
141 class CallNoOp {
142  protected:
143  void AddOp(grpc_op* ops, size_t* nops) {}
144  void FinishOp(bool* status, int max_message_size) {}
145 };
146 
148  public:
150 
152  const std::multimap<grpc::string, grpc::string>& metadata) {
153  send_ = true;
154  initial_metadata_count_ = metadata.size();
156  }
157 
158  protected:
159  void AddOp(grpc_op* ops, size_t* nops) {
160  if (!send_) return;
161  grpc_op* op = &ops[(*nops)++];
162  op->op = GRPC_OP_SEND_INITIAL_METADATA;
163  op->flags = 0;
164  op->reserved = NULL;
165  op->data.send_initial_metadata.count = initial_metadata_count_;
166  op->data.send_initial_metadata.metadata = initial_metadata_;
167  }
168  void FinishOp(bool* status, int max_message_size) {
169  if (!send_) return;
170  gpr_free(initial_metadata_);
171  send_ = false;
172  }
173 
174  bool send_;
176  grpc_metadata* initial_metadata_;
177 };
178 
180  public:
181  CallOpSendMessage() : send_buf_(nullptr), own_buf_(false) {}
182 
185  template <class M>
186  Status SendMessage(const M& message,
187  const WriteOptions& options) GRPC_MUST_USE_RESULT;
188 
189  template <class M>
190  Status SendMessage(const M& message) GRPC_MUST_USE_RESULT;
191 
192  protected:
193  void AddOp(grpc_op* ops, size_t* nops) {
194  if (send_buf_ == nullptr) return;
195  grpc_op* op = &ops[(*nops)++];
196  op->op = GRPC_OP_SEND_MESSAGE;
197  op->flags = write_options_.flags();
198  op->reserved = NULL;
199  op->data.send_message = send_buf_;
200  // Flags are per-message: clear them after use.
201  write_options_.Clear();
202  }
203  void FinishOp(bool* status, int max_message_size) {
204  if (own_buf_) grpc_byte_buffer_destroy(send_buf_);
205  send_buf_ = nullptr;
206  }
207 
208  private:
209  grpc_byte_buffer* send_buf_;
210  WriteOptions write_options_;
211  bool own_buf_;
212 };
213 
214 template <class M>
216  const WriteOptions& options) {
217  write_options_ = options;
218  return SerializationTraits<M>::Serialize(message, &send_buf_, &own_buf_);
219 }
220 
221 template <class M>
223  return SendMessage(message, WriteOptions());
224 }
225 
226 template <class R>
228  public:
229  CallOpRecvMessage() : got_message(false), message_(nullptr) {}
230 
231  void RecvMessage(R* message) { message_ = message; }
232 
234 
235  protected:
236  void AddOp(grpc_op* ops, size_t* nops) {
237  if (message_ == nullptr) return;
238  grpc_op* op = &ops[(*nops)++];
239  op->op = GRPC_OP_RECV_MESSAGE;
240  op->flags = 0;
241  op->reserved = NULL;
242  op->data.recv_message = &recv_buf_;
243  }
244 
245  void FinishOp(bool* status, int max_message_size) {
246  if (message_ == nullptr) return;
247  if (recv_buf_) {
248  if (*status) {
249  got_message = true;
250  *status = SerializationTraits<R>::Deserialize(recv_buf_, message_,
251  max_message_size)
252  .ok();
253  } else {
254  got_message = false;
255  grpc_byte_buffer_destroy(recv_buf_);
256  }
257  } else {
258  got_message = false;
259  *status = false;
260  }
261  message_ = nullptr;
262  }
263 
264  private:
265  R* message_;
266  grpc_byte_buffer* recv_buf_;
267 };
268 
269 namespace CallOpGenericRecvMessageHelper {
271  public:
272  virtual Status Deserialize(grpc_byte_buffer* buf, int max_message_size) = 0;
273 };
274 
275 template <class R>
277  public:
278  DeserializeFuncType(R* message) : message_(message) {}
279  Status Deserialize(grpc_byte_buffer* buf,
280  int max_message_size) GRPC_OVERRIDE {
281  return SerializationTraits<R>::Deserialize(buf, message_, max_message_size);
282  }
283 
284  private:
285  R* message_; // Not a managed pointer because management is external to this
286 };
287 } // namespace CallOpGenericRecvMessageHelper
288 
290  public:
292 
293  template <class R>
294  void RecvMessage(R* message) {
295  deserialize_.reset(
297  }
298 
300 
301  protected:
302  void AddOp(grpc_op* ops, size_t* nops) {
303  if (!deserialize_) return;
304  grpc_op* op = &ops[(*nops)++];
305  op->op = GRPC_OP_RECV_MESSAGE;
306  op->flags = 0;
307  op->reserved = NULL;
308  op->data.recv_message = &recv_buf_;
309  }
310 
311  void FinishOp(bool* status, int max_message_size) {
312  if (!deserialize_) return;
313  if (recv_buf_) {
314  if (*status) {
315  got_message = true;
316  *status = deserialize_->Deserialize(recv_buf_, max_message_size).ok();
317  } else {
318  got_message = false;
319  grpc_byte_buffer_destroy(recv_buf_);
320  }
321  } else {
322  got_message = false;
323  *status = false;
324  }
325  deserialize_.reset();
326  }
327 
328  private:
329  std::unique_ptr<CallOpGenericRecvMessageHelper::DeserializeFunc> deserialize_;
330  grpc_byte_buffer* recv_buf_;
331 };
332 
334  public:
335  CallOpClientSendClose() : send_(false) {}
336 
337  void ClientSendClose() { send_ = true; }
338 
339  protected:
340  void AddOp(grpc_op* ops, size_t* nops) {
341  if (!send_) return;
342  grpc_op* op = &ops[(*nops)++];
343  op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
344  op->flags = 0;
345  op->reserved = NULL;
346  }
347  void FinishOp(bool* status, int max_message_size) { send_ = false; }
348 
349  private:
350  bool send_;
351 };
352 
354  public:
355  CallOpServerSendStatus() : send_status_available_(false) {}
356 
358  const std::multimap<grpc::string, grpc::string>& trailing_metadata,
359  const Status& status) {
360  trailing_metadata_count_ = trailing_metadata.size();
361  trailing_metadata_ = FillMetadataArray(trailing_metadata);
362  send_status_available_ = true;
363  send_status_code_ = static_cast<grpc_status_code>(status.error_code());
364  send_status_details_ = status.error_message();
365  }
366 
367  protected:
368  void AddOp(grpc_op* ops, size_t* nops) {
369  if (!send_status_available_) return;
370  grpc_op* op = &ops[(*nops)++];
371  op->op = GRPC_OP_SEND_STATUS_FROM_SERVER;
372  op->data.send_status_from_server.trailing_metadata_count =
373  trailing_metadata_count_;
374  op->data.send_status_from_server.trailing_metadata = trailing_metadata_;
375  op->data.send_status_from_server.status = send_status_code_;
376  op->data.send_status_from_server.status_details =
377  send_status_details_.empty() ? nullptr : send_status_details_.c_str();
378  op->flags = 0;
379  op->reserved = NULL;
380  }
381 
382  void FinishOp(bool* status, int max_message_size) {
383  if (!send_status_available_) return;
384  gpr_free(trailing_metadata_);
385  send_status_available_ = false;
386  }
387 
388  private:
389  bool send_status_available_;
390  grpc_status_code send_status_code_;
391  grpc::string send_status_details_;
392  size_t trailing_metadata_count_;
393  grpc_metadata* trailing_metadata_;
394 };
395 
397  public:
398  CallOpRecvInitialMetadata() : recv_initial_metadata_(nullptr) {}
399 
401  context->initial_metadata_received_ = true;
402  recv_initial_metadata_ = &context->recv_initial_metadata_;
403  }
404 
405  protected:
406  void AddOp(grpc_op* ops, size_t* nops) {
407  if (!recv_initial_metadata_) return;
408  memset(&recv_initial_metadata_arr_, 0, sizeof(recv_initial_metadata_arr_));
409  grpc_op* op = &ops[(*nops)++];
410  op->op = GRPC_OP_RECV_INITIAL_METADATA;
411  op->data.recv_initial_metadata = &recv_initial_metadata_arr_;
412  op->flags = 0;
413  op->reserved = NULL;
414  }
415  void FinishOp(bool* status, int max_message_size) {
416  if (recv_initial_metadata_ == nullptr) return;
417  FillMetadataMap(&recv_initial_metadata_arr_, recv_initial_metadata_);
418  recv_initial_metadata_ = nullptr;
419  }
420 
421  private:
422  std::multimap<grpc::string_ref, grpc::string_ref>* recv_initial_metadata_;
423  grpc_metadata_array recv_initial_metadata_arr_;
424 };
425 
427  public:
428  CallOpClientRecvStatus() : recv_status_(nullptr) {}
429 
430  void ClientRecvStatus(ClientContext* context, Status* status) {
431  recv_trailing_metadata_ = &context->trailing_metadata_;
432  recv_status_ = status;
433  }
434 
435  protected:
436  void AddOp(grpc_op* ops, size_t* nops) {
437  if (recv_status_ == nullptr) return;
438  memset(&recv_trailing_metadata_arr_, 0,
439  sizeof(recv_trailing_metadata_arr_));
440  status_details_ = nullptr;
441  status_details_capacity_ = 0;
442  grpc_op* op = &ops[(*nops)++];
443  op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
444  op->data.recv_status_on_client.trailing_metadata =
445  &recv_trailing_metadata_arr_;
446  op->data.recv_status_on_client.status = &status_code_;
447  op->data.recv_status_on_client.status_details = &status_details_;
448  op->data.recv_status_on_client.status_details_capacity =
449  &status_details_capacity_;
450  op->flags = 0;
451  op->reserved = NULL;
452  }
453 
454  void FinishOp(bool* status, int max_message_size) {
455  if (recv_status_ == nullptr) return;
456  FillMetadataMap(&recv_trailing_metadata_arr_, recv_trailing_metadata_);
457  *recv_status_ = Status(
458  static_cast<StatusCode>(status_code_),
459  status_details_ ? grpc::string(status_details_) : grpc::string());
460  gpr_free(status_details_);
461  recv_status_ = nullptr;
462  }
463 
464  private:
465  std::multimap<grpc::string_ref, grpc::string_ref>* recv_trailing_metadata_;
466  Status* recv_status_;
467  grpc_metadata_array recv_trailing_metadata_arr_;
468  grpc_status_code status_code_;
469  char* status_details_;
470  size_t status_details_capacity_;
471 };
472 
479  public:
483  virtual void FillOps(grpc_op* ops, size_t* nops) = 0;
484 
485  void set_max_message_size(int max_message_size) {
486  max_message_size_ = max_message_size;
487  }
488 
489  protected:
491 };
492 
499 template <class Op1 = CallNoOp<1>, class Op2 = CallNoOp<2>,
500  class Op3 = CallNoOp<3>, class Op4 = CallNoOp<4>,
501  class Op5 = CallNoOp<5>, class Op6 = CallNoOp<6>>
503  public Op1,
504  public Op2,
505  public Op3,
506  public Op4,
507  public Op5,
508  public Op6 {
509  public:
510  CallOpSet() : return_tag_(this) {}
511  void FillOps(grpc_op* ops, size_t* nops) GRPC_OVERRIDE {
512  this->Op1::AddOp(ops, nops);
513  this->Op2::AddOp(ops, nops);
514  this->Op3::AddOp(ops, nops);
515  this->Op4::AddOp(ops, nops);
516  this->Op5::AddOp(ops, nops);
517  this->Op6::AddOp(ops, nops);
518  }
519 
520  bool FinalizeResult(void** tag, bool* status) GRPC_OVERRIDE {
521  this->Op1::FinishOp(status, max_message_size_);
522  this->Op2::FinishOp(status, max_message_size_);
523  this->Op3::FinishOp(status, max_message_size_);
524  this->Op4::FinishOp(status, max_message_size_);
525  this->Op5::FinishOp(status, max_message_size_);
526  this->Op6::FinishOp(status, max_message_size_);
527  *tag = return_tag_;
528  return true;
529  }
530 
531  void set_output_tag(void* return_tag) { return_tag_ = return_tag; }
532 
533  private:
534  void* return_tag_;
535 };
536 
541 template <class Op1 = CallNoOp<1>, class Op2 = CallNoOp<2>,
542  class Op3 = CallNoOp<3>, class Op4 = CallNoOp<4>,
543  class Op5 = CallNoOp<5>, class Op6 = CallNoOp<6>>
544 class SneakyCallOpSet : public CallOpSet<Op1, Op2, Op3, Op4, Op5, Op6> {
545  public:
546  bool FinalizeResult(void** tag, bool* status) GRPC_OVERRIDE {
548  return Base::FinalizeResult(tag, status) && false;
549  }
550 };
551 
552 // Channel and Server implement this to allow them to hook performing ops
553 class CallHook {
554  public:
555  virtual ~CallHook() {}
556  virtual void PerformOpsOnCall(CallOpSetInterface* ops, Call* call) = 0;
557 };
558 
559 // Straightforward wrapping of the C call object
561  public:
562  /* call is owned by the caller */
563  Call(grpc_call* call, CallHook* call_hook_, CompletionQueue* cq);
564  Call(grpc_call* call, CallHook* call_hook_, CompletionQueue* cq,
565  int max_message_size);
566 
567  void PerformOps(CallOpSetInterface* ops);
568 
569  grpc_call* call() { return call_; }
570  CompletionQueue* cq() { return cq_; }
571 
572  int max_message_size() { return max_message_size_; }
573 
574  private:
575  CallHook* call_hook_;
576  CompletionQueue* cq_;
577  grpc_call* call_;
578  int max_message_size_;
579 };
580 
581 } // namespace grpc
582 
583 #endif // GRPCXX_IMPL_CALL_H
void ServerSendStatus(const std::multimap< grpc::string, grpc::string > &trailing_metadata, const Status &status)
Definition: call.h:357
Call(grpc_call *call, CallHook *call_hook_, CompletionQueue *cq)
CallOpRecvInitialMetadata()
Definition: call.h:398
void RecvMessage(R *message)
Definition: call.h:294
An interface allowing implementors to process and filter event tags.
Definition: completion_queue.h:192
WriteOptions & clear_buffer_hint()
Clears flag indicating that the write may be buffered and need not go out on the wire immediately...
Definition: call.h:112
Default argument for CallOpSet.
Definition: call.h:141
void AddOp(grpc_op *ops, size_t *nops)
Definition: call.h:340
CallOpServerSendStatus()
Definition: call.h:355
void SendInitialMetadata(const std::multimap< grpc::string, grpc::string > &metadata)
Definition: call.h:151
WriteOptions & set_buffer_hint()
Sets flag indicating that the write may be buffered and need not go out on the wire immediately...
Definition: call.h:103
grpc::string error_message() const
Return the instance's error message.
Definition: status.h:64
CallOpSendMessage()
Definition: call.h:181
std::string string
Definition: config.h:112
void AddOp(grpc_op *ops, size_t *nops)
Definition: call.h:302
CompletionQueue * cq()
Definition: call.h:570
void FinishOp(bool *status, int max_message_size)
Definition: call.h:311
WriteOptions & clear_no_compression()
Clears flag for the disabling of compression for the next message write.
Definition: call.h:86
int max_message_size_
Definition: call.h:490
bool FinalizeResult(void **tag, bool *status) GRPC_OVERRIDE
Definition: call.h:546
An abstract collection of call ops, used to generate the grpc_call_op structure to pass down to the l...
Definition: call.h:478
Definition: call.h:426
void FinishOp(bool *status, int max_message_size)
Definition: call.h:347
void AddOp(grpc_op *ops, size_t *nops)
Definition: call.h:236
bool FinalizeResult(void **tag, bool *status) GRPC_OVERRIDE
Definition: call.h:520
void Clear()
Clear all flags.
Definition: call.h:70
void FinishOp(bool *status, int max_message_size)
Definition: call.h:203
void AddOp(grpc_op *ops, size_t *nops)
Definition: call.h:368
WriteOptions()
Definition: call.h:66
Definition: call.h:353
#define GRPC_FINAL
Definition: config.h:71
void FillOps(grpc_op *ops, size_t *nops) GRPC_OVERRIDE
Fills in grpc_op, starting from ops[*nops] and moving upwards.
Definition: call.h:511
grpc_metadata * FillMetadataArray(const std::multimap< grpc::string, grpc::string > &metadata)
grpc_call * call()
Definition: call.h:569
void AddOp(grpc_op *ops, size_t *nops)
Definition: call.h:159
WriteOptions & set_no_compression()
Sets flag for the disabling of compression for the next message write.
Definition: call.h:78
Definition: client_context.h:149
WriteOptions & operator=(const WriteOptions &rhs)
Definition: call.h:123
gpr_uint32 flags() const
Returns raw flags bitset.
Definition: call.h:73
void FinishOp(bool *status, int max_message_size)
Definition: call.h:454
Defines how to serialize and deserialize some type.
Definition: serialization_traits.h:64
Definition: call.h:179
bool send_
Definition: call.h:174
CallOpClientRecvStatus()
Definition: call.h:428
bool get_no_compression() const
Get value for the flag indicating whether compression for the next message write is forcefully disabl...
Definition: call.h:95
Status Deserialize(grpc_byte_buffer *buf, int max_message_size) GRPC_OVERRIDE
Definition: call.h:279
CallOpSet()
Definition: call.h:510
void FinishOp(bool *status, int max_message_size)
Definition: call.h:382
Definition: call.h:333
CallOpSendInitialMetadata()
Definition: call.h:149
void FillMetadataMap(grpc_metadata_array *arr, std::multimap< grpc::string_ref, grpc::string_ref > *metadata)
void AddOp(grpc_op *ops, size_t *nops)
Definition: call.h:436
Definition: call.h:560
void AddOp(grpc_op *ops, size_t *nops)
Definition: call.h:143
void FinishOp(bool *status, int max_message_size)
Definition: call.h:415
CallOpSetInterface()
Definition: call.h:480
WriteOptions(const WriteOptions &other)
Definition: call.h:67
Primary implementaiton of CallOpSetInterface.
Definition: call.h:502
void ClientSendClose()
Definition: call.h:337
Definition: call.h:227
int max_message_size()
Definition: call.h:572
Per-message write options.
Definition: call.h:64
CallOpClientSendClose()
Definition: call.h:335
bool get_buffer_hint() const
Get value for the flag indicating that the write may be buffered and need not go out on the wire imme...
Definition: call.h:121
CallOpRecvMessage()
Definition: call.h:229
StatusCode error_code() const
Return the instance's error code.
Definition: status.h:62
A thin wrapper around grpc_completion_queue (see / src/core/surface/completion_queue.h).
Definition: completion_queue.h:81
Status SendMessage(const M &message, const WriteOptions &options) GRPC_MUST_USE_RESULT
Send message using options for the write.
Definition: call.h:215
virtual void PerformOpsOnCall(CallOpSetInterface *ops, Call *call)=0
void FinishOp(bool *status, int max_message_size)
Definition: call.h:144
bool got_message
Definition: call.h:233
void ClientRecvStatus(ClientContext *context, Status *status)
Definition: call.h:430
void PerformOps(CallOpSetInterface *ops)
void FinishOp(bool *status, int max_message_size)
Definition: call.h:245
void set_max_message_size(int max_message_size)
Definition: call.h:485
DeserializeFuncType(R *message)
Definition: call.h:278
Did it work? If it didn't, why?
Definition: status.h:45
Definition: call.h:147
virtual Status Deserialize(grpc_byte_buffer *buf, int max_message_size)=0
void AddOp(grpc_op *ops, size_t *nops)
Definition: call.h:406
void RecvMessage(R *message)
Definition: call.h:231
CallOpGenericRecvMessage()
Definition: call.h:291
bool got_message
Definition: call.h:299
A CallOpSet that does not post completions to the completion queue.
Definition: call.h:544
virtual void FillOps(grpc_op *ops, size_t *nops)=0
Fills in grpc_op, starting from ops[*nops] and moving upwards.
void set_output_tag(void *return_tag)
Definition: call.h:531
size_t initial_metadata_count_
Definition: call.h:175
#define GRPC_OVERRIDE
Definition: config.h:77
Definition: call.h:553
void RecvInitialMetadata(ClientContext *context)
Definition: call.h:400
Definition: call.h:396
void AddOp(grpc_op *ops, size_t *nops)
Definition: call.h:193
grpc_metadata * initial_metadata_
Definition: call.h:176
void FinishOp(bool *status, int max_message_size)
Definition: call.h:168
Definition: call.h:289
virtual ~CallHook()
Definition: call.h:555