1 // Licensed to the Apache Software Foundation(ASF) under one
2 // or more contributor license agreements.See the NOTICE file
3 // distributed with this work for additional information
4 // regarding copyright ownership.The ASF licenses this file
5 // to you under the Apache License, Version 2.0 (the
6 // "License"); you may not use this file except in compliance
7 // with the License. You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing,
12 // software distributed under the License is distributed on an
13 // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 // KIND, either express or implied. See the License for the
15 // specific language governing permissions and limitations
20 using System.Threading;
21 using System.Threading.Tasks;
22 using Thrift.Protocol.Entities;
23 using Thrift.Transport;
25 namespace Thrift.Protocol
27 // ReSharper disable once InconsistentNaming
28 public abstract class TProtocol : IDisposable
30 public const int DefaultRecursionDepth = 64;
31 private bool _isDisposed;
32 protected int RecursionDepth;
34 protected TTransport Trans;
36 protected TProtocol(TTransport trans)
39 RecursionLimit = DefaultRecursionDepth;
43 public TTransport Transport => Trans;
45 protected int RecursionLimit { get; set; }
52 public void IncrementRecursionDepth()
54 if (RecursionDepth < RecursionLimit)
60 throw new TProtocolException(TProtocolException.DEPTH_LIMIT, "Depth limit exceeded");
64 public void DecrementRecursionDepth()
69 protected virtual void Dispose(bool disposing)
75 (Trans as IDisposable)?.Dispose();
81 public virtual async Task WriteMessageBeginAsync(TMessage message)
83 await WriteMessageBeginAsync(message, CancellationToken.None);
86 public abstract Task WriteMessageBeginAsync(TMessage message, CancellationToken cancellationToken);
88 public virtual async Task WriteMessageEndAsync()
90 await WriteMessageEndAsync(CancellationToken.None);
93 public abstract Task WriteMessageEndAsync(CancellationToken cancellationToken);
95 public virtual async Task WriteStructBeginAsync(TStruct @struct)
97 await WriteStructBeginAsync(@struct, CancellationToken.None);
100 public abstract Task WriteStructBeginAsync(TStruct @struct, CancellationToken cancellationToken);
102 public virtual async Task WriteStructEndAsync()
104 await WriteStructEndAsync(CancellationToken.None);
107 public abstract Task WriteStructEndAsync(CancellationToken cancellationToken);
109 public virtual async Task WriteFieldBeginAsync(TField field)
111 await WriteFieldBeginAsync(field, CancellationToken.None);
114 public abstract Task WriteFieldBeginAsync(TField field, CancellationToken cancellationToken);
116 public virtual async Task WriteFieldEndAsync()
118 await WriteFieldEndAsync(CancellationToken.None);
121 public abstract Task WriteFieldEndAsync(CancellationToken cancellationToken);
123 public virtual async Task WriteFieldStopAsync()
125 await WriteFieldStopAsync(CancellationToken.None);
128 public abstract Task WriteFieldStopAsync(CancellationToken cancellationToken);
130 public virtual async Task WriteMapBeginAsync(TMap map)
132 await WriteMapBeginAsync(map, CancellationToken.None);
135 public abstract Task WriteMapBeginAsync(TMap map, CancellationToken cancellationToken);
137 public virtual async Task WriteMapEndAsync()
139 await WriteMapEndAsync(CancellationToken.None);
142 public abstract Task WriteMapEndAsync(CancellationToken cancellationToken);
144 public virtual async Task WriteListBeginAsync(TList list)
146 await WriteListBeginAsync(list, CancellationToken.None);
149 public abstract Task WriteListBeginAsync(TList list, CancellationToken cancellationToken);
151 public virtual async Task WriteListEndAsync()
153 await WriteListEndAsync(CancellationToken.None);
156 public abstract Task WriteListEndAsync(CancellationToken cancellationToken);
158 public virtual async Task WriteSetBeginAsync(TSet set)
160 await WriteSetBeginAsync(set, CancellationToken.None);
163 public abstract Task WriteSetBeginAsync(TSet set, CancellationToken cancellationToken);
165 public virtual async Task WriteSetEndAsync()
167 await WriteSetEndAsync(CancellationToken.None);
170 public abstract Task WriteSetEndAsync(CancellationToken cancellationToken);
172 public virtual async Task WriteBoolAsync(bool b)
174 await WriteBoolAsync(b, CancellationToken.None);
177 public abstract Task WriteBoolAsync(bool b, CancellationToken cancellationToken);
179 public virtual async Task WriteByteAsync(sbyte b)
181 await WriteByteAsync(b, CancellationToken.None);
184 public abstract Task WriteByteAsync(sbyte b, CancellationToken cancellationToken);
186 public virtual async Task WriteI16Async(short i16)
188 await WriteI16Async(i16, CancellationToken.None);
191 public abstract Task WriteI16Async(short i16, CancellationToken cancellationToken);
193 public virtual async Task WriteI32Async(int i32)
195 await WriteI32Async(i32, CancellationToken.None);
198 public abstract Task WriteI32Async(int i32, CancellationToken cancellationToken);
200 public virtual async Task WriteI64Async(long i64)
202 await WriteI64Async(i64, CancellationToken.None);
205 public abstract Task WriteI64Async(long i64, CancellationToken cancellationToken);
207 public virtual async Task WriteDoubleAsync(double d)
209 await WriteDoubleAsync(d, CancellationToken.None);
212 public abstract Task WriteDoubleAsync(double d, CancellationToken cancellationToken);
214 public virtual async Task WriteStringAsync(string s)
216 await WriteStringAsync(s, CancellationToken.None);
219 public virtual async Task WriteStringAsync(string s, CancellationToken cancellationToken)
221 var bytes = Encoding.UTF8.GetBytes(s);
222 await WriteBinaryAsync(bytes, cancellationToken);
225 public virtual async Task WriteBinaryAsync(byte[] bytes)
227 await WriteBinaryAsync(bytes, CancellationToken.None);
230 public abstract Task WriteBinaryAsync(byte[] bytes, CancellationToken cancellationToken);
232 public virtual async ValueTask<TMessage> ReadMessageBeginAsync()
234 return await ReadMessageBeginAsync(CancellationToken.None);
237 public abstract ValueTask<TMessage> ReadMessageBeginAsync(CancellationToken cancellationToken);
239 public virtual async Task ReadMessageEndAsync()
241 await ReadMessageEndAsync(CancellationToken.None);
244 public abstract Task ReadMessageEndAsync(CancellationToken cancellationToken);
246 public virtual async ValueTask<TStruct> ReadStructBeginAsync()
248 return await ReadStructBeginAsync(CancellationToken.None);
251 public abstract ValueTask<TStruct> ReadStructBeginAsync(CancellationToken cancellationToken);
253 public virtual async Task ReadStructEndAsync()
255 await ReadStructEndAsync(CancellationToken.None);
258 public abstract Task ReadStructEndAsync(CancellationToken cancellationToken);
260 public virtual async ValueTask<TField> ReadFieldBeginAsync()
262 return await ReadFieldBeginAsync(CancellationToken.None);
265 public abstract ValueTask<TField> ReadFieldBeginAsync(CancellationToken cancellationToken);
267 public virtual async Task ReadFieldEndAsync()
269 await ReadFieldEndAsync(CancellationToken.None);
272 public abstract Task ReadFieldEndAsync(CancellationToken cancellationToken);
274 public virtual async ValueTask<TMap> ReadMapBeginAsync()
276 return await ReadMapBeginAsync(CancellationToken.None);
279 public abstract ValueTask<TMap> ReadMapBeginAsync(CancellationToken cancellationToken);
281 public virtual async Task ReadMapEndAsync()
283 await ReadMapEndAsync(CancellationToken.None);
286 public abstract Task ReadMapEndAsync(CancellationToken cancellationToken);
288 public virtual async ValueTask<TList> ReadListBeginAsync()
290 return await ReadListBeginAsync(CancellationToken.None);
293 public abstract ValueTask<TList> ReadListBeginAsync(CancellationToken cancellationToken);
295 public virtual async Task ReadListEndAsync()
297 await ReadListEndAsync(CancellationToken.None);
300 public abstract Task ReadListEndAsync(CancellationToken cancellationToken);
302 public virtual async ValueTask<TSet> ReadSetBeginAsync()
304 return await ReadSetBeginAsync(CancellationToken.None);
307 public abstract ValueTask<TSet> ReadSetBeginAsync(CancellationToken cancellationToken);
309 public virtual async Task ReadSetEndAsync()
311 await ReadSetEndAsync(CancellationToken.None);
314 public abstract Task ReadSetEndAsync(CancellationToken cancellationToken);
316 public virtual async ValueTask<bool> ReadBoolAsync()
318 return await ReadBoolAsync(CancellationToken.None);
321 public abstract ValueTask<bool> ReadBoolAsync(CancellationToken cancellationToken);
323 public virtual async ValueTask<sbyte> ReadByteAsync()
325 return await ReadByteAsync(CancellationToken.None);
328 public abstract ValueTask<sbyte> ReadByteAsync(CancellationToken cancellationToken);
330 public virtual async ValueTask<short> ReadI16Async()
332 return await ReadI16Async(CancellationToken.None);
335 public abstract ValueTask<short> ReadI16Async(CancellationToken cancellationToken);
337 public virtual async ValueTask<int> ReadI32Async()
339 return await ReadI32Async(CancellationToken.None);
342 public abstract ValueTask<int> ReadI32Async(CancellationToken cancellationToken);
344 public virtual async ValueTask<long> ReadI64Async()
346 return await ReadI64Async(CancellationToken.None);
349 public abstract ValueTask<long> ReadI64Async(CancellationToken cancellationToken);
351 public virtual async ValueTask<double> ReadDoubleAsync()
353 return await ReadDoubleAsync(CancellationToken.None);
356 public abstract ValueTask<double> ReadDoubleAsync(CancellationToken cancellationToken);
358 public virtual async ValueTask<string> ReadStringAsync()
360 return await ReadStringAsync(CancellationToken.None);
363 public virtual async ValueTask<string> ReadStringAsync(CancellationToken cancellationToken)
365 var buf = await ReadBinaryAsync(cancellationToken);
366 return Encoding.UTF8.GetString(buf, 0, buf.Length);
369 public virtual async ValueTask<byte[]> ReadBinaryAsync()
371 return await ReadBinaryAsync(CancellationToken.None);
374 public abstract ValueTask<byte[]> ReadBinaryAsync(CancellationToken cancellationToken);