THRIFT-210. c#: Add support for TFramedTransport
authorEsteve Fernandez <esteve@apache.org>
Wed, 11 Nov 2009 18:32:25 +0000 (18:32 +0000)
committerEsteve Fernandez <esteve@apache.org>
Wed, 11 Nov 2009 18:32:25 +0000 (18:32 +0000)
author: Michael Greene (euphoria)

git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@835006 13f79535-47bb-0310-9956-ffa450edef68

lib/csharp/Makefile.am
lib/csharp/src/Thrift.csproj
lib/csharp/src/Transport/TFramedTransport.cs [new file with mode: 0644]

index 4047011..039db74 100644 (file)
@@ -42,6 +42,7 @@ THRIFTCODE= \
             src/Transport/TSocket.cs \
             src/Transport/TTransportException.cs \
             src/Transport/TStreamTransport.cs \
+            src/Transport/TFramedTransport.cs \
             src/Transport/TServerTransport.cs \
             src/Transport/TServerSocket.cs \
             src/Transport/TTransportFactory.cs \
index f38d315..b7e2108 100644 (file)
@@ -58,6 +58,7 @@
     <Compile Include="TApplicationException.cs" />
     <Compile Include="TProcessor.cs" />
     <Compile Include="Transport\TBufferedTransport.cs" />
+    <Compile Include="Transport\TFramedTransport.cs" />
     <Compile Include="Transport\TServerSocket.cs" />
     <Compile Include="Transport\TServerTransport.cs" />
     <Compile Include="Transport\TSocket.cs" />
@@ -70,4 +71,4 @@
   <ProjectExtensions>
     <VisualStudio AllowExistingFolder="true" />
   </ProjectExtensions>
-</Project>
\ No newline at end of file
+</Project>
diff --git a/lib/csharp/src/Transport/TFramedTransport.cs b/lib/csharp/src/Transport/TFramedTransport.cs
new file mode 100644 (file)
index 0000000..b7ad5f2
--- /dev/null
@@ -0,0 +1,114 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+using System.IO;
+
+namespace Thrift.Transport
+{
+       public class TFramedTransport : TTransport
+       {
+               protected TTransport transport = null;
+               protected MemoryStream writeBuffer = new MemoryStream(1024);
+               protected MemoryStream readBuffer = null;
+
+               public class Factory : TTransportFactory
+               {
+                       public override TTransport GetTransport(TTransport trans)
+                       {
+                               return new TFramedTransport(trans);
+                       }
+               }
+
+               public TFramedTransport(TTransport transport)
+               {
+                       this.transport = transport;
+               }
+
+               public override void Open()
+               {
+                       transport.Open();
+               }
+
+               public override bool IsOpen
+               {
+                       get
+                       {
+                               return transport.IsOpen;
+                       }
+               }
+
+               public override void Close()
+               {
+                       transport.Close();
+               }
+
+               public override int Read(byte[] buf, int off, int len)
+               {
+                       if (readBuffer != null)
+                       {
+                               int got = readBuffer.Read(buf, off, len);
+                               if (got > 0)
+                               {
+                                       return got;
+                               }
+                       }
+
+                       // Read another frame of data
+                       ReadFrame();
+
+                       return readBuffer.Read(buf, off, len);
+               }
+
+               private void ReadFrame()
+               {
+                       byte[] i32rd = new byte[4];
+                       transport.ReadAll(i32rd, 0, 4);
+                       int size =
+                               ((i32rd[0] & 0xff) << 24) |
+                               ((i32rd[1] & 0xff) << 16) |
+                               ((i32rd[2] & 0xff) <<  8) |
+                               ((i32rd[3] & 0xff));
+
+                       byte[] buff = new byte[size];
+                       transport.ReadAll(buff, 0, size);
+                       readBuffer = new MemoryStream(buff);
+               }
+
+               public override void Write(byte[] buf, int off, int len)
+               {
+                       writeBuffer.Write(buf, off, len);
+               }
+
+               public override void Flush()
+               {
+                       byte[] buf = writeBuffer.GetBuffer();
+                       int len = (int)writeBuffer.Length;
+                       writeBuffer = new MemoryStream(writeBuffer.Capacity);
+
+                       byte[] i32out = new byte[4];
+                       i32out[0] = (byte)(0xff & (len >> 24));
+                       i32out[1] = (byte)(0xff & (len >> 16));
+                       i32out[2] = (byte)(0xff & (len >> 8));
+                       i32out[3] = (byte)(0xff & (len));
+                       transport.Write(i32out, 0, 4);
+                       transport.Write(buf, 0, len);
+                       transport.Flush();
+               }
+       }
+}