Calls.cs 4.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #region Copyright notice and license
  2. // Copyright 2015, Google Inc.
  3. // All rights reserved.
  4. //
  5. // Redistribution and use in source and binary forms, with or without
  6. // modification, are permitted provided that the following conditions are
  7. // met:
  8. //
  9. // * Redistributions of source code must retain the above copyright
  10. // notice, this list of conditions and the following disclaimer.
  11. // * Redistributions in binary form must reproduce the above
  12. // copyright notice, this list of conditions and the following disclaimer
  13. // in the documentation and/or other materials provided with the
  14. // distribution.
  15. // * Neither the name of Google Inc. nor the names of its
  16. // contributors may be used to endorse or promote products derived from
  17. // this software without specific prior written permission.
  18. //
  19. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  20. // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  21. // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  22. // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  23. // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  24. // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  25. // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  26. // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  27. // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  28. // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  29. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30. #endregion
  31. using System;
  32. using System.Threading;
  33. using System.Threading.Tasks;
  34. using Grpc.Core.Internal;
  35. namespace Grpc.Core
  36. {
  37. // NOTE: this class is work-in-progress
  38. /// <summary>
  39. /// Helper methods for generated stubs to make RPC calls.
  40. /// </summary>
  41. public static class Calls
  42. {
  43. public static TResponse BlockingUnaryCall<TRequest, TResponse>(Call<TRequest, TResponse> call, TRequest req, CancellationToken token)
  44. {
  45. var asyncCall = new AsyncCall<TRequest, TResponse>(call.RequestSerializer, call.ResponseDeserializer);
  46. return asyncCall.UnaryCall(call.Channel, call.MethodName, req);
  47. }
  48. public static async Task<TResponse> AsyncUnaryCall<TRequest, TResponse>(Call<TRequest, TResponse> call, TRequest req, CancellationToken token)
  49. {
  50. var asyncCall = new AsyncCall<TRequest, TResponse>(call.RequestSerializer, call.ResponseDeserializer);
  51. asyncCall.Initialize(call.Channel, GetCompletionQueue(), call.MethodName);
  52. return await asyncCall.UnaryCallAsync(req);
  53. }
  54. public static void AsyncServerStreamingCall<TRequest, TResponse>(Call<TRequest, TResponse> call, TRequest req, IObserver<TResponse> outputs, CancellationToken token)
  55. {
  56. var asyncCall = new AsyncCall<TRequest, TResponse>(call.RequestSerializer, call.ResponseDeserializer);
  57. asyncCall.Initialize(call.Channel, GetCompletionQueue(), call.MethodName);
  58. asyncCall.StartServerStreamingCall(req, outputs);
  59. }
  60. public static ClientStreamingAsyncResult<TRequest, TResponse> AsyncClientStreamingCall<TRequest, TResponse>(Call<TRequest, TResponse> call, CancellationToken token)
  61. {
  62. var asyncCall = new AsyncCall<TRequest, TResponse>(call.RequestSerializer, call.ResponseDeserializer);
  63. asyncCall.Initialize(call.Channel, GetCompletionQueue(), call.MethodName);
  64. var task = asyncCall.ClientStreamingCallAsync();
  65. var inputs = new ClientStreamingInputObserver<TRequest, TResponse>(asyncCall);
  66. return new ClientStreamingAsyncResult<TRequest, TResponse>(task, inputs);
  67. }
  68. public static TResponse BlockingClientStreamingCall<TRequest, TResponse>(Call<TRequest, TResponse> call, IObservable<TRequest> inputs, CancellationToken token)
  69. {
  70. throw new NotImplementedException();
  71. }
  72. public static IObserver<TRequest> DuplexStreamingCall<TRequest, TResponse>(Call<TRequest, TResponse> call, IObserver<TResponse> outputs, CancellationToken token)
  73. {
  74. var asyncCall = new AsyncCall<TRequest, TResponse>(call.RequestSerializer, call.ResponseDeserializer);
  75. asyncCall.Initialize(call.Channel, GetCompletionQueue(), call.MethodName);
  76. asyncCall.StartDuplexStreamingCall(outputs);
  77. return new ClientStreamingInputObserver<TRequest, TResponse>(asyncCall);
  78. }
  79. private static CompletionQueueSafeHandle GetCompletionQueue() {
  80. return GrpcEnvironment.ThreadPool.CompletionQueue;
  81. }
  82. }
  83. }