blob: 83d965debf12a097874e97f026195f91e5605a01 [file] [log] [blame]
Jan Tattermuscha7fff862015-02-13 11:08:08 -08001#region Copyright notice and license
Jan Tattermuschaf77b3d2015-02-13 11:22:21 -08002// Copyright 2015, Google Inc.
Jan Tattermuscha7fff862015-02-13 11:08:08 -08003// All rights reserved.
Craig Tiller190d3602015-02-18 09:23:38 -08004//
Jan Tattermuscha7fff862015-02-13 11:08:08 -08005// Redistribution and use in source and binary forms, with or without
6// modification, are permitted provided that the following conditions are
7// met:
Craig Tiller190d3602015-02-18 09:23:38 -08008//
Jan Tattermuscha7fff862015-02-13 11:08:08 -08009// * 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.
Craig Tiller190d3602015-02-18 09:23:38 -080018//
Jan Tattermuscha7fff862015-02-13 11:08:08 -080019// 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.
Jan Tattermuscha7fff862015-02-13 11:08:08 -080030#endregion
Jan Tattermuscha7608b02015-02-03 17:54:38 -080031using System;
32using System.Runtime.InteropServices;
33using System.Threading;
34using System.Threading.Tasks;
Jan Tattermusch30868622015-02-19 09:22:33 -080035using Grpc.Core.Internal;
Jan Tattermuscha7608b02015-02-03 17:54:38 -080036
Jan Tattermusch30868622015-02-19 09:22:33 -080037namespace Grpc.Core
Jan Tattermuscha7608b02015-02-03 17:54:38 -080038{
Jan Tattermusch15329232015-03-02 15:32:47 -080039 public class Channel : IDisposable
40 {
Jan Tattermuscha7608b02015-02-03 17:54:38 -080041 readonly ChannelSafeHandle handle;
42 readonly String target;
43
Jan Tattermusch15329232015-03-02 15:32:47 -080044 /// <summary>
45 /// Creates a channel.
46 /// </summary>
47 public Channel(string target, Credentials credentials = null, ChannelArgs channelArgs = null)
48 {
49 using (ChannelArgsSafeHandle nativeChannelArgs = CreateNativeChannelArgs(channelArgs))
50 {
51 if (credentials != null)
52 {
53 using (CredentialsSafeHandle nativeCredentials = credentials.ToNativeCredentials())
54 {
55 this.handle = ChannelSafeHandle.CreateSecure(nativeCredentials, target, nativeChannelArgs);
56 }
57 }
58 else
59 {
60 this.handle = ChannelSafeHandle.Create(target, nativeChannelArgs);
61 }
62 }
63 this.target = GetOverridenTarget(target, channelArgs);
64 }
Jan Tattermuscha7608b02015-02-03 17:54:38 -080065
66 internal ChannelSafeHandle Handle
67 {
68 get
69 {
70 return this.handle;
71 }
72 }
73
74 public string Target
75 {
76 get
77 {
78 return this.target;
79 }
80 }
81
82 public void Dispose()
83 {
84 Dispose(true);
85 GC.SuppressFinalize(this);
86 }
87
88 protected virtual void Dispose(bool disposing)
89 {
90 if (handle != null && !handle.IsInvalid)
91 {
92 handle.Dispose();
93 }
94 }
Jan Tattermusch15329232015-03-02 15:32:47 -080095
96 private static string GetOverridenTarget(string target, ChannelArgs args)
97 {
98 if (args != null && !string.IsNullOrEmpty(args.GetSslTargetNameOverride()))
99 {
100 return args.GetSslTargetNameOverride();
101 }
102 return target;
103 }
104
105 private static ChannelArgsSafeHandle CreateNativeChannelArgs(ChannelArgs args)
106 {
107 if (args == null)
108 {
109 return ChannelArgsSafeHandle.CreateNull();
110 }
111 return args.ToNativeChannelArgs();
112 }
113 }
Craig Tiller190d3602015-02-18 09:23:38 -0800114}