mirror of https://github.com/grpc/grpc.git
commit
2d11c93ab5
49 changed files with 1466 additions and 1073 deletions
@ -0,0 +1,144 @@ |
|||||||
|
/*
|
||||||
|
* |
||||||
|
* Copyright 2015, Google Inc. |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are |
||||||
|
* met: |
||||||
|
* |
||||||
|
* * Redistributions of source code must retain the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer. |
||||||
|
* * Redistributions in binary form must reproduce the above |
||||||
|
* copyright notice, this list of conditions and the following disclaimer |
||||||
|
* in the documentation and/or other materials provided with the |
||||||
|
* distribution. |
||||||
|
* * Neither the name of Google Inc. nor the names of its |
||||||
|
* contributors may be used to endorse or promote products derived from |
||||||
|
* this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef __GRPCPP_ASYNC_UNARY_CALL_H__ |
||||||
|
#define __GRPCPP_ASYNC_UNARY_CALL_H__ |
||||||
|
|
||||||
|
#include <grpc++/channel_interface.h> |
||||||
|
#include <grpc++/client_context.h> |
||||||
|
#include <grpc++/completion_queue.h> |
||||||
|
#include <grpc++/server_context.h> |
||||||
|
#include <grpc++/impl/call.h> |
||||||
|
#include <grpc++/impl/service_type.h> |
||||||
|
#include <grpc++/status.h> |
||||||
|
#include <grpc/support/log.h> |
||||||
|
|
||||||
|
namespace grpc { |
||||||
|
template <class R> |
||||||
|
class ClientAsyncResponseReader final { |
||||||
|
public: |
||||||
|
ClientAsyncResponseReader(ChannelInterface* channel, CompletionQueue* cq, |
||||||
|
const RpcMethod& method, ClientContext* context, |
||||||
|
const google::protobuf::Message& request, void* tag) |
||||||
|
: context_(context), |
||||||
|
call_(channel->CreateCall(method, context, cq)) { |
||||||
|
init_buf_.Reset(tag); |
||||||
|
init_buf_.AddSendInitialMetadata(&context->send_initial_metadata_); |
||||||
|
init_buf_.AddSendMessage(request); |
||||||
|
init_buf_.AddClientSendClose(); |
||||||
|
call_.PerformOps(&init_buf_); |
||||||
|
} |
||||||
|
|
||||||
|
void ReadInitialMetadata(void* tag) { |
||||||
|
GPR_ASSERT(!context_->initial_metadata_received_); |
||||||
|
|
||||||
|
meta_buf_.Reset(tag); |
||||||
|
meta_buf_.AddRecvInitialMetadata(context_); |
||||||
|
call_.PerformOps(&meta_buf_); |
||||||
|
} |
||||||
|
|
||||||
|
void Finish(R* msg, Status* status, void* tag) { |
||||||
|
finish_buf_.Reset(tag); |
||||||
|
if (!context_->initial_metadata_received_) { |
||||||
|
finish_buf_.AddRecvInitialMetadata(context_); |
||||||
|
} |
||||||
|
finish_buf_.AddRecvMessage(msg); |
||||||
|
finish_buf_.AddClientRecvStatus(context_, status); |
||||||
|
call_.PerformOps(&finish_buf_); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private: |
||||||
|
ClientContext* context_ = nullptr; |
||||||
|
Call call_; |
||||||
|
CallOpBuffer init_buf_; |
||||||
|
CallOpBuffer meta_buf_; |
||||||
|
CallOpBuffer finish_buf_; |
||||||
|
}; |
||||||
|
|
||||||
|
template <class W> |
||||||
|
class ServerAsyncResponseWriter final : public ServerAsyncStreamingInterface { |
||||||
|
public: |
||||||
|
explicit ServerAsyncResponseWriter(ServerContext* ctx) |
||||||
|
: call_(nullptr, nullptr, nullptr), ctx_(ctx) {} |
||||||
|
|
||||||
|
void SendInitialMetadata(void* tag) { |
||||||
|
GPR_ASSERT(!ctx_->sent_initial_metadata_); |
||||||
|
|
||||||
|
meta_buf_.Reset(tag); |
||||||
|
meta_buf_.AddSendInitialMetadata(&ctx_->initial_metadata_); |
||||||
|
ctx_->sent_initial_metadata_ = true; |
||||||
|
call_.PerformOps(&meta_buf_); |
||||||
|
} |
||||||
|
|
||||||
|
void Finish(const W& msg, const Status& status, void* tag) { |
||||||
|
finish_buf_.Reset(tag); |
||||||
|
if (!ctx_->sent_initial_metadata_) { |
||||||
|
finish_buf_.AddSendInitialMetadata(&ctx_->initial_metadata_); |
||||||
|
ctx_->sent_initial_metadata_ = true; |
||||||
|
} |
||||||
|
// The response is dropped if the status is not OK.
|
||||||
|
if (status.IsOk()) { |
||||||
|
finish_buf_.AddSendMessage(msg); |
||||||
|
} |
||||||
|
bool cancelled = false; |
||||||
|
finish_buf_.AddServerRecvClose(&cancelled); |
||||||
|
finish_buf_.AddServerSendStatus(&ctx_->trailing_metadata_, status); |
||||||
|
call_.PerformOps(&finish_buf_); |
||||||
|
} |
||||||
|
|
||||||
|
void FinishWithError(const Status& status, void* tag) { |
||||||
|
GPR_ASSERT(!status.IsOk()); |
||||||
|
finish_buf_.Reset(tag); |
||||||
|
if (!ctx_->sent_initial_metadata_) { |
||||||
|
finish_buf_.AddSendInitialMetadata(&ctx_->initial_metadata_); |
||||||
|
ctx_->sent_initial_metadata_ = true; |
||||||
|
} |
||||||
|
bool cancelled = false; |
||||||
|
finish_buf_.AddServerRecvClose(&cancelled); |
||||||
|
finish_buf_.AddServerSendStatus(&ctx_->trailing_metadata_, status); |
||||||
|
call_.PerformOps(&finish_buf_); |
||||||
|
} |
||||||
|
|
||||||
|
private: |
||||||
|
void BindCall(Call* call) override { call_ = *call; } |
||||||
|
|
||||||
|
Call call_; |
||||||
|
ServerContext* ctx_; |
||||||
|
CallOpBuffer meta_buf_; |
||||||
|
CallOpBuffer finish_buf_; |
||||||
|
}; |
||||||
|
|
||||||
|
} // namespace grpc
|
||||||
|
|
||||||
|
#endif // __GRPCPP_ASYNC_UNARY_CALL_H__
|
@ -0,0 +1,96 @@ |
|||||||
|
#region Copyright notice and license |
||||||
|
|
||||||
|
// Copyright 2015, Google Inc. |
||||||
|
// All rights reserved. |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
#endregion |
||||||
|
|
||||||
|
using System; |
||||||
|
using System.Runtime.InteropServices; |
||||||
|
using Google.GRPC.Core; |
||||||
|
|
||||||
|
namespace Google.GRPC.Core.Internal |
||||||
|
{ |
||||||
|
/// <summary> |
||||||
|
/// Not owned version of |
||||||
|
/// grpcsharp_batch_context |
||||||
|
/// </summary> |
||||||
|
internal class BatchContextSafeHandleNotOwned : SafeHandleZeroIsInvalid |
||||||
|
{ |
||||||
|
[DllImport("grpc_csharp_ext.dll")] |
||||||
|
static extern IntPtr grpcsharp_batch_context_recv_message_length(BatchContextSafeHandleNotOwned ctx); |
||||||
|
|
||||||
|
[DllImport("grpc_csharp_ext.dll")] |
||||||
|
static extern void grpcsharp_batch_context_recv_message_to_buffer(BatchContextSafeHandleNotOwned ctx, byte[] buffer, UIntPtr bufferLen); |
||||||
|
|
||||||
|
[DllImport("grpc_csharp_ext.dll")] |
||||||
|
static extern StatusCode grpcsharp_batch_context_recv_status_on_client_status(BatchContextSafeHandleNotOwned ctx); |
||||||
|
|
||||||
|
[DllImport("grpc_csharp_ext.dll")] |
||||||
|
static extern IntPtr grpcsharp_batch_context_recv_status_on_client_details(BatchContextSafeHandleNotOwned ctx); // returns const char* |
||||||
|
|
||||||
|
[DllImport("grpc_csharp_ext.dll")] |
||||||
|
static extern CallSafeHandle grpcsharp_batch_context_server_rpc_new_call(BatchContextSafeHandleNotOwned ctx); |
||||||
|
|
||||||
|
[DllImport("grpc_csharp_ext.dll")] |
||||||
|
static extern IntPtr grpcsharp_batch_context_server_rpc_new_method(BatchContextSafeHandleNotOwned ctx); // returns const char* |
||||||
|
|
||||||
|
public BatchContextSafeHandleNotOwned(IntPtr handle) : base(false) |
||||||
|
{ |
||||||
|
SetHandle(handle); |
||||||
|
} |
||||||
|
|
||||||
|
public Status GetReceivedStatus() |
||||||
|
{ |
||||||
|
// TODO: can the native method return string directly? |
||||||
|
string details = Marshal.PtrToStringAnsi(grpcsharp_batch_context_recv_status_on_client_details(this)); |
||||||
|
return new Status(grpcsharp_batch_context_recv_status_on_client_status(this), details); |
||||||
|
} |
||||||
|
|
||||||
|
public byte[] GetReceivedMessage() |
||||||
|
{ |
||||||
|
IntPtr len = grpcsharp_batch_context_recv_message_length(this); |
||||||
|
if (len == new IntPtr(-1)) |
||||||
|
{ |
||||||
|
return null; |
||||||
|
} |
||||||
|
byte[] data = new byte[(int) len]; |
||||||
|
grpcsharp_batch_context_recv_message_to_buffer(this, data, new UIntPtr((ulong)data.Length)); |
||||||
|
return data; |
||||||
|
} |
||||||
|
|
||||||
|
public CallSafeHandle GetServerRpcNewCall() { |
||||||
|
return grpcsharp_batch_context_server_rpc_new_call(this); |
||||||
|
} |
||||||
|
|
||||||
|
public string GetServerRpcNewMethod() { |
||||||
|
return Marshal.PtrToStringAnsi(grpcsharp_batch_context_server_rpc_new_method(this)); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -1,224 +0,0 @@ |
|||||||
#region Copyright notice and license |
|
||||||
|
|
||||||
// Copyright 2015, Google Inc. |
|
||||||
// All rights reserved. |
|
||||||
// |
|
||||||
// Redistribution and use in source and binary forms, with or without |
|
||||||
// modification, are permitted provided that the following conditions are |
|
||||||
// met: |
|
||||||
// |
|
||||||
// * Redistributions of source code must retain the above copyright |
|
||||||
// notice, this list of conditions and the following disclaimer. |
|
||||||
// * Redistributions in binary form must reproduce the above |
|
||||||
// copyright notice, this list of conditions and the following disclaimer |
|
||||||
// in the documentation and/or other materials provided with the |
|
||||||
// distribution. |
|
||||||
// * Neither the name of Google Inc. nor the names of its |
|
||||||
// contributors may be used to endorse or promote products derived from |
|
||||||
// this software without specific prior written permission. |
|
||||||
// |
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
||||||
|
|
||||||
#endregion |
|
||||||
|
|
||||||
using System; |
|
||||||
using System.Runtime.InteropServices; |
|
||||||
using Google.GRPC.Core; |
|
||||||
|
|
||||||
namespace Google.GRPC.Core.Internal |
|
||||||
{ |
|
||||||
/// <summary> |
|
||||||
/// grpc_event from grpc/grpc.h |
|
||||||
/// </summary> |
|
||||||
internal class EventSafeHandle : SafeHandleZeroIsInvalid |
|
||||||
{ |
|
||||||
[DllImport("grpc_csharp_ext.dll")] |
|
||||||
static extern void grpcsharp_event_finish(IntPtr ev); |
|
||||||
|
|
||||||
[DllImport("grpc_csharp_ext.dll")] |
|
||||||
static extern GRPCCompletionType grpcsharp_event_type(EventSafeHandle ev); |
|
||||||
|
|
||||||
[DllImport("grpc_csharp_ext.dll")] |
|
||||||
static extern CallSafeHandle grpcsharp_event_call(EventSafeHandle ev); |
|
||||||
|
|
||||||
[DllImport("grpc_csharp_ext.dll")] |
|
||||||
static extern GRPCOpError grpcsharp_event_write_accepted(EventSafeHandle ev); |
|
||||||
|
|
||||||
[DllImport("grpc_csharp_ext.dll")] |
|
||||||
static extern GRPCOpError grpcsharp_event_finish_accepted(EventSafeHandle ev); |
|
||||||
|
|
||||||
[DllImport("grpc_csharp_ext.dll")] |
|
||||||
static extern StatusCode grpcsharp_event_finished_status(EventSafeHandle ev); |
|
||||||
|
|
||||||
[DllImport("grpc_csharp_ext.dll")] |
|
||||||
static extern IntPtr grpcsharp_event_finished_details(EventSafeHandle ev); // returns const char* |
|
||||||
|
|
||||||
[DllImport("grpc_csharp_ext.dll")] |
|
||||||
static extern IntPtr grpcsharp_event_read_length(EventSafeHandle ev); |
|
||||||
|
|
||||||
[DllImport("grpc_csharp_ext.dll")] |
|
||||||
static extern void grpcsharp_event_read_copy_to_buffer(EventSafeHandle ev, byte[] buffer, UIntPtr bufferLen); |
|
||||||
|
|
||||||
[DllImport("grpc_csharp_ext.dll")] |
|
||||||
static extern IntPtr grpcsharp_event_server_rpc_new_method(EventSafeHandle ev); // returns const char* |
|
||||||
|
|
||||||
public GRPCCompletionType GetCompletionType() |
|
||||||
{ |
|
||||||
return grpcsharp_event_type(this); |
|
||||||
} |
|
||||||
|
|
||||||
public GRPCOpError GetWriteAccepted() |
|
||||||
{ |
|
||||||
return grpcsharp_event_write_accepted(this); |
|
||||||
} |
|
||||||
|
|
||||||
public GRPCOpError GetFinishAccepted() |
|
||||||
{ |
|
||||||
return grpcsharp_event_finish_accepted(this); |
|
||||||
} |
|
||||||
|
|
||||||
public Status GetFinished() |
|
||||||
{ |
|
||||||
// TODO: can the native method return string directly? |
|
||||||
string details = Marshal.PtrToStringAnsi(grpcsharp_event_finished_details(this)); |
|
||||||
return new Status(grpcsharp_event_finished_status(this), details); |
|
||||||
} |
|
||||||
|
|
||||||
public byte[] GetReadData() |
|
||||||
{ |
|
||||||
IntPtr len = grpcsharp_event_read_length(this); |
|
||||||
if (len == new IntPtr(-1)) |
|
||||||
{ |
|
||||||
return null; |
|
||||||
} |
|
||||||
byte[] data = new byte[(int) len]; |
|
||||||
grpcsharp_event_read_copy_to_buffer(this, data, new UIntPtr((ulong)data.Length)); |
|
||||||
return data; |
|
||||||
} |
|
||||||
|
|
||||||
public CallSafeHandle GetCall() { |
|
||||||
return grpcsharp_event_call(this); |
|
||||||
} |
|
||||||
|
|
||||||
public string GetServerRpcNewMethod() { |
|
||||||
// TODO: can the native method return string directly? |
|
||||||
return Marshal.PtrToStringAnsi(grpcsharp_event_server_rpc_new_method(this)); |
|
||||||
} |
|
||||||
|
|
||||||
//TODO: client_metadata_read event type |
|
||||||
|
|
||||||
protected override bool ReleaseHandle() |
|
||||||
{ |
|
||||||
grpcsharp_event_finish(handle); |
|
||||||
return true; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// TODO: this is basically c&p of EventSafeHandle. Unify! |
|
||||||
/// <summary> |
|
||||||
/// Not owned version of |
|
||||||
/// grpc_event from grpc/grpc.h |
|
||||||
/// </summary> |
|
||||||
internal class EventSafeHandleNotOwned : SafeHandleZeroIsInvalid |
|
||||||
{ |
|
||||||
[DllImport("grpc_csharp_ext.dll")] |
|
||||||
static extern void grpcsharp_event_finish(IntPtr ev); |
|
||||||
|
|
||||||
[DllImport("grpc_csharp_ext.dll")] |
|
||||||
static extern GRPCCompletionType grpcsharp_event_type(EventSafeHandleNotOwned ev); |
|
||||||
|
|
||||||
[DllImport("grpc_csharp_ext.dll")] |
|
||||||
static extern CallSafeHandle grpcsharp_event_call(EventSafeHandleNotOwned ev); |
|
||||||
|
|
||||||
[DllImport("grpc_csharp_ext.dll")] |
|
||||||
static extern GRPCOpError grpcsharp_event_write_accepted(EventSafeHandleNotOwned ev); |
|
||||||
|
|
||||||
[DllImport("grpc_csharp_ext.dll")] |
|
||||||
static extern GRPCOpError grpcsharp_event_finish_accepted(EventSafeHandleNotOwned ev); |
|
||||||
|
|
||||||
[DllImport("grpc_csharp_ext.dll")] |
|
||||||
static extern StatusCode grpcsharp_event_finished_status(EventSafeHandleNotOwned ev); |
|
||||||
|
|
||||||
[DllImport("grpc_csharp_ext.dll")] |
|
||||||
static extern IntPtr grpcsharp_event_finished_details(EventSafeHandleNotOwned ev); // returns const char* |
|
||||||
|
|
||||||
[DllImport("grpc_csharp_ext.dll")] |
|
||||||
static extern IntPtr grpcsharp_event_read_length(EventSafeHandleNotOwned ev); |
|
||||||
|
|
||||||
[DllImport("grpc_csharp_ext.dll")] |
|
||||||
static extern void grpcsharp_event_read_copy_to_buffer(EventSafeHandleNotOwned ev, byte[] buffer, UIntPtr bufferLen); |
|
||||||
|
|
||||||
[DllImport("grpc_csharp_ext.dll")] |
|
||||||
static extern IntPtr grpcsharp_event_server_rpc_new_method(EventSafeHandleNotOwned ev); // returns const char* |
|
||||||
|
|
||||||
public EventSafeHandleNotOwned() : base(false) |
|
||||||
{ |
|
||||||
} |
|
||||||
|
|
||||||
public EventSafeHandleNotOwned(IntPtr handle) : base(false) |
|
||||||
{ |
|
||||||
SetHandle(handle); |
|
||||||
} |
|
||||||
|
|
||||||
public GRPCCompletionType GetCompletionType() |
|
||||||
{ |
|
||||||
return grpcsharp_event_type(this); |
|
||||||
} |
|
||||||
|
|
||||||
public GRPCOpError GetWriteAccepted() |
|
||||||
{ |
|
||||||
return grpcsharp_event_write_accepted(this); |
|
||||||
} |
|
||||||
|
|
||||||
public GRPCOpError GetFinishAccepted() |
|
||||||
{ |
|
||||||
return grpcsharp_event_finish_accepted(this); |
|
||||||
} |
|
||||||
|
|
||||||
public Status GetFinished() |
|
||||||
{ |
|
||||||
// TODO: can the native method return string directly? |
|
||||||
string details = Marshal.PtrToStringAnsi(grpcsharp_event_finished_details(this)); |
|
||||||
return new Status(grpcsharp_event_finished_status(this), details); |
|
||||||
} |
|
||||||
|
|
||||||
public byte[] GetReadData() |
|
||||||
{ |
|
||||||
IntPtr len = grpcsharp_event_read_length(this); |
|
||||||
if (len == new IntPtr(-1)) |
|
||||||
{ |
|
||||||
return null; |
|
||||||
} |
|
||||||
byte[] data = new byte[(int) len]; |
|
||||||
grpcsharp_event_read_copy_to_buffer(this, data, new UIntPtr((ulong)data.Length)); |
|
||||||
return data; |
|
||||||
} |
|
||||||
|
|
||||||
public CallSafeHandle GetCall() { |
|
||||||
return grpcsharp_event_call(this); |
|
||||||
} |
|
||||||
|
|
||||||
public string GetServerRpcNewMethod() { |
|
||||||
// TODO: can the native method return string directly? |
|
||||||
return Marshal.PtrToStringAnsi(grpcsharp_event_server_rpc_new_method(this)); |
|
||||||
} |
|
||||||
|
|
||||||
//TODO: client_metadata_read event type |
|
||||||
|
|
||||||
protected override bool ReleaseHandle() |
|
||||||
{ |
|
||||||
grpcsharp_event_finish(handle); |
|
||||||
return true; |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
Loading…
Reference in new issue