You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by je...@apache.org on 2020/02/28 18:21:36 UTC
[thrift] 01/02: THRIFT-4982 Remove deprecated C# bindings from the
code base Client: csharp Patch: Jens Geyer
This is an automated email from the ASF dual-hosted git repository.
jensg pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/thrift.git
commit 56700e469d5d0659994a3963ad5a111740cf8277
Author: Jens Geyer <je...@apache.org>
AuthorDate: Sat Feb 22 16:51:51 2020 +0100
THRIFT-4982 Remove deprecated C# bindings from the code base
Client: csharp
Patch: Jens Geyer
This closes #2027
---
.gitignore | 17 -
ApacheThrift.nuspec | 11 +-
CHANGES.md | 1 +
LANGUAGES.md | 22 -
Makefile.am | 2 +-
build/docker/old/debian-jessie/Dockerfile | 5 -
build/docker/old/debian-stretch/Dockerfile | 4 -
build/docker/old/ubuntu-artful/Dockerfile | 8 -
build/docker/old/ubuntu-trusty/Dockerfile | 4 -
build/docker/ubuntu-bionic/Dockerfile | 4 -
build/docker/ubuntu-disco/Dockerfile | 4 -
build/docker/ubuntu-xenial/Dockerfile | 8 -
build/veralign.sh | 36 +-
compiler/cpp/CMakeLists.txt | 1 -
compiler/cpp/Makefile.am | 1 -
compiler/cpp/compiler.vcxproj | 1 -
compiler/cpp/compiler.vcxproj.filters | 3 -
.../cpp/src/thrift/generate/t_csharp_generator.cc | 3261 --------------------
.../cpp/src/thrift/generate/t_netstd_generator.cc | 5 -
compiler/cpp/src/thrift/parse/t_program.h | 2 +-
compiler/cpp/src/thrift/thriftl.ll | 1 -
compiler/cpp/tests/CMakeLists.txt | 1 -
configure.ac | 31 -
contrib/Rebus/README.md | 5 +
contrib/Vagrantfile | 4 -
contrib/thrift.spec | 1 -
contrib/zeromq/README.md | 5 +
debian/control | 15 +-
debian/copyright | 62 +-
debian/rules | 8 +-
doc/install/debian.md | 4 +-
doc/specs/idl.md | 2 +-
lib/Makefile.am | 4 -
lib/cpp/test/OneWayTest.thrift | 1 -
lib/csharp/Makefile.am | 114 -
lib/csharp/README.md | 32 -
.../ThriftMSBuildTask/Properties/AssemblyInfo.cs | 60 -
lib/csharp/ThriftMSBuildTask/ThriftBuild.cs | 246 --
.../ThriftMSBuildTask/ThriftMSBuildTask.csproj | 118 -
lib/csharp/coding_standards.md | 6 -
lib/csharp/src/Collections/TCollections.cs | 94 -
lib/csharp/src/Collections/THashSet.cs | 160 -
lib/csharp/src/Net35/ExtensionsNet35.cs | 31 -
lib/csharp/src/Properties/AssemblyInfo.cs | 55 -
lib/csharp/src/Protocol/TAbstractBase.cs | 29 -
lib/csharp/src/Protocol/TBase.cs | 29 -
lib/csharp/src/Protocol/TBase64Utils.cs | 100 -
lib/csharp/src/Protocol/TBinaryProtocol.cs | 395 ---
lib/csharp/src/Protocol/TCompactProtocol.cs | 849 -----
lib/csharp/src/Protocol/TField.cs | 62 -
lib/csharp/src/Protocol/TJSONProtocol.cs | 1124 -------
lib/csharp/src/Protocol/TList.cs | 54 -
lib/csharp/src/Protocol/TMap.cs | 62 -
lib/csharp/src/Protocol/TMessage.cs | 62 -
lib/csharp/src/Protocol/TMessageType.cs | 31 -
lib/csharp/src/Protocol/TMultiplexedProcessor.cs | 183 --
lib/csharp/src/Protocol/TMultiplexedProtocol.cs | 103 -
lib/csharp/src/Protocol/TProtocol.cs | 142 -
lib/csharp/src/Protocol/TProtocolDecorator.cs | 261 --
lib/csharp/src/Protocol/TProtocolException.cs | 67 -
lib/csharp/src/Protocol/TProtocolFactory.cs | 33 -
lib/csharp/src/Protocol/TProtocolUtil.cs | 108 -
lib/csharp/src/Protocol/TSet.cs | 59 -
lib/csharp/src/Protocol/TStruct.cs | 46 -
lib/csharp/src/Protocol/TType.cs | 44 -
lib/csharp/src/Server/TServer.cs | 155 -
lib/csharp/src/Server/TServerEventHandler.cs | 53 -
lib/csharp/src/Server/TSimpleServer.cs | 180 --
lib/csharp/src/Server/TThreadPoolServer.cs | 295 --
lib/csharp/src/Server/TThreadedServer.cs | 282 --
lib/csharp/src/TApplicationException.cs | 146 -
lib/csharp/src/TAsyncProcessor.cs | 38 -
lib/csharp/src/TControllingHandler.cs | 29 -
lib/csharp/src/TException.cs | 40 -
lib/csharp/src/TProcessor.cs | 33 -
lib/csharp/src/TProcessorFactory.cs | 30 -
lib/csharp/src/TPrototypeProcessorFactory.cs | 55 -
lib/csharp/src/TSingletonProcessorFactory.cs | 43 -
lib/csharp/src/Thrift.45.csproj | 138 -
lib/csharp/src/Thrift.csproj | 166 -
lib/csharp/src/Thrift.sln | 47 -
lib/csharp/src/Transport/TBufferedTransport.cs | 194 --
lib/csharp/src/Transport/TFramedTransport.cs | 205 --
lib/csharp/src/Transport/THttpClient.cs | 486 ---
lib/csharp/src/Transport/THttpHandler.cs | 102 -
lib/csharp/src/Transport/THttpTaskAsyncHandler.cs | 97 -
lib/csharp/src/Transport/TMemoryBuffer.cs | 117 -
.../src/Transport/TNamedPipeClientTransport.cs | 111 -
.../src/Transport/TNamedPipeServerTransport.cs | 296 --
lib/csharp/src/Transport/TServerSocket.cs | 176 --
lib/csharp/src/Transport/TServerTransport.cs | 44 -
lib/csharp/src/Transport/TSilverlightSocket.cs | 393 ---
lib/csharp/src/Transport/TSocket.cs | 245 --
lib/csharp/src/Transport/TSocketVersionizer.cs | 78 -
lib/csharp/src/Transport/TStreamTransport.cs | 128 -
lib/csharp/src/Transport/TTLSServerSocket.cs | 223 --
lib/csharp/src/Transport/TTLSSocket.cs | 445 ---
lib/csharp/src/Transport/TTransport.cs | 146 -
lib/csharp/src/Transport/TTransportException.cs | 69 -
lib/csharp/src/Transport/TTransportFactory.cs | 42 -
lib/csharp/src/thrift.snk | Bin 596 -> 0 bytes
lib/csharp/test/JSON/JSONTest.csproj | 85 -
lib/csharp/test/JSON/Program.cs | 95 -
lib/csharp/test/JSON/Properties/AssemblyInfo.cs | 55 -
lib/csharp/test/JSON/app.config | 21 -
.../test/Multiplex/Client/Multiplex.Test.Client.cs | 82 -
.../test/Multiplex/Client/MultiplexClient.csproj | 148 -
.../Multiplex/Client/Properties/AssemblyInfo.cs | 55 -
lib/csharp/test/Multiplex/Makefile.am | 63 -
lib/csharp/test/Multiplex/Multiplex.Test.Common.cs | 40 -
.../test/Multiplex/Server/Multiplex.Test.Server.cs | 107 -
.../test/Multiplex/Server/MultiplexServer.csproj | 148 -
.../Multiplex/Server/Properties/AssemblyInfo.cs | 55 -
.../test/ThriftMVCTest/App_Start/FilterConfig.cs | 31 -
.../test/ThriftMVCTest/App_Start/RouteConfig.cs | 39 -
lib/csharp/test/ThriftMVCTest/AsyncHttpHandler.cs | 32 -
.../ThriftMVCTest/Controllers/HomeController.cs | 70 -
lib/csharp/test/ThriftMVCTest/Global.asax | 19 -
lib/csharp/test/ThriftMVCTest/Global.asax.cs | 34 -
.../test/ThriftMVCTest/Properties/AssemblyInfo.cs | 53 -
lib/csharp/test/ThriftMVCTest/SecondServiceImpl.cs | 37 -
lib/csharp/test/ThriftMVCTest/SyncHttpHandler.cs | 32 -
lib/csharp/test/ThriftMVCTest/ThriftMVCTest.csproj | 200 --
.../test/ThriftMVCTest/Views/Home/Index.cshtml | 25 -
.../test/ThriftMVCTest/Views/Shared/_Layout.cshtml | 30 -
lib/csharp/test/ThriftMVCTest/Views/Web.config | 60 -
.../test/ThriftMVCTest/Views/_ViewStart.cshtml | 22 -
lib/csharp/test/ThriftMVCTest/Web.Debug.config | 45 -
lib/csharp/test/ThriftMVCTest/Web.Release.config | 46 -
lib/csharp/test/ThriftMVCTest/Web.config | 92 -
lib/csharp/test/ThriftMVCTest/favicon.ico | Bin 32038 -> 0 bytes
lib/csharp/test/ThriftMVCTest/packages.config | 25 -
lib/netstd/Makefile.am | 2 +-
test/Makefile.am | 5 -
test/README.md | 2 +-
test/ThriftTest.thrift | 1 -
test/csharp/Makefile.am | 95 -
test/csharp/Program.cs | 71 -
test/csharp/Properties/AssemblyInfo.cs | 55 -
test/csharp/TestClient.cs | 870 ------
test/csharp/TestServer.cs | 535 ----
test/csharp/ThriftTest.csproj | 141 -
test/csharp/ThriftTest.sln | 17 -
test/features/known_failures_Linux.json | 12 +-
test/known_failures_Linux.json | 186 +-
test/netstd/Client/Program.cs | 15 +-
test/netstd/Makefile.am | 4 +-
test/netstd/Server/Program.cs | 15 +-
test/tests.json | 45 +-
tutorial/Makefile.am | 1 -
tutorial/csharp/CsharpClient/CsharpClient.cs | 92 -
tutorial/csharp/CsharpClient/CsharpClient.csproj | 110 -
.../csharp/CsharpClient/Properties/AssemblyInfo.cs | 55 -
tutorial/csharp/CsharpServer/CsharpServer.cs | 129 -
tutorial/csharp/CsharpServer/CsharpServer.csproj | 111 -
.../csharp/CsharpServer/Properties/AssemblyInfo.cs | 55 -
tutorial/csharp/tutorial.sln | 39 -
tutorial/netstd/Makefile.am | 2 +-
158 files changed, 269 insertions(+), 17872 deletions(-)
diff --git a/.gitignore b/.gitignore
index 4e2f427..58e2582 100644
--- a/.gitignore
+++ b/.gitignore
@@ -184,9 +184,6 @@ project.lock.json
/lib/c_glib/test/testserialization
/lib/c_glib/thriftc.pc
/lib/c_glib/thrift_c_glib.pc
-/lib/csharp/**/bin/
-/lib/csharp/**/obj/
-/lib/csharp/src/packages
/lib/d/test/*.pem
/lib/d/libthriftd*.a
/lib/d/test/async_test
@@ -234,8 +231,6 @@ project.lock.json
/lib/js/dist
/lib/js/doc
/lib/js/test/build
-/lib/netcore/**/bin
-/lib/netcore/**/obj
/lib/netstd/**/bin
/lib/netstd/**/obj
/lib/nodejs/coverage
@@ -313,8 +308,6 @@ project.lock.json
/test/cpp/StressTestNonBlocking
/test/cpp/TestClient
/test/cpp/TestServer
-/test/csharp/obj
-/test/csharp/bin
/test/dart/**/.dart_tool
/test/dart/**/.packages
/test/dart/**/packages
@@ -343,9 +336,6 @@ project.lock.json
/test/php/php_ext_dir/
/test/py.twisted/_trial_temp/
/test/rb/Gemfile.lock
-/test/netcore/**/bin
-/test/netcore/**/obj
-/test/netcore/Thrift
/test/netstd/**/bin
/test/netstd/**/obj
/test/netstd/*.psess
@@ -375,10 +365,6 @@ project.lock.json
/tutorial/cpp/TutorialServer
/tutorial/c_glib/tutorial_client
/tutorial/c_glib/tutorial_server
-/tutorial/csharp/CsharpServer/obj
-/tutorial/csharp/CsharpServer/bin
-/tutorial/csharp/CsharpClient/obj
-/tutorial/csharp/CsharpClient/bin
/tutorial/d/async_client
/tutorial/d/client
/tutorial/d/server
@@ -403,9 +389,6 @@ project.lock.json
/tutorial/hs/dist/
/tutorial/java/build/
/tutorial/js/build/
-/tutorial/netcore/**/bin
-/tutorial/netcore/**/obj
-/tutorial/netcore/Thrift
/tutorial/netstd/**/bin
/tutorial/netstd/**/obj
/tutorial/netstd/Interfaces
diff --git a/ApacheThrift.nuspec b/ApacheThrift.nuspec
index 6dc3225..61caf57 100644
--- a/ApacheThrift.nuspec
+++ b/ApacheThrift.nuspec
@@ -15,11 +15,9 @@
Instructions for building a nuget package:
- 1. Open Thrift.sln in lib\csharp\src and build the release version
- of the "Thrift" and "Thrift.45" projects.
- 2. Open Thrift.sln in lib\netstd and build the release version of
+ 1. Open Thrift.sln in lib\netstd and build the release version of
the "Thrift" project.
- 3. nuget setApiKey <your-api-key>
+ 2. nuget setApiKey <your-api-key>
3. nuget pack ApacheThrift.nuspec -Symbols -SymbolPackageFormat snupkg
4. nuget push ApacheThrift.0.14.0.nupkg -Source https://api.nuget.org/v3/index.json
-->
@@ -36,15 +34,12 @@
<requireLicenseAcceptance>true</requireLicenseAcceptance>
<summary>Apache Thrift .NET Library</summary>
<description>
- Contains runtime libraries from lib/csharp for net35 and net45 frameworks,
- and from lib/netstd for netstandard2.0 framework development.
+ Contains runtime libraries from lib/netstd for netstandard2.0 framework development.
</description>
<repository type="GitHub" url="https://github.com/apache/thrift" branch="release/0.14.0" />
<tags>Apache Thrift RPC</tags>
</metadata>
<files>
- <file src="lib\csharp\src\bin\Release\Thrift.*" target="lib\net35" />
- <file src="lib\csharp\src\bin\Release\Thrift45.*" target="lib\net45" />
<file src="lib\netstd\Thrift\bin\Release\netstandard2.0\*.*" target="lib\netstandard2.0" />
</files>
</package>
\ No newline at end of file
diff --git a/CHANGES.md b/CHANGES.md
index abd709b..10abcbb 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -6,6 +6,7 @@
- [THRIFT-4990](https://issues.apache.org/jira/browse/THRIFT-4990) - Upgrade to .NET Core 3.1 (LTS)
- [THRIFT-4981](https://issues.apache.org/jira/browse/THRIFT-4981) - Remove deprecated netcore bindings from the code base
+- [THRIFT-4982](https://issues.apache.org/jira/browse/THRIFT-4982) - Remove deprecated csharp bindings from the code base
- [THRIFT-5006](https://issues.apache.org/jira/browse/THRIFT-5006) - Implement DEFAULT_MAX_LENGTH at TFramedTransport
- [THRIFT-5069](https://issues.apache.org/jira/browse/THRIFT-5069) - In Go library TDeserializer.Transport is now typed \*TMemoryBuffer instead of TTransport
- [THRIFT-5072](https://issues.apache.org/jira/browse/THRIFT-5072) - Haskell generator fails to distinguish between multiple enum types with conflicting enum identifiers
diff --git a/LANGUAGES.md b/LANGUAGES.md
index afd7799..8db4172 100644
--- a/LANGUAGES.md
+++ b/LANGUAGES.md
@@ -91,17 +91,6 @@ Thrift's core protocol is TBinary, supported by all languages except for JavaScr
<td align=left><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22C%2B%2B%20-%20Compiler%22%2C%20%22C%2B%2B%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">C++</a></td>
</tr>
<tr align=center>
-<td align=left><a href="https://github.com/apache/thrift/blob/master/lib/csharp/README.md">C#</a></td>
-<!-- Since -----------------><td>0.2.0<br>Deprecated<br>use netstd</td>
-<!-- Build Systems ---------><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cred.png" alt=""/></td>
-<!-- Language Levels -------><td>.NET 3.5 / mono 3.2.8.0</td><td>.NET 4.6.1 / mono 4.6.2.7</td>
-<!-- Low-Level Transports --><td><img src="doc/images/cred.png" alt=""/></td><td><img src="doc/images/cred.png" alt=""/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td>
-<!-- Transport Wrappers ----><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cred.png" alt=""/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cred.png" alt=""/></td>
-<!-- Protocols -------------><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td>
-<!-- Servers ---------------><td><img src="doc/images/cred.png" alt=""/></td><td><img src="doc/images/cred.png" alt=""/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td>
-<td align=left><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22C%23%20-%20Compiler%22%2C%20%22C%23%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">C# (.NET)</a></td>
-</tr>
-<tr align=center>
<td align=left><a href="https://github.com/apache/thrift/blob/master/lib/cl/README.md">Common LISP</a></td>
<!-- Since -----------------><td>0.12.0</td>
<!-- Build Systems ---------><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cred.png" alt=""/></td>
@@ -146,17 +135,6 @@ Thrift's core protocol is TBinary, supported by all languages except for JavaScr
<td align=left><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22Delphi%20-%20Compiler%22%2C%20%22Delphi%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">Delphi</a></td>
</tr>
<tr align=center>
-<td align=left><a href="https://github.com/apache/thrift/blob/master/lib/netcore/README.md">.NET Core</a></td>
-<!-- Since -----------------><td>0.11.0<br>Deprecated<br>use netstd</td>
-<!-- Build Systems ---------><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cred.png" alt=""/></td>
-<!-- Language Levels -------><td>2.1.4</td><td>2.2.101</td>
-<!-- Low-Level Transports --><td><img src="doc/images/cred.png" alt=""/></td><td><img src="doc/images/cred.png" alt=""/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td>
-<!-- Transport Wrappers ----><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cred.png" alt=""/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cred.png" alt=""/></td>
-<!-- Protocols -------------><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td>
-<!-- Servers ---------------><td><img src="doc/images/cred.png" alt=""/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cred.png" alt=""/></td><td><img src="doc/images/cred.png" alt=""/></td><td><img src="doc/images/cred.png" alt=""/></td>
-<td align=left><a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20THRIFT%20AND%20component%20in%20(%22netcore%20-%20Compiler%22%2C%20%22netcore%20-%20Library%22)%20and%20status%20not%20in%20(fixed%2C%20resolved%2C%20closed)">.NET Core</a></td>
-</tr>
-<tr align=center>
<td align=left><a href="https://github.com/apache/thrift/blob/master/lib/netstd/README.md">.NET Standard</a></td>
<!-- Since -----------------><td>0.13.0</td>
<!-- Build Systems ---------><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cred.png" alt=""/></td>
diff --git a/Makefile.am b/Makefile.am
index 5832077..f9d59ef 100755
--- a/Makefile.am
+++ b/Makefile.am
@@ -78,7 +78,7 @@ empty :=
space := $(empty) $(empty)
comma := ,
-CROSS_LANGS = @MAYBE_CPP@ @MAYBE_C_GLIB@ @MAYBE_CL@ @MAYBE_D@ @MAYBE_JAVA@ @MAYBE_CSHARP@ @MAYBE_PYTHON@ @MAYBE_PY3@ @MAYBE_RUBY@ @MAYBE_HASKELL@ @MAYBE_PERL@ @MAYBE_PHP@ @MAYBE_GO@ @MAYBE_NODEJS@ @MAYBE_DART@ @MAYBE_ERLANG@ @MAYBE_LUA@ @MAYBE_RS@ @MAYBE_NETSTD@ @MAYBE_NODETS@
+CROSS_LANGS = @MAYBE_CPP@ @MAYBE_C_GLIB@ @MAYBE_CL@ @MAYBE_D@ @MAYBE_JAVA@ @MAYBE_PYTHON@ @MAYBE_PY3@ @MAYBE_RUBY@ @MAYBE_HASKELL@ @MAYBE_PERL@ @MAYBE_PHP@ @MAYBE_GO@ @MAYBE_NODEJS@ @MAYBE_DART@ @MAYBE_ERLANG@ @MAYBE_LUA@ @MAYBE_RS@ @MAYBE_NETSTD@ @MAYBE_NODETS@
CROSS_LANGS_COMMA_SEPARATED = $(subst $(space),$(comma),$(CROSS_LANGS))
if WITH_PY3
diff --git a/build/docker/old/debian-jessie/Dockerfile b/build/docker/old/debian-jessie/Dockerfile
index 941b4bb..a49b207 100644
--- a/build/docker/old/debian-jessie/Dockerfile
+++ b/build/docker/old/debian-jessie/Dockerfile
@@ -125,11 +125,6 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
npm
RUN apt-get update && apt-get install -y --no-install-recommends \
-`# CSharp dependencies` \
- libmono-system-web2.0-cil \
- mono-devel
-
-RUN apt-get update && apt-get install -y --no-install-recommends \
`# D dependencies` \
xdg-utils \
`# Dart dependencies` \
diff --git a/build/docker/old/debian-stretch/Dockerfile b/build/docker/old/debian-stretch/Dockerfile
index 503eecd..48db7e1 100644
--- a/build/docker/old/debian-stretch/Dockerfile
+++ b/build/docker/old/debian-stretch/Dockerfile
@@ -77,10 +77,6 @@ RUN apt-get install -y --no-install-recommends \
qtbase5-dev-tools
RUN apt-get install -y --no-install-recommends \
-`# csharp (mono) dependencies` \
- mono-devel
-
-RUN apt-get install -y --no-install-recommends \
`# D dependencies` \
dmd-bin \
libevent-dev \
diff --git a/build/docker/old/ubuntu-artful/Dockerfile b/build/docker/old/ubuntu-artful/Dockerfile
index abe84d1..813ef06 100644
--- a/build/docker/old/ubuntu-artful/Dockerfile
+++ b/build/docker/old/ubuntu-artful/Dockerfile
@@ -39,10 +39,6 @@ RUN apt-get update && \
software-properties-common \
wget
-# csharp (mono) - if we ever want a later version
-# RUN echo "deb http://download.mono-project.com/repo/debian xenial main" | tee /etc/apt/sources.list.d/mono.list && \
-# apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A6A19B38D3D831EF
-
# Dart
RUN curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \
curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > \
@@ -89,10 +85,6 @@ RUN apt-get install -y --no-install-recommends \
qtbase5-dev \
qtbase5-dev-tools
-RUN apt-get install -y --no-install-recommends \
-`# csharp (mono) dependencies` \
- mono-devel
-
ENV SBCL_VERSION 1.4.5
RUN \
`# Common Lisp (sbcl) dependencies` \
diff --git a/build/docker/old/ubuntu-trusty/Dockerfile b/build/docker/old/ubuntu-trusty/Dockerfile
index a8e4d3b..96c1540 100644
--- a/build/docker/old/ubuntu-trusty/Dockerfile
+++ b/build/docker/old/ubuntu-trusty/Dockerfile
@@ -75,10 +75,6 @@ RUN apt-get install -y --no-install-recommends \
qtbase5-dev-tools
RUN apt-get install -y --no-install-recommends \
-`# csharp (mono) dependencies` \
- mono-devel
-
-RUN apt-get install -y --no-install-recommends \
`# D dependencies` \
dmd-bin=2.070.2-0 \
libphobos2-dev=2.070.2-0 \
diff --git a/build/docker/ubuntu-bionic/Dockerfile b/build/docker/ubuntu-bionic/Dockerfile
index fa8a2da..464af0b 100644
--- a/build/docker/ubuntu-bionic/Dockerfile
+++ b/build/docker/ubuntu-bionic/Dockerfile
@@ -89,10 +89,6 @@ RUN apt-get install -y --no-install-recommends \
qtbase5-dev \
qtbase5-dev-tools
-RUN apt-get install -y --no-install-recommends \
-`# csharp (mono) dependencies` \
- mono-devel
-
ENV SBCL_VERSION 1.5.3
RUN \
`# Common Lisp (sbcl) dependencies` \
diff --git a/build/docker/ubuntu-disco/Dockerfile b/build/docker/ubuntu-disco/Dockerfile
index fd9464b..247bcf1 100644
--- a/build/docker/ubuntu-disco/Dockerfile
+++ b/build/docker/ubuntu-disco/Dockerfile
@@ -89,10 +89,6 @@ RUN apt-get install -y --no-install-recommends \
qtbase5-dev \
qtbase5-dev-tools
-RUN apt-get install -y --no-install-recommends \
-`# csharp (mono) dependencies` \
- mono-devel
-
ENV SBCL_VERSION 1.5.3
RUN \
`# Common Lisp (sbcl) dependencies` \
diff --git a/build/docker/ubuntu-xenial/Dockerfile b/build/docker/ubuntu-xenial/Dockerfile
index af91e1b..fbbe1c2 100644
--- a/build/docker/ubuntu-xenial/Dockerfile
+++ b/build/docker/ubuntu-xenial/Dockerfile
@@ -37,10 +37,6 @@ RUN apt-get update && \
software-properties-common \
wget && \
-# csharp (mono)
-# echo "deb http://download.mono-project.com/repo/debian xenial main" | tee /etc/apt/sources.list.d/mono.list && \
-# apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A6A19B38D3D831EF && \
-
# D
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EBCF975E5BA24D5E && \
wget http://master.dl.sourceforge.net/project/d-apt/files/d-apt.list -O /etc/apt/sources.list.d/d-apt.list && \
@@ -94,10 +90,6 @@ RUN apt-get install -y --no-install-recommends \
qtbase5-dev \
qtbase5-dev-tools
-RUN apt-get install -y --no-install-recommends \
-`# csharp (mono) dependencies` \
- mono-devel
-
ENV D_VERSION 2.075.1-0
RUN apt-get install -y --allow-unauthenticated --no-install-recommends \
`# D dependencies` \
diff --git a/build/veralign.sh b/build/veralign.sh
index c15e001..422da85 100755
--- a/build/veralign.sh
+++ b/build/veralign.sh
@@ -49,24 +49,16 @@ FILES[doap.rdf]=manual
# These files can be updated automatically:
FILES[ApacheThrift.nuspec]=simpleReplace
-FILES[CMakeLists.txt]=simpleReplace
-FILES[Thrift.podspec]=simpleReplace
FILES[appveyor.yml]=simpleReplace
FILES[bower.json]=jsonReplace
-FILES[configure.ac]=configureReplace
+FILES[CMakeLists.txt]=simpleReplace
FILES[compiler/cpp/src/thrift/version.h]=simpleReplace
+FILES[configure.ac]=configureReplace
+FILES[contrib/Rebus/Properties/AssemblyInfo.cs]=simpleReplace
FILES[contrib/thrift.spec]=simpleReplace
+FILES[contrib/zeromq/csharp/AssemblyInfo.cs]=simpleReplace
FILES[doc/specs/idl.md]=simpleReplace
FILES[lib/as3/gradle.properties]=simpleReplace
-FILES[lib/csharp/ThriftMSBuildTask/Properties/AssemblyInfo.cs]=simpleReplace
-FILES[lib/csharp/ThriftMSBuildTask/ThriftMSBuildTask.csproj]=simpleReplace
-FILES[lib/csharp/src/Properties/AssemblyInfo.cs]=simpleReplace
-FILES[lib/csharp/src/Thrift.csproj]=simpleReplace
-FILES[lib/csharp/test/Multiplex/Client/MultiplexClient.csproj]=simpleReplace
-FILES[lib/csharp/test/Multiplex/Client/Properties/AssemblyInfo.cs]=simpleReplace
-FILES[lib/csharp/test/Multiplex/Server/MultiplexServer.csproj]=simpleReplace
-FILES[lib/csharp/test/Multiplex/Server/Properties/AssemblyInfo.cs]=simpleReplace
-FILES[lib/csharp/test/ThriftMVCTest/Properties/AssemblyInfo.cs]=simpleReplace
FILES[lib/d/src/thrift/base.d]=simpleReplace
FILES[lib/dart/pubspec.yaml]=pubspecReplace
FILES[lib/delphi/src/Thrift.pas]=simpleReplace
@@ -74,10 +66,12 @@ FILES[lib/erl/src/thrift.app.src]=simpleReplace
FILES[lib/haxe/haxelib.json]=simpleReplace
FILES[lib/hs/thrift.cabal]=simpleReplace
FILES[lib/java/gradle.properties]=simpleReplace
-FILES[lib/js/package.json]=jsonReplace
FILES[lib/js/package-lock.json]=jsonReplace
+FILES[lib/js/package.json]=jsonReplace
FILES[lib/js/src/thrift.js]=simpleReplace
FILES[lib/lua/Thrift.lua]=simpleReplace
+FILES[lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Properties/AssemblyInfo.cs]=simpleReplace
+FILES[lib/netstd/Thrift/Properties/AssemblyInfo.cs]=simpleReplace
FILES[lib/netstd/Thrift/Properties/AssemblyInfo.cs]=simpleReplace
FILES[lib/netstd/Thrift/Thrift.csproj]=simpleReplace
FILES[lib/ocaml/_oasis]=simpleReplace
@@ -88,25 +82,29 @@ FILES[lib/rs/Cargo.toml]=simpleReplace
FILES[lib/st/package.xml]=simpleReplace
FILES[lib/swift/Sources/Thrift.swift]=simpleReplace
FILES[lib/swift/Tests/ThriftTests/ThriftTests.swift]=simpleReplace
-FILES[lib/ts/package.json]=jsonReplace
FILES[lib/ts/package-lock.json]=jsonReplace
-FILES[package.json]=jsonReplace
+FILES[lib/ts/package.json]=jsonReplace
FILES[package-lock.json]=jsonReplace
+FILES[package.json]=jsonReplace
FILES[sonar-project.properties]=simpleReplace
-FILES[test/csharp/Properties/AssemblyInfo.cs]=simpleReplace
-FILES[test/csharp/ThriftTest.csproj]=simpleReplace
FILES[test/dart/test_client/pubspec.yaml]=pubspecReplace
FILES[test/erl/src/thrift_test.app.src]=simpleReplace
-FILES[tutorial/csharp/CsharpClient/Properties/AssemblyInfo.cs]=simpleReplace
-FILES[tutorial/csharp/CsharpServer/Properties/AssemblyInfo.cs]=simpleReplace
+FILES[test/netstd/Client/Properties/AssemblyInfo.cs]=simpleReplace
+FILES[test/netstd/Server/Properties/AssemblyInfo.cs]=simpleReplace
+FILES[Thrift.podspec]=simpleReplace
FILES[tutorial/dart/client/pubspec.yaml]=pubspecReplace
FILES[tutorial/dart/console_client/pubspec.yaml]=pubspecReplace
FILES[tutorial/dart/server/pubspec.yaml]=pubspecReplace
FILES[tutorial/delphi/DelphiClient/DelphiClient.dproj]=simpleReplace
FILES[tutorial/delphi/DelphiServer/DelphiServer.dproj]=simpleReplace
FILES[tutorial/hs/ThriftTutorial.cabal]=simpleReplace
+FILES[tutorial/netstd/Client/Properties/AssemblyInfo.cs]=simpleReplace
+FILES[tutorial/netstd/Interfaces/Properties/AssemblyInfo.cs]=simpleReplace
+FILES[tutorial/netstd/Server/Properties/AssemblyInfo.cs]=simpleReplace
FILES[tutorial/ocaml/_oasis]=simpleReplace
+
+
if [ ! -f "CHANGES.md" ]; then
>&2 echo "error: run veralign.sh while in the thrift root directory"
exit 1
diff --git a/compiler/cpp/CMakeLists.txt b/compiler/cpp/CMakeLists.txt
index 4dd316c..7125cd7 100644
--- a/compiler/cpp/CMakeLists.txt
+++ b/compiler/cpp/CMakeLists.txt
@@ -76,7 +76,6 @@ THRIFT_ADD_COMPILER(as3 "Enable compiler for ActionScript 3" ON)
THRIFT_ADD_COMPILER(c_glib "Enable compiler for C with Glib" ON)
THRIFT_ADD_COMPILER(cl "Enable compiler for Common LISP" ON)
THRIFT_ADD_COMPILER(cpp "Enable compiler for C++" ON)
-THRIFT_ADD_COMPILER(csharp "Enable compiler for C#" ON)
THRIFT_ADD_COMPILER(d "Enable compiler for D" ON)
THRIFT_ADD_COMPILER(dart "Enable compiler for Dart" ON)
THRIFT_ADD_COMPILER(delphi "Enable compiler for Delphi" ON)
diff --git a/compiler/cpp/Makefile.am b/compiler/cpp/Makefile.am
index d0ac874..5c0949e 100644
--- a/compiler/cpp/Makefile.am
+++ b/compiler/cpp/Makefile.am
@@ -73,7 +73,6 @@ thrift_SOURCES += src/thrift/generate/t_as3_generator.cc \
src/thrift/generate/t_c_glib_generator.cc \
src/thrift/generate/t_cl_generator.cc \
src/thrift/generate/t_cpp_generator.cc \
- src/thrift/generate/t_csharp_generator.cc \
src/thrift/generate/t_d_generator.cc \
src/thrift/generate/t_dart_generator.cc \
src/thrift/generate/t_delphi_generator.cc \
diff --git a/compiler/cpp/compiler.vcxproj b/compiler/cpp/compiler.vcxproj
index 5d073e7..79045d7 100644
--- a/compiler/cpp/compiler.vcxproj
+++ b/compiler/cpp/compiler.vcxproj
@@ -57,7 +57,6 @@
<ClCompile Include="src\thrift\generate\t_c_glib_generator.cc" />
<ClCompile Include="src\thrift\generate\t_cl_generator.cc" />
<ClCompile Include="src\thrift\generate\t_cpp_generator.cc" />
- <ClCompile Include="src\thrift\generate\t_csharp_generator.cc" />
<ClCompile Include="src\thrift\generate\t_d_generator.cc" />
<ClCompile Include="src\thrift\generate\t_dart_generator.cc" />
<ClCompile Include="src\thrift\generate\t_delphi_generator.cc" />
diff --git a/compiler/cpp/compiler.vcxproj.filters b/compiler/cpp/compiler.vcxproj.filters
index 664a9d9..75ab292 100644
--- a/compiler/cpp/compiler.vcxproj.filters
+++ b/compiler/cpp/compiler.vcxproj.filters
@@ -101,9 +101,6 @@
<ClCompile Include="src\generate\t_cpp_generator.cc">
<Filter>generate</Filter>
</ClCompile>
- <ClCompile Include="src\generate\t_csharp_generator.cc">
- <Filter>generate</Filter>
- </ClCompile>
<ClCompile Include="src\generate\t_c_glib_generator.cc">
<Filter>generate</Filter>
</ClCompile>
diff --git a/compiler/cpp/src/thrift/generate/t_csharp_generator.cc b/compiler/cpp/src/thrift/generate/t_csharp_generator.cc
deleted file mode 100644
index a6ece80..0000000
--- a/compiler/cpp/src/thrift/generate/t_csharp_generator.cc
+++ /dev/null
@@ -1,3261 +0,0 @@
-/*
- * 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.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-#include <cassert>
-
-#include <string>
-#include <fstream>
-#include <iostream>
-#include <vector>
-#include <cctype>
-
-#include <stdlib.h>
-#include <sys/stat.h>
-#include <sstream>
-
-#include "thrift/platform.h"
-#include "thrift/generate/t_oop_generator.h"
-
-using std::map;
-using std::ostream;
-using std::ostringstream;
-using std::string;
-using std::stringstream;
-using std::vector;
-
-static const string endl = "\n"; // avoid ostream << std::endl flushes
-
-struct member_mapping_scope {
- void* scope_member;
- std::map<std::string, std::string> mapping_table;
-};
-
-class t_csharp_generator : public t_oop_generator {
-public:
- t_csharp_generator(t_program* program,
- const std::map<std::string, std::string>& parsed_options,
- const std::string& option_string)
- : t_oop_generator(program) {
- (void)option_string;
-
- std::map<std::string, std::string>::const_iterator iter;
-
- async_ = false;
- nullable_ = false;
- hashcode_ = false;
- union_ = false;
- serialize_ = false;
- wcf_ = false;
- wcf_namespace_.clear();
- for( iter = parsed_options.begin(); iter != parsed_options.end(); ++iter) {
- if( iter->first.compare("async") == 0) {
- async_ = true;
- } else if( iter->first.compare("nullable") == 0) {
- nullable_ = true;
- } else if( iter->first.compare("hashcode") == 0) {
- hashcode_ = true;
- } else if( iter->first.compare("union") == 0) {
- union_ = true;
- } else if( iter->first.compare("serial") == 0) {
- serialize_ = true;
- wcf_namespace_ = iter->second; // since there can be only one namespace
- } else if( iter->first.compare("wcf") == 0) {
- wcf_ = true;
- wcf_namespace_ = iter->second;
- } else {
- throw "unknown option csharp:" + iter->first;
- }
- }
-
- pwarning(1, "The 'csharp' target is deprecated. Consider using 'netstd' instead.\n");
-
- out_dir_base_ = "gen-csharp";
- }
- void init_generator() override;
- void close_generator() override;
-
- void generate_consts(std::vector<t_const*> consts) override;
-
- void generate_typedef(t_typedef* ttypedef) override;
- void generate_enum(t_enum* tenum) override;
- void generate_struct(t_struct* tstruct) override;
- void generate_union(t_struct* tunion);
- void generate_xception(t_struct* txception) override;
- void generate_service(t_service* tservice) override;
- void generate_property(ostream& out, t_field* tfield, bool isPublic, bool generateIsset);
- void generate_csharp_property(ostream& out,
- t_field* tfield,
- bool isPublic,
- bool includeIsset = true,
- std::string fieldPrefix = "");
- bool print_const_value(std::ostream& out,
- std::string name,
- t_type* type,
- t_const_value* value,
- bool in_static,
- bool defval = false,
- bool needtype = false);
- std::string render_const_value(std::ostream& out,
- std::string name,
- t_type* type,
- t_const_value* value);
- void print_const_constructor(std::ostream& out, std::vector<t_const*> consts);
- void print_const_def_value(std::ostream& out,
- std::string name,
- t_type* type,
- t_const_value* value);
-
- void generate_csharp_struct(t_struct* tstruct, bool is_exception);
- void generate_csharp_union(t_struct* tunion);
- void generate_csharp_struct_definition(std::ostream& out,
- t_struct* tstruct,
- bool is_xception = false,
- bool in_class = false,
- bool is_result = false);
- void generate_csharp_union_definition(std::ostream& out, t_struct* tunion);
- void generate_csharp_union_class(std::ostream& out, t_struct* tunion, t_field* tfield);
- void generate_csharp_wcffault(std::ostream& out, t_struct* tstruct);
- void generate_csharp_struct_reader(std::ostream& out, t_struct* tstruct);
- void generate_csharp_struct_result_writer(std::ostream& out, t_struct* tstruct);
- void generate_csharp_struct_writer(std::ostream& out, t_struct* tstruct);
- void generate_csharp_struct_tostring(std::ostream& out, t_struct* tstruct);
- void generate_csharp_struct_equals(std::ostream& out, t_struct* tstruct);
- void generate_csharp_struct_hashcode(std::ostream& out, t_struct* tstruct);
- void generate_csharp_union_reader(std::ostream& out, t_struct* tunion);
-
- void generate_function_helpers(t_function* tfunction);
- void generate_service_interface(t_service* tservice);
- void generate_separate_service_interfaces(t_service* tservice);
- void generate_sync_service_interface(t_service* tservice);
- void generate_async_service_interface(t_service* tservice);
- void generate_combined_service_interface(t_service* tservice);
- void generate_silverlight_async_methods(t_service* tservice);
- void generate_service_helpers(t_service* tservice);
- void generate_service_client(t_service* tservice);
- void generate_service_server(t_service* tservice);
- void generate_service_server_sync(t_service* tservice);
- void generate_service_server_async(t_service* tservice);
- void generate_process_function(t_service* tservice, t_function* function);
- void generate_process_function_async(t_service* tservice, t_function* function);
-
- void generate_deserialize_field(std::ostream& out,
- t_field* tfield,
- std::string prefix = "",
- bool is_propertyless = false);
- void generate_deserialize_struct(std::ostream& out, t_struct* tstruct, std::string prefix = "");
- void generate_deserialize_container(std::ostream& out, t_type* ttype, std::string prefix = "");
- void generate_deserialize_set_element(std::ostream& out, t_set* tset, std::string prefix = "");
- void generate_deserialize_map_element(std::ostream& out, t_map* tmap, std::string prefix = "");
- void generate_deserialize_list_element(std::ostream& out, t_list* list, std::string prefix = "");
- void generate_serialize_field(std::ostream& out,
- t_field* tfield,
- std::string prefix = "",
- bool is_element = false,
- bool is_propertyless = false);
- void generate_serialize_struct(std::ostream& out, t_struct* tstruct, std::string prefix = "");
- void generate_serialize_container(std::ostream& out, t_type* ttype, std::string prefix = "");
- void generate_serialize_map_element(std::ostream& out,
- t_map* tmap,
- std::string iter,
- std::string map);
- void generate_serialize_set_element(std::ostream& out, t_set* tmap, std::string iter);
- void generate_serialize_list_element(std::ostream& out, t_list* tlist, std::string iter);
-
- void generate_csharp_doc(std::ostream& out, t_field* field);
- void generate_csharp_doc(std::ostream& out, t_doc* tdoc);
- void generate_csharp_doc(std::ostream& out, t_function* tdoc);
- void generate_csharp_docstring_comment(std::ostream& out, string contents);
-
- void start_csharp_namespace(std::ostream& out);
- void end_csharp_namespace(std::ostream& out);
-
- std::string csharp_type_usings();
- std::string csharp_thrift_usings();
-
- std::string type_name(t_type* ttype,
- bool in_countainer = false,
- bool in_init = false,
- bool in_param = false,
- bool is_required = false);
- std::string base_type_name(t_base_type* tbase,
- bool in_container = false,
- bool in_param = false,
- bool is_required = false);
- std::string declare_field(t_field* tfield, bool init = false, std::string prefix = "");
- std::string function_signature_async_begin(t_function* tfunction, std::string prefix = "");
- std::string function_signature_async_end(t_function* tfunction, std::string prefix = "");
- std::string function_signature_async(t_function* tfunction, std::string prefix = "");
- std::string function_signature(t_function* tfunction, std::string prefix = "");
- std::string argument_list(t_struct* tstruct);
- std::string type_to_enum(t_type* ttype);
- std::string prop_name(t_field* tfield, bool suppress_mapping = false);
- std::string get_enum_class_name(t_type* type) override;
-
- bool field_has_default(t_field* tfield) { return tfield->get_value() != NULL; }
-
- bool field_is_required(t_field* tfield) { return tfield->get_req() == t_field::T_REQUIRED; }
-
- bool type_can_be_null(t_type* ttype) {
- while (ttype->is_typedef()) {
- ttype = ((t_typedef*)ttype)->get_type();
- }
-
- return ttype->is_container() || ttype->is_struct() || ttype->is_xception()
- || ttype->is_string();
- }
-
-private:
- std::string namespace_name_;
- ofstream_with_content_based_conditional_update f_service_;
- std::string namespace_dir_;
- bool async_;
- bool nullable_;
- bool union_;
- bool hashcode_;
- bool serialize_;
- bool wcf_;
- std::string wcf_namespace_;
-
- std::map<std::string, int> csharp_keywords;
- std::vector<member_mapping_scope> member_mapping_scopes;
-
- void init_keywords();
- std::string normalize_name(std::string name);
- std::string make_valid_csharp_identifier(std::string const& fromName);
- void prepare_member_name_mapping(t_struct* tstruct);
- void prepare_member_name_mapping(void* scope,
- const vector<t_field*>& members,
- const string& structname);
- void cleanup_member_name_mapping(void* scope);
- string get_mapped_member_name(string oldname);
-};
-
-void t_csharp_generator::init_generator() {
- MKDIR(get_out_dir().c_str());
- namespace_name_ = program_->get_namespace("csharp");
-
- string dir = namespace_name_;
- string subdir = get_out_dir().c_str();
- string::size_type loc;
-
- while ((loc = dir.find(".")) != string::npos) {
- subdir = subdir + "/" + dir.substr(0, loc);
- MKDIR(subdir.c_str());
- dir = dir.substr(loc + 1);
- }
- if (dir.size() > 0) {
- subdir = subdir + "/" + dir;
- MKDIR(subdir.c_str());
- }
-
- namespace_dir_ = subdir;
- init_keywords();
-
- while( ! member_mapping_scopes.empty()) {
- cleanup_member_name_mapping( member_mapping_scopes.back().scope_member);
- }
-
- pverbose("C# options:\n");
- pverbose("- async ...... %s\n", (async_ ? "ON" : "off"));
- pverbose("- nullable ... %s\n", (nullable_ ? "ON" : "off"));
- pverbose("- union ...... %s\n", (union_ ? "ON" : "off"));
- pverbose("- hashcode ... %s\n", (hashcode_ ? "ON" : "off"));
- pverbose("- serialize .. %s\n", (serialize_ ? "ON" : "off"));
- pverbose("- wcf ........ %s\n", (wcf_ ? "ON" : "off"));
-}
-
-std::string t_csharp_generator::normalize_name(std::string name) {
- string tmp(name);
- std::transform(tmp.begin(), tmp.end(), tmp.begin(), static_cast<int (*)(int)>(std::tolower));
-
- // un-conflict keywords by prefixing with "@"
- if (csharp_keywords.find(tmp) != csharp_keywords.end()) {
- return "@" + name;
- }
-
- // no changes necessary
- return name;
-}
-
-void t_csharp_generator::init_keywords() {
- csharp_keywords.clear();
-
- // C# keywords
- csharp_keywords["abstract"] = 1;
- csharp_keywords["as"] = 1;
- csharp_keywords["base"] = 1;
- csharp_keywords["bool"] = 1;
- csharp_keywords["break"] = 1;
- csharp_keywords["byte"] = 1;
- csharp_keywords["case"] = 1;
- csharp_keywords["catch"] = 1;
- csharp_keywords["char"] = 1;
- csharp_keywords["checked"] = 1;
- csharp_keywords["class"] = 1;
- csharp_keywords["const"] = 1;
- csharp_keywords["continue"] = 1;
- csharp_keywords["decimal"] = 1;
- csharp_keywords["default"] = 1;
- csharp_keywords["delegate"] = 1;
- csharp_keywords["do"] = 1;
- csharp_keywords["double"] = 1;
- csharp_keywords["else"] = 1;
- csharp_keywords["enum"] = 1;
- csharp_keywords["event"] = 1;
- csharp_keywords["explicit"] = 1;
- csharp_keywords["extern"] = 1;
- csharp_keywords["false"] = 1;
- csharp_keywords["finally"] = 1;
- csharp_keywords["fixed"] = 1;
- csharp_keywords["float"] = 1;
- csharp_keywords["for"] = 1;
- csharp_keywords["foreach"] = 1;
- csharp_keywords["goto"] = 1;
- csharp_keywords["if"] = 1;
- csharp_keywords["implicit"] = 1;
- csharp_keywords["in"] = 1;
- csharp_keywords["int"] = 1;
- csharp_keywords["interface"] = 1;
- csharp_keywords["internal"] = 1;
- csharp_keywords["is"] = 1;
- csharp_keywords["lock"] = 1;
- csharp_keywords["long"] = 1;
- csharp_keywords["namespace"] = 1;
- csharp_keywords["new"] = 1;
- csharp_keywords["null"] = 1;
- csharp_keywords["object"] = 1;
- csharp_keywords["operator"] = 1;
- csharp_keywords["out"] = 1;
- csharp_keywords["override"] = 1;
- csharp_keywords["params"] = 1;
- csharp_keywords["private"] = 1;
- csharp_keywords["protected"] = 1;
- csharp_keywords["public"] = 1;
- csharp_keywords["readonly"] = 1;
- csharp_keywords["ref"] = 1;
- csharp_keywords["return"] = 1;
- csharp_keywords["sbyte"] = 1;
- csharp_keywords["sealed"] = 1;
- csharp_keywords["short"] = 1;
- csharp_keywords["sizeof"] = 1;
- csharp_keywords["stackalloc"] = 1;
- csharp_keywords["static"] = 1;
- csharp_keywords["string"] = 1;
- csharp_keywords["struct"] = 1;
- csharp_keywords["switch"] = 1;
- csharp_keywords["this"] = 1;
- csharp_keywords["throw"] = 1;
- csharp_keywords["true"] = 1;
- csharp_keywords["try"] = 1;
- csharp_keywords["typeof"] = 1;
- csharp_keywords["uint"] = 1;
- csharp_keywords["ulong"] = 1;
- csharp_keywords["unchecked"] = 1;
- csharp_keywords["unsafe"] = 1;
- csharp_keywords["ushort"] = 1;
- csharp_keywords["using"] = 1;
- csharp_keywords["virtual"] = 1;
- csharp_keywords["void"] = 1;
- csharp_keywords["volatile"] = 1;
- csharp_keywords["while"] = 1;
-
- // C# contextual keywords
- csharp_keywords["add"] = 1;
- csharp_keywords["alias"] = 1;
- csharp_keywords["ascending"] = 1;
- csharp_keywords["async"] = 1;
- csharp_keywords["await"] = 1;
- csharp_keywords["descending"] = 1;
- csharp_keywords["dynamic"] = 1;
- csharp_keywords["from"] = 1;
- csharp_keywords["get"] = 1;
- csharp_keywords["global"] = 1;
- csharp_keywords["group"] = 1;
- csharp_keywords["into"] = 1;
- csharp_keywords["join"] = 1;
- csharp_keywords["let"] = 1;
- csharp_keywords["orderby"] = 1;
- csharp_keywords["partial"] = 1;
- csharp_keywords["remove"] = 1;
- csharp_keywords["select"] = 1;
- csharp_keywords["set"] = 1;
- csharp_keywords["value"] = 1;
- csharp_keywords["var"] = 1;
- csharp_keywords["where"] = 1;
- csharp_keywords["yield"] = 1;
-}
-
-void t_csharp_generator::start_csharp_namespace(ostream& out) {
- if (!namespace_name_.empty()) {
- out << "namespace " << namespace_name_ << "\n";
- scope_up(out);
- }
-}
-
-void t_csharp_generator::end_csharp_namespace(ostream& out) {
- if (!namespace_name_.empty()) {
- scope_down(out);
- }
-}
-
-string t_csharp_generator::csharp_type_usings() {
- return string() + "using System;\n" + "using System.Collections;\n"
- + "using System.Collections.Generic;\n" + "using System.Text;\n" + "using System.IO;\n"
- + ((async_) ? "using System.Threading.Tasks;\n" : "") + "using Thrift;\n"
- + "using Thrift.Collections;\n" + ((serialize_ || wcf_) ? "#if !SILVERLIGHT\n" : "")
- + ((serialize_ || wcf_) ? "using System.Xml.Serialization;\n" : "")
- + ((serialize_ || wcf_) ? "#endif\n" : "")
- + "using System.Runtime.Serialization;\n";
-}
-
-string t_csharp_generator::csharp_thrift_usings() {
- return string() + "using Thrift.Protocol;\n" + "using Thrift.Transport;\n";
-}
-
-void t_csharp_generator::close_generator() {
-}
-void t_csharp_generator::generate_typedef(t_typedef* ttypedef) {
- (void)ttypedef;
-}
-
-void t_csharp_generator::generate_enum(t_enum* tenum) {
- string f_enum_name = namespace_dir_ + "/" + (tenum->get_name()) + ".cs";
- ofstream_with_content_based_conditional_update f_enum;
- f_enum.open(f_enum_name.c_str());
-
- f_enum << autogen_comment() << endl;
-
- start_csharp_namespace(f_enum);
-
- generate_csharp_doc(f_enum, tenum);
-
- indent(f_enum) << "public enum " << tenum->get_name() << "\n";
- scope_up(f_enum);
-
- vector<t_enum_value*> constants = tenum->get_constants();
- vector<t_enum_value*>::iterator c_iter;
- for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
- generate_csharp_doc(f_enum, *c_iter);
-
- int value = (*c_iter)->get_value();
- indent(f_enum) << (*c_iter)->get_name() << " = " << value << "," << endl;
- }
-
- scope_down(f_enum);
-
- end_csharp_namespace(f_enum);
-
- f_enum.close();
-}
-
-void t_csharp_generator::generate_consts(std::vector<t_const*> consts) {
- if (consts.empty()) {
- return;
- }
- string f_consts_name = namespace_dir_ + '/' + program_name_ + ".Constants.cs";
- ofstream_with_content_based_conditional_update f_consts;
- f_consts.open(f_consts_name.c_str());
-
- f_consts << autogen_comment() << csharp_type_usings() << endl;
-
- start_csharp_namespace(f_consts);
-
- indent(f_consts) << "public static class " << make_valid_csharp_identifier(program_name_)
- << "Constants" << endl;
- scope_up(f_consts);
-
- vector<t_const*>::iterator c_iter;
- bool need_static_constructor = false;
- for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) {
- generate_csharp_doc(f_consts, (*c_iter));
- if (print_const_value(f_consts,
- (*c_iter)->get_name(),
- (*c_iter)->get_type(),
- (*c_iter)->get_value(),
- false)) {
- need_static_constructor = true;
- }
- }
-
- if (need_static_constructor) {
- print_const_constructor(f_consts, consts);
- }
-
- scope_down(f_consts);
- end_csharp_namespace(f_consts);
- f_consts.close();
-}
-
-void t_csharp_generator::print_const_def_value(std::ostream& out,
- string name,
- t_type* type,
- t_const_value* value) {
- if (type->is_struct() || type->is_xception()) {
- const vector<t_field*>& fields = ((t_struct*)type)->get_members();
- vector<t_field*>::const_iterator f_iter;
- const map<t_const_value*, t_const_value*, t_const_value::value_compare>& val = value->get_map();
- map<t_const_value*, t_const_value*, t_const_value::value_compare>::const_iterator v_iter;
- prepare_member_name_mapping((t_struct*)type);
- for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) {
- t_field* field = NULL;
- for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
- if ((*f_iter)->get_name() == v_iter->first->get_string()) {
- field = (*f_iter);
- }
- }
- if (field == NULL) {
- throw "type error: " + type->get_name() + " has no field " + v_iter->first->get_string();
- }
- t_type* field_type = field->get_type();
- string val = render_const_value(out, name, field_type, v_iter->second);
- indent(out) << name << "." << prop_name(field) << " = " << val << ";" << endl;
- }
- cleanup_member_name_mapping((t_struct*)type);
- } else if (type->is_map()) {
- t_type* ktype = ((t_map*)type)->get_key_type();
- t_type* vtype = ((t_map*)type)->get_val_type();
- const map<t_const_value*, t_const_value*, t_const_value::value_compare>& val = value->get_map();
- map<t_const_value*, t_const_value*, t_const_value::value_compare>::const_iterator v_iter;
- for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) {
- string key = render_const_value(out, name, ktype, v_iter->first);
- string val = render_const_value(out, name, vtype, v_iter->second);
- indent(out) << name << "[" << key << "]"
- << " = " << val << ";" << endl;
- }
- } else if (type->is_list() || type->is_set()) {
- t_type* etype;
- if (type->is_list()) {
- etype = ((t_list*)type)->get_elem_type();
- } else {
- etype = ((t_set*)type)->get_elem_type();
- }
-
- const vector<t_const_value*>& val = value->get_list();
- vector<t_const_value*>::const_iterator v_iter;
- for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) {
- string val = render_const_value(out, name, etype, *v_iter);
- indent(out) << name << ".Add(" << val << ");" << endl;
- }
- }
-}
-
-void t_csharp_generator::print_const_constructor(std::ostream& out, std::vector<t_const*> consts) {
- indent(out) << "static " << make_valid_csharp_identifier(program_name_).c_str() << "Constants()"
- << endl;
- scope_up(out);
- vector<t_const*>::iterator c_iter;
- for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) {
- string name = (*c_iter)->get_name();
- t_type* type = (*c_iter)->get_type();
- t_const_value* value = (*c_iter)->get_value();
-
- print_const_def_value(out, name, type, value);
- }
- scope_down(out);
-}
-
-// it seems like all that methods that call this are using in_static to be the opposite of what it
-// would imply
-bool t_csharp_generator::print_const_value(std::ostream& out,
- string name,
- t_type* type,
- t_const_value* value,
- bool in_static,
- bool defval,
- bool needtype) {
- indent(out);
- bool need_static_construction = !in_static;
- while (type->is_typedef()) {
- type = ((t_typedef*)type)->get_type();
- }
-
- if (!defval || needtype) {
- out << (in_static ? "" : type->is_base_type() ? "public const " : "public static ")
- << type_name(type) << " ";
- }
- if (type->is_base_type()) {
- string v2 = render_const_value(out, name, type, value);
- out << name << " = " << v2 << ";" << endl;
- need_static_construction = false;
- } else if (type->is_enum()) {
- out << name << " = " << type_name(type, false, true) << "." << value->get_identifier_name()
- << ";" << endl;
- need_static_construction = false;
- } else if (type->is_struct() || type->is_xception()) {
- out << name << " = new " << type_name(type) << "();" << endl;
- } else if (type->is_map()) {
- out << name << " = new " << type_name(type, true, true) << "();" << endl;
- } else if (type->is_list() || type->is_set()) {
- out << name << " = new " << type_name(type) << "();" << endl;
- }
-
- if (defval && !type->is_base_type() && !type->is_enum()) {
- print_const_def_value(out, name, type, value);
- }
-
- return need_static_construction;
-}
-
-std::string t_csharp_generator::render_const_value(ostream& out,
- string name,
- t_type* type,
- t_const_value* value) {
- (void)name;
- std::ostringstream render;
-
- if (type->is_base_type()) {
- t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
- switch (tbase) {
- case t_base_type::TYPE_STRING:
- render << '"' << get_escaped_string(value) << '"';
- break;
- case t_base_type::TYPE_BOOL:
- render << ((value->get_integer() > 0) ? "true" : "false");
- break;
- case t_base_type::TYPE_I8:
- case t_base_type::TYPE_I16:
- case t_base_type::TYPE_I32:
- case t_base_type::TYPE_I64:
- render << value->get_integer();
- break;
- case t_base_type::TYPE_DOUBLE:
- if (value->get_type() == t_const_value::CV_INTEGER) {
- render << value->get_integer();
- } else {
- render << value->get_double();
- }
- break;
- default:
- throw "compiler error: no const of base type " + t_base_type::t_base_name(tbase);
- }
- } else if (type->is_enum()) {
- render << type->get_name() << "." << value->get_identifier_name();
- } else {
- string t = tmp("tmp");
- print_const_value(out, t, type, value, true, true, true);
- render << t;
- }
-
- return render.str();
-}
-
-void t_csharp_generator::generate_struct(t_struct* tstruct) {
- if (union_ && tstruct->is_union()) {
- generate_csharp_union(tstruct);
- } else {
- generate_csharp_struct(tstruct, false);
- }
-}
-
-void t_csharp_generator::generate_xception(t_struct* txception) {
- generate_csharp_struct(txception, true);
-}
-
-void t_csharp_generator::generate_csharp_struct(t_struct* tstruct, bool is_exception) {
- string f_struct_name = namespace_dir_ + "/" + (tstruct->get_name()) + ".cs";
- ofstream_with_content_based_conditional_update f_struct;
-
- f_struct.open(f_struct_name.c_str());
-
- f_struct << autogen_comment() << csharp_type_usings() << csharp_thrift_usings() << endl;
-
- generate_csharp_struct_definition(f_struct, tstruct, is_exception);
-
- f_struct.close();
-}
-
-void t_csharp_generator::generate_csharp_struct_definition(ostream& out,
- t_struct* tstruct,
- bool is_exception,
- bool in_class,
- bool is_result) {
-
- if (!in_class) {
- start_csharp_namespace(out);
- }
-
- out << endl;
-
- generate_csharp_doc(out, tstruct);
- prepare_member_name_mapping(tstruct);
-
- indent(out) << "#if !SILVERLIGHT" << endl;
- indent(out) << "[Serializable]" << endl;
- indent(out) << "#endif" << endl;
- if ((serialize_ || wcf_) && !is_exception) {
- indent(out) << "[DataContract(Namespace=\"" << wcf_namespace_ << "\")]"
- << endl; // do not make exception classes directly WCF serializable, we provide a
- // separate "fault" for that
- }
- bool is_final = (tstruct->annotations_.find("final") != tstruct->annotations_.end());
-
- indent(out) << "public " << (is_final ? "sealed " : "") << "partial class "
- << normalize_name(tstruct->get_name()) << " : ";
-
- if (is_exception) {
- out << "TException, ";
- }
- out << "TBase";
-
- out << endl;
-
- scope_up(out);
-
- const vector<t_field*>& members = tstruct->get_members();
- vector<t_field*>::const_iterator m_iter;
-
- // make private members with public Properties
- for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
- // if the field is requied, then we use auto-properties
- if (!field_is_required((*m_iter)) && (!nullable_ || field_has_default((*m_iter)))) {
- indent(out) << "private " << declare_field(*m_iter, false, "_") << endl;
- }
- }
- out << endl;
-
- bool has_non_required_fields = false;
- bool has_non_required_default_value_fields = false;
- bool has_required_fields = false;
- for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
- generate_csharp_doc(out, *m_iter);
- generate_property(out, *m_iter, true, true);
- bool is_required = field_is_required((*m_iter));
- bool has_default = field_has_default((*m_iter));
- if (is_required) {
- has_required_fields = true;
- } else {
- if (has_default) {
- has_non_required_default_value_fields = true;
- }
- has_non_required_fields = true;
- }
- }
-
- bool generate_isset = (nullable_ && has_non_required_default_value_fields)
- || (!nullable_ && has_non_required_fields);
- if (generate_isset) {
- out << endl;
- if (serialize_ || wcf_) {
- out << indent() << "[XmlIgnore] // XmlSerializer" << endl << indent()
- << "[DataMember(Order = 1)] // XmlObjectSerializer, DataContractJsonSerializer, etc."
- << endl;
- }
- out << indent() << "public Isset __isset;" << endl << indent() << "#if !SILVERLIGHT" << endl
- << indent() << "[Serializable]" << endl << indent() << "#endif" << endl;
- if (serialize_ || wcf_) {
- indent(out) << "[DataContract]" << endl;
- }
- indent(out) << "public struct Isset {" << endl;
- indent_up();
- for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
- bool is_required = field_is_required((*m_iter));
- bool has_default = field_has_default((*m_iter));
- // if it is required, don't need Isset for that variable
- // if it is not required, if it has a default value, we need to generate Isset
- // if we are not nullable, then we generate Isset
- if (!is_required && (!nullable_ || has_default)) {
- if (serialize_ || wcf_) {
- indent(out) << "[DataMember]" << endl;
- }
- indent(out) << "public bool " << normalize_name((*m_iter)->get_name()) << ";" << endl;
- }
- }
-
- indent_down();
- indent(out) << "}" << endl << endl;
-
- if (generate_isset && (serialize_ || wcf_)) {
- indent(out) << "#region XmlSerializer support" << endl << endl;
-
- for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
- bool is_required = field_is_required((*m_iter));
- bool has_default = field_has_default((*m_iter));
- // if it is required, don't need Isset for that variable
- // if it is not required, if it has a default value, we need to generate Isset
- // if we are not nullable, then we generate Isset
- if (!is_required && (!nullable_ || has_default)) {
- indent(out) << "public bool ShouldSerialize" << prop_name((*m_iter)) << "()" << endl;
- indent(out) << "{" << endl;
- indent_up();
- indent(out) << "return __isset." << normalize_name((*m_iter)->get_name()) << ";" << endl;
- indent_down();
- indent(out) << "}" << endl << endl;
- }
- }
-
- indent(out) << "#endregion XmlSerializer support" << endl << endl;
- }
- }
-
- // We always want a default, no argument constructor for Reading
- indent(out) << "public " << normalize_name(tstruct->get_name()) << "() {" << endl;
- indent_up();
-
- for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
- t_type* t = (*m_iter)->get_type();
- while (t->is_typedef()) {
- t = ((t_typedef*)t)->get_type();
- }
- if ((*m_iter)->get_value() != NULL) {
- if (field_is_required((*m_iter))) {
- print_const_value(out, "this." + prop_name(*m_iter), t, (*m_iter)->get_value(), true, true);
- } else {
- print_const_value(out,
- "this._" + (*m_iter)->get_name(),
- t,
- (*m_iter)->get_value(),
- true,
- true);
- // Optionals with defaults are marked set
- indent(out) << "this.__isset." << normalize_name((*m_iter)->get_name()) << " = true;"
- << endl;
- }
- }
- }
- indent_down();
- indent(out) << "}" << endl << endl;
-
- if (has_required_fields) {
- indent(out) << "public " << tstruct->get_name() << "(";
- bool first = true;
- for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
- if (field_is_required((*m_iter))) {
- if (first) {
- first = false;
- } else {
- out << ", ";
- }
- out << type_name((*m_iter)->get_type()) << " " << normalize_name((*m_iter)->get_name());
- }
- }
- out << ") : this() {" << endl;
- indent_up();
-
- for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
- if (field_is_required((*m_iter))) {
- indent(out) << "this." << prop_name((*m_iter)) << " = " << normalize_name((*m_iter)->get_name()) << ";"
- << endl;
- }
- }
-
- indent_down();
- indent(out) << "}" << endl << endl;
- }
-
- generate_csharp_struct_reader(out, tstruct);
- if (is_result) {
- generate_csharp_struct_result_writer(out, tstruct);
- } else {
- generate_csharp_struct_writer(out, tstruct);
- }
- if (hashcode_) {
- generate_csharp_struct_equals(out, tstruct);
- generate_csharp_struct_hashcode(out, tstruct);
- }
- generate_csharp_struct_tostring(out, tstruct);
- scope_down(out);
- out << endl;
-
- // generate a corresponding WCF fault to wrap the exception
- if ((serialize_ || wcf_) && is_exception) {
- generate_csharp_wcffault(out, tstruct);
- }
-
- cleanup_member_name_mapping(tstruct);
- if (!in_class) {
- end_csharp_namespace(out);
- }
-}
-
-void t_csharp_generator::generate_csharp_wcffault(ostream& out, t_struct* tstruct) {
- out << endl;
- indent(out) << "#if !SILVERLIGHT" << endl;
- indent(out) << "[Serializable]" << endl;
- indent(out) << "#endif" << endl;
- indent(out) << "[DataContract]" << endl;
- bool is_final = (tstruct->annotations_.find("final") != tstruct->annotations_.end());
-
- indent(out) << "public " << (is_final ? "sealed " : "") << "partial class " << tstruct->get_name()
- << "Fault" << endl;
-
- scope_up(out);
-
- const vector<t_field*>& members = tstruct->get_members();
- vector<t_field*>::const_iterator m_iter;
-
- // make private members with public Properties
- for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
- // if the field is requied, then we use auto-properties
- if (!field_is_required((*m_iter)) && (!nullable_ || field_has_default((*m_iter)))) {
- indent(out) << "private " << declare_field(*m_iter, false, "_") << endl;
- }
- }
- out << endl;
-
- for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
- generate_property(out, *m_iter, true, false);
- }
-
- scope_down(out);
- out << endl;
-}
-
-void t_csharp_generator::generate_csharp_struct_reader(ostream& out, t_struct* tstruct) {
- indent(out) << "public void Read (TProtocol iprot)" << endl;
- scope_up(out);
-
- out << indent() << "iprot.IncrementRecursionDepth();" << endl;
- out << indent() << "try" << endl;
- scope_up(out);
-
- const vector<t_field*>& fields = tstruct->get_members();
- vector<t_field*>::const_iterator f_iter;
-
- // Required variables aren't in __isset, so we need tmp vars to check them
- for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
- if (field_is_required((*f_iter))) {
- indent(out) << "bool isset_" << (*f_iter)->get_name() << " = false;" << endl;
- }
- }
-
- indent(out) << "TField field;" << endl << indent() << "iprot.ReadStructBegin();" << endl;
-
- indent(out) << "while (true)" << endl;
- scope_up(out);
-
- indent(out) << "field = iprot.ReadFieldBegin();" << endl;
-
- indent(out) << "if (field.Type == TType.Stop) { " << endl;
- indent_up();
- indent(out) << "break;" << endl;
- indent_down();
- indent(out) << "}" << endl;
-
- indent(out) << "switch (field.ID)" << endl;
-
- scope_up(out);
-
- for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
- bool is_required = field_is_required((*f_iter));
- indent(out) << "case " << (*f_iter)->get_key() << ":" << endl;
- indent_up();
- indent(out) << "if (field.Type == " << type_to_enum((*f_iter)->get_type()) << ") {" << endl;
- indent_up();
-
- generate_deserialize_field(out, *f_iter);
- if (is_required) {
- indent(out) << "isset_" << (*f_iter)->get_name() << " = true;" << endl;
- }
-
- indent_down();
- out << indent() << "} else { " << endl << indent() << " TProtocolUtil.Skip(iprot, field.Type);"
- << endl << indent() << "}" << endl << indent() << "break;" << endl;
- indent_down();
- }
-
- indent(out) << "default: " << endl;
- indent_up();
- indent(out) << "TProtocolUtil.Skip(iprot, field.Type);" << endl;
- indent(out) << "break;" << endl;
- indent_down();
-
- scope_down(out);
-
- indent(out) << "iprot.ReadFieldEnd();" << endl;
-
- scope_down(out);
-
- indent(out) << "iprot.ReadStructEnd();" << endl;
-
- for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
- if (field_is_required((*f_iter))) {
- indent(out) << "if (!isset_" << (*f_iter)->get_name() << ")" << endl;
- indent_up();
- out << indent()
- << "throw new TProtocolException(TProtocolException.INVALID_DATA, "
- << "\"required field " << prop_name((*f_iter)) << " not set\");"
- << endl;
- indent_down();
- }
- }
-
- scope_down(out);
- out << indent() << "finally" << endl;
- scope_up(out);
- out << indent() << "iprot.DecrementRecursionDepth();" << endl;
- scope_down(out);
-
- indent_down();
-
- indent(out) << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_csharp_struct_writer(ostream& out, t_struct* tstruct) {
- out << indent() << "public void Write(TProtocol oprot) {" << endl;
- indent_up();
-
- out << indent() << "oprot.IncrementRecursionDepth();" << endl;
- out << indent() << "try" << endl;
- scope_up(out);
-
- string name = tstruct->get_name();
- const vector<t_field*>& fields = tstruct->get_sorted_members();
- vector<t_field*>::const_iterator f_iter;
-
- indent(out) << "TStruct struc = new TStruct(\"" << name << "\");" << endl;
- indent(out) << "oprot.WriteStructBegin(struc);" << endl;
-
- if (fields.size() > 0) {
- indent(out) << "TField field = new TField();" << endl;
- for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
- bool is_required = field_is_required((*f_iter));
- bool has_default = field_has_default((*f_iter));
- bool null_allowed = type_can_be_null((*f_iter)->get_type());
-
- if (is_required)
- {
- if (null_allowed) {
- indent(out) << "if (" << prop_name((*f_iter)) << " == null)" << endl;
- indent_up();
- out << indent()
- << "throw new TProtocolException(TProtocolException.INVALID_DATA, "
- << "\"required field " << prop_name((*f_iter)) << " not set\");"
- << endl;
- indent_down();
- }
- }
- else
- {
- if (nullable_ && !has_default) {
- indent(out) << "if (" << prop_name((*f_iter)) << " != null) {" << endl;
- }
- else if (null_allowed) {
- out << indent()
- << "if (" << prop_name((*f_iter)) << " != null && __isset."
- << normalize_name((*f_iter)->get_name()) << ") {"
- << endl;
- }
- else {
- indent(out) << "if (__isset." << normalize_name((*f_iter)->get_name()) << ") {" << endl;
- }
- indent_up();
- }
- indent(out) << "field.Name = \"" << (*f_iter)->get_name() << "\";" << endl;
- indent(out) << "field.Type = " << type_to_enum((*f_iter)->get_type()) << ";" << endl;
- indent(out) << "field.ID = " << (*f_iter)->get_key() << ";" << endl;
- indent(out) << "oprot.WriteFieldBegin(field);" << endl;
-
- generate_serialize_field(out, *f_iter);
-
- indent(out) << "oprot.WriteFieldEnd();" << endl;
- if (!is_required) {
- indent_down();
- indent(out) << "}" << endl;
- }
- }
- }
-
- indent(out) << "oprot.WriteFieldStop();" << endl;
- indent(out) << "oprot.WriteStructEnd();" << endl;
-
- scope_down(out);
- out << indent() << "finally" << endl;
- scope_up(out);
- out << indent() << "oprot.DecrementRecursionDepth();" << endl;
- scope_down(out);
-
- indent_down();
-
- indent(out) << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_csharp_struct_result_writer(ostream& out, t_struct* tstruct) {
- indent(out) << "public void Write(TProtocol oprot) {" << endl;
- indent_up();
-
- out << indent() << "oprot.IncrementRecursionDepth();" << endl;
- out << indent() << "try" << endl;
- scope_up(out);
-
- string name = tstruct->get_name();
- const vector<t_field*>& fields = tstruct->get_sorted_members();
- vector<t_field*>::const_iterator f_iter;
-
- indent(out) << "TStruct struc = new TStruct(\"" << name << "\");" << endl;
- indent(out) << "oprot.WriteStructBegin(struc);" << endl;
-
- if (fields.size() > 0) {
- indent(out) << "TField field = new TField();" << endl;
- bool first = true;
- for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
- if (first) {
- first = false;
- out << endl << indent() << "if ";
- } else {
- out << " else if ";
- }
-
- if (nullable_) {
- out << "(this." << prop_name((*f_iter)) << " != null) {" << endl;
- } else {
- out << "(this.__isset." << normalize_name((*f_iter)->get_name()) << ") {" << endl;
- }
- indent_up();
-
- bool null_allowed = !nullable_ && type_can_be_null((*f_iter)->get_type());
- if (null_allowed) {
- indent(out) << "if (" << prop_name(*f_iter) << " != null) {" << endl;
- indent_up();
- }
-
- indent(out) << "field.Name = \"" << prop_name(*f_iter) << "\";" << endl;
- indent(out) << "field.Type = " << type_to_enum((*f_iter)->get_type()) << ";" << endl;
- indent(out) << "field.ID = " << (*f_iter)->get_key() << ";" << endl;
- indent(out) << "oprot.WriteFieldBegin(field);" << endl;
-
- generate_serialize_field(out, *f_iter);
-
- indent(out) << "oprot.WriteFieldEnd();" << endl;
-
- if (null_allowed) {
- indent_down();
- indent(out) << "}" << endl;
- }
-
- indent_down();
- indent(out) << "}";
- }
- }
-
- out << endl << indent() << "oprot.WriteFieldStop();" << endl << indent()
- << "oprot.WriteStructEnd();" << endl;
-
- scope_down(out);
- out << indent() << "finally" << endl;
- scope_up(out);
- out << indent() << "oprot.DecrementRecursionDepth();" << endl;
- scope_down(out);
-
- indent_down();
-
- indent(out) << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_csharp_struct_tostring(ostream& out, t_struct* tstruct) {
- indent(out) << "public override string ToString() {" << endl;
- indent_up();
-
- indent(out) << "StringBuilder __sb = new StringBuilder(\"" << tstruct->get_name() << "(\");"
- << endl;
-
- const vector<t_field*>& fields = tstruct->get_members();
- vector<t_field*>::const_iterator f_iter;
-
- bool useFirstFlag = false;
- for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
- if (!field_is_required((*f_iter))) {
- indent(out) << "bool __first = true;" << endl;
- useFirstFlag = true;
- }
- break;
- }
-
- bool had_required = false; // set to true after first required field has been processed
-
- for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
- bool is_required = field_is_required((*f_iter));
- bool has_default = field_has_default((*f_iter));
- if (nullable_ && !has_default && !is_required) {
- indent(out) << "if (" << prop_name((*f_iter)) << " != null) {" << endl;
- indent_up();
- } else if (!is_required) {
- bool null_allowed = type_can_be_null((*f_iter)->get_type());
- if (null_allowed) {
- indent(out) << "if (" << prop_name((*f_iter)) << " != null && __isset."
- << normalize_name((*f_iter)->get_name()) << ") {" << endl;
- indent_up();
- } else {
- indent(out) << "if (__isset." << normalize_name((*f_iter)->get_name()) << ") {" << endl;
- indent_up();
- }
- }
-
- if (useFirstFlag && (!had_required)) {
- indent(out) << "if(!__first) { __sb.Append(\", \"); }" << endl;
- if (!is_required) {
- indent(out) << "__first = false;" << endl;
- }
- indent(out) << "__sb.Append(\"" << prop_name((*f_iter)) << ": \");" << endl;
- } else {
- indent(out) << "__sb.Append(\", " << prop_name((*f_iter)) << ": \");" << endl;
- }
-
- t_type* ttype = (*f_iter)->get_type();
- if (ttype->is_xception() || ttype->is_struct()) {
- indent(out) << "__sb.Append(" << prop_name((*f_iter))
- << "== null ? \"<null>\" : " << prop_name((*f_iter)) << ".ToString());" << endl;
- } else {
- indent(out) << "__sb.Append(" << prop_name((*f_iter)) << ");" << endl;
- }
-
- if (!is_required) {
- indent_down();
- indent(out) << "}" << endl;
- } else {
- had_required = true; // now __first must be false, so we don't need to check it anymore
- }
- }
-
- indent(out) << "__sb.Append(\")\");" << endl;
- indent(out) << "return __sb.ToString();" << endl;
-
- indent_down();
- indent(out) << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_csharp_union(t_struct* tunion) {
- string f_union_name = namespace_dir_ + "/" + (tunion->get_name()) + ".cs";
- ofstream_with_content_based_conditional_update f_union;
-
- f_union.open(f_union_name.c_str());
-
- f_union << autogen_comment() << csharp_type_usings() << csharp_thrift_usings() << endl;
-
- generate_csharp_union_definition(f_union, tunion);
-
- f_union.close();
-}
-
-void t_csharp_generator::generate_csharp_union_definition(std::ostream& out, t_struct* tunion) {
- // Let's define the class first
- start_csharp_namespace(out);
-
- indent(out) << "public abstract partial class " << tunion->get_name() << " : TAbstractBase {"
- << endl;
-
- indent_up();
-
- indent(out) << "public abstract void Write(TProtocol protocol);" << endl;
- indent(out) << "public readonly int Isset;" << endl;
- indent(out) << "public abstract object Data { get; }" << endl;
-
- indent(out) << "protected " << tunion->get_name() << "(int isset) {" << endl;
- indent_up();
- indent(out) << "Isset = isset;" << endl;
- indent_down();
- indent(out) << "}" << endl << endl;
-
- indent(out) << "public class ___undefined : " << tunion->get_name() << " {" << endl;
- indent_up();
-
- indent(out) << "public override object Data { get { return null; } }" << endl;
-
- indent(out) << "public ___undefined() : base(0) {}" << endl << endl;
-
- indent(out) << "public override void Write(TProtocol protocol) {" << endl;
- indent_up();
- indent(out) << "throw new TProtocolException( TProtocolException.INVALID_DATA, \"Cannot persist "
- "an union type which is not set.\");" << endl;
- indent_down();
- indent(out) << "}" << endl << endl;
-
- indent_down();
- indent(out) << "}" << endl << endl;
-
- const vector<t_field*>& fields = tunion->get_members();
- vector<t_field*>::const_iterator f_iter;
-
- for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
- generate_csharp_union_class(out, tunion, (*f_iter));
- }
-
- generate_csharp_union_reader(out, tunion);
-
- indent_down();
- indent(out) << "}" << endl << endl;
-
- end_csharp_namespace(out);
-}
-
-void t_csharp_generator::generate_csharp_union_class(std::ostream& out,
- t_struct* tunion,
- t_field* tfield) {
- indent(out) << "public " << type_name(tfield->get_type()) << " As_" << tfield->get_name() << endl;
- indent(out) << "{" << endl;
- indent_up();
- indent(out) << "get" << endl;
- indent(out) << "{" << endl;
- indent_up();
- indent(out) << "return (" << tfield->get_key() << " == Isset) ? (" << type_name(tfield->get_type()) << ")Data : default(" << type_name(tfield->get_type()) << ");" << endl;
- indent_down();
- indent(out) << "}" << endl;
- indent_down();
- indent(out) << "}" << endl
- << endl;
-
-
- indent(out) << "public class " << tfield->get_name() << " : " << tunion->get_name() << " {"
- << endl;
- indent_up();
- indent(out) << "private " << type_name(tfield->get_type()) << " _data;" << endl;
- indent(out) << "public override object Data { get { return _data; } }" << endl;
- indent(out) << "public " << tfield->get_name() << "(" << type_name(tfield->get_type())
- << " data) : base("<< tfield->get_key() <<") {" << endl;
- indent_up();
- indent(out) << "this._data = data;" << endl;
- indent_down();
- indent(out) << "}" << endl;
- indent(out) << "public override void Write(TProtocol oprot) {" << endl;
- indent_up();
-
- out << indent() << "oprot.IncrementRecursionDepth();" << endl;
- out << indent() << "try" << endl;
- scope_up(out);
-
- indent(out) << "TStruct struc = new TStruct(\"" << tunion->get_name() << "\");" << endl;
- indent(out) << "oprot.WriteStructBegin(struc);" << endl;
-
- indent(out) << "TField field = new TField();" << endl;
- indent(out) << "field.Name = \"" << tfield->get_name() << "\";" << endl;
- indent(out) << "field.Type = " << type_to_enum(tfield->get_type()) << ";" << endl;
- indent(out) << "field.ID = " << tfield->get_key() << ";" << endl;
- indent(out) << "oprot.WriteFieldBegin(field);" << endl;
-
- generate_serialize_field(out, tfield, "_data", true, true);
-
- indent(out) << "oprot.WriteFieldEnd();" << endl;
- indent(out) << "oprot.WriteFieldStop();" << endl;
- indent(out) << "oprot.WriteStructEnd();" << endl;
- indent_down();
-
- scope_down(out);
- out << indent() << "finally" << endl;
- scope_up(out);
- out << indent() << "oprot.DecrementRecursionDepth();" << endl;
- scope_down(out);
-
- indent(out) << "}" << endl;
-
- indent_down();
- indent(out) << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_csharp_struct_equals(ostream& out, t_struct* tstruct) {
- indent(out) << "public override bool Equals(object that) {" << endl;
- indent_up();
-
- indent(out) << "var other = that as " << type_name(tstruct) << ";" << endl;
- indent(out) << "if (other == null) return false;" << endl;
- indent(out) << "if (ReferenceEquals(this, other)) return true;" << endl;
-
- const vector<t_field*>& fields = tstruct->get_members();
- vector<t_field*>::const_iterator f_iter;
-
- bool first = true;
-
- for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
- if (first) {
- first = false;
- indent(out) << "return ";
- indent_up();
- } else {
- out << endl;
- indent(out) << "&& ";
- }
- if (!field_is_required((*f_iter)) && !(nullable_ && !field_has_default((*f_iter)))) {
- out << "((__isset." << normalize_name((*f_iter)->get_name()) << " == other.__isset."
- << normalize_name((*f_iter)->get_name()) << ") && ((!__isset."
- << normalize_name((*f_iter)->get_name()) << ") || (";
- }
- t_type* ttype = (*f_iter)->get_type();
- if (ttype->is_container() || ttype->is_binary()) {
- out << "TCollections.Equals(";
- } else {
- out << "System.Object.Equals(";
- }
- out << prop_name((*f_iter)) << ", other." << prop_name((*f_iter)) << ")";
- if (!field_is_required((*f_iter)) && !(nullable_ && !field_has_default((*f_iter)))) {
- out << ")))";
- }
- }
- if (first) {
- indent(out) << "return true;" << endl;
- } else {
- out << ";" << endl;
- indent_down();
- }
-
- indent_down();
- indent(out) << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_csharp_struct_hashcode(ostream& out, t_struct* tstruct) {
- indent(out) << "public override int GetHashCode() {" << endl;
- indent_up();
-
- indent(out) << "int hashcode = 0;" << endl;
- indent(out) << "unchecked {" << endl;
- indent_up();
-
- const vector<t_field*>& fields = tstruct->get_members();
- vector<t_field*>::const_iterator f_iter;
-
- for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
- t_type* ttype = (*f_iter)->get_type();
- indent(out) << "hashcode = (hashcode * 397) ^ ";
- if (field_is_required((*f_iter))) {
- out << "(";
- } else if (nullable_) {
- out << "(" << prop_name((*f_iter)) << " == null ? 0 : ";
- } else {
- out << "(!__isset." << normalize_name((*f_iter)->get_name()) << " ? 0 : ";
- }
- if (ttype->is_container()) {
- out << "(TCollections.GetHashCode(" << prop_name((*f_iter)) << "))";
- } else {
- out << "(" << prop_name((*f_iter)) << ".GetHashCode())";
- }
- out << ");" << endl;
- }
-
- indent_down();
- indent(out) << "}" << endl;
- indent(out) << "return hashcode;" << endl;
-
- indent_down();
- indent(out) << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_service(t_service* tservice) {
- string f_service_name = namespace_dir_ + "/" + service_name_ + ".cs";
- f_service_.open(f_service_name.c_str());
-
- f_service_ << autogen_comment() << csharp_type_usings() << csharp_thrift_usings() << endl;
-
- start_csharp_namespace(f_service_);
-
- indent(f_service_) << "public partial class " << normalize_name(service_name_) << " {" << endl;
- indent_up();
-
- generate_service_interface(tservice);
- generate_service_client(tservice);
- generate_service_server(tservice);
- generate_service_helpers(tservice);
-
- indent_down();
-
- indent(f_service_) << "}" << endl;
- end_csharp_namespace(f_service_);
- f_service_.close();
-}
-
-void t_csharp_generator::generate_service_interface(t_service* tservice) {
- generate_separate_service_interfaces(tservice);
-}
-
-void t_csharp_generator::generate_separate_service_interfaces(t_service* tservice) {
- generate_sync_service_interface(tservice);
-
- if (async_) {
- generate_async_service_interface(tservice);
- }
-
- generate_combined_service_interface(tservice);
-}
-
-void t_csharp_generator::generate_sync_service_interface(t_service* tservice) {
- string extends = "";
- string extends_iface = "";
- if (tservice->get_extends() != NULL) {
- extends = type_name(tservice->get_extends());
- extends_iface = " : " + extends + ".ISync";
- }
-
- generate_csharp_doc(f_service_, tservice);
-
- if (wcf_) {
- indent(f_service_) << "[System.ServiceModel.ServiceContract(Namespace=\"" << wcf_namespace_ << "\")]" << endl;
- }
- indent(f_service_) << "public interface ISync" << extends_iface << " {" << endl;
-
- indent_up();
- vector<t_function*> functions = tservice->get_functions();
- vector<t_function*>::iterator f_iter;
- for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
- generate_csharp_doc(f_service_, *f_iter);
-
- // if we're using WCF, add the corresponding attributes
- if (wcf_) {
- indent(f_service_) << "[System.ServiceModel.OperationContract]" << endl;
-
- const std::vector<t_field*>& xceptions = (*f_iter)->get_xceptions()->get_members();
- vector<t_field*>::const_iterator x_iter;
- for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
- indent(f_service_) << "[System.ServiceModel.FaultContract(typeof("
- + type_name((*x_iter)->get_type(), false, false) + "Fault))]" << endl;
- }
- }
-
- indent(f_service_) << function_signature(*f_iter) << ";" << endl;
- }
- indent_down();
- f_service_ << indent() << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_async_service_interface(t_service* tservice) {
- string extends = "";
- string extends_iface = "";
- if (tservice->get_extends() != NULL) {
- extends = type_name(tservice->get_extends());
- extends_iface = " : " + extends + ".IAsync";
- }
-
- generate_csharp_doc(f_service_, tservice);
-
- if (wcf_) {
- indent(f_service_) << "[System.ServiceModel.ServiceContract(Namespace=\"" << wcf_namespace_ << "\")]" << endl;
- }
- indent(f_service_) << "public interface IAsync" << extends_iface << " {" << endl;
-
- indent_up();
- vector<t_function*> functions = tservice->get_functions();
- vector<t_function*>::iterator f_iter;
- for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
- generate_csharp_doc(f_service_, *f_iter);
-
- // if we're using WCF, add the corresponding attributes
- if (wcf_) {
- indent(f_service_) << "[System.ServiceModel.OperationContract]" << endl;
-
- const std::vector<t_field*>& xceptions = (*f_iter)->get_xceptions()->get_members();
- vector<t_field*>::const_iterator x_iter;
- for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
- indent(f_service_) << "[System.ServiceModel.FaultContract(typeof("
- + type_name((*x_iter)->get_type(), false, false) + "Fault))]" << endl;
- }
- }
-
- indent(f_service_) << function_signature_async(*f_iter) << ";" << endl;
- }
- indent_down();
- f_service_ << indent() << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_combined_service_interface(t_service* tservice) {
- string extends_iface = " : ISync";
-
- if (async_) {
- extends_iface += ", IAsync";
- }
-
- generate_csharp_doc(f_service_, tservice);
-
- if (wcf_) {
- indent(f_service_) << "[System.ServiceModel.ServiceContract(Namespace=\"" << wcf_namespace_ << "\")]" << endl;
- }
-
- indent(f_service_) << "public interface Iface" << extends_iface << " {" << endl;
-
- indent_up();
-
- // We need to generate extra old style async methods for silverlight. Since
- // this isn't something you'd want to implement server-side, just put them into
- // the main Iface interface.
- generate_silverlight_async_methods(tservice);
-
- indent_down();
-
- f_service_ << indent() << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_silverlight_async_methods(t_service* tservice) {
- vector<t_function*> functions = tservice->get_functions();
- vector<t_function*>::iterator f_iter;
- for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
- generate_csharp_doc(f_service_, *f_iter);
-
- // For backwards compatibility, include the Begin_, End_ methods if we're generating
- // with the async flag. I'm not sure this is necessary, so someone with more knowledge
- // can maybe remove these checks if they know it's safe.
- if (!async_) {
- indent(f_service_) << "#if SILVERLIGHT" << endl;
- }
-
- indent(f_service_) << function_signature_async_begin(*f_iter, "Begin_") << ";" << endl;
- indent(f_service_) << function_signature_async_end(*f_iter, "End_") << ";" << endl;
-
- if (!async_) {
- indent(f_service_) << "#endif" << endl;
- }
- }
-}
-
-void t_csharp_generator::generate_service_helpers(t_service* tservice) {
- vector<t_function*> functions = tservice->get_functions();
- vector<t_function*>::iterator f_iter;
-
- for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
- t_struct* ts = (*f_iter)->get_arglist();
- generate_csharp_struct_definition(f_service_, ts, false, true);
- generate_function_helpers(*f_iter);
- }
-}
-
-void t_csharp_generator::generate_service_client(t_service* tservice) {
- string extends = "";
- string extends_client = "";
- if (tservice->get_extends() != NULL) {
- extends = type_name(tservice->get_extends());
- extends_client = extends + ".Client, ";
- } else {
- extends_client = "IDisposable, ";
- }
-
- generate_csharp_doc(f_service_, tservice);
-
- indent(f_service_) << "public class Client : " << extends_client << "Iface {" << endl;
- indent_up();
- indent(f_service_) << "public Client(TProtocol prot) : this(prot, prot)" << endl;
- scope_up(f_service_);
- scope_down(f_service_);
- f_service_ << endl;
-
- indent(f_service_) << "public Client(TProtocol iprot, TProtocol oprot)";
- if (!extends.empty()) {
- f_service_ << " : base(iprot, oprot)";
- }
- f_service_ << endl;
-
- scope_up(f_service_);
- if (extends.empty()) {
- f_service_ << indent() << "iprot_ = iprot;" << endl << indent() << "oprot_ = oprot;" << endl;
- }
- scope_down(f_service_);
-
- f_service_ << endl;
-
- if (extends.empty()) {
- f_service_ << indent() << "protected TProtocol iprot_;" << endl << indent()
- << "protected TProtocol oprot_;" << endl << indent() << "protected int seqid_;"
- << endl << endl;
-
- f_service_ << indent() << "public TProtocol InputProtocol" << endl;
- scope_up(f_service_);
- indent(f_service_) << "get { return iprot_; }" << endl;
- scope_down(f_service_);
-
- f_service_ << indent() << "public TProtocol OutputProtocol" << endl;
- scope_up(f_service_);
- indent(f_service_) << "get { return oprot_; }" << endl;
- scope_down(f_service_);
- f_service_ << endl << endl;
-
- indent(f_service_) << "#region \" IDisposable Support \"" << endl;
- indent(f_service_) << "private bool _IsDisposed;" << endl << endl;
- indent(f_service_) << "// IDisposable" << endl;
- indent(f_service_) << "public void Dispose()" << endl;
- scope_up(f_service_);
- indent(f_service_) << "Dispose(true);" << endl;
- scope_down(f_service_);
- indent(f_service_) << endl << endl;
- indent(f_service_) << "protected virtual void Dispose(bool disposing)" << endl;
- scope_up(f_service_);
- indent(f_service_) << "if (!_IsDisposed)" << endl;
- scope_up(f_service_);
- indent(f_service_) << "if (disposing)" << endl;
- scope_up(f_service_);
- indent(f_service_) << "if (iprot_ != null)" << endl;
- scope_up(f_service_);
- indent(f_service_) << "((IDisposable)iprot_).Dispose();" << endl;
- scope_down(f_service_);
- indent(f_service_) << "if (oprot_ != null)" << endl;
- scope_up(f_service_);
- indent(f_service_) << "((IDisposable)oprot_).Dispose();" << endl;
- scope_down(f_service_);
- scope_down(f_service_);
- scope_down(f_service_);
- indent(f_service_) << "_IsDisposed = true;" << endl;
- scope_down(f_service_);
- indent(f_service_) << "#endregion" << endl;
- f_service_ << endl << endl;
- }
-
- vector<t_function*> functions = tservice->get_functions();
- vector<t_function*>::const_iterator f_iter;
- for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
- string funname = (*f_iter)->get_name();
-
- indent(f_service_) << endl;
-
- if (!async_) {
- indent(f_service_) << "#if SILVERLIGHT" << endl;
- indent(f_service_) << endl;
- }
- // Begin_
- indent(f_service_) << "public " << function_signature_async_begin(*f_iter, "Begin_") << endl;
- scope_up(f_service_);
- indent(f_service_) << "return "
- << "send_" << funname << "(callback, state";
-
- t_struct* arg_struct = (*f_iter)->get_arglist();
- prepare_member_name_mapping(arg_struct);
-
- const vector<t_field*>& fields = arg_struct->get_members();
- vector<t_field*>::const_iterator fld_iter;
- for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
- f_service_ << ", ";
- f_service_ << normalize_name((*fld_iter)->get_name());
- }
- f_service_ << ");" << endl;
- scope_down(f_service_);
- f_service_ << endl;
-
- // End
- indent(f_service_) << "public " << function_signature_async_end(*f_iter, "End_") << endl;
- scope_up(f_service_);
- indent(f_service_) << "oprot_.Transport.EndFlush(asyncResult);" << endl;
- if (!(*f_iter)->is_oneway()) {
- f_service_ << indent();
- if (!(*f_iter)->get_returntype()->is_void()) {
- f_service_ << "return ";
- }
- f_service_ << "recv_" << funname << "();" << endl;
- }
- scope_down(f_service_);
- f_service_ << endl;
-
- // async
- bool first;
- if (async_) {
- indent(f_service_) << "public async " << function_signature_async(*f_iter, "") << endl;
- scope_up(f_service_);
-
- if (!(*f_iter)->get_returntype()->is_void()) {
- indent(f_service_) << type_name((*f_iter)->get_returntype()) << " retval;" << endl;
- indent(f_service_) << "retval = ";
- } else {
- indent(f_service_);
- }
- f_service_ << "await Task.Run(() =>" << endl;
- scope_up(f_service_);
- indent(f_service_);
- if (!(*f_iter)->get_returntype()->is_void()) {
- f_service_ << "return ";
- }
- f_service_ << funname << "(";
- first = true;
- for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
- if (first) {
- first = false;
- } else {
- f_service_ << ", ";
- }
- f_service_ << (*fld_iter)->get_name();
- }
- f_service_ << ");" << endl;
- indent_down();
- indent(f_service_) << "});" << endl;
- if (!(*f_iter)->get_returntype()->is_void()) {
- indent(f_service_) << "return retval;" << endl;
- }
- scope_down(f_service_);
- f_service_ << endl;
- }
-
- if (!async_) {
- indent(f_service_) << "#endif" << endl << endl;
- }
-
- generate_csharp_doc(f_service_, *f_iter);
- indent(f_service_) << "public " << function_signature(*f_iter) << endl;
- scope_up(f_service_);
-
- // silverlight invoke
- if (!async_) {
- indent(f_service_) << "#if SILVERLIGHT" << endl;
-
- indent(f_service_) << "var asyncResult = Begin_" << funname << "(null, null";
- for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
- f_service_ << ", " << normalize_name((*fld_iter)->get_name());
- }
- f_service_ << ");" << endl;
-
- if (!(*f_iter)->is_oneway()) {
- f_service_ << indent();
- if (!(*f_iter)->get_returntype()->is_void()) {
- f_service_ << "return ";
- }
- f_service_ << "End_" << funname << "(asyncResult);" << endl;
- }
- f_service_ << endl;
-
- indent(f_service_) << "#else" << endl;
- }
-
- // synchronous invoke
- indent(f_service_) << "send_" << funname << "(";
-
- first = true;
- for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
- if (first) {
- first = false;
- } else {
- f_service_ << ", ";
- }
- f_service_ << normalize_name((*fld_iter)->get_name());
- }
- f_service_ << ");" << endl;
-
- if (!(*f_iter)->is_oneway()) {
- f_service_ << indent();
- if (!(*f_iter)->get_returntype()->is_void()) {
- f_service_ << "return ";
- }
- f_service_ << "recv_" << funname << "();" << endl;
- }
- f_service_ << endl;
-
- if (!async_) {
- indent(f_service_) << "#endif" << endl;
- }
- scope_down(f_service_);
-
- // Send
- t_function send_function(g_type_void,
- string("send_") + (*f_iter)->get_name(),
- (*f_iter)->get_arglist());
-
- string argsname = (*f_iter)->get_name() + "_args";
-
- if (!async_) {
- indent(f_service_) << "#if SILVERLIGHT" << endl;
- }
-
- indent(f_service_) << "public " << function_signature_async_begin(&send_function) << endl;
- scope_up(f_service_);
-
- f_service_ << indent() << "oprot_.WriteMessageBegin(new TMessage(\"" << funname << "\", "
- << ((*f_iter)->is_oneway() ? "TMessageType.Oneway" : "TMessageType.Call")
- << ", seqid_));" << endl << indent() << argsname << " args = new " << argsname
- << "();" << endl;
-
- for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
- f_service_ << indent() << "args." << prop_name(*fld_iter) << " = "
- << normalize_name((*fld_iter)->get_name()) << ";" << endl;
- }
-
- f_service_ << indent() << "args.Write(oprot_);" << endl << indent()
- << "oprot_.WriteMessageEnd();" << endl;
- indent(f_service_) << "return oprot_.Transport.BeginFlush(callback, state);" << endl;
-
- scope_down(f_service_);
- f_service_ << endl;
-
- if (!async_) {
- indent(f_service_) << "#else" << endl;
- f_service_ << endl;
- }
-
- indent(f_service_) << "public " << function_signature(&send_function) << endl;
- scope_up(f_service_);
-
- f_service_ << indent() << "oprot_.WriteMessageBegin(new TMessage(\"" << funname << "\", "
- << ((*f_iter)->is_oneway() ? "TMessageType.Oneway" : "TMessageType.Call")
- << ", seqid_));" << endl << indent() << argsname << " args = new " << argsname
- << "();" << endl;
-
- for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
- f_service_ << indent() << "args." << prop_name(*fld_iter) << " = "
- << normalize_name((*fld_iter)->get_name()) << ";" << endl;
- }
-
- f_service_ << indent() << "args.Write(oprot_);" << endl << indent()
- << "oprot_.WriteMessageEnd();" << endl;
-
- indent(f_service_) << "oprot_.Transport.Flush();" << endl;
- cleanup_member_name_mapping(arg_struct);
- scope_down(f_service_);
-
- if (!async_) {
- indent(f_service_) << "#endif" << endl;
- }
-
- f_service_ << endl;
-
- if (!(*f_iter)->is_oneway()) {
- string resultname = (*f_iter)->get_name() + "_result";
-
- t_struct noargs(program_);
- t_function recv_function((*f_iter)->get_returntype(),
- string("recv_") + (*f_iter)->get_name(),
- &noargs,
- (*f_iter)->get_xceptions());
- indent(f_service_) << "public " << function_signature(&recv_function) << endl;
- scope_up(f_service_);
-
- t_struct* xs = (*f_iter)->get_xceptions();
- prepare_member_name_mapping(xs, xs->get_members(), resultname);
-
- f_service_ << indent() << "TMessage msg = iprot_.ReadMessageBegin();" << endl << indent()
- << "if (msg.Type == TMessageType.Exception) {" << endl;
- indent_up();
- f_service_ << indent() << "TApplicationException x = TApplicationException.Read(iprot_);"
- << endl << indent() << "iprot_.ReadMessageEnd();" << endl << indent() << "throw x;"
- << endl;
- indent_down();
- f_service_ << indent() << "}" << endl << indent() << resultname << " result = new "
- << resultname << "();" << endl << indent() << "result.Read(iprot_);" << endl
- << indent() << "iprot_.ReadMessageEnd();" << endl;
-
- if (!(*f_iter)->get_returntype()->is_void()) {
- if (nullable_) {
- if (type_can_be_null((*f_iter)->get_returntype())) {
- f_service_ << indent() << "if (result.Success != null) {" << endl << indent()
- << " return result.Success;" << endl << indent() << "}" << endl;
- } else {
- f_service_ << indent() << "if (result.Success.HasValue) {" << endl << indent()
- << " return result.Success.Value;" << endl << indent() << "}" << endl;
- }
- } else {
- f_service_ << indent() << "if (result.__isset.success) {" << endl << indent()
- << " return result.Success;" << endl << indent() << "}" << endl;
- }
- }
-
- const std::vector<t_field*>& xceptions = xs->get_members();
- vector<t_field*>::const_iterator x_iter;
- for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
- if (nullable_) {
- f_service_ << indent() << "if (result." << prop_name(*x_iter) << " != null) {" << endl
- << indent() << " throw result." << prop_name(*x_iter) << ";" << endl
- << indent() << "}" << endl;
- } else {
- f_service_ << indent() << "if (result.__isset." << normalize_name((*x_iter)->get_name())
- << ") {" << endl << indent() << " throw result." << prop_name(*x_iter) << ";"
- << endl << indent() << "}" << endl;
- }
- }
-
- if ((*f_iter)->get_returntype()->is_void()) {
- indent(f_service_) << "return;" << endl;
- } else {
- f_service_ << indent()
- << "throw new "
- "TApplicationException(TApplicationException.ExceptionType.MissingResult, \""
- << (*f_iter)->get_name() << " failed: unknown result\");" << endl;
- }
-
- cleanup_member_name_mapping((*f_iter)->get_xceptions());
- scope_down(f_service_);
- f_service_ << endl;
- }
- }
-
- indent_down();
- indent(f_service_) << "}" << endl;
-}
-
-void t_csharp_generator::generate_service_server(t_service* tservice) {
- if (async_) {
- generate_service_server_async(tservice);
- generate_service_server_sync(tservice);
- }
- else {
- generate_service_server_sync(tservice);
- }
-}
-
-void t_csharp_generator::generate_service_server_sync(t_service* tservice) {
- vector<t_function*> functions = tservice->get_functions();
- vector<t_function*>::iterator f_iter;
-
- string extends = "";
- string extends_processor = "";
- if (tservice->get_extends() != NULL) {
- extends = type_name(tservice->get_extends());
- extends_processor = extends + ".Processor, ";
- }
-
- indent(f_service_) << "public class Processor : " << extends_processor << "TProcessor {" << endl;
- indent_up();
-
- indent(f_service_) << "public Processor(ISync iface)";
-
- if (!extends.empty()) {
- f_service_ << " : base(iface)";
- }
- f_service_ << endl;
- scope_up(f_service_);
- f_service_ << indent() << "iface_ = iface;" << endl;
-
- for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
- f_service_ << indent() << "processMap_[\"" << (*f_iter)->get_name()
- << "\"] = " << (*f_iter)->get_name() << "_Process;" << endl;
- }
-
- scope_down(f_service_);
- f_service_ << endl;
-
- if (extends.empty()) {
- f_service_
- << indent()
- << "protected delegate void ProcessFunction(int seqid, TProtocol iprot, TProtocol oprot);"
- << endl;
- }
-
- f_service_ << indent() << "private ISync iface_;" << endl;
-
- if (extends.empty()) {
- f_service_ << indent() << "protected Dictionary<string, ProcessFunction> processMap_ = new "
- "Dictionary<string, ProcessFunction>();" << endl;
- }
-
- f_service_ << endl;
-
- if (extends.empty()) {
- indent(f_service_) << "public bool Process(TProtocol iprot, TProtocol oprot)" << endl;
- }
- else {
- indent(f_service_) << "public new bool Process(TProtocol iprot, TProtocol oprot)" << endl;
- }
- scope_up(f_service_);
-
- f_service_ << indent() << "try" << endl;
- scope_up(f_service_);
-
- f_service_ << indent() << "TMessage msg = iprot.ReadMessageBegin();" << endl;
-
- f_service_
- << indent() << "ProcessFunction fn;" << endl << indent()
- << "processMap_.TryGetValue(msg.Name, out fn);" << endl << indent() << "if (fn == null) {"
- << endl << indent() << " TProtocolUtil.Skip(iprot, TType.Struct);" << endl << indent()
- << " iprot.ReadMessageEnd();" << endl << indent()
- << " TApplicationException x = new TApplicationException "
- "(TApplicationException.ExceptionType.UnknownMethod, \"Invalid method name: '\" + "
- "msg.Name + \"'\");" << endl << indent()
- << " oprot.WriteMessageBegin(new TMessage(msg.Name, TMessageType.Exception, msg.SeqID));"
- << endl << indent() << " x.Write(oprot);" << endl << indent() << " oprot.WriteMessageEnd();"
- << endl << indent() << " oprot.Transport.Flush();" << endl << indent() << " return true;"
- << endl << indent() << "}" << endl << indent() << "fn(msg.SeqID, iprot, oprot);" << endl;
-
- scope_down(f_service_);
-
- f_service_ << indent() << "catch (IOException)" << endl;
- scope_up(f_service_);
- f_service_ << indent() << "return false;" << endl;
- scope_down(f_service_);
-
- f_service_ << indent() << "return true;" << endl;
-
- scope_down(f_service_);
- f_service_ << endl;
-
- for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
- generate_process_function(tservice, *f_iter);
- }
-
- indent_down();
- indent(f_service_) << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_service_server_async(t_service* tservice) {
- vector<t_function*> functions = tservice->get_functions();
- vector<t_function*>::iterator f_iter;
-
- string extends = "";
- string extends_processor = "";
- if (tservice->get_extends() != NULL) {
- extends = type_name(tservice->get_extends());
- extends_processor = extends + ".AsyncProcessor, ";
- }
-
- indent(f_service_) << "public class AsyncProcessor : " << extends_processor << "TAsyncProcessor {" << endl;
- indent_up();
-
- indent(f_service_) << "public AsyncProcessor(IAsync iface)";
- if (!extends.empty()) {
- f_service_ << " : base(iface)";
- }
- f_service_ << endl;
- scope_up(f_service_);
- f_service_ << indent() << "iface_ = iface;" << endl;
-
- for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
- f_service_ << indent() << "processMap_[\"" << (*f_iter)->get_name()
- << "\"] = " << (*f_iter)->get_name() << "_ProcessAsync;" << endl;
- }
-
- scope_down(f_service_);
- f_service_ << endl;
-
- if (extends.empty()) {
- f_service_
- << indent()
- << "protected delegate Task ProcessFunction(int seqid, TProtocol iprot, TProtocol oprot);"
- << endl;
- }
-
- f_service_ << indent() << "private IAsync iface_;" << endl;
-
- if (extends.empty()) {
- f_service_ << indent() << "protected Dictionary<string, ProcessFunction> processMap_ = new "
- "Dictionary<string, ProcessFunction>();" << endl;
- }
-
- f_service_ << endl;
-
- if (extends.empty()) {
- indent(f_service_) << "public async Task<bool> ProcessAsync(TProtocol iprot, TProtocol oprot)" << endl;
- }
- else {
- indent(f_service_) << "public new async Task<bool> ProcessAsync(TProtocol iprot, TProtocol oprot)" << endl;
- }
- scope_up(f_service_);
-
- f_service_ << indent() << "try" << endl;
- scope_up(f_service_);
-
- f_service_ << indent() << "TMessage msg = iprot.ReadMessageBegin();" << endl;
-
- f_service_
- << indent() << "ProcessFunction fn;" << endl << indent()
- << "processMap_.TryGetValue(msg.Name, out fn);" << endl << indent() << "if (fn == null) {"
- << endl << indent() << " TProtocolUtil.Skip(iprot, TType.Struct);" << endl << indent()
- << " iprot.ReadMessageEnd();" << endl << indent()
- << " TApplicationException x = new TApplicationException "
- "(TApplicationException.ExceptionType.UnknownMethod, \"Invalid method name: '\" + "
- "msg.Name + \"'\");" << endl << indent()
- << " oprot.WriteMessageBegin(new TMessage(msg.Name, TMessageType.Exception, msg.SeqID));"
- << endl << indent() << " x.Write(oprot);" << endl << indent() << " oprot.WriteMessageEnd();"
- << endl << indent() << " oprot.Transport.Flush();" << endl << indent() << " return true;"
- << endl << indent() << "}" << endl << indent() << "await fn(msg.SeqID, iprot, oprot);" << endl;
-
- scope_down(f_service_);
-
- f_service_ << indent() << "catch (IOException)" << endl;
- scope_up(f_service_);
- f_service_ << indent() << "return false;" << endl;
- scope_down(f_service_);
-
- f_service_ << indent() << "return true;" << endl;
-
- scope_down(f_service_);
- f_service_ << endl;
-
- for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
- generate_process_function_async(tservice, *f_iter);
- }
-
- indent_down();
- indent(f_service_) << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_function_helpers(t_function* tfunction) {
- if (tfunction->is_oneway()) {
- return;
- }
-
- t_struct result(program_, tfunction->get_name() + "_result");
- t_field success(tfunction->get_returntype(), "success", 0);
- if (!tfunction->get_returntype()->is_void()) {
- result.append(&success);
- }
-
- t_struct* xs = tfunction->get_xceptions();
- const vector<t_field*>& fields = xs->get_members();
- vector<t_field*>::const_iterator f_iter;
- for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
- result.append(*f_iter);
- }
-
- generate_csharp_struct_definition(f_service_, &result, false, true, true);
-}
-
-void t_csharp_generator::generate_process_function(t_service* tservice, t_function* tfunction) {
- (void)tservice;
- indent(f_service_) << "public void " << tfunction->get_name()
- << "_Process(int seqid, TProtocol iprot, TProtocol oprot)" << endl;
- scope_up(f_service_);
-
- string argsname = tfunction->get_name() + "_args";
- string resultname = tfunction->get_name() + "_result";
-
- f_service_ << indent() << argsname << " args = new " << argsname << "();" << endl
- << indent() << "args.Read(iprot);" << endl
- << indent() << "iprot.ReadMessageEnd();" << endl;
-
- t_struct* xs = tfunction->get_xceptions();
- const std::vector<t_field*>& xceptions = xs->get_members();
- vector<t_field*>::const_iterator x_iter;
-
- if (!tfunction->is_oneway()) {
- f_service_ << indent() << resultname << " result = new " << resultname << "();" << endl;
- }
-
- f_service_ << indent() << "try" << endl
- << indent() << "{" << endl;
- indent_up();
-
- if (xceptions.size() > 0) {
- f_service_ << indent() << "try" << endl
- << indent() << "{" << endl;
- indent_up();
- }
-
- t_struct* arg_struct = tfunction->get_arglist();
- const std::vector<t_field*>& fields = arg_struct->get_members();
- vector<t_field*>::const_iterator f_iter;
-
- f_service_ << indent();
- if (!tfunction->is_oneway() && !tfunction->get_returntype()->is_void()) {
- f_service_ << "result.Success = ";
- }
- f_service_ << "iface_." << normalize_name(tfunction->get_name()) << "(";
- bool first = true;
- prepare_member_name_mapping(arg_struct);
- for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
- if (first) {
- first = false;
- } else {
- f_service_ << ", ";
- }
- f_service_ << "args." << prop_name(*f_iter);
- if (nullable_ && !type_can_be_null((*f_iter)->get_type())) {
- f_service_ << ".Value";
- }
- }
- cleanup_member_name_mapping(arg_struct);
- f_service_ << ");" << endl;
-
- prepare_member_name_mapping(xs, xs->get_members(), resultname);
- if (xceptions.size() > 0) {
- indent_down();
- f_service_ << indent() << "}" << endl;
- for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
- f_service_ << indent() << "catch (" << type_name((*x_iter)->get_type(), false, false) << " "
- << (*x_iter)->get_name() << ")" << endl
- << indent() << "{" << endl;
- if (!tfunction->is_oneway()) {
- indent_up();
- f_service_ << indent() << "result." << prop_name(*x_iter) << " = " << (*x_iter)->get_name()
- << ";" << endl;
- indent_down();
- }
- f_service_ << indent() << "}" << endl;
- }
- }
- if (!tfunction->is_oneway()) {
- f_service_ << indent() << "oprot.WriteMessageBegin(new TMessage(\"" << tfunction->get_name()
- << "\", TMessageType.Reply, seqid)); " << endl;
- f_service_ << indent() << "result.Write(oprot);" << endl;
- }
- indent_down();
-
- cleanup_member_name_mapping(xs);
-
- f_service_ << indent() << "}" << endl
- << indent() << "catch (TTransportException)" << endl
- << indent() << "{" << endl
- << indent() << " throw;" << endl
- << indent() << "}" << endl
- << indent() << "catch (Exception ex)" << endl
- << indent() << "{" << endl
- << indent() << " Console.Error.WriteLine(\"Error occurred in processor:\");" << endl
- << indent() << " Console.Error.WriteLine(ex.ToString());" << endl;
-
- if (tfunction->is_oneway()) {
- f_service_ << indent() << "}" << endl;
- } else {
- f_service_ << indent() << " TApplicationException x = new TApplicationException" << indent()
- << "(TApplicationException.ExceptionType.InternalError,\" Internal error.\");"
- << endl
- << indent() << " oprot.WriteMessageBegin(new TMessage(\"" << tfunction->get_name()
- << "\", TMessageType.Exception, seqid));" << endl
- << indent() << " x.Write(oprot);" << endl
- << indent() << "}" << endl;
- f_service_ << indent() << "oprot.WriteMessageEnd();" << endl
- << indent() << "oprot.Transport.Flush();" << endl;
- }
-
- scope_down(f_service_);
-
- f_service_ << endl;
-}
-
-void t_csharp_generator::generate_process_function_async(t_service* tservice, t_function* tfunction) {
- (void)tservice;
- indent(f_service_) << "public async Task " << tfunction->get_name()
- << "_ProcessAsync(int seqid, TProtocol iprot, TProtocol oprot)" << endl;
- scope_up(f_service_);
-
- string argsname = tfunction->get_name() + "_args";
- string resultname = tfunction->get_name() + "_result";
-
- f_service_ << indent() << argsname << " args = new " << argsname << "();" << endl
- << indent() << "args.Read(iprot);" << endl
- << indent() << "iprot.ReadMessageEnd();" << endl;
-
- t_struct* xs = tfunction->get_xceptions();
- const std::vector<t_field*>& xceptions = xs->get_members();
- vector<t_field*>::const_iterator x_iter;
-
- if (!tfunction->is_oneway()) {
- f_service_ << indent() << resultname << " result = new " << resultname << "();" << endl;
- }
-
- f_service_ << indent() << "try" << endl
- << indent() << "{" << endl;
- indent_up();
-
- if (xceptions.size() > 0) {
- f_service_ << indent() << "try" << endl
- << indent() << "{" << endl;
- indent_up();
- }
-
- t_struct* arg_struct = tfunction->get_arglist();
- const std::vector<t_field*>& fields = arg_struct->get_members();
- vector<t_field*>::const_iterator f_iter;
-
- f_service_ << indent();
- if (!tfunction->is_oneway() && !tfunction->get_returntype()->is_void()) {
- f_service_ << "result.Success = ";
- }
- f_service_ << "await iface_." << normalize_name(tfunction->get_name()) << "Async(";
- bool first = true;
- prepare_member_name_mapping(arg_struct);
- for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
- if (first) {
- first = false;
- }
- else {
- f_service_ << ", ";
- }
- f_service_ << "args." << prop_name(*f_iter);
- if (nullable_ && !type_can_be_null((*f_iter)->get_type())) {
- f_service_ << ".Value";
- }
- }
- cleanup_member_name_mapping(arg_struct);
- f_service_ << ");" << endl;
-
- prepare_member_name_mapping(xs, xs->get_members(), resultname);
- if (xceptions.size() > 0) {
- indent_down();
- f_service_ << indent() << "}" << endl;
- for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
- f_service_ << indent() << "catch (" << type_name((*x_iter)->get_type(), false, false) << " "
- << (*x_iter)->get_name() << ")" << endl
- << indent() << "{" << endl;
- if (!tfunction->is_oneway()) {
- indent_up();
- f_service_ << indent() << "result." << prop_name(*x_iter) << " = " << (*x_iter)->get_name()
- << ";" << endl;
- indent_down();
- }
- f_service_ << indent() << "}" << endl;
- }
- }
- if (!tfunction->is_oneway()) {
- f_service_ << indent() << "oprot.WriteMessageBegin(new TMessage(\"" << tfunction->get_name()
- << "\", TMessageType.Reply, seqid)); " << endl;
- f_service_ << indent() << "result.Write(oprot);" << endl;
- }
- indent_down();
-
- cleanup_member_name_mapping(xs);
-
- f_service_ << indent() << "}" << endl
- << indent() << "catch (TTransportException)" << endl
- << indent() << "{" << endl
- << indent() << " throw;" << endl
- << indent() << "}" << endl
- << indent() << "catch (Exception ex)" << endl
- << indent() << "{" << endl
- << indent() << " Console.Error.WriteLine(\"Error occurred in processor:\");" << endl
- << indent() << " Console.Error.WriteLine(ex.ToString());" << endl;
-
- if (tfunction->is_oneway()) {
- f_service_ << indent() << "}" << endl;
- }
- else {
- f_service_ << indent() << " TApplicationException x = new TApplicationException" << indent()
- << "(TApplicationException.ExceptionType.InternalError,\" Internal error.\");"
- << endl
- << indent() << " oprot.WriteMessageBegin(new TMessage(\"" << tfunction->get_name()
- << "\", TMessageType.Exception, seqid));" << endl
- << indent() << " x.Write(oprot);" << endl
- << indent() << "}" << endl;
- f_service_ << indent() << "oprot.WriteMessageEnd();" << endl
- << indent() << "oprot.Transport.Flush();" << endl;
- }
-
- scope_down(f_service_);
-
- f_service_ << endl;
-}
-
-void t_csharp_generator::generate_csharp_union_reader(std::ostream& out, t_struct* tunion) {
- // Thanks to THRIFT-1768, we don't need to check for required fields in the union
- const vector<t_field*>& fields = tunion->get_members();
- vector<t_field*>::const_iterator f_iter;
-
- indent(out) << "public static " << tunion->get_name() << " Read(TProtocol iprot)" << endl;
- scope_up(out);
-
- out << indent() << "iprot.IncrementRecursionDepth();" << endl;
- out << indent() << "try" << endl;
- scope_up(out);
-
- indent(out) << tunion->get_name() << " retval;" << endl;
- indent(out) << "iprot.ReadStructBegin();" << endl;
- indent(out) << "TField field = iprot.ReadFieldBegin();" << endl;
- // we cannot have the first field be a stop -- we must have a single field defined
- indent(out) << "if (field.Type == TType.Stop)" << endl;
- scope_up(out);
- indent(out) << "iprot.ReadFieldEnd();" << endl;
- indent(out) << "retval = new ___undefined();" << endl;
- scope_down(out);
- indent(out) << "else" << endl;
- scope_up(out);
- indent(out) << "switch (field.ID)" << endl;
- scope_up(out);
-
- for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
- indent(out) << "case " << (*f_iter)->get_key() << ":" << endl;
- indent_up();
- indent(out) << "if (field.Type == " << type_to_enum((*f_iter)->get_type()) << ") {" << endl;
- indent_up();
-
- indent(out) << type_name((*f_iter)->get_type()) << " temp;" << endl;
- generate_deserialize_field(out, (*f_iter), "temp", true);
- indent(out) << "retval = new " << (*f_iter)->get_name() << "(temp);" << endl;
-
- indent_down();
- out << indent() << "} else { " << endl << indent() << " TProtocolUtil.Skip(iprot, field.Type);"
- << endl << indent() << " retval = new ___undefined();" << endl << indent() << "}" << endl
- << indent() << "break;" << endl;
- indent_down();
- }
-
- indent(out) << "default: " << endl;
- indent_up();
- indent(out) << "TProtocolUtil.Skip(iprot, field.Type);" << endl << indent()
- << "retval = new ___undefined();" << endl;
- indent(out) << "break;" << endl;
- indent_down();
-
- scope_down(out);
-
- indent(out) << "iprot.ReadFieldEnd();" << endl;
-
- indent(out) << "if (iprot.ReadFieldBegin().Type != TType.Stop)" << endl;
- scope_up(out);
- indent(out) << "throw new TProtocolException(TProtocolException.INVALID_DATA);" << endl;
- scope_down(out);
-
- // end of else for TStop
- scope_down(out);
- indent(out) << "iprot.ReadStructEnd();" << endl;
- indent(out) << "return retval;" << endl;
- indent_down();
-
- scope_down(out);
- out << indent() << "finally" << endl;
- scope_up(out);
- out << indent() << "iprot.DecrementRecursionDepth();" << endl;
- scope_down(out);
-
- indent(out) << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_deserialize_field(ostream& out,
- t_field* tfield,
- string prefix,
- bool is_propertyless) {
- t_type* type = tfield->get_type();
- while (type->is_typedef()) {
- type = ((t_typedef*)type)->get_type();
- }
-
- if (type->is_void()) {
- throw "CANNOT GENERATE DESERIALIZE CODE FOR void TYPE: " + prefix + tfield->get_name();
- }
-
- string name = prefix + (is_propertyless ? "" : prop_name(tfield));
-
- if (type->is_struct() || type->is_xception()) {
- generate_deserialize_struct(out, (t_struct*)type, name);
- } else if (type->is_container()) {
- generate_deserialize_container(out, type, name);
- } else if (type->is_base_type() || type->is_enum()) {
- indent(out) << name << " = ";
-
- if (type->is_enum()) {
- out << "(" << type_name(type, false, true) << ")";
- }
-
- out << "iprot.";
-
- if (type->is_base_type()) {
- t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
- switch (tbase) {
- case t_base_type::TYPE_VOID:
- throw "compiler error: cannot serialize void field in a struct: " + name;
- break;
- case t_base_type::TYPE_STRING:
- if (type->is_binary()) {
- out << "ReadBinary();";
- } else {
- out << "ReadString();";
- }
- break;
- case t_base_type::TYPE_BOOL:
- out << "ReadBool();";
- break;
- case t_base_type::TYPE_I8:
- out << "ReadByte();";
- break;
- case t_base_type::TYPE_I16:
- out << "ReadI16();";
- break;
- case t_base_type::TYPE_I32:
- out << "ReadI32();";
- break;
- case t_base_type::TYPE_I64:
- out << "ReadI64();";
- break;
- case t_base_type::TYPE_DOUBLE:
- out << "ReadDouble();";
- break;
- default:
- throw "compiler error: no C# name for base type " + t_base_type::t_base_name(tbase);
- }
- } else if (type->is_enum()) {
- out << "ReadI32();";
- }
- out << endl;
- } else {
- printf("DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n",
- tfield->get_name().c_str(),
- type_name(type).c_str());
- }
-}
-
-void t_csharp_generator::generate_deserialize_struct(ostream& out,
- t_struct* tstruct,
- string prefix) {
- if (union_ && tstruct->is_union()) {
- out << indent() << prefix << " = " << type_name(tstruct) << ".Read(iprot);" << endl;
- } else {
- out << indent() << prefix << " = new " << type_name(tstruct) << "();" << endl << indent()
- << prefix << ".Read(iprot);" << endl;
- }
-}
-
-void t_csharp_generator::generate_deserialize_container(ostream& out,
- t_type* ttype,
- string prefix) {
- scope_up(out);
-
- string obj;
-
- if (ttype->is_map()) {
- obj = tmp("_map");
- } else if (ttype->is_set()) {
- obj = tmp("_set");
- } else if (ttype->is_list()) {
- obj = tmp("_list");
- }
-
- indent(out) << prefix << " = new " << type_name(ttype, false, true) << "();" << endl;
- if (ttype->is_map()) {
- out << indent() << "TMap " << obj << " = iprot.ReadMapBegin();" << endl;
- } else if (ttype->is_set()) {
- out << indent() << "TSet " << obj << " = iprot.ReadSetBegin();" << endl;
- } else if (ttype->is_list()) {
- out << indent() << "TList " << obj << " = iprot.ReadListBegin();" << endl;
- }
-
- string i = tmp("_i");
- indent(out) << "for( int " << i << " = 0; " << i << " < " << obj << ".Count"
- << "; "
- << "++" << i << ")" << endl;
- scope_up(out);
-
- if (ttype->is_map()) {
- generate_deserialize_map_element(out, (t_map*)ttype, prefix);
- } else if (ttype->is_set()) {
- generate_deserialize_set_element(out, (t_set*)ttype, prefix);
- } else if (ttype->is_list()) {
- generate_deserialize_list_element(out, (t_list*)ttype, prefix);
- }
-
- scope_down(out);
-
- if (ttype->is_map()) {
- indent(out) << "iprot.ReadMapEnd();" << endl;
- } else if (ttype->is_set()) {
- indent(out) << "iprot.ReadSetEnd();" << endl;
- } else if (ttype->is_list()) {
- indent(out) << "iprot.ReadListEnd();" << endl;
- }
-
- scope_down(out);
-}
-
-void t_csharp_generator::generate_deserialize_map_element(ostream& out,
- t_map* tmap,
- string prefix) {
- string key = tmp("_key");
- string val = tmp("_val");
-
- t_field fkey(tmap->get_key_type(), key);
- t_field fval(tmap->get_val_type(), val);
-
- indent(out) << declare_field(&fkey) << endl;
- indent(out) << declare_field(&fval) << endl;
-
- generate_deserialize_field(out, &fkey);
- generate_deserialize_field(out, &fval);
-
- indent(out) << prefix << "[" << key << "] = " << val << ";" << endl;
-}
-
-void t_csharp_generator::generate_deserialize_set_element(ostream& out,
- t_set* tset,
- string prefix) {
- string elem = tmp("_elem");
- t_field felem(tset->get_elem_type(), elem);
-
- indent(out) << declare_field(&felem) << endl;
-
- generate_deserialize_field(out, &felem);
-
- indent(out) << prefix << ".Add(" << elem << ");" << endl;
-}
-
-void t_csharp_generator::generate_deserialize_list_element(ostream& out,
- t_list* tlist,
- string prefix) {
- string elem = tmp("_elem");
- t_field felem(tlist->get_elem_type(), elem);
-
- indent(out) << declare_field(&felem) << endl;
-
- generate_deserialize_field(out, &felem);
-
- indent(out) << prefix << ".Add(" << elem << ");" << endl;
-}
-
-void t_csharp_generator::generate_serialize_field(ostream& out,
- t_field* tfield,
- string prefix,
- bool is_element,
- bool is_propertyless) {
- t_type* type = tfield->get_type();
- while (type->is_typedef()) {
- type = ((t_typedef*)type)->get_type();
- }
-
- string name = prefix + (is_propertyless ? "" : prop_name(tfield));
-
- if (type->is_void()) {
- throw "CANNOT GENERATE SERIALIZE CODE FOR void TYPE: " + name;
- }
-
- if (type->is_struct() || type->is_xception()) {
- generate_serialize_struct(out, (t_struct*)type, name);
- } else if (type->is_container()) {
- generate_serialize_container(out, type, name);
- } else if (type->is_base_type() || type->is_enum()) {
- indent(out) << "oprot.";
-
- string nullable_name = nullable_ && !is_element && !field_is_required(tfield) ? name + ".Value"
- : name;
-
- if (type->is_base_type()) {
- t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
- switch (tbase) {
- case t_base_type::TYPE_VOID:
- throw "compiler error: cannot serialize void field in a struct: " + name;
- break;
- case t_base_type::TYPE_STRING:
- if (type->is_binary()) {
- out << "WriteBinary(";
- } else {
- out << "WriteString(";
- }
- out << name << ");";
- break;
- case t_base_type::TYPE_BOOL:
- out << "WriteBool(" << nullable_name << ");";
- break;
- case t_base_type::TYPE_I8:
- out << "WriteByte(" << nullable_name << ");";
- break;
- case t_base_type::TYPE_I16:
- out << "WriteI16(" << nullable_name << ");";
- break;
- case t_base_type::TYPE_I32:
- out << "WriteI32(" << nullable_name << ");";
- break;
- case t_base_type::TYPE_I64:
- out << "WriteI64(" << nullable_name << ");";
- break;
- case t_base_type::TYPE_DOUBLE:
- out << "WriteDouble(" << nullable_name << ");";
- break;
- default:
- throw "compiler error: no C# name for base type " + t_base_type::t_base_name(tbase);
- }
- } else if (type->is_enum()) {
- out << "WriteI32((int)" << nullable_name << ");";
- }
- out << endl;
- } else {
- printf("DO NOT KNOW HOW TO SERIALIZE '%s%s' TYPE '%s'\n",
- prefix.c_str(),
- tfield->get_name().c_str(),
- type_name(type).c_str());
- }
-}
-
-void t_csharp_generator::generate_serialize_struct(ostream& out,
- t_struct* tstruct,
- string prefix) {
- (void)tstruct;
- out << indent() << prefix << ".Write(oprot);" << endl;
-}
-
-void t_csharp_generator::generate_serialize_container(ostream& out, t_type* ttype, string prefix) {
- scope_up(out);
-
- if (ttype->is_map()) {
- indent(out) << "oprot.WriteMapBegin(new TMap(" << type_to_enum(((t_map*)ttype)->get_key_type())
- << ", " << type_to_enum(((t_map*)ttype)->get_val_type()) << ", " << prefix
- << ".Count));" << endl;
- } else if (ttype->is_set()) {
- indent(out) << "oprot.WriteSetBegin(new TSet(" << type_to_enum(((t_set*)ttype)->get_elem_type())
- << ", " << prefix << ".Count));" << endl;
- } else if (ttype->is_list()) {
- indent(out) << "oprot.WriteListBegin(new TList("
- << type_to_enum(((t_list*)ttype)->get_elem_type()) << ", " << prefix << ".Count));"
- << endl;
- }
-
- string iter = tmp("_iter");
- if (ttype->is_map()) {
- indent(out) << "foreach (" << type_name(((t_map*)ttype)->get_key_type()) << " " << iter
- << " in " << prefix << ".Keys)";
- } else if (ttype->is_set()) {
- indent(out) << "foreach (" << type_name(((t_set*)ttype)->get_elem_type()) << " " << iter
- << " in " << prefix << ")";
- } else if (ttype->is_list()) {
- indent(out) << "foreach (" << type_name(((t_list*)ttype)->get_elem_type()) << " " << iter
- << " in " << prefix << ")";
- }
-
- out << endl;
- scope_up(out);
-
- if (ttype->is_map()) {
- generate_serialize_map_element(out, (t_map*)ttype, iter, prefix);
- } else if (ttype->is_set()) {
- generate_serialize_set_element(out, (t_set*)ttype, iter);
- } else if (ttype->is_list()) {
- generate_serialize_list_element(out, (t_list*)ttype, iter);
- }
-
- scope_down(out);
-
- if (ttype->is_map()) {
- indent(out) << "oprot.WriteMapEnd();" << endl;
- } else if (ttype->is_set()) {
- indent(out) << "oprot.WriteSetEnd();" << endl;
- } else if (ttype->is_list()) {
- indent(out) << "oprot.WriteListEnd();" << endl;
- }
-
- scope_down(out);
-}
-
-void t_csharp_generator::generate_serialize_map_element(ostream& out,
- t_map* tmap,
- string iter,
- string map) {
- t_field kfield(tmap->get_key_type(), iter);
- generate_serialize_field(out, &kfield, "", true);
- t_field vfield(tmap->get_val_type(), map + "[" + iter + "]");
- generate_serialize_field(out, &vfield, "", true);
-}
-
-void t_csharp_generator::generate_serialize_set_element(ostream& out, t_set* tset, string iter) {
- t_field efield(tset->get_elem_type(), iter);
- generate_serialize_field(out, &efield, "", true);
-}
-
-void t_csharp_generator::generate_serialize_list_element(ostream& out,
- t_list* tlist,
- string iter) {
- t_field efield(tlist->get_elem_type(), iter);
- generate_serialize_field(out, &efield, "", true);
-}
-
-void t_csharp_generator::generate_property(ostream& out,
- t_field* tfield,
- bool isPublic,
- bool generateIsset) {
- generate_csharp_property(out, tfield, isPublic, generateIsset, "_");
-}
-void t_csharp_generator::generate_csharp_property(ostream& out,
- t_field* tfield,
- bool isPublic,
- bool generateIsset,
- std::string fieldPrefix) {
- if ((serialize_ || wcf_) && isPublic) {
- indent(out) << "[DataMember(Order = 0)]" << endl;
- }
- bool has_default = field_has_default(tfield);
- bool is_required = field_is_required(tfield);
- if ((nullable_ && !has_default) || (is_required)) {
- indent(out) << (isPublic ? "public " : "private ")
- << type_name(tfield->get_type(), false, false, true, is_required) << " "
- << prop_name(tfield) << " { get; set; }" << endl;
- } else {
- indent(out) << (isPublic ? "public " : "private ")
- << type_name(tfield->get_type(), false, false, true) << " " << prop_name(tfield)
- << endl;
- scope_up(out);
- indent(out) << "get" << endl;
- scope_up(out);
- bool use_nullable = false;
- if (nullable_) {
- t_type* ttype = tfield->get_type();
- while (ttype->is_typedef()) {
- ttype = ((t_typedef*)ttype)->get_type();
- }
- if (ttype->is_base_type()) {
- use_nullable = ((t_base_type*)ttype)->get_base() != t_base_type::TYPE_STRING;
- } else if (ttype->is_enum()) {
- use_nullable = true;
- }
- }
- indent(out) << "return " << fieldPrefix + tfield->get_name() << ";" << endl;
- scope_down(out);
- indent(out) << "set" << endl;
- scope_up(out);
- if (use_nullable) {
- if (generateIsset) {
- indent(out) << "__isset." << normalize_name(tfield->get_name()) << " = value.HasValue;"
- << endl;
- }
- indent(out) << "if (value.HasValue) this." << fieldPrefix + tfield->get_name()
- << " = value.Value;" << endl;
- } else {
- if (generateIsset) {
- indent(out) << "__isset." << normalize_name(tfield->get_name()) << " = true;" << endl;
- }
- indent(out) << "this." << fieldPrefix + tfield->get_name() << " = value;" << endl;
- }
- scope_down(out);
- scope_down(out);
- }
- out << endl;
-}
-
-std::string t_csharp_generator::make_valid_csharp_identifier(std::string const& fromName) {
- std::string str = fromName;
- if (str.empty()) {
- return str;
- }
-
- // tests rely on this
- assert(('A' < 'Z') && ('a' < 'z') && ('0' < '9'));
-
- // if the first letter is a number, we add an additional underscore in front of it
- char c = str.at(0);
- if (('0' <= c) && (c <= '9')) {
- str = "_" + str;
- }
-
- // following chars: letter, number or underscore
- for (size_t i = 0; i < str.size(); ++i) {
- c = str.at(i);
- if ((('A' > c) || (c > 'Z')) && (('a' > c) || (c > 'z')) && (('0' > c) || (c > '9'))
- && ('_' != c)) {
- str.replace(i, 1, "_");
- }
- }
-
- return str;
-}
-
-void t_csharp_generator::cleanup_member_name_mapping(void* scope) {
- if( member_mapping_scopes.empty()) {
- throw "internal error: cleanup_member_name_mapping() no scope active";
- }
-
- member_mapping_scope& active = member_mapping_scopes.back();
- if (active.scope_member != scope) {
- throw "internal error: cleanup_member_name_mapping() called for wrong struct";
- }
-
- member_mapping_scopes.pop_back();
-}
-
-string t_csharp_generator::get_mapped_member_name(string name) {
- if( ! member_mapping_scopes.empty()) {
- member_mapping_scope& active = member_mapping_scopes.back();
- map<string, string>::iterator iter = active.mapping_table.find(name);
- if (active.mapping_table.end() != iter) {
- return iter->second;
- }
- }
-
- pverbose("no mapping for member %s\n", name.c_str());
- return name;
-}
-
-void t_csharp_generator::prepare_member_name_mapping(t_struct* tstruct) {
- prepare_member_name_mapping(tstruct, tstruct->get_members(), tstruct->get_name());
-}
-
-void t_csharp_generator::prepare_member_name_mapping(void* scope,
- const vector<t_field*>& members,
- const string& structname) {
- // begin new scope
- member_mapping_scope dummy;
- dummy.scope_member = 0;
- member_mapping_scopes.push_back(dummy);
- member_mapping_scope& active = member_mapping_scopes.back();
- active.scope_member = scope;
-
- // current C# generator policy:
- // - prop names are always rendered with an Uppercase first letter
- // - struct names are used as given
- std::set<std::string> used_member_names;
- vector<t_field*>::const_iterator iter;
-
- // prevent name conflicts with struct (CS0542 error)
- used_member_names.insert(structname);
-
- // prevent name conflicts with known methods (THRIFT-2942)
- used_member_names.insert("Read");
- used_member_names.insert("Write");
-
- for (iter = members.begin(); iter != members.end(); ++iter) {
- string oldname = (*iter)->get_name();
- string newname = prop_name(*iter, true);
- while (true) {
-
- // new name conflicts with another member
- if (used_member_names.find(newname) != used_member_names.end()) {
- pverbose("struct %s: member %s conflicts with another member\n",
- structname.c_str(),
- newname.c_str());
- newname += '_';
- continue;
- }
-
- // add always, this helps us to detect edge cases like
- // different spellings ("foo" and "Foo") within the same struct
- pverbose("struct %s: member mapping %s => %s\n",
- structname.c_str(),
- oldname.c_str(),
- newname.c_str());
- active.mapping_table[oldname] = newname;
- used_member_names.insert(newname);
- break;
- }
- }
-}
-
-std::string t_csharp_generator::prop_name(t_field* tfield, bool suppress_mapping) {
- string name(tfield->get_name());
- if (suppress_mapping) {
- name[0] = toupper(name[0]);
- } else {
- name = get_mapped_member_name(name);
- }
- return name;
-}
-
-string t_csharp_generator::type_name(t_type* ttype,
- bool in_container,
- bool in_init,
- bool in_param,
- bool is_required) {
- (void)in_init;
- while (ttype->is_typedef()) {
- ttype = ((t_typedef*)ttype)->get_type();
- }
-
- if (ttype->is_base_type()) {
- return base_type_name((t_base_type*)ttype, in_container, in_param, is_required);
- } else if (ttype->is_map()) {
- t_map* tmap = (t_map*)ttype;
- return "Dictionary<" + type_name(tmap->get_key_type(), true) + ", "
- + type_name(tmap->get_val_type(), true) + ">";
- } else if (ttype->is_set()) {
- t_set* tset = (t_set*)ttype;
- return "THashSet<" + type_name(tset->get_elem_type(), true) + ">";
- } else if (ttype->is_list()) {
- t_list* tlist = (t_list*)ttype;
- return "List<" + type_name(tlist->get_elem_type(), true) + ">";
- }
-
- t_program* program = ttype->get_program();
- string postfix = (!is_required && nullable_ && in_param && ttype->is_enum()) ? "?" : "";
- if (program != NULL && program != program_) {
- string ns = program->get_namespace("csharp");
- if (!ns.empty()) {
- return ns + "." + normalize_name(ttype->get_name()) + postfix;
- }
- }
-
- return normalize_name(ttype->get_name()) + postfix;
-}
-
-string t_csharp_generator::base_type_name(t_base_type* tbase,
- bool in_container,
- bool in_param,
- bool is_required) {
- (void)in_container;
- string postfix = (!is_required && nullable_ && in_param) ? "?" : "";
- switch (tbase->get_base()) {
- case t_base_type::TYPE_VOID:
- return "void";
- case t_base_type::TYPE_STRING:
- if (tbase->is_binary()) {
- return "byte[]";
- } else {
- return "string";
- }
- case t_base_type::TYPE_BOOL:
- return "bool" + postfix;
- case t_base_type::TYPE_I8:
- return "sbyte" + postfix;
- case t_base_type::TYPE_I16:
- return "short" + postfix;
- case t_base_type::TYPE_I32:
- return "int" + postfix;
- case t_base_type::TYPE_I64:
- return "long" + postfix;
- case t_base_type::TYPE_DOUBLE:
- return "double" + postfix;
- default:
- throw "compiler error: no C# name for base type " + t_base_type::t_base_name(tbase->get_base());
- }
-}
-
-string t_csharp_generator::declare_field(t_field* tfield, bool init, std::string prefix) {
- string result = type_name(tfield->get_type()) + " " + prefix + tfield->get_name();
- if (init) {
- t_type* ttype = tfield->get_type();
- while (ttype->is_typedef()) {
- ttype = ((t_typedef*)ttype)->get_type();
- }
- if (ttype->is_base_type() && field_has_default(tfield)) {
- std::ofstream dummy;
- result += " = " + render_const_value(dummy, tfield->get_name(), ttype, tfield->get_value());
- } else if (ttype->is_base_type()) {
- t_base_type::t_base tbase = ((t_base_type*)ttype)->get_base();
- switch (tbase) {
- case t_base_type::TYPE_VOID:
- throw "NO T_VOID CONSTRUCT";
- case t_base_type::TYPE_STRING:
- result += " = null";
- break;
- case t_base_type::TYPE_BOOL:
- result += " = false";
- break;
- case t_base_type::TYPE_I8:
- case t_base_type::TYPE_I16:
- case t_base_type::TYPE_I32:
- case t_base_type::TYPE_I64:
- result += " = 0";
- break;
- case t_base_type::TYPE_DOUBLE:
- result += " = (double)0";
- break;
- }
- } else if (ttype->is_enum()) {
- result += " = (" + type_name(ttype, false, true) + ")0";
- } else if (ttype->is_container()) {
- result += " = new " + type_name(ttype, false, true) + "()";
- } else {
- result += " = new " + type_name(ttype, false, true) + "()";
- }
- }
- return result + ";";
-}
-
-string t_csharp_generator::function_signature(t_function* tfunction, string prefix) {
- t_type* ttype = tfunction->get_returntype();
- return type_name(ttype) + " " + normalize_name(prefix + tfunction->get_name()) + "("
- + argument_list(tfunction->get_arglist()) + ")";
-}
-
-string t_csharp_generator::function_signature_async_begin(t_function* tfunction, string prefix) {
- string comma = (tfunction->get_arglist()->get_members().size() > 0 ? ", " : "");
- return "IAsyncResult " + normalize_name(prefix + tfunction->get_name())
- + "(AsyncCallback callback, object state" + comma + argument_list(tfunction->get_arglist())
- + ")";
-}
-
-string t_csharp_generator::function_signature_async_end(t_function* tfunction, string prefix) {
- t_type* ttype = tfunction->get_returntype();
- return type_name(ttype) + " " + normalize_name(prefix + tfunction->get_name())
- + "(IAsyncResult asyncResult)";
-}
-
-string t_csharp_generator::function_signature_async(t_function* tfunction, string prefix) {
- t_type* ttype = tfunction->get_returntype();
- string task = "Task";
- if (!ttype->is_void())
- task += "<" + type_name(ttype) + ">";
- return task + " " + normalize_name(prefix + tfunction->get_name()) + "Async("
- + argument_list(tfunction->get_arglist()) + ")";
-}
-
-string t_csharp_generator::argument_list(t_struct* tstruct) {
- string result = "";
- const vector<t_field*>& fields = tstruct->get_members();
- vector<t_field*>::const_iterator f_iter;
- bool first = true;
- for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
- if (first) {
- first = false;
- } else {
- result += ", ";
- }
- result += type_name((*f_iter)->get_type()) + " " + normalize_name((*f_iter)->get_name());
- }
- return result;
-}
-
-string t_csharp_generator::type_to_enum(t_type* type) {
- while (type->is_typedef()) {
- type = ((t_typedef*)type)->get_type();
- }
-
- if (type->is_base_type()) {
- t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
- switch (tbase) {
- case t_base_type::TYPE_VOID:
- throw "NO T_VOID CONSTRUCT";
- case t_base_type::TYPE_STRING:
- return "TType.String";
- case t_base_type::TYPE_BOOL:
- return "TType.Bool";
- case t_base_type::TYPE_I8:
- return "TType.Byte";
- case t_base_type::TYPE_I16:
- return "TType.I16";
- case t_base_type::TYPE_I32:
- return "TType.I32";
- case t_base_type::TYPE_I64:
- return "TType.I64";
- case t_base_type::TYPE_DOUBLE:
- return "TType.Double";
- }
- } else if (type->is_enum()) {
- return "TType.I32";
- } else if (type->is_struct() || type->is_xception()) {
- return "TType.Struct";
- } else if (type->is_map()) {
- return "TType.Map";
- } else if (type->is_set()) {
- return "TType.Set";
- } else if (type->is_list()) {
- return "TType.List";
- }
-
- throw "INVALID TYPE IN type_to_enum: " + type->get_name();
-}
-
-void t_csharp_generator::generate_csharp_docstring_comment(ostream& out, string contents) {
- generate_docstring_comment(out, "/// <summary>\n", "/// ", contents, "/// </summary>\n");
-}
-
-void t_csharp_generator::generate_csharp_doc(ostream& out, t_field* field) {
- if (field->get_type()->is_enum()) {
- string combined_message = field->get_doc() + "\n<seealso cref=\""
- + get_enum_class_name(field->get_type()) + "\"/>";
- generate_csharp_docstring_comment(out, combined_message);
- } else {
- generate_csharp_doc(out, (t_doc*)field);
- }
-}
-
-void t_csharp_generator::generate_csharp_doc(ostream& out, t_doc* tdoc) {
- if (tdoc->has_doc()) {
- generate_csharp_docstring_comment(out, tdoc->get_doc());
- }
-}
-
-void t_csharp_generator::generate_csharp_doc(ostream& out, t_function* tfunction) {
- if (tfunction->has_doc()) {
- stringstream ps;
- const vector<t_field*>& fields = tfunction->get_arglist()->get_members();
- vector<t_field*>::const_iterator p_iter;
- for (p_iter = fields.begin(); p_iter != fields.end(); ++p_iter) {
- t_field* p = *p_iter;
- ps << "\n<param name=\"" << p->get_name() << "\">";
- if (p->has_doc()) {
- std::string str = p->get_doc();
- str.erase(std::remove(str.begin(), str.end(), '\n'),
- str.end()); // remove the newlines that appear from the parser
- ps << str;
- }
- ps << "</param>";
- }
- generate_docstring_comment(out,
- "",
- "/// ",
- "<summary>\n" + tfunction->get_doc() + "</summary>" + ps.str(),
- "");
- }
-}
-
-std::string t_csharp_generator::get_enum_class_name(t_type* type) {
- string package = "";
- t_program* program = type->get_program();
- if (program != NULL && program != program_) {
- package = program->get_namespace("csharp") + ".";
- }
- return package + type->get_name();
-}
-
-
-THRIFT_REGISTER_GENERATOR(
- csharp,
- "C#",
- " async: Adds Async support using Task.Run.\n"
- " wcf: Adds bindings for WCF to generated classes.\n"
- " serial: Add serialization support to generated classes.\n"
- " nullable: Use nullable types for properties.\n"
- " hashcode: Generate a hashcode and equals implementation for classes.\n"
- " union: Use new union typing, which includes a static read function for union "
- "types.\n")
diff --git a/compiler/cpp/src/thrift/generate/t_netstd_generator.cc b/compiler/cpp/src/thrift/generate/t_netstd_generator.cc
index b2883ed..6737862 100644
--- a/compiler/cpp/src/thrift/generate/t_netstd_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_netstd_generator.cc
@@ -157,12 +157,7 @@ void t_netstd_generator::init_generator()
{
MKDIR(get_out_dir().c_str());
- // for usage of csharp namespaces in thrift files (from files for csharp)
namespace_name_ = program_->get_namespace("netstd");
- if (namespace_name_.empty())
- {
- namespace_name_ = program_->get_namespace("netstd");
- }
string dir = namespace_name_;
string subdir = get_out_dir().c_str();
diff --git a/compiler/cpp/src/thrift/parse/t_program.h b/compiler/cpp/src/thrift/parse/t_program.h
index de68a0c..5b1b8d0 100644
--- a/compiler/cpp/src/thrift/parse/t_program.h
+++ b/compiler/cpp/src/thrift/parse/t_program.h
@@ -292,7 +292,7 @@ public:
base_language = "st";
}
else if (base_language == "csharp") {
- pwarning(1, "The '%s' target is deprecated. Consider moving to 'netstd' instead.", base_language.c_str());
+ pwarning(1, "The '%s' target is no longer available. Use 'netstd' instead.", base_language.c_str());
// warn only, don't change base_language
}
else if (base_language == "netcore") {
diff --git a/compiler/cpp/src/thrift/thriftl.ll b/compiler/cpp/src/thrift/thriftl.ll
index 282e030..5f0ebd9 100644
--- a/compiler/cpp/src/thrift/thriftl.ll
+++ b/compiler/cpp/src/thrift/thriftl.ll
@@ -207,7 +207,6 @@ literal_begin (['\"])
"cpp_include" { return tok_cpp_include; }
"cpp_type" { return tok_cpp_type; }
"java_package" { error_unsupported_namespace_decl("java_package", "java"); /* do nothing */ }
-"csharp_namespace" { error_unsupported_namespace_decl("csharp"); /* do nothing */ }
"delphi_namespace" { error_unsupported_namespace_decl("delphi"); /* do nothing */ }
"php_namespace" { error_unsupported_namespace_decl("php"); /* do nothing */ }
"py_module" { error_unsupported_namespace_decl("py_module", "py"); /* do nothing */ }
diff --git a/compiler/cpp/tests/CMakeLists.txt b/compiler/cpp/tests/CMakeLists.txt
index 7798c15..924e167 100644
--- a/compiler/cpp/tests/CMakeLists.txt
+++ b/compiler/cpp/tests/CMakeLists.txt
@@ -101,7 +101,6 @@ THRIFT_ADD_COMPILER(as3 "Enable compiler for ActionScript 3" OFF)
THRIFT_ADD_COMPILER(c_glib "Enable compiler for C with Glib" OFF)
THRIFT_ADD_COMPILER(cl "Enable compiler for Common LISP" OFF)
THRIFT_ADD_COMPILER(cpp "Enable compiler for C++" OFF)
-THRIFT_ADD_COMPILER(csharp "Enable compiler for C#" OFF)
THRIFT_ADD_COMPILER(d "Enable compiler for D" OFF)
THRIFT_ADD_COMPILER(dart "Enable compiler for Dart" OFF)
THRIFT_ADD_COMPILER(delphi "Enable compiler for Delphi" OFF)
diff --git a/configure.ac b/configure.ac
index f3f88a7..99c3c9c 100755
--- a/configure.ac
+++ b/configure.ac
@@ -121,7 +121,6 @@ if test "$enable_libs" = "no"; then
with_c_glib="no"
with_cl="no"
with_java="no"
- with_csharp="no"
with_python="no"
with_py3="no"
with_ruby="no"
@@ -212,24 +211,6 @@ if test "$have_cpp" = "yes" -o "$have_c_glib" = "yes"; then
AX_CHECK_OPENSSL()
fi
-AX_THRIFT_LIB(csharp, [C#], yes)
-if test "$with_csharp" = "yes"; then
- PKG_CHECK_MODULES(MONO, mono >= 2.11.0, mono_2_11=yes, mono_2_11=no)
- if test "$mono_2_11" == "yes"; then
- AC_PATH_PROG([MCS], [mcs])
- if test "x$MCS" != "x"; then
- mono_mcs="yes"
- fi
- fi
- PKG_CHECK_MODULES(MONO, mono >= 2.0.0, net_3_5=yes, net_3_5=no)
- PKG_CHECK_MODULES(MONO, mono >= 1.2.4, have_mono=yes, have_mono=no)
- if test "$have_mono" = "yes" ; then
- have_csharp="yes"
- fi
-fi
-AM_CONDITIONAL(WITH_MONO, [test "$have_csharp" = "yes"])
-AM_CONDITIONAL(NET_2_0, [test "$net_3_5" = "no"])
-AM_CONDITIONAL(MONO_MCS, [test "$mono_mcs" = "yes"])
AX_THRIFT_LIB(java, [Java], yes)
if test "$with_java" = "yes"; then
@@ -802,8 +783,6 @@ AC_CONFIG_FILES([
lib/c_glib/Makefile
lib/c_glib/thrift_c_glib.pc
lib/c_glib/test/Makefile
- lib/csharp/Makefile
- lib/csharp/test/Multiplex/Makefile
lib/d/Makefile
lib/d/test/Makefile
lib/erl/Makefile
@@ -838,7 +817,6 @@ AC_CONFIG_FILES([
test/c_glib/Makefile
test/cl/Makefile
test/cpp/Makefile
- test/csharp/Makefile
test/erl/Makefile
test/go/Makefile
test/haxe/Makefile
@@ -885,8 +863,6 @@ if test "$have_d" = "yes" -a "$have_deimos_event2" = "yes" -a "$have_deimos_open
AC_SUBST([MAYBE_D])
if test "$have_java" = "yes" ; then MAYBE_JAVA="java" ; else MAYBE_JAVA="" ; fi
AC_SUBST([MAYBE_JAVA])
-if test "$have_csharp" = "yes" ; then MAYBE_CSHARP="csharp" ; else MAYBE_CSHARP="" ; fi
-AC_SUBST([MAYBE_CSHARP])
if test "$have_python" = "yes" ; then MAYBE_PYTHON="py" ; else MAYBE_PYTHON="" ; fi
AC_SUBST([MAYBE_PYTHON])
if test "$have_py3" = "yes" ; then MAYBE_PY3="py3" ; else MAYBE_PY3="" ; fi
@@ -928,7 +904,6 @@ echo "$PACKAGE $VERSION"
echo
echo "Building ActionScript3 Library : $have_as3"
echo "Building C (GLib) Library .... : $have_c_glib"
-echo "Building C# (Mono) Library ... : $have_csharp"
echo "Building C++ Library ......... : $have_cpp"
echo "Building Common Lisp Library.. : $have_cl"
echo "Building D Library ........... : $have_d"
@@ -960,12 +935,6 @@ if test "$have_c_glib" = "yes" ; then
echo "C (glib):"
echo " Using glib version ........ : $($GSETTINGS --version)"
fi
-if test "$have_csharp" = "yes" ; then
- echo
- echo "C# Library:"
- echo " Using .NET 3.5 ............ : $net_3_5"
- echo " Using mono version ........ : $($MCS --version | head -1)"
-fi
if test "$have_cpp" = "yes" ; then
echo
echo "C++ Library:"
diff --git a/contrib/Rebus/README.md b/contrib/Rebus/README.md
index bbb9c49..7b11bd0 100644
--- a/contrib/Rebus/README.md
+++ b/contrib/Rebus/README.md
@@ -19,3 +19,8 @@ refer to the Rebus docs on how to do that (it's not that hard, really).
Additional requirements:
- RabbitMQ .NET client (see nuget)
+
+Deprecation notice:
+Csharp is not a supported Apache Thrift target anymore. Instead netstd is the
+recommended replacement. This code is left "as is" for educational purposes
+unless someone converts it to netstd
diff --git a/contrib/Vagrantfile b/contrib/Vagrantfile
index b340563..6d2d420 100644
--- a/contrib/Vagrantfile
+++ b/contrib/Vagrantfile
@@ -78,10 +78,6 @@ sudo apt-get install -qq lua5.2 lua5.2-dev
# Node.js dependencies
sudo apt-get install -qq nodejs nodejs-dev nodejs-legacy npm
-# CSharp
-sudo apt-get install -qq mono-gmcs mono-devel mono-xbuild mono-complete libmono-system-web2.0-cil
-sudo apt-get install -qq mingw32 mingw32-binutils mingw32-runtime nsis
-
# D dependencies
sudo wget http://master.dl.sourceforge.net/project/d-apt/files/d-apt.list -O /etc/apt/sources.list.d/d-apt.list
sudo apt-get update && sudo apt-get -y --allow-unauthenticated install --reinstall d-apt-keyring && sudo apt-get update
diff --git a/contrib/thrift.spec b/contrib/thrift.spec
index 225a969..4c678ba 100644
--- a/contrib/thrift.spec
+++ b/contrib/thrift.spec
@@ -175,7 +175,6 @@ export RUBYLIB=${PWD}/lib/rb/lib
%{?without_ruby: --without-ruby } \
%{?without_php: --without-php } \
%{!?without_php: PHP_PREFIX=${RPM_BUILD_ROOT}/usr/lib/php } \
- --without-csharp \
--without-erlang \
%if 0%{!?without_ruby:1}
diff --git a/contrib/zeromq/README.md b/contrib/zeromq/README.md
index 9e0b5bd..3a7379e 100644
--- a/contrib/zeromq/README.md
+++ b/contrib/zeromq/README.md
@@ -28,3 +28,8 @@ that amount.
This code is not quite what I would consider production-ready. It doesn't
support all of the normal hooks into Thrift, and its performance is
sub-optimal because it does some unnecessary copying.
+
+Deprecation notice:
+Csharp is not a supported Apache Thrift target anymore. Instead netstd is the
+recommended replacement. This code is left "as is" for educational purposes
+unless someone converts it to netstd
diff --git a/debian/control b/debian/control
index 414a815..a9e934f 100644
--- a/debian/control
+++ b/debian/control
@@ -1,8 +1,8 @@
Source: thrift
Section: devel
Priority: extra
-Build-Depends: debhelper (>= 9), build-essential, mono-mcs, python-dev, ant,
- mono-devel, libmono-system-web4.0-cil, erlang-base, ruby-dev | ruby1.9.1-dev, ruby-bundler ,autoconf, automake,
+Build-Depends: dotnet-runtime-3.1, dotnet-sdk-3.1, debhelper (>= 9), build-essential, python-dev, ant,
+ erlang-base, ruby-dev | ruby1.9.1-dev, ruby-bundler ,autoconf, automake,
pkg-config, libtool, bison, flex, libboost-dev | libboost1.56-dev | libboost1.63-all-dev,
python-all, python-setuptools, python-all-dev, python-all-dbg,
python3-all, python3-setuptools, python3-all-dev, python3-all-dbg,
@@ -126,17 +126,16 @@ Description: Java bindings for Thrift
classes, and then the modules in this package will allow you to use those
classes in your programs.
-Package: libthrift-cil
+Package: libthrift-netstd
Architecture: all
-Section: cli-mono
-Depends: cli-common, libmono-corlib4.0-cil (>= 2.10) | libmono-corlib4.5-cil (>=3.2), libmono-system4.0-cil (>= 2.10),
- libmono-system-web4.0-cil (>= 2.10), ${misc:Depends}
-Description: CLI bindings for Thrift
+Section: netstd
+Depends: dotnet-runtime-3.1, ${misc:Depends}
+Description: NET Standard bindings for Thrift
Thrift is a software framework for scalable cross-language services
development. It combines a software stack with a code generation engine to
build services that work efficiently and seamlessly.
.
- This package contains the CLI bindings for Thrift. You will need the thrift
+ This package contains the NET Standard bindings for Thrift. You will need the thrift
tool (in the thrift-compiler package) to compile your definition to C#
classes, and then the modules in this package will allow you to use those
classes in your programs.
diff --git a/debian/copyright b/debian/copyright
index 3e6fcf7..ada769b 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -29,7 +29,7 @@ under the Apache 2.0 License:
compiler/cpp/Makefile.am
compiler/cpp/src/generate/t_cpp_generator.cc
- compiler/cpp/src/generate/t_csharp_generator.cc
+ compiler/cpp/src/generate/t_netstd_generator.cc
compiler/cpp/src/generate/t_erl_generator.cc
compiler/cpp/src/generate/t_hs_generator.cc
compiler/cpp/src/generate/t_java_generator.cc
@@ -46,36 +46,36 @@ under the Apache 2.0 License:
compiler/cpp/src/platform.h
compiler/cpp/src/thriftl.ll
compiler/cpp/src/thrifty.yy
- lib/csharp/src/Protocol/TBinaryProtocol.cs
- lib/csharp/src/Protocol/TField.cs
- lib/csharp/src/Protocol/TList.cs
- lib/csharp/src/Protocol/TMap.cs
- lib/csharp/src/Protocol/TMessage.cs
- lib/csharp/src/Protocol/TMessageType.cs
- lib/csharp/src/Protocol/TProtocol.cs
- lib/csharp/src/Protocol/TProtocolException.cs
- lib/csharp/src/Protocol/TProtocolFactory.cs
- lib/csharp/src/Protocol/TProtocolUtil.cs
- lib/csharp/src/Protocol/TSet.cs
- lib/csharp/src/Protocol/TStruct.cs
- lib/csharp/src/Protocol/TType.cs
- lib/csharp/src/Server/TServer.cs
- lib/csharp/src/Server/TSimpleServer.cs
- lib/csharp/src/Server/TThreadPoolServer.cs
- lib/csharp/src/TApplicationException.cs
- lib/csharp/src/Thrift.csproj
- lib/csharp/src/Thrift.sln
- lib/csharp/src/TProcessor.cs
- lib/csharp/src/Transport/TServerSocket.cs
- lib/csharp/src/Transport/TServerTransport.cs
- lib/csharp/src/Transport/TSocket.cs
- lib/csharp/src/Transport/TStreamTransport.cs
- lib/csharp/src/Transport/TTransport.cs
- lib/csharp/src/Transport/TTransportException.cs
- lib/csharp/src/Transport/TTransportFactory.cs
- lib/csharp/ThriftMSBuildTask/Properties/AssemblyInfo.cs
- lib/csharp/ThriftMSBuildTask/ThriftBuild.cs
- lib/csharp/ThriftMSBuildTask/ThriftMSBuildTask.csproj
+ lib/netstd/src/Protocol/TBinaryProtocol.cs
+ lib/netstd/src/Protocol/TField.cs
+ lib/netstd/src/Protocol/TList.cs
+ lib/netstd/src/Protocol/TMap.cs
+ lib/netstd/src/Protocol/TMessage.cs
+ lib/netstd/src/Protocol/TMessageType.cs
+ lib/netstd/src/Protocol/TProtocol.cs
+ lib/netstd/src/Protocol/TProtocolException.cs
+ lib/netstd/src/Protocol/TProtocolFactory.cs
+ lib/netstd/src/Protocol/TProtocolUtil.cs
+ lib/netstd/src/Protocol/TSet.cs
+ lib/netstd/src/Protocol/TStruct.cs
+ lib/netstd/src/Protocol/TType.cs
+ lib/netstd/src/Server/TServer.cs
+ lib/netstd/src/Server/TSimpleServer.cs
+ lib/netstd/src/Server/TThreadPoolServer.cs
+ lib/netstd/src/TApplicationException.cs
+ lib/netstd/src/Thrift.csproj
+ lib/netstd/src/Thrift.sln
+ lib/netstd/src/TProcessor.cs
+ lib/netstd/src/Transport/TServerSocket.cs
+ lib/netstd/src/Transport/TServerTransport.cs
+ lib/netstd/src/Transport/TSocket.cs
+ lib/netstd/src/Transport/TStreamTransport.cs
+ lib/netstd/src/Transport/TTransport.cs
+ lib/netstd/src/Transport/TTransportException.cs
+ lib/netstd/src/Transport/TTransportFactory.cs
+ lib/netstd/ThriftMSBuildTask/Properties/AssemblyInfo.cs
+ lib/netstd/ThriftMSBuildTask/ThriftBuild.cs
+ lib/netstd/ThriftMSBuildTask/ThriftMSBuildTask.csproj
lib/rb/lib/thrift.rb
lib/st/README
lib/st/thrift.st
diff --git a/debian/rules b/debian/rules
index e209ba3..d0de508 100755
--- a/debian/rules
+++ b/debian/rules
@@ -76,7 +76,7 @@ build-indep-stamp: configure-stamp $(CURDIR)/compiler/cpp/thrift
./gradlew --no-daemon -Prelease=true jar
# C#
- $(MAKE) -C $(CURDIR)/lib/csharp
+ $(MAKE) -C $(CURDIR)/lib/netstd
# Ruby
$(MAKE) -C $(CURDIR)/lib/rb
@@ -122,9 +122,9 @@ install-indep:
$(CURDIR)/debian/ruby-thrift/usr/lib/ruby/1.9.1
# C#
- mkdir -p $(CURDIR)/debian/libthrift-cil/usr/lib/cli/thrift/ && \
- cp $(CURDIR)/lib/csharp/Thrift.dll \
- $(CURDIR)/debian/libthrift-cil/usr/lib/cli/thrift/Thrift.dll
+ mkdir -p $(CURDIR)/debian/libthrift-netstd/usr/lib/cli/thrift/ && \
+ cp $(CURDIR)/lib/netstd/Thrift/bin/Release/netstandard2.0/Thrift.dll \
+ $(CURDIR)/debian/libthrift-netstd/usr/lib/cli/thrift/Thrift.dll
# Perl
$(MAKE) -C $(CURDIR)/lib/perl install DESTDIR=$(CURDIR)/debian/libthrift-perl
diff --git a/doc/install/debian.md b/doc/install/debian.md
index 2ccc37d..d6b5500 100644
--- a/doc/install/debian.md
+++ b/doc/install/debian.md
@@ -32,8 +32,8 @@ If you would like to build Apache Thrift libraries for other programming languag
* libglib2.0-dev
* Erlang
* erlang-base erlang-eunit erlang-dev rebar
- * Csharp
- * mono-gmcs mono-devel libmono-system-web2.0-cil nunit nunit-console
+ * NetStd
+ * apt-transport-https dotnet-sdk-3.1 aspnetcore-runtime-3.1
* Haskell
* ghc cabal-install libghc-binary-dev libghc-network-dev libghc-http-dev
* Thrift Compiler for Windows
diff --git a/doc/specs/idl.md b/doc/specs/idl.md
index df7e8d7..7563310 100644
--- a/doc/specs/idl.md
+++ b/doc/specs/idl.md
@@ -38,7 +38,7 @@ A namespace declares which namespaces/package/module/etc. the type definitions i
[5] Namespace ::= ( 'namespace' ( NamespaceScope Identifier ) )
- [6] NamespaceScope ::= '*' | 'c_glib' | 'cpp' | 'csharp' | 'delphi' | 'go' | 'java' | 'js' | 'lua' | 'netcore' | 'perl' | 'php' | 'py' | 'py.twisted' | 'rb' | 'st' | 'xsd'
+ [6] NamespaceScope ::= '*' | 'c_glib' | 'cpp' | 'delphi' | 'haxe' | 'go' | 'java' | 'js' | 'lua' | 'netstd' | 'perl' | 'php' | 'py' | 'py.twisted' | 'rb' | 'st' | 'xsd'
## Definition
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 51a2af0..5d16256 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -32,10 +32,6 @@ if WITH_C_GLIB
SUBDIRS += c_glib
endif
-if WITH_MONO
-SUBDIRS += csharp
-endif
-
if WITH_JAVA
SUBDIRS += java
PRECROSS_TARGET += precross-java
diff --git a/lib/cpp/test/OneWayTest.thrift b/lib/cpp/test/OneWayTest.thrift
index 1e9894c..37d1eb3 100644
--- a/lib/cpp/test/OneWayTest.thrift
+++ b/lib/cpp/test/OneWayTest.thrift
@@ -26,7 +26,6 @@ namespace java onewaytest
namespace cpp onewaytest
namespace rb Onewaytest
namespace perl OneWayTest
-namespace csharp Onewaytest
namespace js OneWayTest
namespace st OneWayTest
namespace py OneWayTest
diff --git a/lib/csharp/Makefile.am b/lib/csharp/Makefile.am
deleted file mode 100644
index cc2bbc9..0000000
--- a/lib/csharp/Makefile.am
+++ /dev/null
@@ -1,114 +0,0 @@
-#
-# 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.
-#
-
-SUBDIRS = . test/Multiplex
-
-THRIFTCODE = \
- src/Collections/THashSet.cs \
- src/Collections/TCollections.cs \
- src/Properties/AssemblyInfo.cs \
- src/Protocol/TAbstractBase.cs \
- src/Protocol/TBase.cs \
- src/Protocol/TBase64Utils.cs \
- src/Protocol/TJSONProtocol.cs \
- src/Protocol/TProtocolException.cs \
- src/Protocol/TProtocolFactory.cs \
- src/Protocol/TList.cs \
- src/Protocol/TSet.cs \
- src/Protocol/TMap.cs \
- src/Protocol/TProtocolUtil.cs \
- src/Protocol/TMessageType.cs \
- src/Protocol/TProtocol.cs \
- src/Protocol/TProtocolDecorator.cs \
- src/Protocol/TMultiplexedProtocol.cs \
- src/Protocol/TMultiplexedProcessor.cs \
- src/Protocol/TType.cs \
- src/Protocol/TField.cs \
- src/Protocol/TMessage.cs \
- src/Protocol/TStruct.cs \
- src/Protocol/TBinaryProtocol.cs \
- src/Protocol/TCompactProtocol.cs \
- src/Server/TThreadedServer.cs \
- src/Server/TThreadPoolServer.cs \
- src/Server/TSimpleServer.cs \
- src/Server/TServer.cs \
- src/Server/TServerEventHandler.cs \
- src/Transport/TBufferedTransport.cs \
- src/Transport/TTransport.cs \
- src/Transport/TSocket.cs \
- src/Transport/TSocketVersionizer.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 \
- src/Transport/THttpClient.cs \
- src/Transport/THttpHandler.cs \
- src/Transport/TMemoryBuffer.cs \
- src/Transport/TNamedPipeClientTransport.cs \
- src/Transport/TNamedPipeServerTransport.cs \
- src/Transport/TTLSSocket.cs \
- src/Transport/TTLSServerSocket.cs \
- src/TProcessor.cs \
- src/TProcessorFactory.cs \
- src/TSingletonProcessorFactory.cs \
- src/TPrototypeProcessorFactory.cs \
- src/TControllingHandler.cs \
- src/TException.cs \
- src/TApplicationException.cs
-
-if MONO_MCS
-export CSC = mcs
-else
-export CSC = gmcs
-endif
-
-if NET_2_0
-export CSC_DEFINES = -d:NET_2_0
-endif
-
-all-local: Thrift.dll Thrift.45.dll
-
-Thrift.dll: $(THRIFTCODE)
- $(CSC) $(CSC_DEFINES) -out:$@ -target:library -reference:System.Web $(THRIFTCODE)
-
-Thrift.45.dll: $(THRIFTCODE)
- $(CSC) $(CSC_DEFINES) -out:$@ -target:library -reference:System.Web $(THRIFTCODE)
-
-CLEANFILES = \
- Thrift.dll \
- Thrift.45.dll
-
-DISTCLEANFILES = \
- Makefile.in
-
-EXTRA_DIST = \
- $(THRIFTCODE) \
- ThriftMSBuildTask \
- src/Thrift.csproj \
- src/Thrift.45.csproj \
- src/Thrift.sln \
- src/Net35/ExtensionsNet35.cs \
- src/Transport/TSilverlightSocket.cs \
- src/Transport/THttpTaskAsyncHandler.cs \
- src/TAsyncProcessor.cs \
- test \
- coding_standards.md \
- README.md
diff --git a/lib/csharp/README.md b/lib/csharp/README.md
deleted file mode 100644
index 5fc14cb..0000000
--- a/lib/csharp/README.md
+++ /dev/null
@@ -1,32 +0,0 @@
-Thrift C# Software Library
-
-Deprecation notice
-=======
-
-Per [THRIFT-4723](https://issues.apache.org/jira/browse/THRIFT-4723), both CSharp and Netcore targets are deprecated
-and will be removed with the next release. Migrate to the [NetStd language target](../netstd/README.md) instead.
-
-License
-=======
-
-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 Thrift with C#
-====================
-
-Thrift requires Mono >= 1.2.6 or .NET framework >= 3.5
diff --git a/lib/csharp/ThriftMSBuildTask/Properties/AssemblyInfo.cs b/lib/csharp/ThriftMSBuildTask/Properties/AssemblyInfo.cs
deleted file mode 100644
index f5f0000..0000000
--- a/lib/csharp/ThriftMSBuildTask/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,60 +0,0 @@
-/**
- * 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.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("ThriftMSBuildTask")]
-[assembly: AssemblyDescription("MSBuild Task to generate csharp from .thrift files, and compile the code into a library: ThriftImpl.dll")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("The Apache Software Foundation")]
-[assembly: AssemblyProduct("ThriftMSBuildTask")]
-[assembly: AssemblyCopyright("The Apache Software Foundation")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-//@TODO where to put License information?
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components. If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("5095e09d-7b95-4be1-b250-e1c1db1c485e")]
-
-// Version information for an assembly consists of the following four values:
-//
-// Major Version
-// Minor Version
-// Build Number
-// Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("0.14.0.*")]
-[assembly: AssemblyFileVersion("0.14.0.*")]
diff --git a/lib/csharp/ThriftMSBuildTask/ThriftBuild.cs b/lib/csharp/ThriftMSBuildTask/ThriftBuild.cs
deleted file mode 100644
index 4e6d301..0000000
--- a/lib/csharp/ThriftMSBuildTask/ThriftBuild.cs
+++ /dev/null
@@ -1,246 +0,0 @@
-/**
- * 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.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using Microsoft.Build.Framework;
-using Microsoft.Build.Utilities;
-using Microsoft.Build.Tasks;
-using System.IO;
-using System.Diagnostics;
-
-namespace ThriftMSBuildTask
-{
- /// <summary>
- /// MSBuild Task to generate csharp from .thrift files, and compile the code into a library: ThriftImpl.dll
- /// </summary>
- public class ThriftBuild : Task
- {
- /// <summary>
- /// The full path to the thrift.exe compiler
- /// </summary>
- [Required]
- public ITaskItem ThriftExecutable
- {
- get;
- set;
- }
-
- /// <summary>
- /// The full path to a thrift.dll C# library
- /// </summary>
- [Required]
- public ITaskItem ThriftLibrary
- {
- get;
- set;
- }
-
- /// <summary>
- /// A direcotry containing .thrift files
- /// </summary>
- [Required]
- public ITaskItem ThriftDefinitionDir
- {
- get;
- set;
- }
-
- /// <summary>
- /// The name of the auto-gen and compiled thrift library. It will placed in
- /// the same directory as ThriftLibrary
- /// </summary>
- [Required]
- public ITaskItem OutputName
- {
- get;
- set;
- }
-
- /// <summary>
- /// The full path to the compiled ThriftLibrary. This allows msbuild tasks to use this
- /// output as a variable for use elsewhere.
- /// </summary>
- [Output]
- public ITaskItem ThriftImplementation
- {
- get { return thriftImpl; }
- }
-
- private ITaskItem thriftImpl;
- private const string lastCompilationName = "LAST_COMP_TIMESTAMP";
-
- //use the Message Build Task to write something to build log
- private void LogMessage(string text, MessageImportance importance)
- {
- Message m = new Message();
- m.Text = text;
- m.Importance = importance.ToString();
- m.BuildEngine = this.BuildEngine;
- m.Execute();
- }
-
- //recursively find .cs files in srcDir, paths should initially be non-null and empty
- private void FindSourcesHelper(string srcDir, List<string> paths)
- {
- string[] files = Directory.GetFiles(srcDir, "*.cs");
- foreach (string f in files)
- {
- paths.Add(f);
- }
- string[] dirs = Directory.GetDirectories(srcDir);
- foreach (string dir in dirs)
- {
- FindSourcesHelper(dir, paths);
- }
- }
-
- /// <summary>
- /// Quote paths with spaces
- /// </summary>
- private string SafePath(string path)
- {
- if (path.Contains(' ') && !path.StartsWith("\""))
- {
- return "\"" + path + "\"";
- }
- return path;
- }
-
- private ITaskItem[] FindSources(string srcDir)
- {
- List<string> files = new List<string>();
- FindSourcesHelper(srcDir, files);
- ITaskItem[] items = new ITaskItem[files.Count];
- for (int i = 0; i < items.Length; i++)
- {
- items[i] = new TaskItem(files[i]);
- }
- return items;
- }
-
- private string LastWriteTime(string defDir)
- {
- string[] files = Directory.GetFiles(defDir, "*.thrift");
- DateTime d = (new DirectoryInfo(defDir)).LastWriteTime;
- foreach(string file in files)
- {
- FileInfo f = new FileInfo(file);
- DateTime curr = f.LastWriteTime;
- if (DateTime.Compare(curr, d) > 0)
- {
- d = curr;
- }
- }
- return d.ToFileTimeUtc().ToString();
- }
-
- public override bool Execute()
- {
- string defDir = SafePath(ThriftDefinitionDir.ItemSpec);
- //look for last compilation timestamp
- string lastBuildPath = Path.Combine(defDir, lastCompilationName);
- DirectoryInfo defDirInfo = new DirectoryInfo(defDir);
- string lastWrite = LastWriteTime(defDir);
- if (File.Exists(lastBuildPath))
- {
- string lastComp = File.ReadAllText(lastBuildPath);
- //don't recompile if the thrift library has been updated since lastComp
- FileInfo f = new FileInfo(ThriftLibrary.ItemSpec);
- string thriftLibTime = f.LastWriteTimeUtc.ToFileTimeUtc().ToString();
- if (lastComp.CompareTo(thriftLibTime) < 0)
- {
- //new thrift library, do a compile
- lastWrite = thriftLibTime;
- }
- else if (lastComp == lastWrite || (lastComp == thriftLibTime && lastComp.CompareTo(lastWrite) > 0))
- {
- //the .thrift dir hasn't been written to since last compilation, don't need to do anything
- LogMessage("ThriftImpl up-to-date", MessageImportance.High);
- return true;
- }
- }
-
- //find the directory of the thriftlibrary (that's where output will go)
- FileInfo thriftLibInfo = new FileInfo(SafePath(ThriftLibrary.ItemSpec));
- string thriftDir = thriftLibInfo.Directory.FullName;
-
- string genDir = Path.Combine(thriftDir, "gen-csharp");
- if (Directory.Exists(genDir))
- {
- try
- {
- Directory.Delete(genDir, true);
- }
- catch { /*eh i tried, just over-write now*/}
- }
-
- //run the thrift executable to generate C#
- foreach (string thriftFile in Directory.GetFiles(defDir, "*.thrift"))
- {
- LogMessage("Generating code for: " + thriftFile, MessageImportance.Normal);
- Process p = new Process();
- p.StartInfo.FileName = SafePath(ThriftExecutable.ItemSpec);
- p.StartInfo.Arguments = "--gen csharp -o " + SafePath(thriftDir) + " -r " + thriftFile;
- p.StartInfo.UseShellExecute = false;
- p.StartInfo.CreateNoWindow = true;
- p.StartInfo.RedirectStandardOutput = false;
- p.Start();
- p.WaitForExit();
- if (p.ExitCode != 0)
- {
- LogMessage("thrift.exe failed to compile " + thriftFile, MessageImportance.High);
- return false;
- }
- if (p.ExitCode != 0)
- {
- LogMessage("thrift.exe failed to compile " + thriftFile, MessageImportance.High);
- return false;
- }
- }
-
- Csc csc = new Csc();
- csc.TargetType = "library";
- csc.References = new ITaskItem[] { new TaskItem(ThriftLibrary.ItemSpec) };
- csc.EmitDebugInformation = true;
- string outputPath = Path.Combine(thriftDir, OutputName.ItemSpec);
- csc.OutputAssembly = new TaskItem(outputPath);
- csc.Sources = FindSources(Path.Combine(thriftDir, "gen-csharp"));
- csc.BuildEngine = this.BuildEngine;
- LogMessage("Compiling generated cs...", MessageImportance.Normal);
- if (!csc.Execute())
- {
- return false;
- }
-
- //write file to defDir to indicate a build was successfully completed
- File.WriteAllText(lastBuildPath, lastWrite);
-
- thriftImpl = new TaskItem(outputPath);
-
- return true;
- }
- }
-}
diff --git a/lib/csharp/ThriftMSBuildTask/ThriftMSBuildTask.csproj b/lib/csharp/ThriftMSBuildTask/ThriftMSBuildTask.csproj
deleted file mode 100644
index 2589970..0000000
--- a/lib/csharp/ThriftMSBuildTask/ThriftMSBuildTask.csproj
+++ /dev/null
@@ -1,118 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- 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.
--->
-<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <PropertyGroup>
- <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
- <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
- <ProductVersion>9.0.21022</ProductVersion>
- <SchemaVersion>2.0</SchemaVersion>
- <ProjectGuid>{EC0A0231-66EA-4593-A792-C6CA3BB8668E}</ProjectGuid>
- <OutputType>Library</OutputType>
- <AppDesignerFolder>Properties</AppDesignerFolder>
- <RootNamespace>ThriftMSBuildTask</RootNamespace>
- <AssemblyName>ThriftMSBuildTask</AssemblyName>
- <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
- <FileAlignment>512</FileAlignment>
- <FileUpgradeFlags>
- </FileUpgradeFlags>
- <OldToolsVersion>3.5</OldToolsVersion>
- <UpgradeBackupLocation />
- <PublishUrl>publish\</PublishUrl>
- <Install>true</Install>
- <InstallFrom>Disk</InstallFrom>
- <UpdateEnabled>false</UpdateEnabled>
- <UpdateMode>Foreground</UpdateMode>
- <UpdateInterval>7</UpdateInterval>
- <UpdateIntervalUnits>Days</UpdateIntervalUnits>
- <UpdatePeriodically>false</UpdatePeriodically>
- <UpdateRequired>false</UpdateRequired>
- <MapFileExtensions>true</MapFileExtensions>
- <ApplicationRevision>0</ApplicationRevision>
- <ApplicationVersion>0.14.0.0</ApplicationVersion>
- <IsWebBootstrapper>false</IsWebBootstrapper>
- <UseApplicationTrust>false</UseApplicationTrust>
- <BootstrapperEnabled>true</BootstrapperEnabled>
- </PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
- <DebugSymbols>true</DebugSymbols>
- <DebugType>full</DebugType>
- <Optimize>false</Optimize>
- <OutputPath>bin\Debug\</OutputPath>
- <DefineConstants>DEBUG;TRACE</DefineConstants>
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
- <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
- </PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
- <DebugType>pdbonly</DebugType>
- <Optimize>true</Optimize>
- <OutputPath>bin\Release\</OutputPath>
- <DefineConstants>TRACE</DefineConstants>
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
- <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
- </PropertyGroup>
- <ItemGroup>
- <Reference Include="Microsoft.Build.Framework" />
- <Reference Include="Microsoft.Build.Tasks" />
- <Reference Include="Microsoft.Build.Utilities" />
- <Reference Include="System" />
- <Reference Include="System.Core">
- <RequiredTargetFramework>3.5</RequiredTargetFramework>
- </Reference>
- <Reference Include="System.Xml.Linq">
- <RequiredTargetFramework>3.5</RequiredTargetFramework>
- </Reference>
- <Reference Include="System.Data.DataSetExtensions">
- <RequiredTargetFramework>3.5</RequiredTargetFramework>
- </Reference>
- <Reference Include="System.Data" />
- <Reference Include="System.Xml" />
- </ItemGroup>
- <ItemGroup>
- <Compile Include="ThriftBuild.cs" />
- <Compile Include="Properties\AssemblyInfo.cs" />
- </ItemGroup>
- <ItemGroup>
- <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
- <Visible>False</Visible>
- <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
- <Install>false</Install>
- </BootstrapperPackage>
- <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
- <Visible>False</Visible>
- <ProductName>.NET Framework 3.5 SP1</ProductName>
- <Install>true</Install>
- </BootstrapperPackage>
- <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
- <Visible>False</Visible>
- <ProductName>Windows Installer 3.1</ProductName>
- <Install>true</Install>
- </BootstrapperPackage>
- </ItemGroup>
- <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
- <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
- Other similar extension points exist, see Microsoft.Common.targets.
- <Target Name="BeforeBuild">
- </Target>
- <Target Name="AfterBuild">
- </Target>
- -->
-</Project>
diff --git a/lib/csharp/coding_standards.md b/lib/csharp/coding_standards.md
deleted file mode 100644
index dc87190..0000000
--- a/lib/csharp/coding_standards.md
+++ /dev/null
@@ -1,6 +0,0 @@
-## C# Coding Standards
-
-Please follow:
- * [Thrift General Coding Standards](/doc/coding_standards.md)
- * [MSDN C# Coding Conventions](http://msdn.microsoft.com/en-us/library/ff926074.aspx)
- * [C# Coding Guidelines](http://csharpguidelines.codeplex.com/)
diff --git a/lib/csharp/src/Collections/TCollections.cs b/lib/csharp/src/Collections/TCollections.cs
deleted file mode 100644
index 84afb6a..0000000
--- a/lib/csharp/src/Collections/TCollections.cs
+++ /dev/null
@@ -1,94 +0,0 @@
-/**
- * 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;
-using System.Collections;
-
-namespace Thrift.Collections
-{
- public class TCollections
- {
- /// <summary>
- /// This will return true if the two collections are value-wise the same.
- /// If the collection contains a collection, the collections will be compared using this method.
- /// </summary>
- public static bool Equals (IEnumerable first, IEnumerable second)
- {
- if (first == null && second == null)
- {
- return true;
- }
- if (first == null || second == null)
- {
- return false;
- }
- IEnumerator fiter = first.GetEnumerator ();
- IEnumerator siter = second.GetEnumerator ();
-
- bool fnext = fiter.MoveNext ();
- bool snext = siter.MoveNext ();
- while (fnext && snext)
- {
- IEnumerable fenum = fiter.Current as IEnumerable;
- IEnumerable senum = siter.Current as IEnumerable;
- if (fenum != null && senum != null)
- {
- if (!Equals(fenum, senum))
- {
- return false;
- }
- }
- else if (fenum == null ^ senum == null)
- {
- return false;
- }
- else if (!Equals(fiter.Current, siter.Current))
- {
- return false;
- }
- fnext = fiter.MoveNext();
- snext = siter.MoveNext();
- }
-
- return fnext == snext;
- }
-
- /// <summary>
- /// This returns a hashcode based on the value of the enumerable.
- /// </summary>
- public static int GetHashCode (IEnumerable enumerable)
- {
- if (enumerable == null)
- {
- return 0;
- }
-
- int hashcode = 0;
- foreach (object obj in enumerable)
- {
- IEnumerable enum2 = obj as IEnumerable;
- int objHash = enum2 == null ? obj.GetHashCode () : GetHashCode (enum2);
- unchecked
- {
- hashcode = (hashcode * 397) ^ (objHash);
- }
- }
- return hashcode;
- }
- }
-}
diff --git a/lib/csharp/src/Collections/THashSet.cs b/lib/csharp/src/Collections/THashSet.cs
deleted file mode 100644
index e29271a..0000000
--- a/lib/csharp/src/Collections/THashSet.cs
+++ /dev/null
@@ -1,160 +0,0 @@
-/**
- * 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;
-using System.Collections;
-using System.Collections.Generic;
-
-#if SILVERLIGHT
-using System.Runtime.Serialization;
-#endif
-
-namespace Thrift.Collections
-{
-#if SILVERLIGHT
- [DataContract]
-#else
- [Serializable]
-#endif
- public class THashSet<T> : ICollection<T>
- {
-#if NET_2_0 || SILVERLIGHT
-#if SILVERLIGHT
- [DataMember]
-#endif
- TDictSet<T> set = new TDictSet<T>();
-#else
- HashSet<T> set = new HashSet<T>();
-#endif
- public int Count
- {
- get { return set.Count; }
- }
-
- public bool IsReadOnly
- {
- get { return false; }
- }
-
- public void Add(T item)
- {
- set.Add(item);
- }
-
- public void Clear()
- {
- set.Clear();
- }
-
- public bool Contains(T item)
- {
- return set.Contains(item);
- }
-
- public void CopyTo(T[] array, int arrayIndex)
- {
- set.CopyTo(array, arrayIndex);
- }
-
- public IEnumerator GetEnumerator()
- {
- return set.GetEnumerator();
- }
-
- IEnumerator<T> IEnumerable<T>.GetEnumerator()
- {
- return ((IEnumerable<T>)set).GetEnumerator();
- }
-
- public bool Remove(T item)
- {
- return set.Remove(item);
- }
-
-#if NET_2_0 || SILVERLIGHT
-#if SILVERLIGHT
- [DataContract]
-#endif
- private class TDictSet<V> : ICollection<V>
- {
-#if SILVERLIGHT
- [DataMember]
-#endif
- Dictionary<V, TDictSet<V>> dict = new Dictionary<V, TDictSet<V>>();
-
- public int Count
- {
- get { return dict.Count; }
- }
-
- public bool IsReadOnly
- {
- get { return false; }
- }
-
- public IEnumerator GetEnumerator()
- {
- return ((IEnumerable)dict.Keys).GetEnumerator();
- }
-
- IEnumerator<V> IEnumerable<V>.GetEnumerator()
- {
- return dict.Keys.GetEnumerator();
- }
-
- public bool Add(V item)
- {
- if (!dict.ContainsKey(item))
- {
- dict[item] = this;
- return true;
- }
-
- return false;
- }
-
- void ICollection<V>.Add(V item)
- {
- Add(item);
- }
-
- public void Clear()
- {
- dict.Clear();
- }
-
- public bool Contains(V item)
- {
- return dict.ContainsKey(item);
- }
-
- public void CopyTo(V[] array, int arrayIndex)
- {
- dict.Keys.CopyTo(array, arrayIndex);
- }
-
- public bool Remove(V item)
- {
- return dict.Remove(item);
- }
- }
-#endif
- }
-
-}
diff --git a/lib/csharp/src/Net35/ExtensionsNet35.cs b/lib/csharp/src/Net35/ExtensionsNet35.cs
deleted file mode 100644
index 73a4232..0000000
--- a/lib/csharp/src/Net35/ExtensionsNet35.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Text;
-
-#if (!NET45)
-namespace Thrift
-{
- static class StreamExtensionsNet35
- {
- // CopyTo() has been added in 4.0
- public static long CopyTo(this Stream source, Stream target)
- {
- byte[] buffer = new byte[8192]; // multiple of 4096
- long nTotal = 0;
- while (true)
- {
- int nRead = source.Read(buffer, 0, buffer.Length);
- if (nRead <= 0) // done?
- return nTotal;
-
- target.Write(buffer, 0, nRead);
- nTotal += nRead;
- }
- }
- }
-
-}
-#endif
-
diff --git a/lib/csharp/src/Properties/AssemblyInfo.cs b/lib/csharp/src/Properties/AssemblyInfo.cs
deleted file mode 100644
index c8f51b5..0000000
--- a/lib/csharp/src/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * 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.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("Thrift")]
-[assembly: AssemblyDescription("C# bindings for the Apache Thrift RPC system")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("The Apache Software Foundation")]
-[assembly: AssemblyProduct("Thrift")]
-[assembly: AssemblyCopyright("The Apache Software Foundation")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-//@TODO where to put License information?
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components. If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("df3f8ef0-e0a3-4c86-a65b-8ec84e016b1d")]
-
-// Version information for an assembly consists of the following four values:
-//
-// Major Version
-// Minor Version
-// Build Number
-// Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-[assembly: AssemblyVersion("0.14.0.0")]
-[assembly: AssemblyFileVersion("0.14.0.0")]
diff --git a/lib/csharp/src/Protocol/TAbstractBase.cs b/lib/csharp/src/Protocol/TAbstractBase.cs
deleted file mode 100644
index f5a61cd..0000000
--- a/lib/csharp/src/Protocol/TAbstractBase.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * 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.
- */
-
-namespace Thrift.Protocol
-{
- public interface TAbstractBase
- {
- /// <summary>
- /// Writes the objects out to the protocol.
- /// </summary>
- void Write(TProtocol tProtocol);
- }
-}
diff --git a/lib/csharp/src/Protocol/TBase.cs b/lib/csharp/src/Protocol/TBase.cs
deleted file mode 100644
index 411e4d9..0000000
--- a/lib/csharp/src/Protocol/TBase.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * 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.
- */
-
-namespace Thrift.Protocol
-{
- public interface TBase : TAbstractBase
- {
- /// <summary>
- /// Reads the TObject from the given input protocol.
- /// </summary>
- void Read(TProtocol tProtocol);
- }
-}
diff --git a/lib/csharp/src/Protocol/TBase64Utils.cs b/lib/csharp/src/Protocol/TBase64Utils.cs
deleted file mode 100644
index 9eaaebd..0000000
--- a/lib/csharp/src/Protocol/TBase64Utils.cs
+++ /dev/null
@@ -1,100 +0,0 @@
-/**
- * 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;
-
-namespace Thrift.Protocol
-{
- internal static class TBase64Utils
- {
- internal const string ENCODE_TABLE =
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-
- internal static void encode(byte[] src, int srcOff, int len, byte[] dst,
- int dstOff)
- {
- dst[dstOff] = (byte)ENCODE_TABLE[(src[srcOff] >> 2) & 0x3F];
- if (len == 3)
- {
- dst[dstOff + 1] =
- (byte)ENCODE_TABLE[
- ((src[srcOff] << 4) & 0x30) | ((src[srcOff + 1] >> 4) & 0x0F)];
- dst[dstOff + 2] =
- (byte)ENCODE_TABLE[
- ((src[srcOff + 1] << 2) & 0x3C) | ((src[srcOff + 2] >> 6) & 0x03)];
- dst[dstOff + 3] =
- (byte)ENCODE_TABLE[src[srcOff + 2] & 0x3F];
- }
- else if (len == 2)
- {
- dst[dstOff + 1] =
- (byte)ENCODE_TABLE[
- ((src[srcOff] << 4) & 0x30) | ((src[srcOff + 1] >> 4) & 0x0F)];
- dst[dstOff + 2] =
- (byte)ENCODE_TABLE[(src[srcOff + 1] << 2) & 0x3C];
-
- }
- else
- { // len == 1) {
- dst[dstOff + 1] =
- (byte)ENCODE_TABLE[(src[srcOff] << 4) & 0x30];
- }
- }
-
- private static int[] DECODE_TABLE = {
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,
- 52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,
- -1, 0, 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,-1,-1,-1,-1,-1,
- -1,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,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
- };
-
- internal static void decode(byte[] src, int srcOff, int len, byte[] dst,
- int dstOff)
- {
- dst[dstOff] = (byte)
- ((DECODE_TABLE[src[srcOff] & 0x0FF] << 2) |
- (DECODE_TABLE[src[srcOff + 1] & 0x0FF] >> 4));
- if (len > 2)
- {
- dst[dstOff + 1] = (byte)
- (((DECODE_TABLE[src[srcOff + 1] & 0x0FF] << 4) & 0xF0) |
- (DECODE_TABLE[src[srcOff + 2] & 0x0FF] >> 2));
- if (len > 3)
- {
- dst[dstOff + 2] = (byte)
- (((DECODE_TABLE[src[srcOff + 2] & 0x0FF] << 6) & 0xC0) |
- DECODE_TABLE[src[srcOff + 3] & 0x0FF]);
- }
- }
- }
-
- }
-}
diff --git a/lib/csharp/src/Protocol/TBinaryProtocol.cs b/lib/csharp/src/Protocol/TBinaryProtocol.cs
deleted file mode 100644
index a4faa94..0000000
--- a/lib/csharp/src/Protocol/TBinaryProtocol.cs
+++ /dev/null
@@ -1,395 +0,0 @@
-/**
- * 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.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Text;
-using Thrift.Transport;
-
-namespace Thrift.Protocol
-{
- public class TBinaryProtocol : TProtocol
- {
- protected const uint VERSION_MASK = 0xffff0000;
- protected const uint VERSION_1 = 0x80010000;
-
- protected bool strictRead_ = false;
- protected bool strictWrite_ = true;
-
- #region BinaryProtocol Factory
-
- public class Factory : TProtocolFactory
- {
- protected bool strictRead_ = false;
- protected bool strictWrite_ = true;
-
- public Factory()
- : this(false, true)
- {
- }
-
- public Factory(bool strictRead, bool strictWrite)
- {
- strictRead_ = strictRead;
- strictWrite_ = strictWrite;
- }
-
- public TProtocol GetProtocol(TTransport trans)
- {
- return new TBinaryProtocol(trans, strictRead_, strictWrite_);
- }
- }
-
- #endregion
-
- public TBinaryProtocol(TTransport trans)
- : this(trans, false, true)
- {
- }
-
- public TBinaryProtocol(TTransport trans, bool strictRead, bool strictWrite)
- : base(trans)
- {
- strictRead_ = strictRead;
- strictWrite_ = strictWrite;
- }
-
- #region Write Methods
-
- public override void WriteMessageBegin(TMessage message)
- {
- if (strictWrite_)
- {
- uint version = VERSION_1 | (uint)(message.Type);
- WriteI32((int)version);
- WriteString(message.Name);
- WriteI32(message.SeqID);
- }
- else
- {
- WriteString(message.Name);
- WriteByte((sbyte)message.Type);
- WriteI32(message.SeqID);
- }
- }
-
- public override void WriteMessageEnd()
- {
- }
-
- public override void WriteStructBegin(TStruct struc)
- {
- }
-
- public override void WriteStructEnd()
- {
- }
-
- public override void WriteFieldBegin(TField field)
- {
- WriteByte((sbyte)field.Type);
- WriteI16(field.ID);
- }
-
- public override void WriteFieldEnd()
- {
- }
-
- public override void WriteFieldStop()
- {
- WriteByte((sbyte)TType.Stop);
- }
-
- public override void WriteMapBegin(TMap map)
- {
- WriteByte((sbyte)map.KeyType);
- WriteByte((sbyte)map.ValueType);
- WriteI32(map.Count);
- }
-
- public override void WriteMapEnd()
- {
- }
-
- public override void WriteListBegin(TList list)
- {
- WriteByte((sbyte)list.ElementType);
- WriteI32(list.Count);
- }
-
- public override void WriteListEnd()
- {
- }
-
- public override void WriteSetBegin(TSet set)
- {
- WriteByte((sbyte)set.ElementType);
- WriteI32(set.Count);
- }
-
- public override void WriteSetEnd()
- {
- }
-
- public override void WriteBool(bool b)
- {
- WriteByte(b ? (sbyte)1 : (sbyte)0);
- }
-
- private byte[] bout = new byte[1];
- public override void WriteByte(sbyte b)
- {
- bout[0] = (byte)b;
- trans.Write(bout, 0, 1);
- }
-
- private byte[] i16out = new byte[2];
- public override void WriteI16(short s)
- {
- i16out[0] = (byte)(0xff & (s >> 8));
- i16out[1] = (byte)(0xff & s);
- trans.Write(i16out, 0, 2);
- }
-
- private byte[] i32out = new byte[4];
- public override void WriteI32(int i32)
- {
- i32out[0] = (byte)(0xff & (i32 >> 24));
- i32out[1] = (byte)(0xff & (i32 >> 16));
- i32out[2] = (byte)(0xff & (i32 >> 8));
- i32out[3] = (byte)(0xff & i32);
- trans.Write(i32out, 0, 4);
- }
-
- private byte[] i64out = new byte[8];
- public override void WriteI64(long i64)
- {
- i64out[0] = (byte)(0xff & (i64 >> 56));
- i64out[1] = (byte)(0xff & (i64 >> 48));
- i64out[2] = (byte)(0xff & (i64 >> 40));
- i64out[3] = (byte)(0xff & (i64 >> 32));
- i64out[4] = (byte)(0xff & (i64 >> 24));
- i64out[5] = (byte)(0xff & (i64 >> 16));
- i64out[6] = (byte)(0xff & (i64 >> 8));
- i64out[7] = (byte)(0xff & i64);
- trans.Write(i64out, 0, 8);
- }
-
- public override void WriteDouble(double d)
- {
-#if !SILVERLIGHT
- WriteI64(BitConverter.DoubleToInt64Bits(d));
-#else
- var bytes = BitConverter.GetBytes(d);
- WriteI64(BitConverter.ToInt64(bytes, 0));
-#endif
- }
-
- public override void WriteBinary(byte[] b)
- {
- WriteI32(b.Length);
- trans.Write(b, 0, b.Length);
- }
-
- #endregion
-
- #region ReadMethods
-
- public override TMessage ReadMessageBegin()
- {
- TMessage message = new TMessage();
- int size = ReadI32();
- if (size < 0)
- {
- uint version = (uint)size & VERSION_MASK;
- if (version != VERSION_1)
- {
- throw new TProtocolException(TProtocolException.BAD_VERSION, "Bad version in ReadMessageBegin: " + version);
- }
- message.Type = (TMessageType)(size & 0x000000ff);
- message.Name = ReadString();
- message.SeqID = ReadI32();
- }
- else
- {
- if (strictRead_)
- {
- throw new TProtocolException(TProtocolException.BAD_VERSION, "Missing version in readMessageBegin, old client?");
- }
- message.Name = ReadStringBody(size);
- message.Type = (TMessageType)ReadByte();
- message.SeqID = ReadI32();
- }
- return message;
- }
-
- public override void ReadMessageEnd()
- {
- }
-
- public override TStruct ReadStructBegin()
- {
- return new TStruct();
- }
-
- public override void ReadStructEnd()
- {
- }
-
- public override TField ReadFieldBegin()
- {
- TField field = new TField();
- field.Type = (TType)ReadByte();
-
- if (field.Type != TType.Stop)
- {
- field.ID = ReadI16();
- }
-
- return field;
- }
-
- public override void ReadFieldEnd()
- {
- }
-
- public override TMap ReadMapBegin()
- {
- TMap map = new TMap();
- map.KeyType = (TType)ReadByte();
- map.ValueType = (TType)ReadByte();
- map.Count = ReadI32();
-
- return map;
- }
-
- public override void ReadMapEnd()
- {
- }
-
- public override TList ReadListBegin()
- {
- TList list = new TList();
- list.ElementType = (TType)ReadByte();
- list.Count = ReadI32();
-
- return list;
- }
-
- public override void ReadListEnd()
- {
- }
-
- public override TSet ReadSetBegin()
- {
- TSet set = new TSet();
- set.ElementType = (TType)ReadByte();
- set.Count = ReadI32();
-
- return set;
- }
-
- public override void ReadSetEnd()
- {
- }
-
- public override bool ReadBool()
- {
- return ReadByte() == 1;
- }
-
- private byte[] bin = new byte[1];
- public override sbyte ReadByte()
- {
- ReadAll(bin, 0, 1);
- return (sbyte)bin[0];
- }
-
- private byte[] i16in = new byte[2];
- public override short ReadI16()
- {
- ReadAll(i16in, 0, 2);
- return (short)(((i16in[0] & 0xff) << 8) | ((i16in[1] & 0xff)));
- }
-
- private byte[] i32in = new byte[4];
- public override int ReadI32()
- {
- ReadAll(i32in, 0, 4);
- return (int)(((i32in[0] & 0xff) << 24) | ((i32in[1] & 0xff) << 16) | ((i32in[2] & 0xff) << 8) | ((i32in[3] & 0xff)));
- }
-
-#pragma warning disable 675
-
- private byte[] i64in = new byte[8];
- public override long ReadI64()
- {
- ReadAll(i64in, 0, 8);
- unchecked
- {
- return (long)(
- ((long)(i64in[0] & 0xff) << 56) |
- ((long)(i64in[1] & 0xff) << 48) |
- ((long)(i64in[2] & 0xff) << 40) |
- ((long)(i64in[3] & 0xff) << 32) |
- ((long)(i64in[4] & 0xff) << 24) |
- ((long)(i64in[5] & 0xff) << 16) |
- ((long)(i64in[6] & 0xff) << 8) |
- ((long)(i64in[7] & 0xff)));
- }
- }
-
-#pragma warning restore 675
-
- public override double ReadDouble()
- {
-#if !SILVERLIGHT
- return BitConverter.Int64BitsToDouble(ReadI64());
-#else
- var value = ReadI64();
- var bytes = BitConverter.GetBytes(value);
- return BitConverter.ToDouble(bytes, 0);
-#endif
- }
-
- public override byte[] ReadBinary()
- {
- int size = ReadI32();
- byte[] buf = new byte[size];
- trans.ReadAll(buf, 0, size);
- return buf;
- }
- private string ReadStringBody(int size)
- {
- byte[] buf = new byte[size];
- trans.ReadAll(buf, 0, size);
- return Encoding.UTF8.GetString(buf, 0, buf.Length);
- }
-
- private int ReadAll(byte[] buf, int off, int len)
- {
- return trans.ReadAll(buf, off, len);
- }
-
- #endregion
- }
-}
diff --git a/lib/csharp/src/Protocol/TCompactProtocol.cs b/lib/csharp/src/Protocol/TCompactProtocol.cs
deleted file mode 100644
index ff67397..0000000
--- a/lib/csharp/src/Protocol/TCompactProtocol.cs
+++ /dev/null
@@ -1,849 +0,0 @@
-/**
- * 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.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Text;
-using Thrift.Transport;
-using System.Collections;
-using System.IO;
-using System.Collections.Generic;
-
-namespace Thrift.Protocol
-{
- public class TCompactProtocol : TProtocol
- {
- private static TStruct ANONYMOUS_STRUCT = new TStruct("");
- private static TField TSTOP = new TField("", TType.Stop, (short)0);
-
- private static byte[] ttypeToCompactType = new byte[16];
-
- private const byte PROTOCOL_ID = 0x82;
- private const byte VERSION = 1;
- private const byte VERSION_MASK = 0x1f; // 0001 1111
- private const byte TYPE_MASK = 0xE0; // 1110 0000
- private const byte TYPE_BITS = 0x07; // 0000 0111
- private const int TYPE_SHIFT_AMOUNT = 5;
-
- /// <summary>
- /// All of the on-wire type codes.
- /// </summary>
- private static class Types
- {
- public const byte STOP = 0x00;
- public const byte BOOLEAN_TRUE = 0x01;
- public const byte BOOLEAN_FALSE = 0x02;
- public const byte BYTE = 0x03;
- public const byte I16 = 0x04;
- public const byte I32 = 0x05;
- public const byte I64 = 0x06;
- public const byte DOUBLE = 0x07;
- public const byte BINARY = 0x08;
- public const byte LIST = 0x09;
- public const byte SET = 0x0A;
- public const byte MAP = 0x0B;
- public const byte STRUCT = 0x0C;
- }
-
- /// <summary>
- /// Used to keep track of the last field for the current and previous structs,
- /// so we can do the delta stuff.
- /// </summary>
- private Stack<short> lastField_ = new Stack<short>(15);
-
- private short lastFieldId_ = 0;
-
- /// <summary>
- /// If we encounter a boolean field begin, save the TField here so it can
- /// have the value incorporated.
- /// </summary>
- private Nullable<TField> booleanField_;
-
- /// <summary>
- /// If we Read a field header, and it's a boolean field, save the boolean
- /// value here so that ReadBool can use it.
- /// </summary>
- private Nullable<Boolean> boolValue_;
-
-
- #region CompactProtocol Factory
-
- public class Factory : TProtocolFactory
- {
- public Factory() { }
-
- public TProtocol GetProtocol(TTransport trans)
- {
- return new TCompactProtocol(trans);
- }
- }
-
- #endregion
-
- public TCompactProtocol(TTransport trans)
- : base(trans)
- {
- ttypeToCompactType[(int)TType.Stop] = Types.STOP;
- ttypeToCompactType[(int)TType.Bool] = Types.BOOLEAN_TRUE;
- ttypeToCompactType[(int)TType.Byte] = Types.BYTE;
- ttypeToCompactType[(int)TType.I16] = Types.I16;
- ttypeToCompactType[(int)TType.I32] = Types.I32;
- ttypeToCompactType[(int)TType.I64] = Types.I64;
- ttypeToCompactType[(int)TType.Double] = Types.DOUBLE;
- ttypeToCompactType[(int)TType.String] = Types.BINARY;
- ttypeToCompactType[(int)TType.List] = Types.LIST;
- ttypeToCompactType[(int)TType.Set] = Types.SET;
- ttypeToCompactType[(int)TType.Map] = Types.MAP;
- ttypeToCompactType[(int)TType.Struct] = Types.STRUCT;
- }
-
- public void reset()
- {
- lastField_.Clear();
- lastFieldId_ = 0;
- }
-
- #region Write Methods
-
- /// <summary>
- /// Writes a byte without any possibility of all that field header nonsense.
- /// Used internally by other writing methods that know they need to Write a byte.
- /// </summary>
- private byte[] byteDirectBuffer = new byte[1];
-
- private void WriteByteDirect(byte b)
- {
- byteDirectBuffer[0] = b;
- trans.Write(byteDirectBuffer);
- }
-
- /// <summary>
- /// Writes a byte without any possibility of all that field header nonsense.
- /// </summary>
- private void WriteByteDirect(int n)
- {
- WriteByteDirect((byte)n);
- }
-
- /// <summary>
- /// Write an i32 as a varint. Results in 1-5 bytes on the wire.
- /// TODO: make a permanent buffer like WriteVarint64?
- /// </summary>
- byte[] i32buf = new byte[5];
-
- private void WriteVarint32(uint n)
- {
- int idx = 0;
- while (true)
- {
- if ((n & ~0x7F) == 0)
- {
- i32buf[idx++] = (byte)n;
- // WriteByteDirect((byte)n);
- break;
- // return;
- }
- else
- {
- i32buf[idx++] = (byte)((n & 0x7F) | 0x80);
- // WriteByteDirect((byte)((n & 0x7F) | 0x80));
- n >>= 7;
- }
- }
- trans.Write(i32buf, 0, idx);
- }
-
- /// <summary>
- /// Write a message header to the wire. Compact Protocol messages contain the
- /// protocol version so we can migrate forwards in the future if need be.
- /// </summary>
- public override void WriteMessageBegin(TMessage message)
- {
- WriteByteDirect(PROTOCOL_ID);
- WriteByteDirect((byte)((VERSION & VERSION_MASK) | ((((uint)message.Type) << TYPE_SHIFT_AMOUNT) & TYPE_MASK)));
- WriteVarint32((uint)message.SeqID);
- WriteString(message.Name);
- }
-
- /// <summary>
- /// Write a struct begin. This doesn't actually put anything on the wire. We
- /// use it as an opportunity to put special placeholder markers on the field
- /// stack so we can get the field id deltas correct.
- /// </summary>
- public override void WriteStructBegin(TStruct strct)
- {
- lastField_.Push(lastFieldId_);
- lastFieldId_ = 0;
- }
-
- /// <summary>
- /// Write a struct end. This doesn't actually put anything on the wire. We use
- /// this as an opportunity to pop the last field from the current struct off
- /// of the field stack.
- /// </summary>
- public override void WriteStructEnd()
- {
- lastFieldId_ = lastField_.Pop();
- }
-
- /// <summary>
- /// Write a field header containing the field id and field type. If the
- /// difference between the current field id and the last one is small (< 15),
- /// then the field id will be encoded in the 4 MSB as a delta. Otherwise, the
- /// field id will follow the type header as a zigzag varint.
- /// </summary>
- public override void WriteFieldBegin(TField field)
- {
- if (field.Type == TType.Bool)
- {
- // we want to possibly include the value, so we'll wait.
- booleanField_ = field;
- }
- else
- {
- WriteFieldBeginInternal(field, 0xFF);
- }
- }
-
- /// <summary>
- /// The workhorse of WriteFieldBegin. It has the option of doing a
- /// 'type override' of the type header. This is used specifically in the
- /// boolean field case.
- /// </summary>
- private void WriteFieldBeginInternal(TField field, byte typeOverride)
- {
- // short lastField = lastField_.Pop();
-
- // if there's a type override, use that.
- byte typeToWrite = typeOverride == 0xFF ? getCompactType(field.Type) : typeOverride;
-
- // check if we can use delta encoding for the field id
- if (field.ID > lastFieldId_ && field.ID - lastFieldId_ <= 15)
- {
- // Write them together
- WriteByteDirect((field.ID - lastFieldId_) << 4 | typeToWrite);
- }
- else
- {
- // Write them separate
- WriteByteDirect(typeToWrite);
- WriteI16(field.ID);
- }
-
- lastFieldId_ = field.ID;
- // lastField_.push(field.id);
- }
-
- /// <summary>
- /// Write the STOP symbol so we know there are no more fields in this struct.
- /// </summary>
- public override void WriteFieldStop()
- {
- WriteByteDirect(Types.STOP);
- }
-
- /// <summary>
- /// Write a map header. If the map is empty, omit the key and value type
- /// headers, as we don't need any additional information to skip it.
- /// </summary>
- public override void WriteMapBegin(TMap map)
- {
- if (map.Count == 0)
- {
- WriteByteDirect(0);
- }
- else
- {
- WriteVarint32((uint)map.Count);
- WriteByteDirect(getCompactType(map.KeyType) << 4 | getCompactType(map.ValueType));
- }
- }
-
- /// <summary>
- /// Write a list header.
- /// </summary>
- public override void WriteListBegin(TList list)
- {
- WriteCollectionBegin(list.ElementType, list.Count);
- }
-
- /// <summary>
- /// Write a set header.
- /// </summary>
- public override void WriteSetBegin(TSet set)
- {
- WriteCollectionBegin(set.ElementType, set.Count);
- }
-
- /// <summary>
- /// Write a boolean value. Potentially, this could be a boolean field, in
- /// which case the field header info isn't written yet. If so, decide what the
- /// right type header is for the value and then Write the field header.
- /// Otherwise, Write a single byte.
- /// </summary>
- public override void WriteBool(Boolean b)
- {
- if (booleanField_ != null)
- {
- // we haven't written the field header yet
- WriteFieldBeginInternal(booleanField_.Value, b ? Types.BOOLEAN_TRUE : Types.BOOLEAN_FALSE);
- booleanField_ = null;
- }
- else
- {
- // we're not part of a field, so just Write the value.
- WriteByteDirect(b ? Types.BOOLEAN_TRUE : Types.BOOLEAN_FALSE);
- }
- }
-
- /// <summary>
- /// Write a byte. Nothing to see here!
- /// </summary>
- public override void WriteByte(sbyte b)
- {
- WriteByteDirect((byte)b);
- }
-
- /// <summary>
- /// Write an I16 as a zigzag varint.
- /// </summary>
- public override void WriteI16(short i16)
- {
- WriteVarint32(intToZigZag(i16));
- }
-
- /// <summary>
- /// Write an i32 as a zigzag varint.
- /// </summary>
- public override void WriteI32(int i32)
- {
- WriteVarint32(intToZigZag(i32));
- }
-
- /// <summary>
- /// Write an i64 as a zigzag varint.
- /// </summary>
- public override void WriteI64(long i64)
- {
- WriteVarint64(longToZigzag(i64));
- }
-
- /// <summary>
- /// Write a double to the wire as 8 bytes.
- /// </summary>
- public override void WriteDouble(double dub)
- {
- byte[] data = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 };
- fixedLongToBytes(BitConverter.DoubleToInt64Bits(dub), data, 0);
- trans.Write(data);
- }
-
- /// <summary>
- /// Write a string to the wire with a varint size preceding.
- /// </summary>
- public override void WriteString(string str)
- {
- byte[] bytes = UTF8Encoding.UTF8.GetBytes(str);
- WriteBinary(bytes, 0, bytes.Length);
- }
-
- /// <summary>
- /// Write a byte array, using a varint for the size.
- /// </summary>
- public override void WriteBinary(byte[] bin)
- {
- WriteBinary(bin, 0, bin.Length);
- }
-
- private void WriteBinary(byte[] buf, int offset, int length)
- {
- WriteVarint32((uint)length);
- trans.Write(buf, offset, length);
- }
-
- //
- // These methods are called by structs, but don't actually have any wire
- // output or purpose.
- //
-
- public override void WriteMessageEnd() { }
- public override void WriteMapEnd() { }
- public override void WriteListEnd() { }
- public override void WriteSetEnd() { }
- public override void WriteFieldEnd() { }
-
- //
- // Internal writing methods
- //
-
- /// <summary>
- /// Abstract method for writing the start of lists and sets. List and sets on
- /// the wire differ only by the type indicator.
- /// </summary>
- protected void WriteCollectionBegin(TType elemType, int size)
- {
- if (size <= 14)
- {
- WriteByteDirect(size << 4 | getCompactType(elemType));
- }
- else
- {
- WriteByteDirect(0xf0 | getCompactType(elemType));
- WriteVarint32((uint)size);
- }
- }
-
- /// <summary>
- /// Write an i64 as a varint. Results in 1-10 bytes on the wire.
- /// </summary>
- byte[] varint64out = new byte[10];
- private void WriteVarint64(ulong n)
- {
- int idx = 0;
- while (true)
- {
- if ((n & ~(ulong)0x7FL) == 0)
- {
- varint64out[idx++] = (byte)n;
- break;
- }
- else
- {
- varint64out[idx++] = ((byte)((n & 0x7F) | 0x80));
- n >>= 7;
- }
- }
- trans.Write(varint64out, 0, idx);
- }
-
- /// <summary>
- /// Convert l into a zigzag long. This allows negative numbers to be
- /// represented compactly as a varint.
- /// </summary>
- private ulong longToZigzag(long n)
- {
- return (ulong)(n << 1) ^ (ulong)(n >> 63);
- }
-
- /// <summary>
- /// Convert n into a zigzag int. This allows negative numbers to be
- /// represented compactly as a varint.
- /// </summary>
- private uint intToZigZag(int n)
- {
- return (uint)(n << 1) ^ (uint)(n >> 31);
- }
-
- /// <summary>
- /// Convert a long into little-endian bytes in buf starting at off and going
- /// until off+7.
- /// </summary>
- private void fixedLongToBytes(long n, byte[] buf, int off)
- {
- buf[off + 0] = (byte)(n & 0xff);
- buf[off + 1] = (byte)((n >> 8) & 0xff);
- buf[off + 2] = (byte)((n >> 16) & 0xff);
- buf[off + 3] = (byte)((n >> 24) & 0xff);
- buf[off + 4] = (byte)((n >> 32) & 0xff);
- buf[off + 5] = (byte)((n >> 40) & 0xff);
- buf[off + 6] = (byte)((n >> 48) & 0xff);
- buf[off + 7] = (byte)((n >> 56) & 0xff);
- }
-
- #endregion
-
- #region ReadMethods
-
- /// <summary>
- /// Read a message header.
- /// </summary>
- public override TMessage ReadMessageBegin()
- {
- byte protocolId = (byte)ReadByte();
- if (protocolId != PROTOCOL_ID)
- {
- throw new TProtocolException("Expected protocol id " + PROTOCOL_ID.ToString("X") + " but got " + protocolId.ToString("X"));
- }
- byte versionAndType = (byte)ReadByte();
- byte version = (byte)(versionAndType & VERSION_MASK);
- if (version != VERSION)
- {
- throw new TProtocolException("Expected version " + VERSION + " but got " + version);
- }
- byte type = (byte)((versionAndType >> TYPE_SHIFT_AMOUNT) & TYPE_BITS);
- int seqid = (int)ReadVarint32();
- string messageName = ReadString();
- return new TMessage(messageName, (TMessageType)type, seqid);
- }
-
- /// <summary>
- /// Read a struct begin. There's nothing on the wire for this, but it is our
- /// opportunity to push a new struct begin marker onto the field stack.
- /// </summary>
- public override TStruct ReadStructBegin()
- {
- lastField_.Push(lastFieldId_);
- lastFieldId_ = 0;
- return ANONYMOUS_STRUCT;
- }
-
- /// <summary>
- /// Doesn't actually consume any wire data, just removes the last field for
- /// this struct from the field stack.
- /// </summary>
- public override void ReadStructEnd()
- {
- // consume the last field we Read off the wire.
- lastFieldId_ = lastField_.Pop();
- }
-
- /// <summary>
- /// Read a field header off the wire.
- /// </summary>
- public override TField ReadFieldBegin()
- {
- byte type = (byte)ReadByte();
-
- // if it's a stop, then we can return immediately, as the struct is over.
- if (type == Types.STOP)
- {
- return TSTOP;
- }
-
- short fieldId;
-
- // mask off the 4 MSB of the type header. it could contain a field id delta.
- short modifier = (short)((type & 0xf0) >> 4);
- if (modifier == 0)
- {
- // not a delta. look ahead for the zigzag varint field id.
- fieldId = ReadI16();
- }
- else
- {
- // has a delta. add the delta to the last Read field id.
- fieldId = (short)(lastFieldId_ + modifier);
- }
-
- TField field = new TField("", getTType((byte)(type & 0x0f)), fieldId);
-
- // if this happens to be a boolean field, the value is encoded in the type
- if (isBoolType(type))
- {
- // save the boolean value in a special instance variable.
- boolValue_ = (byte)(type & 0x0f) == Types.BOOLEAN_TRUE ? true : false;
- }
-
- // push the new field onto the field stack so we can keep the deltas going.
- lastFieldId_ = field.ID;
- return field;
- }
-
- /// <summary>
- /// Read a map header off the wire. If the size is zero, skip Reading the key
- /// and value type. This means that 0-length maps will yield TMaps without the
- /// "correct" types.
- /// </summary>
- public override TMap ReadMapBegin()
- {
- int size = (int)ReadVarint32();
- byte keyAndValueType = size == 0 ? (byte)0 : (byte)ReadByte();
- return new TMap(getTType((byte)(keyAndValueType >> 4)), getTType((byte)(keyAndValueType & 0xf)), size);
- }
-
- /// <summary>
- /// Read a list header off the wire. If the list size is 0-14, the size will
- /// be packed into the element type header. If it's a longer list, the 4 MSB
- /// of the element type header will be 0xF, and a varint will follow with the
- /// true size.
- /// </summary>
- public override TList ReadListBegin()
- {
- byte size_and_type = (byte)ReadByte();
- int size = (size_and_type >> 4) & 0x0f;
- if (size == 15)
- {
- size = (int)ReadVarint32();
- }
- TType type = getTType(size_and_type);
- return new TList(type, size);
- }
-
- /// <summary>
- /// Read a set header off the wire. If the set size is 0-14, the size will
- /// be packed into the element type header. If it's a longer set, the 4 MSB
- /// of the element type header will be 0xF, and a varint will follow with the
- /// true size.
- /// </summary>
- public override TSet ReadSetBegin()
- {
- return new TSet(ReadListBegin());
- }
-
- /// <summary>
- /// Read a boolean off the wire. If this is a boolean field, the value should
- /// already have been Read during ReadFieldBegin, so we'll just consume the
- /// pre-stored value. Otherwise, Read a byte.
- /// </summary>
- public override Boolean ReadBool()
- {
- if (boolValue_ != null)
- {
- bool result = boolValue_.Value;
- boolValue_ = null;
- return result;
- }
- return ReadByte() == Types.BOOLEAN_TRUE;
- }
-
- byte[] byteRawBuf = new byte[1];
- /// <summary>
- /// Read a single byte off the wire. Nothing interesting here.
- /// </summary>
- public override sbyte ReadByte()
- {
- trans.ReadAll(byteRawBuf, 0, 1);
- return (sbyte)byteRawBuf[0];
- }
-
- /// <summary>
- /// Read an i16 from the wire as a zigzag varint.
- /// </summary>
- public override short ReadI16()
- {
- return (short)zigzagToInt(ReadVarint32());
- }
-
- /// <summary>
- /// Read an i32 from the wire as a zigzag varint.
- /// </summary>
- public override int ReadI32()
- {
- return zigzagToInt(ReadVarint32());
- }
-
- /// <summary>
- /// Read an i64 from the wire as a zigzag varint.
- /// </summary>
- public override long ReadI64()
- {
- return zigzagToLong(ReadVarint64());
- }
-
- /// <summary>
- /// No magic here - just Read a double off the wire.
- /// </summary>
- public override double ReadDouble()
- {
- byte[] longBits = new byte[8];
- trans.ReadAll(longBits, 0, 8);
- return BitConverter.Int64BitsToDouble(bytesToLong(longBits));
- }
-
- /// <summary>
- /// Reads a byte[] (via ReadBinary), and then UTF-8 decodes it.
- /// </summary>
- public override string ReadString()
- {
- int length = (int)ReadVarint32();
-
- if (length == 0)
- {
- return "";
- }
-
- return Encoding.UTF8.GetString(ReadBinary(length));
- }
-
- /// <summary>
- /// Read a byte[] from the wire.
- /// </summary>
- public override byte[] ReadBinary()
- {
- int length = (int)ReadVarint32();
- if (length == 0) return new byte[0];
-
- byte[] buf = new byte[length];
- trans.ReadAll(buf, 0, length);
- return buf;
- }
-
- /// <summary>
- /// Read a byte[] of a known length from the wire.
- /// </summary>
- private byte[] ReadBinary(int length)
- {
- if (length == 0) return new byte[0];
-
- byte[] buf = new byte[length];
- trans.ReadAll(buf, 0, length);
- return buf;
- }
-
- //
- // These methods are here for the struct to call, but don't have any wire
- // encoding.
- //
- public override void ReadMessageEnd() { }
- public override void ReadFieldEnd() { }
- public override void ReadMapEnd() { }
- public override void ReadListEnd() { }
- public override void ReadSetEnd() { }
-
- //
- // Internal Reading methods
- //
-
- /// <summary>
- /// Read an i32 from the wire as a varint. The MSB of each byte is set
- /// if there is another byte to follow. This can Read up to 5 bytes.
- /// </summary>
- private uint ReadVarint32()
- {
- uint result = 0;
- int shift = 0;
- while (true)
- {
- byte b = (byte)ReadByte();
- result |= (uint)(b & 0x7f) << shift;
- if ((b & 0x80) != 0x80) break;
- shift += 7;
- }
- return result;
- }
-
- /// <summary>
- /// Read an i64 from the wire as a proper varint. The MSB of each byte is set
- /// if there is another byte to follow. This can Read up to 10 bytes.
- /// </summary>
- private ulong ReadVarint64()
- {
- int shift = 0;
- ulong result = 0;
- while (true)
- {
- byte b = (byte)ReadByte();
- result |= (ulong)(b & 0x7f) << shift;
- if ((b & 0x80) != 0x80) break;
- shift += 7;
- }
-
- return result;
- }
-
- #endregion
-
- //
- // encoding helpers
- //
-
- /// <summary>
- /// Convert from zigzag int to int.
- /// </summary>
- private int zigzagToInt(uint n)
- {
- return (int)(n >> 1) ^ (-(int)(n & 1));
- }
-
- /// <summary>
- /// Convert from zigzag long to long.
- /// </summary>
- private long zigzagToLong(ulong n)
- {
- return (long)(n >> 1) ^ (-(long)(n & 1));
- }
-
- /// <summary>
- /// Note that it's important that the mask bytes are long literals,
- /// otherwise they'll default to ints, and when you shift an int left 56 bits,
- /// you just get a messed up int.
- /// </summary>
- private long bytesToLong(byte[] bytes)
- {
- return
- ((bytes[7] & 0xffL) << 56) |
- ((bytes[6] & 0xffL) << 48) |
- ((bytes[5] & 0xffL) << 40) |
- ((bytes[4] & 0xffL) << 32) |
- ((bytes[3] & 0xffL) << 24) |
- ((bytes[2] & 0xffL) << 16) |
- ((bytes[1] & 0xffL) << 8) |
- ((bytes[0] & 0xffL));
- }
-
- //
- // type testing and converting
- //
-
- private Boolean isBoolType(byte b)
- {
- int lowerNibble = b & 0x0f;
- return lowerNibble == Types.BOOLEAN_TRUE || lowerNibble == Types.BOOLEAN_FALSE;
- }
-
- /// <summary>
- /// Given a TCompactProtocol.Types constant, convert it to its corresponding
- /// TType value.
- /// </summary>
- private TType getTType(byte type)
- {
- switch ((byte)(type & 0x0f))
- {
- case Types.STOP:
- return TType.Stop;
- case Types.BOOLEAN_FALSE:
- case Types.BOOLEAN_TRUE:
- return TType.Bool;
- case Types.BYTE:
- return TType.Byte;
- case Types.I16:
- return TType.I16;
- case Types.I32:
- return TType.I32;
- case Types.I64:
- return TType.I64;
- case Types.DOUBLE:
- return TType.Double;
- case Types.BINARY:
- return TType.String;
- case Types.LIST:
- return TType.List;
- case Types.SET:
- return TType.Set;
- case Types.MAP:
- return TType.Map;
- case Types.STRUCT:
- return TType.Struct;
- default:
- throw new TProtocolException("don't know what type: " + (byte)(type & 0x0f));
- }
- }
-
- /// <summary>
- /// Given a TType value, find the appropriate TCompactProtocol.Types constant.
- /// </summary>
- private byte getCompactType(TType ttype)
- {
- return ttypeToCompactType[(int)ttype];
- }
- }
-}
diff --git a/lib/csharp/src/Protocol/TField.cs b/lib/csharp/src/Protocol/TField.cs
deleted file mode 100644
index 8179557..0000000
--- a/lib/csharp/src/Protocol/TField.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * 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.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Thrift.Protocol
-{
- public struct TField
- {
- private string name;
- private TType type;
- private short id;
-
- public TField(string name, TType type, short id)
- :this()
- {
- this.name = name;
- this.type = type;
- this.id = id;
- }
-
- public string Name
- {
- get { return name; }
- set { name = value; }
- }
-
- public TType Type
- {
- get { return type; }
- set { type = value; }
- }
-
- public short ID
- {
- get { return id; }
- set { id = value; }
- }
- }
-}
diff --git a/lib/csharp/src/Protocol/TJSONProtocol.cs b/lib/csharp/src/Protocol/TJSONProtocol.cs
deleted file mode 100644
index 9dbdea9..0000000
--- a/lib/csharp/src/Protocol/TJSONProtocol.cs
+++ /dev/null
@@ -1,1124 +0,0 @@
-/**
- * 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;
-using System.IO;
-using System.Text;
-using System.Collections.Generic;
-
-using Thrift.Transport;
-using System.Globalization;
-
-namespace Thrift.Protocol
-{
- /// <summary>
- /// JSON protocol implementation for thrift.
- /// <para/>
- /// This is a full-featured protocol supporting Write and Read.
- /// <para/>
- /// Please see the C++ class header for a detailed description of the
- /// protocol's wire format.
- /// <para/>
- /// Adapted from the Java version.
- /// </summary>
- public class TJSONProtocol : TProtocol
- {
- /// <summary>
- /// Factory for JSON protocol objects.
- /// </summary>
- public class Factory : TProtocolFactory
- {
- public TProtocol GetProtocol(TTransport trans)
- {
- return new TJSONProtocol(trans);
- }
- }
-
- private static byte[] COMMA = new byte[] { (byte)',' };
- private static byte[] COLON = new byte[] { (byte)':' };
- private static byte[] LBRACE = new byte[] { (byte)'{' };
- private static byte[] RBRACE = new byte[] { (byte)'}' };
- private static byte[] LBRACKET = new byte[] { (byte)'[' };
- private static byte[] RBRACKET = new byte[] { (byte)']' };
- private static byte[] QUOTE = new byte[] { (byte)'"' };
- private static byte[] BACKSLASH = new byte[] { (byte)'\\' };
-
- private byte[] ESCSEQ = new byte[] { (byte)'\\', (byte)'u', (byte)'0', (byte)'0' };
-
- private const long VERSION = 1;
- private byte[] JSON_CHAR_TABLE = {
- 0, 0, 0, 0, 0, 0, 0, 0,(byte)'b',(byte)'t',(byte)'n', 0,(byte)'f',(byte)'r', 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 1,(byte)'"', 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- };
-
- private char[] ESCAPE_CHARS = "\"\\/bfnrt".ToCharArray();
-
- private byte[] ESCAPE_CHAR_VALS = {
- (byte)'"', (byte)'\\', (byte)'/', (byte)'\b', (byte)'\f', (byte)'\n', (byte)'\r', (byte)'\t',
- };
-
- private const int DEF_STRING_SIZE = 16;
-
- private static byte[] NAME_BOOL = new byte[] { (byte)'t', (byte)'f' };
- private static byte[] NAME_BYTE = new byte[] { (byte)'i', (byte)'8' };
- private static byte[] NAME_I16 = new byte[] { (byte)'i', (byte)'1', (byte)'6' };
- private static byte[] NAME_I32 = new byte[] { (byte)'i', (byte)'3', (byte)'2' };
- private static byte[] NAME_I64 = new byte[] { (byte)'i', (byte)'6', (byte)'4' };
- private static byte[] NAME_DOUBLE = new byte[] { (byte)'d', (byte)'b', (byte)'l' };
- private static byte[] NAME_STRUCT = new byte[] { (byte)'r', (byte)'e', (byte)'c' };
- private static byte[] NAME_STRING = new byte[] { (byte)'s', (byte)'t', (byte)'r' };
- private static byte[] NAME_MAP = new byte[] { (byte)'m', (byte)'a', (byte)'p' };
- private static byte[] NAME_LIST = new byte[] { (byte)'l', (byte)'s', (byte)'t' };
- private static byte[] NAME_SET = new byte[] { (byte)'s', (byte)'e', (byte)'t' };
-
- private static byte[] GetTypeNameForTypeID(TType typeID)
- {
- switch (typeID)
- {
- case TType.Bool:
- return NAME_BOOL;
- case TType.Byte:
- return NAME_BYTE;
- case TType.I16:
- return NAME_I16;
- case TType.I32:
- return NAME_I32;
- case TType.I64:
- return NAME_I64;
- case TType.Double:
- return NAME_DOUBLE;
- case TType.String:
- return NAME_STRING;
- case TType.Struct:
- return NAME_STRUCT;
- case TType.Map:
- return NAME_MAP;
- case TType.Set:
- return NAME_SET;
- case TType.List:
- return NAME_LIST;
- default:
- throw new TProtocolException(TProtocolException.NOT_IMPLEMENTED,
- "Unrecognized type");
- }
- }
-
- private static TType GetTypeIDForTypeName(byte[] name)
- {
- TType result = TType.Stop;
- if (name.Length > 1)
- {
- switch (name[0])
- {
- case (byte)'d':
- result = TType.Double;
- break;
- case (byte)'i':
- switch (name[1])
- {
- case (byte)'8':
- result = TType.Byte;
- break;
- case (byte)'1':
- result = TType.I16;
- break;
- case (byte)'3':
- result = TType.I32;
- break;
- case (byte)'6':
- result = TType.I64;
- break;
- }
- break;
- case (byte)'l':
- result = TType.List;
- break;
- case (byte)'m':
- result = TType.Map;
- break;
- case (byte)'r':
- result = TType.Struct;
- break;
- case (byte)'s':
- if (name[1] == (byte)'t')
- {
- result = TType.String;
- }
- else if (name[1] == (byte)'e')
- {
- result = TType.Set;
- }
- break;
- case (byte)'t':
- result = TType.Bool;
- break;
- }
- }
- if (result == TType.Stop)
- {
- throw new TProtocolException(TProtocolException.NOT_IMPLEMENTED,
- "Unrecognized type");
- }
- return result;
- }
-
- /// <summary>
- /// Base class for tracking JSON contexts that may require
- /// inserting/Reading additional JSON syntax characters
- /// This base context does nothing.
- /// </summary>
- protected class JSONBaseContext
- {
- protected TJSONProtocol proto;
-
- public JSONBaseContext(TJSONProtocol proto)
- {
- this.proto = proto;
- }
-
- public virtual void Write() { }
-
- public virtual void Read() { }
-
- public virtual bool EscapeNumbers() { return false; }
- }
-
- /// <summary>
- /// Context for JSON lists. Will insert/Read commas before each item except
- /// for the first one
- /// </summary>
- protected class JSONListContext : JSONBaseContext
- {
- public JSONListContext(TJSONProtocol protocol)
- : base(protocol)
- {
-
- }
-
- private bool first = true;
-
- public override void Write()
- {
- if (first)
- {
- first = false;
- }
- else
- {
- proto.trans.Write(COMMA);
- }
- }
-
- public override void Read()
- {
- if (first)
- {
- first = false;
- }
- else
- {
- proto.ReadJSONSyntaxChar(COMMA);
- }
- }
- }
-
- /// <summary>
- /// Context for JSON records. Will insert/Read colons before the value portion
- /// of each record pair, and commas before each key except the first. In
- /// addition, will indicate that numbers in the key position need to be
- /// escaped in quotes (since JSON keys must be strings).
- /// </summary>
- protected class JSONPairContext : JSONBaseContext
- {
- public JSONPairContext(TJSONProtocol proto)
- : base(proto)
- {
-
- }
-
- private bool first = true;
- private bool colon = true;
-
- public override void Write()
- {
- if (first)
- {
- first = false;
- colon = true;
- }
- else
- {
- proto.trans.Write(colon ? COLON : COMMA);
- colon = !colon;
- }
- }
-
- public override void Read()
- {
- if (first)
- {
- first = false;
- colon = true;
- }
- else
- {
- proto.ReadJSONSyntaxChar(colon ? COLON : COMMA);
- colon = !colon;
- }
- }
-
- public override bool EscapeNumbers()
- {
- return colon;
- }
- }
-
- /// <summary>
- /// Holds up to one byte from the transport
- /// </summary>
- protected class LookaheadReader
- {
- protected TJSONProtocol proto;
-
- public LookaheadReader(TJSONProtocol proto)
- {
- this.proto = proto;
- }
-
- private bool hasData;
- private byte[] data = new byte[1];
-
- /// <summary>
- /// Return and consume the next byte to be Read, either taking it from the
- /// data buffer if present or getting it from the transport otherwise.
- /// </summary>
- public byte Read()
- {
- if (hasData)
- {
- hasData = false;
- }
- else
- {
- proto.trans.ReadAll(data, 0, 1);
- }
- return data[0];
- }
-
- /// <summary>
- /// Return the next byte to be Read without consuming, filling the data
- /// buffer if it has not been filled alReady.
- /// </summary>
- public byte Peek()
- {
- if (!hasData)
- {
- proto.trans.ReadAll(data, 0, 1);
- }
- hasData = true;
- return data[0];
- }
- }
-
- // Default encoding
- protected Encoding utf8Encoding = UTF8Encoding.UTF8;
-
- // Stack of nested contexts that we may be in
- protected Stack<JSONBaseContext> contextStack = new Stack<JSONBaseContext>();
-
- // Current context that we are in
- protected JSONBaseContext context;
-
- // Reader that manages a 1-byte buffer
- protected LookaheadReader reader;
-
- /// <summary>
- /// Push a new JSON context onto the stack.
- /// </summary>
- protected void PushContext(JSONBaseContext c)
- {
- contextStack.Push(context);
- context = c;
- }
-
- /// <summary>
- /// Pop the last JSON context off the stack
- /// </summary>
- protected void PopContext()
- {
- context = contextStack.Pop();
- }
-
- /// <summary>
- /// TJSONProtocol Constructor
- /// </summary>
- public TJSONProtocol(TTransport trans)
- : base(trans)
- {
- context = new JSONBaseContext(this);
- reader = new LookaheadReader(this);
- }
-
- // Temporary buffer used by several methods
- private byte[] tempBuffer = new byte[4];
-
- /// <summary>
- /// Read a byte that must match b[0]; otherwise an exception is thrown.
- /// Marked protected to avoid synthetic accessor in JSONListContext.Read
- /// and JSONPairContext.Read
- /// </summary>
- protected void ReadJSONSyntaxChar(byte[] b)
- {
- byte ch = reader.Read();
- if (ch != b[0])
- {
- throw new TProtocolException(TProtocolException.INVALID_DATA,
- "Unexpected character:" + (char)ch);
- }
- }
-
- /// <summary>
- /// Convert a byte containing a hex char ('0'-'9' or 'a'-'f') into its
- /// corresponding hex value
- /// </summary>
- private static byte HexVal(byte ch)
- {
- if ((ch >= '0') && (ch <= '9'))
- {
- return (byte)((char)ch - '0');
- }
- else if ((ch >= 'a') && (ch <= 'f'))
- {
- ch += 10;
- return (byte)((char)ch - 'a');
- }
- else
- {
- throw new TProtocolException(TProtocolException.INVALID_DATA,
- "Expected hex character");
- }
- }
-
- /// <summary>
- /// Convert a byte containing a hex value to its corresponding hex character
- /// </summary>
- private static byte HexChar(byte val)
- {
- val &= 0x0F;
- if (val < 10)
- {
- return (byte)((char)val + '0');
- }
- else
- {
- val -= 10;
- return (byte)((char)val + 'a');
- }
- }
-
- /// <summary>
- /// Write the bytes in array buf as a JSON characters, escaping as needed
- /// </summary>
- private void WriteJSONString(byte[] b)
- {
- context.Write();
- trans.Write(QUOTE);
- int len = b.Length;
- for (int i = 0; i < len; i++)
- {
- if ((b[i] & 0x00FF) >= 0x30)
- {
- if (b[i] == BACKSLASH[0])
- {
- trans.Write(BACKSLASH);
- trans.Write(BACKSLASH);
- }
- else
- {
- trans.Write(b, i, 1);
- }
- }
- else
- {
- tempBuffer[0] = JSON_CHAR_TABLE[b[i]];
- if (tempBuffer[0] == 1)
- {
- trans.Write(b, i, 1);
- }
- else if (tempBuffer[0] > 1)
- {
- trans.Write(BACKSLASH);
- trans.Write(tempBuffer, 0, 1);
- }
- else
- {
- trans.Write(ESCSEQ);
- tempBuffer[0] = HexChar((byte)(b[i] >> 4));
- tempBuffer[1] = HexChar(b[i]);
- trans.Write(tempBuffer, 0, 2);
- }
- }
- }
- trans.Write(QUOTE);
- }
-
- /// <summary>
- /// Write out number as a JSON value. If the context dictates so, it will be
- /// wrapped in quotes to output as a JSON string.
- /// </summary>
- private void WriteJSONInteger(long num)
- {
- context.Write();
- string str = num.ToString();
-
- bool escapeNum = context.EscapeNumbers();
- if (escapeNum)
- trans.Write(QUOTE);
-
- trans.Write(utf8Encoding.GetBytes(str));
-
- if (escapeNum)
- trans.Write(QUOTE);
- }
-
- /// <summary>
- /// Write out a double as a JSON value. If it is NaN or infinity or if the
- /// context dictates escaping, Write out as JSON string.
- /// </summary>
- private void WriteJSONDouble(double num)
- {
- context.Write();
- string str = num.ToString("G17", CultureInfo.InvariantCulture);
- bool special = false;
-
- switch (str[0])
- {
- case 'N': // NaN
- case 'I': // Infinity
- special = true;
- break;
- case '-':
- if (str[1] == 'I')
- { // -Infinity
- special = true;
- }
- break;
- }
-
- bool escapeNum = special || context.EscapeNumbers();
-
- if (escapeNum)
- trans.Write(QUOTE);
-
- trans.Write(utf8Encoding.GetBytes(str));
-
- if (escapeNum)
- trans.Write(QUOTE);
- }
- /// <summary>
- /// Write out contents of byte array b as a JSON string with base-64 encoded
- /// data
- /// </summary>
- private void WriteJSONBase64(byte[] b)
- {
- context.Write();
- trans.Write(QUOTE);
-
- int len = b.Length;
- int off = 0;
-
- while (len >= 3)
- {
- // Encode 3 bytes at a time
- TBase64Utils.encode(b, off, 3, tempBuffer, 0);
- trans.Write(tempBuffer, 0, 4);
- off += 3;
- len -= 3;
- }
- if (len > 0)
- {
- // Encode remainder
- TBase64Utils.encode(b, off, len, tempBuffer, 0);
- trans.Write(tempBuffer, 0, len + 1);
- }
-
- trans.Write(QUOTE);
- }
-
- private void WriteJSONObjectStart()
- {
- context.Write();
- trans.Write(LBRACE);
- PushContext(new JSONPairContext(this));
- }
-
- private void WriteJSONObjectEnd()
- {
- PopContext();
- trans.Write(RBRACE);
- }
-
- private void WriteJSONArrayStart()
- {
- context.Write();
- trans.Write(LBRACKET);
- PushContext(new JSONListContext(this));
- }
-
- private void WriteJSONArrayEnd()
- {
- PopContext();
- trans.Write(RBRACKET);
- }
-
- public override void WriteMessageBegin(TMessage message)
- {
- WriteJSONArrayStart();
- WriteJSONInteger(VERSION);
-
- byte[] b = utf8Encoding.GetBytes(message.Name);
- WriteJSONString(b);
-
- WriteJSONInteger((long)message.Type);
- WriteJSONInteger(message.SeqID);
- }
-
- public override void WriteMessageEnd()
- {
- WriteJSONArrayEnd();
- }
-
- public override void WriteStructBegin(TStruct str)
- {
- WriteJSONObjectStart();
- }
-
- public override void WriteStructEnd()
- {
- WriteJSONObjectEnd();
- }
-
- public override void WriteFieldBegin(TField field)
- {
- WriteJSONInteger(field.ID);
- WriteJSONObjectStart();
- WriteJSONString(GetTypeNameForTypeID(field.Type));
- }
-
- public override void WriteFieldEnd()
- {
- WriteJSONObjectEnd();
- }
-
- public override void WriteFieldStop() { }
-
- public override void WriteMapBegin(TMap map)
- {
- WriteJSONArrayStart();
- WriteJSONString(GetTypeNameForTypeID(map.KeyType));
- WriteJSONString(GetTypeNameForTypeID(map.ValueType));
- WriteJSONInteger(map.Count);
- WriteJSONObjectStart();
- }
-
- public override void WriteMapEnd()
- {
- WriteJSONObjectEnd();
- WriteJSONArrayEnd();
- }
-
- public override void WriteListBegin(TList list)
- {
- WriteJSONArrayStart();
- WriteJSONString(GetTypeNameForTypeID(list.ElementType));
- WriteJSONInteger(list.Count);
- }
-
- public override void WriteListEnd()
- {
- WriteJSONArrayEnd();
- }
-
- public override void WriteSetBegin(TSet set)
- {
- WriteJSONArrayStart();
- WriteJSONString(GetTypeNameForTypeID(set.ElementType));
- WriteJSONInteger(set.Count);
- }
-
- public override void WriteSetEnd()
- {
- WriteJSONArrayEnd();
- }
-
- public override void WriteBool(bool b)
- {
- WriteJSONInteger(b ? (long)1 : (long)0);
- }
-
- public override void WriteByte(sbyte b)
- {
- WriteJSONInteger((long)b);
- }
-
- public override void WriteI16(short i16)
- {
- WriteJSONInteger((long)i16);
- }
-
- public override void WriteI32(int i32)
- {
- WriteJSONInteger((long)i32);
- }
-
- public override void WriteI64(long i64)
- {
- WriteJSONInteger(i64);
- }
-
- public override void WriteDouble(double dub)
- {
- WriteJSONDouble(dub);
- }
-
- public override void WriteString(string str)
- {
- byte[] b = utf8Encoding.GetBytes(str);
- WriteJSONString(b);
- }
-
- public override void WriteBinary(byte[] bin)
- {
- WriteJSONBase64(bin);
- }
-
- /**
- * Reading methods.
- */
-
- /// <summary>
- /// Read in a JSON string, unescaping as appropriate.. Skip Reading from the
- /// context if skipContext is true.
- /// </summary>
- private byte[] ReadJSONString(bool skipContext)
- {
- MemoryStream buffer = new MemoryStream();
- List<char> codeunits = new List<char>();
-
-
- if (!skipContext)
- {
- context.Read();
- }
- ReadJSONSyntaxChar(QUOTE);
- while (true)
- {
- byte ch = reader.Read();
- if (ch == QUOTE[0])
- {
- break;
- }
-
- // escaped?
- if (ch != ESCSEQ[0])
- {
- buffer.Write(new byte[] { (byte)ch }, 0, 1);
- continue;
- }
-
- // distinguish between \uXXXX and \?
- ch = reader.Read();
- if (ch != ESCSEQ[1]) // control chars like \n
- {
- int off = Array.IndexOf(ESCAPE_CHARS, (char)ch);
- if (off == -1)
- {
- throw new TProtocolException(TProtocolException.INVALID_DATA,
- "Expected control char");
- }
- ch = ESCAPE_CHAR_VALS[off];
- buffer.Write(new byte[] { (byte)ch }, 0, 1);
- continue;
- }
-
-
- // it's \uXXXX
- trans.ReadAll(tempBuffer, 0, 4);
- var wch = (short)((HexVal((byte)tempBuffer[0]) << 12) +
- (HexVal((byte)tempBuffer[1]) << 8) +
- (HexVal((byte)tempBuffer[2]) << 4) +
- HexVal(tempBuffer[3]));
- if (Char.IsHighSurrogate((char)wch))
- {
- if (codeunits.Count > 0)
- {
- throw new TProtocolException(TProtocolException.INVALID_DATA,
- "Expected low surrogate char");
- }
- codeunits.Add((char)wch);
- }
- else if (Char.IsLowSurrogate((char)wch))
- {
- if (codeunits.Count == 0)
- {
- throw new TProtocolException(TProtocolException.INVALID_DATA,
- "Expected high surrogate char");
- }
- codeunits.Add((char)wch);
- var tmp = utf8Encoding.GetBytes(codeunits.ToArray());
- buffer.Write(tmp, 0, tmp.Length);
- codeunits.Clear();
- }
- else
- {
- var tmp = utf8Encoding.GetBytes(new char[] { (char)wch });
- buffer.Write(tmp, 0, tmp.Length);
- }
- }
-
-
- if (codeunits.Count > 0)
- {
- throw new TProtocolException(TProtocolException.INVALID_DATA,
- "Expected low surrogate char");
- }
-
- return buffer.ToArray();
- }
-
- /// <summary>
- /// Return true if the given byte could be a valid part of a JSON number.
- /// </summary>
- private bool IsJSONNumeric(byte b)
- {
- switch (b)
- {
- case (byte)'+':
- case (byte)'-':
- case (byte)'.':
- case (byte)'0':
- case (byte)'1':
- case (byte)'2':
- case (byte)'3':
- case (byte)'4':
- case (byte)'5':
- case (byte)'6':
- case (byte)'7':
- case (byte)'8':
- case (byte)'9':
- case (byte)'E':
- case (byte)'e':
- return true;
- }
- return false;
- }
-
- /// <summary>
- /// Read in a sequence of characters that are all valid in JSON numbers. Does
- /// not do a complete regex check to validate that this is actually a number.
- /// </summary>
- private string ReadJSONNumericChars()
- {
- StringBuilder strbld = new StringBuilder();
- while (true)
- {
- byte ch = reader.Peek();
- if (!IsJSONNumeric(ch))
- {
- break;
- }
- strbld.Append((char)reader.Read());
- }
- return strbld.ToString();
- }
-
- /// <summary>
- /// Read in a JSON number. If the context dictates, Read in enclosing quotes.
- /// </summary>
- private long ReadJSONInteger()
- {
- context.Read();
- if (context.EscapeNumbers())
- {
- ReadJSONSyntaxChar(QUOTE);
- }
-
- string str = ReadJSONNumericChars();
- if (context.EscapeNumbers())
- {
- ReadJSONSyntaxChar(QUOTE);
- }
-
- try
- {
- return Int64.Parse(str);
- }
- catch (FormatException fex)
- {
- throw new TProtocolException(TProtocolException.INVALID_DATA,
- "Bad data encounted in numeric data", fex);
- }
- }
-
- /// <summary>
- /// Read in a JSON double value. Throw if the value is not wrapped in quotes
- /// when expected or if wrapped in quotes when not expected.
- /// </summary>
- private double ReadJSONDouble()
- {
- context.Read();
- if (reader.Peek() == QUOTE[0])
- {
- byte[] arr = ReadJSONString(true);
- double dub = Double.Parse(utf8Encoding.GetString(arr, 0, arr.Length), CultureInfo.InvariantCulture);
-
- if (!context.EscapeNumbers() && !Double.IsNaN(dub) && !Double.IsInfinity(dub))
- {
- // Throw exception -- we should not be in a string in this case
- throw new TProtocolException(TProtocolException.INVALID_DATA,
- "Numeric data unexpectedly quoted");
- }
- return dub;
- }
- else
- {
- if (context.EscapeNumbers())
- {
- // This will throw - we should have had a quote if escapeNum == true
- ReadJSONSyntaxChar(QUOTE);
- }
- try
- {
- return Double.Parse(ReadJSONNumericChars(), CultureInfo.InvariantCulture);
- }
- catch (FormatException fex)
- {
- throw new TProtocolException(TProtocolException.INVALID_DATA,
- "Bad data encounted in numeric data", fex);
- }
- }
- }
-
- /// <summary>
- /// Read in a JSON string containing base-64 encoded data and decode it.
- /// </summary>
- private byte[] ReadJSONBase64()
- {
- byte[] b = ReadJSONString(false);
- int len = b.Length;
- int off = 0;
- int size = 0;
- // reduce len to ignore fill bytes
- while ((len > 0) && (b[len - 1] == '='))
- {
- --len;
- }
- // read & decode full byte triplets = 4 source bytes
- while (len > 4)
- {
- // Decode 4 bytes at a time
- TBase64Utils.decode(b, off, 4, b, size); // NB: decoded in place
- off += 4;
- len -= 4;
- size += 3;
- }
- // Don't decode if we hit the end or got a single leftover byte (invalid
- // base64 but legal for skip of regular string type)
- if (len > 1)
- {
- // Decode remainder
- TBase64Utils.decode(b, off, len, b, size); // NB: decoded in place
- size += len - 1;
- }
- // Sadly we must copy the byte[] (any way around this?)
- byte[] result = new byte[size];
- Array.Copy(b, 0, result, 0, size);
- return result;
- }
-
- private void ReadJSONObjectStart()
- {
- context.Read();
- ReadJSONSyntaxChar(LBRACE);
- PushContext(new JSONPairContext(this));
- }
-
- private void ReadJSONObjectEnd()
- {
- ReadJSONSyntaxChar(RBRACE);
- PopContext();
- }
-
- private void ReadJSONArrayStart()
- {
- context.Read();
- ReadJSONSyntaxChar(LBRACKET);
- PushContext(new JSONListContext(this));
- }
-
- private void ReadJSONArrayEnd()
- {
- ReadJSONSyntaxChar(RBRACKET);
- PopContext();
- }
-
- public override TMessage ReadMessageBegin()
- {
- TMessage message = new TMessage();
- ReadJSONArrayStart();
- if (ReadJSONInteger() != VERSION)
- {
- throw new TProtocolException(TProtocolException.BAD_VERSION,
- "Message contained bad version.");
- }
-
- var buf = ReadJSONString(false);
- message.Name = utf8Encoding.GetString(buf, 0, buf.Length);
- message.Type = (TMessageType)ReadJSONInteger();
- message.SeqID = (int)ReadJSONInteger();
- return message;
- }
-
- public override void ReadMessageEnd()
- {
- ReadJSONArrayEnd();
- }
-
- public override TStruct ReadStructBegin()
- {
- ReadJSONObjectStart();
- return new TStruct();
- }
-
- public override void ReadStructEnd()
- {
- ReadJSONObjectEnd();
- }
-
- public override TField ReadFieldBegin()
- {
- TField field = new TField();
- byte ch = reader.Peek();
- if (ch == RBRACE[0])
- {
- field.Type = TType.Stop;
- }
- else
- {
- field.ID = (short)ReadJSONInteger();
- ReadJSONObjectStart();
- field.Type = GetTypeIDForTypeName(ReadJSONString(false));
- }
- return field;
- }
-
- public override void ReadFieldEnd()
- {
- ReadJSONObjectEnd();
- }
-
- public override TMap ReadMapBegin()
- {
- TMap map = new TMap();
- ReadJSONArrayStart();
- map.KeyType = GetTypeIDForTypeName(ReadJSONString(false));
- map.ValueType = GetTypeIDForTypeName(ReadJSONString(false));
- map.Count = (int)ReadJSONInteger();
- ReadJSONObjectStart();
- return map;
- }
-
- public override void ReadMapEnd()
- {
- ReadJSONObjectEnd();
- ReadJSONArrayEnd();
- }
-
- public override TList ReadListBegin()
- {
- TList list = new TList();
- ReadJSONArrayStart();
- list.ElementType = GetTypeIDForTypeName(ReadJSONString(false));
- list.Count = (int)ReadJSONInteger();
- return list;
- }
-
- public override void ReadListEnd()
- {
- ReadJSONArrayEnd();
- }
-
- public override TSet ReadSetBegin()
- {
- TSet set = new TSet();
- ReadJSONArrayStart();
- set.ElementType = GetTypeIDForTypeName(ReadJSONString(false));
- set.Count = (int)ReadJSONInteger();
- return set;
- }
-
- public override void ReadSetEnd()
- {
- ReadJSONArrayEnd();
- }
-
- public override bool ReadBool()
- {
- return (ReadJSONInteger() == 0 ? false : true);
- }
-
- public override sbyte ReadByte()
- {
- return (sbyte)ReadJSONInteger();
- }
-
- public override short ReadI16()
- {
- return (short)ReadJSONInteger();
- }
-
- public override int ReadI32()
- {
- return (int)ReadJSONInteger();
- }
-
- public override long ReadI64()
- {
- return (long)ReadJSONInteger();
- }
-
- public override double ReadDouble()
- {
- return ReadJSONDouble();
- }
-
- public override string ReadString()
- {
- var buf = ReadJSONString(false);
- return utf8Encoding.GetString(buf, 0, buf.Length);
- }
-
- public override byte[] ReadBinary()
- {
- return ReadJSONBase64();
- }
-
- }
-}
diff --git a/lib/csharp/src/Protocol/TList.cs b/lib/csharp/src/Protocol/TList.cs
deleted file mode 100644
index 0c8f214..0000000
--- a/lib/csharp/src/Protocol/TList.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * 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.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Thrift.Protocol
-{
- public struct TList
- {
- private TType elementType;
- private int count;
-
- public TList(TType elementType, int count)
- :this()
- {
- this.elementType = elementType;
- this.count = count;
- }
-
- public TType ElementType
- {
- get { return elementType; }
- set { elementType = value; }
- }
-
- public int Count
- {
- get { return count; }
- set { count = value; }
- }
- }
-}
diff --git a/lib/csharp/src/Protocol/TMap.cs b/lib/csharp/src/Protocol/TMap.cs
deleted file mode 100644
index aba9d3a..0000000
--- a/lib/csharp/src/Protocol/TMap.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * 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.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Thrift.Protocol
-{
- public struct TMap
- {
- private TType keyType;
- private TType valueType;
- private int count;
-
- public TMap(TType keyType, TType valueType, int count)
- :this()
- {
- this.keyType = keyType;
- this.valueType = valueType;
- this.count = count;
- }
-
- public TType KeyType
- {
- get { return keyType; }
- set { keyType = value; }
- }
-
- public TType ValueType
- {
- get { return valueType; }
- set { valueType = value; }
- }
-
- public int Count
- {
- get { return count; }
- set { count = value; }
- }
- }
-}
diff --git a/lib/csharp/src/Protocol/TMessage.cs b/lib/csharp/src/Protocol/TMessage.cs
deleted file mode 100644
index 348263c..0000000
--- a/lib/csharp/src/Protocol/TMessage.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * 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.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Thrift.Protocol
-{
- public struct TMessage
- {
- private string name;
- private TMessageType type;
- private int seqID;
-
- public TMessage(string name, TMessageType type, int seqid)
- :this()
- {
- this.name = name;
- this.type = type;
- this.seqID = seqid;
- }
-
- public string Name
- {
- get { return name; }
- set { name = value; }
- }
-
- public TMessageType Type
- {
- get { return type; }
- set { type = value; }
- }
-
- public int SeqID
- {
- get { return seqID; }
- set { seqID = value; }
- }
- }
-}
diff --git a/lib/csharp/src/Protocol/TMessageType.cs b/lib/csharp/src/Protocol/TMessageType.cs
deleted file mode 100644
index c7091fe..0000000
--- a/lib/csharp/src/Protocol/TMessageType.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * 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;
-
-namespace Thrift.Protocol
-{
- public enum TMessageType
- {
- Call = 1,
- Reply = 2,
- Exception = 3,
- Oneway = 4
- }
-}
diff --git a/lib/csharp/src/Protocol/TMultiplexedProcessor.cs b/lib/csharp/src/Protocol/TMultiplexedProcessor.cs
deleted file mode 100644
index aa91c52..0000000
--- a/lib/csharp/src/Protocol/TMultiplexedProcessor.cs
+++ /dev/null
@@ -1,183 +0,0 @@
-/**
- * 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.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Text;
-using Thrift.Transport;
-using System.Collections.Generic;
-using System.IO;
-
-namespace Thrift.Protocol
-{
- /// <summary>
- /// <see cref="TMultiplexedProcessor"/> is a <see cref="TProcessor"/> allowing a single <see cref="Thrift.Server.TServer"/>
- /// to provide multiple services.
- /// <para/>
- /// To do so, you instantiate the processor and then register additional processors with it,
- /// as shown in the following example:
- /// <para/>
- /// <code>
- /// TMultiplexedProcessor processor = new TMultiplexedProcessor();
- ///
- /// processor.registerProcessor(
- /// "Calculator",
- /// new Calculator.Processor(new CalculatorHandler()));
- ///
- /// processor.registerProcessor(
- /// "WeatherReport",
- /// new WeatherReport.Processor(new WeatherReportHandler()));
- ///
- /// TServerTransport t = new TServerSocket(9090);
- /// TSimpleServer server = new TSimpleServer(processor, t);
- ///
- /// server.serve();
- /// </code>
- /// </summary>
- public class TMultiplexedProcessor : TProcessor
- {
- private Dictionary<string, TProcessor> ServiceProcessorMap = new Dictionary<string, TProcessor>();
-
- /// <summary>
- /// 'Register' a service with this TMultiplexedProcessor. This allows us to broker
- /// requests to individual services by using the service name to select them at request time.
- ///
- /// Args:
- /// - serviceName Name of a service, has to be identical to the name
- /// declared in the Thrift IDL, e.g. "WeatherReport".
- /// - processor Implementation of a service, usually referred to as "handlers",
- /// e.g. WeatherReportHandler implementing WeatherReport.Iface.
- /// </summary>
- public void RegisterProcessor(string serviceName, TProcessor processor)
- {
- ServiceProcessorMap.Add(serviceName, processor);
- }
-
-
- private void Fail(TProtocol oprot, TMessage message, TApplicationException.ExceptionType extype, string etxt)
- {
- TApplicationException appex = new TApplicationException(extype, etxt);
-
- TMessage newMessage = new TMessage(message.Name, TMessageType.Exception, message.SeqID);
-
- oprot.WriteMessageBegin(newMessage);
- appex.Write(oprot);
- oprot.WriteMessageEnd();
- oprot.Transport.Flush();
- }
-
-
- /// <summary>
- /// This implementation of process performs the following steps:
- ///
- /// - Read the beginning of the message.
- /// - Extract the service name from the message.
- /// - Using the service name to locate the appropriate processor.
- /// - Dispatch to the processor, with a decorated instance of TProtocol
- /// that allows readMessageBegin() to return the original TMessage.
- /// <para/>
- /// Throws an exception if
- /// - the message type is not CALL or ONEWAY,
- /// - the service name was not found in the message, or
- /// - the service name has not been RegisterProcessor()ed.
- /// </summary>
- public bool Process(TProtocol iprot, TProtocol oprot)
- {
- /* Use the actual underlying protocol (e.g. TBinaryProtocol) to read the
- message header. This pulls the message "off the wire", which we'll
- deal with at the end of this method. */
-
- try
- {
- TMessage message = iprot.ReadMessageBegin();
-
- if ((message.Type != TMessageType.Call) && (message.Type != TMessageType.Oneway))
- {
- Fail(oprot, message,
- TApplicationException.ExceptionType.InvalidMessageType,
- "Message type CALL or ONEWAY expected");
- return false;
- }
-
- // Extract the service name
- int index = message.Name.IndexOf(TMultiplexedProtocol.SEPARATOR);
- if (index < 0)
- {
- Fail(oprot, message,
- TApplicationException.ExceptionType.InvalidProtocol,
- "Service name not found in message name: " + message.Name + ". " +
- "Did you forget to use a TMultiplexProtocol in your client?");
- return false;
- }
-
- // Create a new TMessage, something that can be consumed by any TProtocol
- string serviceName = message.Name.Substring(0, index);
- TProcessor actualProcessor;
- if (!ServiceProcessorMap.TryGetValue(serviceName, out actualProcessor))
- {
- Fail(oprot, message,
- TApplicationException.ExceptionType.InternalError,
- "Service name not found: " + serviceName + ". " +
- "Did you forget to call RegisterProcessor()?");
- return false;
- }
-
- // Create a new TMessage, removing the service name
- TMessage newMessage = new TMessage(
- message.Name.Substring(serviceName.Length + TMultiplexedProtocol.SEPARATOR.Length),
- message.Type,
- message.SeqID);
-
- // Dispatch processing to the stored processor
- return actualProcessor.Process(new StoredMessageProtocol(iprot, newMessage), oprot);
-
- }
- catch (IOException)
- {
- return false; // similar to all other processors
- }
-
- }
-
- /// <summary>
- /// Our goal was to work with any protocol. In order to do that, we needed
- /// to allow them to call readMessageBegin() and get a TMessage in exactly
- /// the standard format, without the service name prepended to TMessage.name.
- /// </summary>
- private class StoredMessageProtocol : TProtocolDecorator
- {
- TMessage MsgBegin;
-
- public StoredMessageProtocol(TProtocol protocol, TMessage messageBegin)
- : base(protocol)
- {
- this.MsgBegin = messageBegin;
- }
-
- public override TMessage ReadMessageBegin()
- {
- return MsgBegin;
- }
- }
-
- }
-}
diff --git a/lib/csharp/src/Protocol/TMultiplexedProtocol.cs b/lib/csharp/src/Protocol/TMultiplexedProtocol.cs
deleted file mode 100644
index 1bd420f..0000000
--- a/lib/csharp/src/Protocol/TMultiplexedProtocol.cs
+++ /dev/null
@@ -1,103 +0,0 @@
-/**
- * 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.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Text;
-using Thrift.Transport;
-using System.Collections.Generic;
-
-namespace Thrift.Protocol
-{
-
- /// <summary>
- /// TMultiplexedProtocol is a protocol-independent concrete decorator that allows a Thrift
- /// client to communicate with a multiplexing Thrift server, by prepending the service name
- /// to the function name during function calls.
- /// <para/>
- /// NOTE: THIS IS NOT TO BE USED BY SERVERS.
- /// On the server, use TMultiplexedProcessor to handle requests from a multiplexing client.
- /// <para/>
- /// This example uses a single socket transport to invoke two services:
- /// <code>
- /// TSocket transport = new TSocket("localhost", 9090);
- /// transport.open();
- ///
- /// TBinaryProtocol protocol = new TBinaryProtocol(transport);
- ///
- /// TMultiplexedProtocol mp = new TMultiplexedProtocol(protocol, "Calculator");
- /// Calculator.Client service = new Calculator.Client(mp);
- ///
- /// TMultiplexedProtocol mp2 = new TMultiplexedProtocol(protocol, "WeatherReport");
- /// WeatherReport.Client service2 = new WeatherReport.Client(mp2);
- ///
- /// System.out.println(service.add(2,2));
- /// System.out.println(service2.getTemperature());
- /// </code>
- /// </summary>
- public class TMultiplexedProtocol : TProtocolDecorator
- {
-
- /// <summary>
- /// Used to delimit the service name from the function name.
- /// </summary>
- public static string SEPARATOR = ":";
-
- private string ServiceName;
-
- /// <summary>
- /// Wrap the specified protocol, allowing it to be used to communicate with a
- /// multiplexing server. The <paramref name="serviceName"/> is required as it is
- /// prepended to the message header so that the multiplexing server can broker
- /// the function call to the proper service.
- /// </summary>
- /// <param name="protocol">Your communication protocol of choice, e.g. <see cref="TBinaryProtocol"/>.</param>
- /// <param name="serviceName">The service name of the service communicating via this protocol.</param>
- public TMultiplexedProtocol(TProtocol protocol, string serviceName)
- : base(protocol)
- {
- ServiceName = serviceName;
- }
-
- /// <summary>
- /// Prepends the service name to the function name, separated by TMultiplexedProtocol.SEPARATOR.
- /// </summary>
- /// <param name="tMessage">The original message.</param>
- public override void WriteMessageBegin(TMessage tMessage)
- {
- switch (tMessage.Type)
- {
- case TMessageType.Call:
- case TMessageType.Oneway:
- base.WriteMessageBegin(new TMessage(
- ServiceName + SEPARATOR + tMessage.Name,
- tMessage.Type,
- tMessage.SeqID));
- break;
-
- default:
- base.WriteMessageBegin(tMessage);
- break;
- }
- }
- }
-}
diff --git a/lib/csharp/src/Protocol/TProtocol.cs b/lib/csharp/src/Protocol/TProtocol.cs
deleted file mode 100644
index dd7a6e0..0000000
--- a/lib/csharp/src/Protocol/TProtocol.cs
+++ /dev/null
@@ -1,142 +0,0 @@
-/**
- * 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.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Text;
-using Thrift.Transport;
-
-namespace Thrift.Protocol
-{
- public abstract class TProtocol : IDisposable
- {
- private const int DEFAULT_RECURSION_DEPTH = 64;
-
- protected TTransport trans;
- protected int recursionLimit;
- protected int recursionDepth;
-
- protected TProtocol(TTransport trans)
- {
- this.trans = trans;
- this.recursionLimit = DEFAULT_RECURSION_DEPTH;
- this.recursionDepth = 0;
- }
-
- public TTransport Transport
- {
- get { return trans; }
- }
-
- public int RecursionLimit
- {
- get { return recursionLimit; }
- set { recursionLimit = value; }
- }
-
- public void IncrementRecursionDepth()
- {
- if (recursionDepth < recursionLimit)
- ++recursionDepth;
- else
- throw new TProtocolException(TProtocolException.DEPTH_LIMIT, "Depth limit exceeded");
- }
-
- public void DecrementRecursionDepth()
- {
- --recursionDepth;
- }
-
- #region " IDisposable Support "
- private bool _IsDisposed;
-
- // IDisposable
- public void Dispose()
- {
- Dispose(true);
- }
-
- protected virtual void Dispose(bool disposing)
- {
- if (!_IsDisposed)
- {
- if (disposing)
- {
- if (trans is IDisposable)
- (trans as IDisposable).Dispose();
- }
- }
- _IsDisposed = true;
- }
- #endregion
-
- public abstract void WriteMessageBegin(TMessage message);
- public abstract void WriteMessageEnd();
- public abstract void WriteStructBegin(TStruct struc);
- public abstract void WriteStructEnd();
- public abstract void WriteFieldBegin(TField field);
- public abstract void WriteFieldEnd();
- public abstract void WriteFieldStop();
- public abstract void WriteMapBegin(TMap map);
- public abstract void WriteMapEnd();
- public abstract void WriteListBegin(TList list);
- public abstract void WriteListEnd();
- public abstract void WriteSetBegin(TSet set);
- public abstract void WriteSetEnd();
- public abstract void WriteBool(bool b);
- public abstract void WriteByte(sbyte b);
- public abstract void WriteI16(short i16);
- public abstract void WriteI32(int i32);
- public abstract void WriteI64(long i64);
- public abstract void WriteDouble(double d);
- public virtual void WriteString(string s)
- {
- WriteBinary(Encoding.UTF8.GetBytes(s));
- }
- public abstract void WriteBinary(byte[] b);
-
- public abstract TMessage ReadMessageBegin();
- public abstract void ReadMessageEnd();
- public abstract TStruct ReadStructBegin();
- public abstract void ReadStructEnd();
- public abstract TField ReadFieldBegin();
- public abstract void ReadFieldEnd();
- public abstract TMap ReadMapBegin();
- public abstract void ReadMapEnd();
- public abstract TList ReadListBegin();
- public abstract void ReadListEnd();
- public abstract TSet ReadSetBegin();
- public abstract void ReadSetEnd();
- public abstract bool ReadBool();
- public abstract sbyte ReadByte();
- public abstract short ReadI16();
- public abstract int ReadI32();
- public abstract long ReadI64();
- public abstract double ReadDouble();
- public virtual string ReadString()
- {
- var buf = ReadBinary();
- return Encoding.UTF8.GetString(buf, 0, buf.Length);
- }
- public abstract byte[] ReadBinary();
- }
-}
diff --git a/lib/csharp/src/Protocol/TProtocolDecorator.cs b/lib/csharp/src/Protocol/TProtocolDecorator.cs
deleted file mode 100644
index 8600002..0000000
--- a/lib/csharp/src/Protocol/TProtocolDecorator.cs
+++ /dev/null
@@ -1,261 +0,0 @@
-/**
- * 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.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Text;
-using Thrift.Transport;
-using System.Collections.Generic;
-
-namespace Thrift.Protocol
-{
- /// <summary>
- /// <see cref="TProtocolDecorator"/> forwards all requests to an enclosed <see cref="TProtocol"/> instance,
- /// providing a way to author concise concrete decorator subclasses. While it has
- /// no abstract methods, it is marked abstract as a reminder that by itself,
- /// it does not modify the behaviour of the enclosed <see cref="TProtocol"/>.
- /// <para/>
- /// See p.175 of Design Patterns (by Gamma et al.)
- /// </summary>
- /// <seealso cref="TMultiplexedProtocol"/>
- public abstract class TProtocolDecorator : TProtocol
- {
- private TProtocol WrappedProtocol;
-
- /// <summary>
- /// Encloses the specified protocol.
- /// </summary>
- /// <param name="protocol">All operations will be forward to this protocol. Must be non-null.</param>
- public TProtocolDecorator(TProtocol protocol)
- : base(protocol.Transport)
- {
-
- WrappedProtocol = protocol;
- }
-
- public override void WriteMessageBegin(TMessage tMessage)
- {
- WrappedProtocol.WriteMessageBegin(tMessage);
- }
-
- public override void WriteMessageEnd()
- {
- WrappedProtocol.WriteMessageEnd();
- }
-
- public override void WriteStructBegin(TStruct tStruct)
- {
- WrappedProtocol.WriteStructBegin(tStruct);
- }
-
- public override void WriteStructEnd()
- {
- WrappedProtocol.WriteStructEnd();
- }
-
- public override void WriteFieldBegin(TField tField)
- {
- WrappedProtocol.WriteFieldBegin(tField);
- }
-
- public override void WriteFieldEnd()
- {
- WrappedProtocol.WriteFieldEnd();
- }
-
- public override void WriteFieldStop()
- {
- WrappedProtocol.WriteFieldStop();
- }
-
- public override void WriteMapBegin(TMap tMap)
- {
- WrappedProtocol.WriteMapBegin(tMap);
- }
-
- public override void WriteMapEnd()
- {
- WrappedProtocol.WriteMapEnd();
- }
-
- public override void WriteListBegin(TList tList)
- {
- WrappedProtocol.WriteListBegin(tList);
- }
-
- public override void WriteListEnd()
- {
- WrappedProtocol.WriteListEnd();
- }
-
- public override void WriteSetBegin(TSet tSet)
- {
- WrappedProtocol.WriteSetBegin(tSet);
- }
-
- public override void WriteSetEnd()
- {
- WrappedProtocol.WriteSetEnd();
- }
-
- public override void WriteBool(bool b)
- {
- WrappedProtocol.WriteBool(b);
- }
-
- public override void WriteByte(sbyte b)
- {
- WrappedProtocol.WriteByte(b);
- }
-
- public override void WriteI16(short i)
- {
- WrappedProtocol.WriteI16(i);
- }
-
- public override void WriteI32(int i)
- {
- WrappedProtocol.WriteI32(i);
- }
-
- public override void WriteI64(long l)
- {
- WrappedProtocol.WriteI64(l);
- }
-
- public override void WriteDouble(double v)
- {
- WrappedProtocol.WriteDouble(v);
- }
-
- public override void WriteString(string s)
- {
- WrappedProtocol.WriteString(s);
- }
-
- public override void WriteBinary(byte[] bytes)
- {
- WrappedProtocol.WriteBinary(bytes);
- }
-
- public override TMessage ReadMessageBegin()
- {
- return WrappedProtocol.ReadMessageBegin();
- }
-
- public override void ReadMessageEnd()
- {
- WrappedProtocol.ReadMessageEnd();
- }
-
- public override TStruct ReadStructBegin()
- {
- return WrappedProtocol.ReadStructBegin();
- }
-
- public override void ReadStructEnd()
- {
- WrappedProtocol.ReadStructEnd();
- }
-
- public override TField ReadFieldBegin()
- {
- return WrappedProtocol.ReadFieldBegin();
- }
-
- public override void ReadFieldEnd()
- {
- WrappedProtocol.ReadFieldEnd();
- }
-
- public override TMap ReadMapBegin()
- {
- return WrappedProtocol.ReadMapBegin();
- }
-
- public override void ReadMapEnd()
- {
- WrappedProtocol.ReadMapEnd();
- }
-
- public override TList ReadListBegin()
- {
- return WrappedProtocol.ReadListBegin();
- }
-
- public override void ReadListEnd()
- {
- WrappedProtocol.ReadListEnd();
- }
-
- public override TSet ReadSetBegin()
- {
- return WrappedProtocol.ReadSetBegin();
- }
-
- public override void ReadSetEnd()
- {
- WrappedProtocol.ReadSetEnd();
- }
-
- public override bool ReadBool()
- {
- return WrappedProtocol.ReadBool();
- }
-
- public override sbyte ReadByte()
- {
- return WrappedProtocol.ReadByte();
- }
-
- public override short ReadI16()
- {
- return WrappedProtocol.ReadI16();
- }
-
- public override int ReadI32()
- {
- return WrappedProtocol.ReadI32();
- }
-
- public override long ReadI64()
- {
- return WrappedProtocol.ReadI64();
- }
-
- public override double ReadDouble()
- {
- return WrappedProtocol.ReadDouble();
- }
-
- public override string ReadString()
- {
- return WrappedProtocol.ReadString();
- }
-
- public override byte[] ReadBinary()
- {
- return WrappedProtocol.ReadBinary();
- }
- }
-
-}
diff --git a/lib/csharp/src/Protocol/TProtocolException.cs b/lib/csharp/src/Protocol/TProtocolException.cs
deleted file mode 100644
index 7bef236..0000000
--- a/lib/csharp/src/Protocol/TProtocolException.cs
+++ /dev/null
@@ -1,67 +0,0 @@
-/**
- * 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.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-
-namespace Thrift.Protocol
-{
- public class TProtocolException : TException
- {
- public const int UNKNOWN = 0;
- public const int INVALID_DATA = 1;
- public const int NEGATIVE_SIZE = 2;
- public const int SIZE_LIMIT = 3;
- public const int BAD_VERSION = 4;
- public const int NOT_IMPLEMENTED = 5;
- public const int DEPTH_LIMIT = 6;
-
- protected int type_ = UNKNOWN;
-
- public TProtocolException()
- : base()
- {
- }
-
- public TProtocolException(int type, Exception inner = null)
- : base(string.Empty, inner)
- {
- type_ = type;
- }
-
- public TProtocolException(int type, string message, Exception inner = null)
- : base(message, inner)
- {
- type_ = type;
- }
-
- public TProtocolException(string message, Exception inner = null)
- : base(message, inner)
- {
- }
-
- public int getType()
- {
- return type_;
- }
- }
-}
diff --git a/lib/csharp/src/Protocol/TProtocolFactory.cs b/lib/csharp/src/Protocol/TProtocolFactory.cs
deleted file mode 100644
index 71360a1..0000000
--- a/lib/csharp/src/Protocol/TProtocolFactory.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * 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.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using Thrift.Transport;
-
-namespace Thrift.Protocol
-{
- public interface TProtocolFactory
- {
- TProtocol GetProtocol(TTransport trans);
- }
-}
diff --git a/lib/csharp/src/Protocol/TProtocolUtil.cs b/lib/csharp/src/Protocol/TProtocolUtil.cs
deleted file mode 100644
index d995c6c..0000000
--- a/lib/csharp/src/Protocol/TProtocolUtil.cs
+++ /dev/null
@@ -1,108 +0,0 @@
-/**
- * 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.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-
-namespace Thrift.Protocol
-{
- public static class TProtocolUtil
- {
- public static void Skip(TProtocol prot, TType type)
- {
- prot.IncrementRecursionDepth();
- try
- {
- switch (type)
- {
- case TType.Bool:
- prot.ReadBool();
- break;
- case TType.Byte:
- prot.ReadByte();
- break;
- case TType.I16:
- prot.ReadI16();
- break;
- case TType.I32:
- prot.ReadI32();
- break;
- case TType.I64:
- prot.ReadI64();
- break;
- case TType.Double:
- prot.ReadDouble();
- break;
- case TType.String:
- // Don't try to decode the string, just skip it.
- prot.ReadBinary();
- break;
- case TType.Struct:
- prot.ReadStructBegin();
- while (true)
- {
- TField field = prot.ReadFieldBegin();
- if (field.Type == TType.Stop)
- {
- break;
- }
- Skip(prot, field.Type);
- prot.ReadFieldEnd();
- }
- prot.ReadStructEnd();
- break;
- case TType.Map:
- TMap map = prot.ReadMapBegin();
- for (int i = 0; i < map.Count; i++)
- {
- Skip(prot, map.KeyType);
- Skip(prot, map.ValueType);
- }
- prot.ReadMapEnd();
- break;
- case TType.Set:
- TSet set = prot.ReadSetBegin();
- for (int i = 0; i < set.Count; i++)
- {
- Skip(prot, set.ElementType);
- }
- prot.ReadSetEnd();
- break;
- case TType.List:
- TList list = prot.ReadListBegin();
- for (int i = 0; i < list.Count; i++)
- {
- Skip(prot, list.ElementType);
- }
- prot.ReadListEnd();
- break;
- default:
- throw new TProtocolException(TProtocolException.INVALID_DATA, "Unknown data type " + type.ToString("d"));
- }
- }
- finally
- {
- prot.DecrementRecursionDepth();
- }
- }
- }
-}
diff --git a/lib/csharp/src/Protocol/TSet.cs b/lib/csharp/src/Protocol/TSet.cs
deleted file mode 100644
index a918ab5..0000000
--- a/lib/csharp/src/Protocol/TSet.cs
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * 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.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Thrift.Protocol
-{
- public struct TSet
- {
- private TType elementType;
- private int count;
-
- public TSet(TType elementType, int count)
- :this()
- {
- this.elementType = elementType;
- this.count = count;
- }
-
- public TSet(TList list)
- : this(list.ElementType, list.Count)
- {
- }
-
- public TType ElementType
- {
- get { return elementType; }
- set { elementType = value; }
- }
-
- public int Count
- {
- get { return count; }
- set { count = value; }
- }
- }
-}
diff --git a/lib/csharp/src/Protocol/TStruct.cs b/lib/csharp/src/Protocol/TStruct.cs
deleted file mode 100644
index f4844a4..0000000
--- a/lib/csharp/src/Protocol/TStruct.cs
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * 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.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Thrift.Protocol
-{
- public struct TStruct
- {
- private string name;
-
- public TStruct(string name)
- :this()
- {
- this.name = name;
- }
-
- public string Name
- {
- get { return name; }
- set { name = value; }
- }
- }
-}
diff --git a/lib/csharp/src/Protocol/TType.cs b/lib/csharp/src/Protocol/TType.cs
deleted file mode 100644
index 9ce915e..0000000
--- a/lib/csharp/src/Protocol/TType.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * 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.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-
-namespace Thrift.Protocol
-{
- public enum TType : byte
- {
- Stop = 0,
- Void = 1,
- Bool = 2,
- Byte = 3,
- Double = 4,
- I16 = 6,
- I32 = 8,
- I64 = 10,
- String = 11,
- Struct = 12,
- Map = 13,
- Set = 14,
- List = 15
- }
-}
diff --git a/lib/csharp/src/Server/TServer.cs b/lib/csharp/src/Server/TServer.cs
deleted file mode 100644
index 2bc04f3..0000000
--- a/lib/csharp/src/Server/TServer.cs
+++ /dev/null
@@ -1,155 +0,0 @@
-/**
- * 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.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using Thrift.Protocol;
-using Thrift.Transport;
-using System.IO;
-
-namespace Thrift.Server
-{
- public abstract class TServer
- {
- //Attributes
- protected TProcessorFactory processorFactory;
- protected TServerTransport serverTransport;
- protected TTransportFactory inputTransportFactory;
- protected TTransportFactory outputTransportFactory;
- protected TProtocolFactory inputProtocolFactory;
- protected TProtocolFactory outputProtocolFactory;
- protected TServerEventHandler serverEventHandler = null;
-
- //Methods
- public void setEventHandler(TServerEventHandler seh)
- {
- serverEventHandler = seh;
- }
- public TServerEventHandler getEventHandler()
- {
- return serverEventHandler;
- }
-
- //Log delegation
- public delegate void LogDelegate(string str);
- private LogDelegate _logDelegate;
- protected LogDelegate logDelegate
- {
- get { return _logDelegate; }
- set { _logDelegate = (value != null) ? value : DefaultLogDelegate; }
- }
- protected static void DefaultLogDelegate(string s)
- {
- Console.Error.WriteLine(s);
- }
-
- //Construction
- public TServer(TProcessor processor,
- TServerTransport serverTransport)
- : this(processor, serverTransport,
- new TTransportFactory(),
- new TTransportFactory(),
- new TBinaryProtocol.Factory(),
- new TBinaryProtocol.Factory(),
- DefaultLogDelegate)
- {
- }
-
- public TServer(TProcessor processor,
- TServerTransport serverTransport,
- LogDelegate logDelegate)
- : this(processor,
- serverTransport,
- new TTransportFactory(),
- new TTransportFactory(),
- new TBinaryProtocol.Factory(),
- new TBinaryProtocol.Factory(),
- logDelegate)
- {
- }
-
- public TServer(TProcessor processor,
- TServerTransport serverTransport,
- TTransportFactory transportFactory)
- : this(processor,
- serverTransport,
- transportFactory,
- transportFactory,
- new TBinaryProtocol.Factory(),
- new TBinaryProtocol.Factory(),
- DefaultLogDelegate)
- {
- }
-
- public TServer(TProcessor processor,
- TServerTransport serverTransport,
- TTransportFactory transportFactory,
- TProtocolFactory protocolFactory)
- : this(processor,
- serverTransport,
- transportFactory,
- transportFactory,
- protocolFactory,
- protocolFactory,
- DefaultLogDelegate)
- {
- }
-
- public TServer(TProcessor processor,
- TServerTransport serverTransport,
- TTransportFactory inputTransportFactory,
- TTransportFactory outputTransportFactory,
- TProtocolFactory inputProtocolFactory,
- TProtocolFactory outputProtocolFactory,
- LogDelegate logDelegate)
- {
- this.processorFactory = new TSingletonProcessorFactory(processor);
- this.serverTransport = serverTransport;
- this.inputTransportFactory = inputTransportFactory;
- this.outputTransportFactory = outputTransportFactory;
- this.inputProtocolFactory = inputProtocolFactory;
- this.outputProtocolFactory = outputProtocolFactory;
- this.logDelegate = (logDelegate != null) ? logDelegate : DefaultLogDelegate;
- }
-
- public TServer(TProcessorFactory processorFactory,
- TServerTransport serverTransport,
- TTransportFactory inputTransportFactory,
- TTransportFactory outputTransportFactory,
- TProtocolFactory inputProtocolFactory,
- TProtocolFactory outputProtocolFactory,
- LogDelegate logDelegate)
- {
- this.processorFactory = processorFactory;
- this.serverTransport = serverTransport;
- this.inputTransportFactory = inputTransportFactory;
- this.outputTransportFactory = outputTransportFactory;
- this.inputProtocolFactory = inputProtocolFactory;
- this.outputProtocolFactory = outputProtocolFactory;
- this.logDelegate = (logDelegate != null) ? logDelegate : DefaultLogDelegate;
- }
-
- //Abstract Interface
- public abstract void Serve();
- public abstract void Stop();
- }
-}
diff --git a/lib/csharp/src/Server/TServerEventHandler.cs b/lib/csharp/src/Server/TServerEventHandler.cs
deleted file mode 100644
index e81efc6..0000000
--- a/lib/csharp/src/Server/TServerEventHandler.cs
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * 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.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-
-namespace Thrift.Server
-{
- /// <summary>
- /// Interface implemented by server users to handle events from the server.
- /// </summary>
- public interface TServerEventHandler
- {
- /// <summary>
- /// Called before the server begins.
- /// </summary>
- void preServe();
-
- /// <summary>
- /// Called when a new client has connected and is about to being processing.
- /// </summary>
- object createContext(Thrift.Protocol.TProtocol input, Thrift.Protocol.TProtocol output);
-
- /// <summary>
- /// Called when a client has finished request-handling to delete server context.
- /// </summary>
- void deleteContext(object serverContext, Thrift.Protocol.TProtocol input, Thrift.Protocol.TProtocol output);
-
- /// <summary>
- /// Called when a client is about to call the processor.
- /// </summary>
- void processContext(object serverContext, Thrift.Transport.TTransport transport);
- };
-}
diff --git a/lib/csharp/src/Server/TSimpleServer.cs b/lib/csharp/src/Server/TSimpleServer.cs
deleted file mode 100644
index 4e7ea96..0000000
--- a/lib/csharp/src/Server/TSimpleServer.cs
+++ /dev/null
@@ -1,180 +0,0 @@
-/**
- * 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.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using Thrift.Transport;
-using Thrift.Protocol;
-
-namespace Thrift.Server
-{
- /// <summary>
- /// Simple single-threaded server for testing.
- /// </summary>
- public class TSimpleServer : TServer
- {
- private bool stop = false;
-
- public TSimpleServer(TProcessor processor,
- TServerTransport serverTransport)
- : base(processor, serverTransport, new TTransportFactory(), new TTransportFactory(), new TBinaryProtocol.Factory(), new TBinaryProtocol.Factory(), DefaultLogDelegate)
- {
- }
-
- public TSimpleServer(TProcessor processor,
- TServerTransport serverTransport,
- LogDelegate logDel)
- : base(processor, serverTransport, new TTransportFactory(), new TTransportFactory(), new TBinaryProtocol.Factory(), new TBinaryProtocol.Factory(), logDel)
- {
- }
-
- public TSimpleServer(TProcessor processor,
- TServerTransport serverTransport,
- TTransportFactory transportFactory)
- : base(processor,
- serverTransport,
- transportFactory,
- transportFactory,
- new TBinaryProtocol.Factory(),
- new TBinaryProtocol.Factory(),
- DefaultLogDelegate)
- {
- }
-
- public TSimpleServer(TProcessor processor,
- TServerTransport serverTransport,
- TTransportFactory transportFactory,
- TProtocolFactory protocolFactory)
- : base(processor,
- serverTransport,
- transportFactory,
- transportFactory,
- protocolFactory,
- protocolFactory,
- DefaultLogDelegate)
- {
- }
-
- public TSimpleServer(TProcessorFactory processorFactory,
- TServerTransport serverTransport,
- TTransportFactory transportFactory,
- TProtocolFactory protocolFactory)
- : base(processorFactory,
- serverTransport,
- transportFactory,
- transportFactory,
- protocolFactory,
- protocolFactory,
- DefaultLogDelegate)
- {
- }
-
- public override void Serve()
- {
- try
- {
- serverTransport.Listen();
- }
- catch (TTransportException ttx)
- {
- logDelegate(ttx.ToString());
- return;
- }
-
- //Fire the preServe server event when server is up but before any client connections
- if (serverEventHandler != null)
- serverEventHandler.preServe();
-
- while (!stop)
- {
- TProcessor processor = null;
- TTransport client = null;
- TTransport inputTransport = null;
- TTransport outputTransport = null;
- TProtocol inputProtocol = null;
- TProtocol outputProtocol = null;
- object connectionContext = null;
- try
- {
- using (client = serverTransport.Accept())
- {
- processor = processorFactory.GetProcessor(client);
- if (client != null)
- {
- using (inputTransport = inputTransportFactory.GetTransport(client))
- {
- using (outputTransport = outputTransportFactory.GetTransport(client))
- {
- inputProtocol = inputProtocolFactory.GetProtocol(inputTransport);
- outputProtocol = outputProtocolFactory.GetProtocol(outputTransport);
-
- //Recover event handler (if any) and fire createContext server event when a client connects
- if (serverEventHandler != null)
- connectionContext = serverEventHandler.createContext(inputProtocol, outputProtocol);
-
- //Process client requests until client disconnects
- while (!stop)
- {
- if (!inputTransport.Peek())
- break;
-
- //Fire processContext server event
- //N.B. This is the pattern implemented in C++ and the event fires provisionally.
- //That is to say it may be many minutes between the event firing and the client request
- //actually arriving or the client may hang up without ever makeing a request.
- if (serverEventHandler != null)
- serverEventHandler.processContext(connectionContext, inputTransport);
- //Process client request (blocks until transport is readable)
- if (!processor.Process(inputProtocol, outputProtocol))
- break;
- }
- }
- }
- }
- }
- }
- catch (TTransportException ttx)
- {
- if (!stop || ttx.Type != TTransportException.ExceptionType.Interrupted)
- {
- logDelegate(ttx.ToString());
- }
- }
- catch (Exception x)
- {
- //Unexpected
- logDelegate(x.ToString());
- }
-
- //Fire deleteContext server event after client disconnects
- if (serverEventHandler != null)
- serverEventHandler.deleteContext(connectionContext, inputProtocol, outputProtocol);
- }
- }
-
- public override void Stop()
- {
- stop = true;
- serverTransport.Close();
- }
- }
-}
diff --git a/lib/csharp/src/Server/TThreadPoolServer.cs b/lib/csharp/src/Server/TThreadPoolServer.cs
deleted file mode 100644
index a494ce7..0000000
--- a/lib/csharp/src/Server/TThreadPoolServer.cs
+++ /dev/null
@@ -1,295 +0,0 @@
-/**
- * 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.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Threading;
-using Thrift.Protocol;
-using Thrift.Transport;
-
-namespace Thrift.Server
-{
- /// <summary>
- /// Server that uses C# built-in ThreadPool to spawn threads when handling requests.
- /// </summary>
- public class TThreadPoolServer : TServer
- {
- private const int DEFAULT_MIN_THREADS = -1; // use .NET ThreadPool defaults
- private const int DEFAULT_MAX_THREADS = -1; // use .NET ThreadPool defaults
- private volatile bool stop = false;
-
- public struct Configuration
- {
- public int MinWorkerThreads;
- public int MaxWorkerThreads;
- public int MinIOThreads;
- public int MaxIOThreads;
-
- public Configuration(int min = DEFAULT_MIN_THREADS, int max = DEFAULT_MAX_THREADS)
- {
- MinWorkerThreads = min;
- MaxWorkerThreads = max;
- MinIOThreads = min;
- MaxIOThreads = max;
- }
-
- public Configuration(int minWork, int maxWork, int minIO, int maxIO)
- {
- MinWorkerThreads = minWork;
- MaxWorkerThreads = maxWork;
- MinIOThreads = minIO;
- MaxIOThreads = maxIO;
- }
- }
-
- public TThreadPoolServer(TProcessor processor, TServerTransport serverTransport)
- : this(new TSingletonProcessorFactory(processor), serverTransport,
- new TTransportFactory(), new TTransportFactory(),
- new TBinaryProtocol.Factory(), new TBinaryProtocol.Factory(),
- new Configuration(), DefaultLogDelegate)
- {
- }
-
- public TThreadPoolServer(TProcessor processor, TServerTransport serverTransport, LogDelegate logDelegate)
- : this(new TSingletonProcessorFactory(processor), serverTransport,
- new TTransportFactory(), new TTransportFactory(),
- new TBinaryProtocol.Factory(), new TBinaryProtocol.Factory(),
- new Configuration(), logDelegate)
- {
- }
-
- public TThreadPoolServer(TProcessor processor,
- TServerTransport serverTransport,
- TTransportFactory transportFactory,
- TProtocolFactory protocolFactory)
- : this(new TSingletonProcessorFactory(processor), serverTransport,
- transportFactory, transportFactory,
- protocolFactory, protocolFactory,
- new Configuration(), DefaultLogDelegate)
- {
- }
-
- public TThreadPoolServer(TProcessorFactory processorFactory,
- TServerTransport serverTransport,
- TTransportFactory transportFactory,
- TProtocolFactory protocolFactory)
- : this(processorFactory, serverTransport,
- transportFactory, transportFactory,
- protocolFactory, protocolFactory,
- new Configuration(), DefaultLogDelegate)
- {
- }
-
- public TThreadPoolServer(TProcessorFactory processorFactory,
- TServerTransport serverTransport,
- TTransportFactory inputTransportFactory,
- TTransportFactory outputTransportFactory,
- TProtocolFactory inputProtocolFactory,
- TProtocolFactory outputProtocolFactory,
- int minThreadPoolThreads, int maxThreadPoolThreads, LogDelegate logDel)
- : this(processorFactory, serverTransport, inputTransportFactory, outputTransportFactory,
- inputProtocolFactory, outputProtocolFactory,
- new Configuration(minThreadPoolThreads, maxThreadPoolThreads),
- logDel)
- {
- }
-
- public TThreadPoolServer(TProcessorFactory processorFactory,
- TServerTransport serverTransport,
- TTransportFactory inputTransportFactory,
- TTransportFactory outputTransportFactory,
- TProtocolFactory inputProtocolFactory,
- TProtocolFactory outputProtocolFactory,
- Configuration threadConfig,
- LogDelegate logDel)
- : base(processorFactory, serverTransport, inputTransportFactory, outputTransportFactory,
- inputProtocolFactory, outputProtocolFactory, logDel)
- {
- lock (typeof(TThreadPoolServer))
- {
- if ((threadConfig.MaxWorkerThreads > 0) || (threadConfig.MaxIOThreads > 0))
- {
- int work, comm;
- ThreadPool.GetMaxThreads(out work, out comm);
- if (threadConfig.MaxWorkerThreads > 0)
- work = threadConfig.MaxWorkerThreads;
- if (threadConfig.MaxIOThreads > 0)
- comm = threadConfig.MaxIOThreads;
- if (!ThreadPool.SetMaxThreads(work, comm))
- throw new Exception("Error: could not SetMaxThreads in ThreadPool");
- }
-
- if ((threadConfig.MinWorkerThreads > 0) || (threadConfig.MinIOThreads > 0))
- {
- int work, comm;
- ThreadPool.GetMinThreads(out work, out comm);
- if (threadConfig.MinWorkerThreads > 0)
- work = threadConfig.MinWorkerThreads;
- if (threadConfig.MinIOThreads > 0)
- comm = threadConfig.MinIOThreads;
- if (!ThreadPool.SetMinThreads(work, comm))
- throw new Exception("Error: could not SetMinThreads in ThreadPool");
- }
- }
- }
-
-
- /// <summary>
- /// Use new ThreadPool thread for each new client connection.
- /// </summary>
- public override void Serve()
- {
- try
- {
- serverTransport.Listen();
- }
- catch (TTransportException ttx)
- {
- logDelegate("Error, could not listen on ServerTransport: " + ttx);
- return;
- }
-
- //Fire the preServe server event when server is up but before any client connections
- if (serverEventHandler != null)
- serverEventHandler.preServe();
-
- while (!stop)
- {
- int failureCount = 0;
- try
- {
- TTransport client = serverTransport.Accept();
- ThreadPool.QueueUserWorkItem(this.Execute, client);
- }
- catch (TTransportException ttx)
- {
- if (!stop || ttx.Type != TTransportException.ExceptionType.Interrupted)
- {
- ++failureCount;
- logDelegate(ttx.ToString());
- }
-
- }
- }
-
- if (stop)
- {
- try
- {
- serverTransport.Close();
- }
- catch (TTransportException ttx)
- {
- logDelegate("TServerTransport failed on close: " + ttx.Message);
- }
- stop = false;
- }
- }
-
- /// <summary>
- /// Loops on processing a client forever
- /// threadContext will be a TTransport instance
- /// </summary>
- /// <param name="threadContext"></param>
- private void Execute(object threadContext)
- {
- using (TTransport client = (TTransport)threadContext)
- {
- TProcessor processor = processorFactory.GetProcessor(client, this);
- TTransport inputTransport = null;
- TTransport outputTransport = null;
- TProtocol inputProtocol = null;
- TProtocol outputProtocol = null;
- object connectionContext = null;
- try
- {
- try
- {
- inputTransport = inputTransportFactory.GetTransport(client);
- outputTransport = outputTransportFactory.GetTransport(client);
- inputProtocol = inputProtocolFactory.GetProtocol(inputTransport);
- outputProtocol = outputProtocolFactory.GetProtocol(outputTransport);
-
- //Recover event handler (if any) and fire createContext server event when a client connects
- if (serverEventHandler != null)
- connectionContext = serverEventHandler.createContext(inputProtocol, outputProtocol);
-
- //Process client requests until client disconnects
- while (!stop)
- {
- if (!inputTransport.Peek())
- break;
-
- //Fire processContext server event
- //N.B. This is the pattern implemented in C++ and the event fires provisionally.
- //That is to say it may be many minutes between the event firing and the client request
- //actually arriving or the client may hang up without ever makeing a request.
- if (serverEventHandler != null)
- serverEventHandler.processContext(connectionContext, inputTransport);
- //Process client request (blocks until transport is readable)
- if (!processor.Process(inputProtocol, outputProtocol))
- break;
- }
- }
- catch (TTransportException)
- {
- //Usually a client disconnect, expected
- }
- catch (Exception x)
- {
- //Unexpected
- logDelegate("Error: " + x);
- }
-
- //Fire deleteContext server event after client disconnects
- if (serverEventHandler != null)
- serverEventHandler.deleteContext(connectionContext, inputProtocol, outputProtocol);
-
- }
- finally
- {
- //Close transports
- if (inputTransport != null)
- inputTransport.Close();
- if (outputTransport != null)
- outputTransport.Close();
-
- // disposable stuff should be disposed
- if (inputProtocol != null)
- inputProtocol.Dispose();
- if (outputProtocol != null)
- outputProtocol.Dispose();
- if (inputTransport != null)
- inputTransport.Dispose();
- if (outputTransport != null)
- outputTransport.Dispose();
- }
- }
- }
-
- public override void Stop()
- {
- stop = true;
- serverTransport.Close();
- }
- }
-}
diff --git a/lib/csharp/src/Server/TThreadedServer.cs b/lib/csharp/src/Server/TThreadedServer.cs
deleted file mode 100644
index cc051a3..0000000
--- a/lib/csharp/src/Server/TThreadedServer.cs
+++ /dev/null
@@ -1,282 +0,0 @@
-/**
- * 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;
-using System.Collections.Generic;
-using System.Threading;
-using Thrift.Collections;
-using Thrift.Protocol;
-using Thrift.Transport;
-
-namespace Thrift.Server
-{
- /// <summary>
- /// Server that uses C# threads (as opposed to the ThreadPool) when handling requests.
- /// </summary>
- public class TThreadedServer : TServer
- {
- private const int DEFAULT_MAX_THREADS = 100;
- private volatile bool stop = false;
- private readonly int maxThreads;
-
- private Queue<TTransport> clientQueue;
- private THashSet<Thread> clientThreads;
- private object clientLock;
- private Thread workerThread;
-
- public int ClientThreadsCount
- {
- get { return clientThreads.Count; }
- }
-
- public TThreadedServer(TProcessor processor, TServerTransport serverTransport)
- : this(new TSingletonProcessorFactory(processor), serverTransport,
- new TTransportFactory(), new TTransportFactory(),
- new TBinaryProtocol.Factory(), new TBinaryProtocol.Factory(),
- DEFAULT_MAX_THREADS, DefaultLogDelegate)
- {
- }
-
- public TThreadedServer(TProcessor processor, TServerTransport serverTransport, LogDelegate logDelegate)
- : this(new TSingletonProcessorFactory(processor), serverTransport,
- new TTransportFactory(), new TTransportFactory(),
- new TBinaryProtocol.Factory(), new TBinaryProtocol.Factory(),
- DEFAULT_MAX_THREADS, logDelegate)
- {
- }
-
-
- public TThreadedServer(TProcessor processor,
- TServerTransport serverTransport,
- TTransportFactory transportFactory,
- TProtocolFactory protocolFactory)
- : this(new TSingletonProcessorFactory(processor), serverTransport,
- transportFactory, transportFactory,
- protocolFactory, protocolFactory,
- DEFAULT_MAX_THREADS, DefaultLogDelegate)
- {
- }
-
- public TThreadedServer(TProcessorFactory processorFactory,
- TServerTransport serverTransport,
- TTransportFactory transportFactory,
- TProtocolFactory protocolFactory)
- : this(processorFactory, serverTransport,
- transportFactory, transportFactory,
- protocolFactory, protocolFactory,
- DEFAULT_MAX_THREADS, DefaultLogDelegate)
- {
- }
- public TThreadedServer(TProcessorFactory processorFactory,
- TServerTransport serverTransport,
- TTransportFactory inputTransportFactory,
- TTransportFactory outputTransportFactory,
- TProtocolFactory inputProtocolFactory,
... 9780 lines suppressed ...