2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
19 * Contains some contributions under the Thrift Software License.
20 * Please see doc/old-thrift-license.txt in the Thrift distribution for
26 using Thrift.Transport;
28 namespace Thrift.Protocol
30 public abstract class TProtocol : IDisposable
32 private const int DEFAULT_RECURSION_DEPTH = 64;
34 protected TTransport trans;
35 protected int recursionLimit;
36 protected int recursionDepth;
38 protected TProtocol(TTransport trans)
41 this.recursionLimit = DEFAULT_RECURSION_DEPTH;
42 this.recursionDepth = 0;
45 public TTransport Transport
50 public int RecursionLimit
52 get { return recursionLimit; }
53 set { recursionLimit = value; }
56 public void IncrementRecursionDepth()
58 if (recursionDepth < recursionLimit)
61 throw new TProtocolException(TProtocolException.DEPTH_LIMIT, "Depth limit exceeded");
64 public void DecrementRecursionDepth()
69 #region " IDisposable Support "
70 private bool _IsDisposed;
78 protected virtual void Dispose(bool disposing)
84 if (trans is IDisposable)
85 (trans as IDisposable).Dispose();
92 public abstract void WriteMessageBegin(TMessage message);
93 public abstract void WriteMessageEnd();
94 public abstract void WriteStructBegin(TStruct struc);
95 public abstract void WriteStructEnd();
96 public abstract void WriteFieldBegin(TField field);
97 public abstract void WriteFieldEnd();
98 public abstract void WriteFieldStop();
99 public abstract void WriteMapBegin(TMap map);
100 public abstract void WriteMapEnd();
101 public abstract void WriteListBegin(TList list);
102 public abstract void WriteListEnd();
103 public abstract void WriteSetBegin(TSet set);
104 public abstract void WriteSetEnd();
105 public abstract void WriteBool(bool b);
106 public abstract void WriteByte(sbyte b);
107 public abstract void WriteI16(short i16);
108 public abstract void WriteI32(int i32);
109 public abstract void WriteI64(long i64);
110 public abstract void WriteDouble(double d);
111 public virtual void WriteString(string s)
113 WriteBinary(Encoding.UTF8.GetBytes(s));
115 public abstract void WriteBinary(byte[] b);
117 public abstract TMessage ReadMessageBegin();
118 public abstract void ReadMessageEnd();
119 public abstract TStruct ReadStructBegin();
120 public abstract void ReadStructEnd();
121 public abstract TField ReadFieldBegin();
122 public abstract void ReadFieldEnd();
123 public abstract TMap ReadMapBegin();
124 public abstract void ReadMapEnd();
125 public abstract TList ReadListBegin();
126 public abstract void ReadListEnd();
127 public abstract TSet ReadSetBegin();
128 public abstract void ReadSetEnd();
129 public abstract bool ReadBool();
130 public abstract sbyte ReadByte();
131 public abstract short ReadI16();
132 public abstract int ReadI32();
133 public abstract long ReadI64();
134 public abstract double ReadDouble();
135 public virtual string ReadString()
137 var buf = ReadBinary();
138 return Encoding.UTF8.GetString(buf, 0, buf.Length);
140 public abstract byte[] ReadBinary();