|
|
|
@ -349,6 +349,28 @@ class CallOpRecvMessage { |
|
|
|
|
bool allow_not_getting_message_; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
namespace CallOpGenericRecvMessageHelper { |
|
|
|
|
class DeserializeFunc { |
|
|
|
|
public: |
|
|
|
|
virtual Status Deserialize(grpc_byte_buffer* buf) = 0; |
|
|
|
|
virtual ~DeserializeFunc() {} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
template <class R> |
|
|
|
|
class DeserializeFuncType final : public DeserializeFunc { |
|
|
|
|
public: |
|
|
|
|
DeserializeFuncType(R* message) : message_(message) {} |
|
|
|
|
Status Deserialize(grpc_byte_buffer* buf) override { |
|
|
|
|
return SerializationTraits<R>::Deserialize(buf, message_); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
~DeserializeFuncType() override {} |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
R* message_; // Not a managed pointer because management is external to this
|
|
|
|
|
}; |
|
|
|
|
} // namespace CallOpGenericRecvMessageHelper
|
|
|
|
|
|
|
|
|
|
class CallOpGenericRecvMessage { |
|
|
|
|
public: |
|
|
|
|
CallOpGenericRecvMessage() |
|
|
|
@ -356,9 +378,11 @@ class CallOpGenericRecvMessage { |
|
|
|
|
|
|
|
|
|
template <class R> |
|
|
|
|
void RecvMessage(R* message) { |
|
|
|
|
deserialize_ = [message](grpc_byte_buffer* buf) -> Status { |
|
|
|
|
return SerializationTraits<R>::Deserialize(buf, message); |
|
|
|
|
}; |
|
|
|
|
// Use an explicit base class pointer to avoid resolution error in the
|
|
|
|
|
// following unique_ptr::reset for some old implementations.
|
|
|
|
|
CallOpGenericRecvMessageHelper::DeserializeFunc* func = |
|
|
|
|
new CallOpGenericRecvMessageHelper::DeserializeFuncType<R>(message); |
|
|
|
|
deserialize_.reset(func); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Do not change status if no message is received.
|
|
|
|
@ -381,7 +405,7 @@ class CallOpGenericRecvMessage { |
|
|
|
|
if (recv_buf_) { |
|
|
|
|
if (*status) { |
|
|
|
|
got_message = true; |
|
|
|
|
*status = deserialize_(recv_buf_).ok(); |
|
|
|
|
*status = deserialize_->Deserialize(recv_buf_).ok(); |
|
|
|
|
} else { |
|
|
|
|
got_message = false; |
|
|
|
|
g_core_codegen_interface->grpc_byte_buffer_destroy(recv_buf_); |
|
|
|
@ -392,12 +416,11 @@ class CallOpGenericRecvMessage { |
|
|
|
|
*status = false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
deserialize_ = DeserializeFunc(); |
|
|
|
|
deserialize_.reset(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
typedef std::function<Status(grpc_byte_buffer*)> DeserializeFunc; |
|
|
|
|
DeserializeFunc deserialize_; |
|
|
|
|
std::unique_ptr<CallOpGenericRecvMessageHelper::DeserializeFunc> deserialize_; |
|
|
|
|
grpc_byte_buffer* recv_buf_; |
|
|
|
|
bool allow_not_getting_message_; |
|
|
|
|
}; |
|
|
|
|