-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAStreamRpcConnection.cs
167 lines (149 loc) · 3.3 KB
/
AStreamRpcConnection.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
using StreamJsonRpc;
using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp6
{
public abstract class AStreamRpcConnection<TLocal, TRemote>
where TRemote : class
where TLocal : class
{
public event EventHandler Connecting;
public event EventHandler Connected;
public event EventHandler Disconnecting;
public event EventHandler Disconnected;
private CancellationTokenSource _cancellationTokenSource;
protected AStreamRpcConnection(TLocal instance)
{
Local = instance;
_cancellationTokenSource = new CancellationTokenSource();
}
public bool IsConnected { get; private set; }
public TLocal Local { get; private set; }
public TRemote Remote { get; private set; }
public void Start()
{
RunAsync().AsDisconnected();
}
public void Stop()
{
_cancellationTokenSource.Cancel();
}
public async Task RunAsync()
{
try
{
//try
//{
// using (TcpClient tcpClient = new TcpClient())
// {
// tcpClient.Client = _socket;
// using (var stream = tcpClient.GetStream())
// {
// await RunStreamAsync(stream);
// }
// }
//}
//finally
//{
// try
// {
// if (_socket != null)
// {
// if (_socket.Connected)
// {
// _socket.Disconnect(false);
// }
// _socket.Dispose();
// _socket = null;
// }
// }
// finally
// {
// }
//}
await RunInternalAsync();
}
finally
{
OnDisconnectedInternal();
}
}
protected abstract Task RunInternalAsync();
protected async Task RunStreamAsync(Stream stream)
{
using (JsonRpc rpc = new JsonRpc(stream))
{
rpc.Disconnected += (sender, e) => stream.Close();
CancellationToken token = _cancellationTokenSource.Token;
CancellationTokenRegistration cancellationTokenRegistration = token.Register(() => stream.Close());
{
if (await OnConnectingInternalAsync(rpc, _cancellationTokenSource.Token))
{
OnConnectedInternal();
await rpc.Completion;
OnDisconnectingInternal(rpc);
}
}
}
}
private Task<bool> OnConnectingInternalAsync(JsonRpc rpc, CancellationToken cancellationToken)
{
rpc.AddLocalRpcTarget(Local, new JsonRpcTargetOptions { NotifyClientOfEvents = true });
Remote = rpc.Attach<TRemote>();
rpc.StartListening();
try
{
return OnConnectingAsync(rpc, cancellationToken);
}
finally
{
Connecting?.Invoke(this, EventArgs.Empty);
}
}
private void OnConnectedInternal()
{
try
{
OnConnected();
}
finally
{
IsConnected = true;
Connected?.Invoke(this, EventArgs.Empty);
}
}
private void OnDisconnectedInternal()
{
Remote = null;
try
{
OnDisconnected();
}
finally
{
Disconnected?.Invoke(this, EventArgs.Empty);
}
}
private void OnDisconnectingInternal(JsonRpc rpc)
{
try
{
OnDisconnecting(rpc);
}
finally
{
IsConnected = false;
Disconnecting?.Invoke(this, EventArgs.Empty);
}
}
protected virtual Task<bool> OnConnectingAsync(JsonRpc rpc, CancellationToken cancellationToken)
{
return Task.FromResult(true);
}
protected virtual void OnDisconnected() { }
protected virtual void OnConnected() { }
protected virtual void OnDisconnecting(JsonRpc rpc) { }
}
}