auser-poolparty 1.3.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (353) hide show
  1. data/VERSION.yml +1 -1
  2. data/examples/monitored_cloud.rb +1 -1
  3. data/examples/thrift/thrift_example.rb +1 -1
  4. data/lib/proto/command_interface_handler.rb +1 -1
  5. data/vendor/gems/thrift/CHANGES +35 -0
  6. data/vendor/gems/thrift/CONTRIBUTORS +77 -0
  7. data/vendor/gems/thrift/DISCLAIMER +6 -0
  8. data/vendor/gems/thrift/LICENSE +202 -0
  9. data/vendor/gems/thrift/Makefile.am +28 -0
  10. data/vendor/gems/thrift/NEWS +79 -0
  11. data/vendor/gems/thrift/NOTICE +26 -0
  12. data/vendor/gems/thrift/README +137 -0
  13. data/vendor/gems/thrift/aclocal/ax_boost_base.m4 +198 -0
  14. data/vendor/gems/thrift/aclocal/ax_javac_and_java.m4 +107 -0
  15. data/vendor/gems/thrift/aclocal/ax_lib_event.m4 +194 -0
  16. data/vendor/gems/thrift/aclocal/ax_lib_zlib.m4 +173 -0
  17. data/vendor/gems/thrift/aclocal/ax_signed_right_shift.m4 +127 -0
  18. data/vendor/gems/thrift/aclocal/ax_thrift_internal.m4 +39 -0
  19. data/vendor/gems/thrift/bootstrap.sh +35 -0
  20. data/vendor/gems/thrift/cleanup.sh +58 -0
  21. data/vendor/gems/thrift/compiler/cpp/Makefile.am +136 -0
  22. data/vendor/gems/thrift/compiler/cpp/README +39 -0
  23. data/vendor/gems/thrift/compiler/cpp/src/generate/t_cocoa_generator.cc +2331 -0
  24. data/vendor/gems/thrift/compiler/cpp/src/generate/t_cpp_generator.cc +3003 -0
  25. data/vendor/gems/thrift/compiler/cpp/src/generate/t_csharp_generator.cc +1700 -0
  26. data/vendor/gems/thrift/compiler/cpp/src/generate/t_erl_generator.cc +932 -0
  27. data/vendor/gems/thrift/compiler/cpp/src/generate/t_generator.cc +173 -0
  28. data/vendor/gems/thrift/compiler/cpp/src/generate/t_generator.h +321 -0
  29. data/vendor/gems/thrift/compiler/cpp/src/generate/t_hs_generator.cc +1445 -0
  30. data/vendor/gems/thrift/compiler/cpp/src/generate/t_html_generator.cc +637 -0
  31. data/vendor/gems/thrift/compiler/cpp/src/generate/t_java_generator.cc +3069 -0
  32. data/vendor/gems/thrift/compiler/cpp/src/generate/t_ocaml_generator.cc +1673 -0
  33. data/vendor/gems/thrift/compiler/cpp/src/generate/t_oop_generator.h +77 -0
  34. data/vendor/gems/thrift/compiler/cpp/src/generate/t_perl_generator.cc +1812 -0
  35. data/vendor/gems/thrift/compiler/cpp/src/generate/t_php_generator.cc +2281 -0
  36. data/vendor/gems/thrift/compiler/cpp/src/generate/t_py_generator.cc +2310 -0
  37. data/vendor/gems/thrift/compiler/cpp/src/generate/t_rb_generator.cc +1114 -0
  38. data/vendor/gems/thrift/compiler/cpp/src/generate/t_st_generator.cc +1071 -0
  39. data/vendor/gems/thrift/compiler/cpp/src/generate/t_xsd_generator.cc +354 -0
  40. data/vendor/gems/thrift/compiler/cpp/src/globals.h +117 -0
  41. data/vendor/gems/thrift/compiler/cpp/src/main.cc +1207 -0
  42. data/vendor/gems/thrift/compiler/cpp/src/main.h +103 -0
  43. data/vendor/gems/thrift/compiler/cpp/src/md5.c +381 -0
  44. data/vendor/gems/thrift/compiler/cpp/src/md5.h +91 -0
  45. data/vendor/gems/thrift/compiler/cpp/src/parse/t_base_type.h +137 -0
  46. data/vendor/gems/thrift/compiler/cpp/src/parse/t_const.h +59 -0
  47. data/vendor/gems/thrift/compiler/cpp/src/parse/t_const_value.h +121 -0
  48. data/vendor/gems/thrift/compiler/cpp/src/parse/t_container.h +56 -0
  49. data/vendor/gems/thrift/compiler/cpp/src/parse/t_doc.h +51 -0
  50. data/vendor/gems/thrift/compiler/cpp/src/parse/t_enum.h +59 -0
  51. data/vendor/gems/thrift/compiler/cpp/src/parse/t_enum_value.h +64 -0
  52. data/vendor/gems/thrift/compiler/cpp/src/parse/t_field.h +150 -0
  53. data/vendor/gems/thrift/compiler/cpp/src/parse/t_function.h +93 -0
  54. data/vendor/gems/thrift/compiler/cpp/src/parse/t_list.h +56 -0
  55. data/vendor/gems/thrift/compiler/cpp/src/parse/t_map.h +64 -0
  56. data/vendor/gems/thrift/compiler/cpp/src/parse/t_program.h +223 -0
  57. data/vendor/gems/thrift/compiler/cpp/src/parse/t_scope.h +86 -0
  58. data/vendor/gems/thrift/compiler/cpp/src/parse/t_service.h +68 -0
  59. data/vendor/gems/thrift/compiler/cpp/src/parse/t_set.h +55 -0
  60. data/vendor/gems/thrift/compiler/cpp/src/parse/t_struct.h +127 -0
  61. data/vendor/gems/thrift/compiler/cpp/src/parse/t_type.h +176 -0
  62. data/vendor/gems/thrift/compiler/cpp/src/parse/t_typedef.h +70 -0
  63. data/vendor/gems/thrift/compiler/cpp/src/platform.h +36 -0
  64. data/vendor/gems/thrift/compiler/cpp/src/thriftl.ll +303 -0
  65. data/vendor/gems/thrift/compiler/cpp/src/thrifty.yy +1140 -0
  66. data/vendor/gems/thrift/configure.ac +255 -0
  67. data/vendor/gems/thrift/contrib/fb303/LICENSE +16 -0
  68. data/vendor/gems/thrift/contrib/fb303/Makefile.am +31 -0
  69. data/vendor/gems/thrift/contrib/fb303/README +37 -0
  70. data/vendor/gems/thrift/contrib/fb303/acinclude.m4 +258 -0
  71. data/vendor/gems/thrift/contrib/fb303/aclocal/ax_boost_base.m4 +198 -0
  72. data/vendor/gems/thrift/contrib/fb303/bootstrap.sh +26 -0
  73. data/vendor/gems/thrift/contrib/fb303/configure.ac +115 -0
  74. data/vendor/gems/thrift/contrib/fb303/cpp/FacebookBase.cpp +124 -0
  75. data/vendor/gems/thrift/contrib/fb303/cpp/FacebookBase.h +103 -0
  76. data/vendor/gems/thrift/contrib/fb303/cpp/Makefile.am +84 -0
  77. data/vendor/gems/thrift/contrib/fb303/cpp/ServiceTracker.cpp +481 -0
  78. data/vendor/gems/thrift/contrib/fb303/cpp/ServiceTracker.h +215 -0
  79. data/vendor/gems/thrift/contrib/fb303/global_footer.mk +21 -0
  80. data/vendor/gems/thrift/contrib/fb303/global_header.mk +38 -0
  81. data/vendor/gems/thrift/contrib/fb303/if/fb303.thrift +112 -0
  82. data/vendor/gems/thrift/contrib/fb303/java/FacebookBase.java +103 -0
  83. data/vendor/gems/thrift/contrib/fb303/java/build.xml +84 -0
  84. data/vendor/gems/thrift/contrib/fb303/php/FacebookBase.php +89 -0
  85. data/vendor/gems/thrift/contrib/fb303/py/Makefile.am +44 -0
  86. data/vendor/gems/thrift/contrib/fb303/py/fb303/FacebookBase.py +82 -0
  87. data/vendor/gems/thrift/contrib/fb303/py/fb303_scripts/__init__.py +20 -0
  88. data/vendor/gems/thrift/contrib/fb303/py/fb303_scripts/fb303_simple_mgmt.py +195 -0
  89. data/vendor/gems/thrift/contrib/fb303/py/setup.py +27 -0
  90. data/vendor/gems/thrift/contrib/thrift.el +126 -0
  91. data/vendor/gems/thrift/contrib/thrift.spec +206 -0
  92. data/vendor/gems/thrift/contrib/thrift.vim +91 -0
  93. data/vendor/gems/thrift/contrib/thrift_dump.cpp +91 -0
  94. data/vendor/gems/thrift/doc/lgpl-2.1.txt +504 -0
  95. data/vendor/gems/thrift/doc/otp-base-license.txt +20 -0
  96. data/vendor/gems/thrift/doc/thrift.bnf +96 -0
  97. data/vendor/gems/thrift/doc/thrift.tex +1057 -0
  98. data/vendor/gems/thrift/lib/Makefile.am +55 -0
  99. data/vendor/gems/thrift/lib/cocoa/README +21 -0
  100. data/vendor/gems/thrift/lib/cocoa/src/TApplicationException.h +44 -0
  101. data/vendor/gems/thrift/lib/cocoa/src/TApplicationException.m +130 -0
  102. data/vendor/gems/thrift/lib/cocoa/src/TException.h +34 -0
  103. data/vendor/gems/thrift/lib/cocoa/src/TException.m +64 -0
  104. data/vendor/gems/thrift/lib/cocoa/src/TProcessor.h +29 -0
  105. data/vendor/gems/thrift/lib/cocoa/src/TProcessorFactory.h +27 -0
  106. data/vendor/gems/thrift/lib/cocoa/src/TSharedProcessorFactory.h +27 -0
  107. data/vendor/gems/thrift/lib/cocoa/src/TSharedProcessorFactory.m +51 -0
  108. data/vendor/gems/thrift/lib/cocoa/src/protocol/TBinaryProtocol.h +51 -0
  109. data/vendor/gems/thrift/lib/cocoa/src/protocol/TBinaryProtocol.m +477 -0
  110. data/vendor/gems/thrift/lib/cocoa/src/protocol/TProtocol.h +148 -0
  111. data/vendor/gems/thrift/lib/cocoa/src/protocol/TProtocolException.h +25 -0
  112. data/vendor/gems/thrift/lib/cocoa/src/protocol/TProtocolException.m +23 -0
  113. data/vendor/gems/thrift/lib/cocoa/src/protocol/TProtocolFactory.h +29 -0
  114. data/vendor/gems/thrift/lib/cocoa/src/protocol/TProtocolUtil.h +29 -0
  115. data/vendor/gems/thrift/lib/cocoa/src/protocol/TProtocolUtil.m +104 -0
  116. data/vendor/gems/thrift/lib/cocoa/src/server/TSocketServer.h +50 -0
  117. data/vendor/gems/thrift/lib/cocoa/src/server/TSocketServer.m +153 -0
  118. data/vendor/gems/thrift/lib/cocoa/src/transport/THTTPClient.h +42 -0
  119. data/vendor/gems/thrift/lib/cocoa/src/transport/THTTPClient.m +159 -0
  120. data/vendor/gems/thrift/lib/cocoa/src/transport/TNSFileHandleTransport.h +35 -0
  121. data/vendor/gems/thrift/lib/cocoa/src/transport/TNSFileHandleTransport.m +91 -0
  122. data/vendor/gems/thrift/lib/cocoa/src/transport/TNSStreamTransport.h +38 -0
  123. data/vendor/gems/thrift/lib/cocoa/src/transport/TNSStreamTransport.m +89 -0
  124. data/vendor/gems/thrift/lib/cocoa/src/transport/TSocketClient.h +32 -0
  125. data/vendor/gems/thrift/lib/cocoa/src/transport/TSocketClient.m +58 -0
  126. data/vendor/gems/thrift/lib/cocoa/src/transport/TTransport.h +36 -0
  127. data/vendor/gems/thrift/lib/cocoa/src/transport/TTransportException.h +30 -0
  128. data/vendor/gems/thrift/lib/cocoa/src/transport/TTransportException.m +43 -0
  129. data/vendor/gems/thrift/lib/cpp/Makefile.am +158 -0
  130. data/vendor/gems/thrift/lib/cpp/README +67 -0
  131. data/vendor/gems/thrift/lib/cpp/src/TLogging.h +163 -0
  132. data/vendor/gems/thrift/lib/cpp/src/TProcessor.h +53 -0
  133. data/vendor/gems/thrift/lib/cpp/src/TReflectionLocal.h +96 -0
  134. data/vendor/gems/thrift/lib/cpp/src/Thrift.cpp +148 -0
  135. data/vendor/gems/thrift/lib/cpp/src/Thrift.h +191 -0
  136. data/vendor/gems/thrift/lib/cpp/src/concurrency/Exception.h +60 -0
  137. data/vendor/gems/thrift/lib/cpp/src/concurrency/FunctionRunner.h +77 -0
  138. data/vendor/gems/thrift/lib/cpp/src/concurrency/Monitor.cpp +137 -0
  139. data/vendor/gems/thrift/lib/cpp/src/concurrency/Monitor.h +84 -0
  140. data/vendor/gems/thrift/lib/cpp/src/concurrency/Mutex.cpp +160 -0
  141. data/vendor/gems/thrift/lib/cpp/src/concurrency/Mutex.h +114 -0
  142. data/vendor/gems/thrift/lib/cpp/src/concurrency/PosixThreadFactory.cpp +314 -0
  143. data/vendor/gems/thrift/lib/cpp/src/concurrency/PosixThreadFactory.h +130 -0
  144. data/vendor/gems/thrift/lib/cpp/src/concurrency/Thread.h +125 -0
  145. data/vendor/gems/thrift/lib/cpp/src/concurrency/ThreadManager.cpp +493 -0
  146. data/vendor/gems/thrift/lib/cpp/src/concurrency/ThreadManager.h +169 -0
  147. data/vendor/gems/thrift/lib/cpp/src/concurrency/TimerManager.cpp +284 -0
  148. data/vendor/gems/thrift/lib/cpp/src/concurrency/TimerManager.h +122 -0
  149. data/vendor/gems/thrift/lib/cpp/src/concurrency/Util.cpp +55 -0
  150. data/vendor/gems/thrift/lib/cpp/src/concurrency/Util.h +100 -0
  151. data/vendor/gems/thrift/lib/cpp/src/concurrency/test/Tests.cpp +155 -0
  152. data/vendor/gems/thrift/lib/cpp/src/concurrency/test/ThreadFactoryTests.h +354 -0
  153. data/vendor/gems/thrift/lib/cpp/src/concurrency/test/ThreadManagerTests.h +379 -0
  154. data/vendor/gems/thrift/lib/cpp/src/concurrency/test/TimerManagerTests.h +155 -0
  155. data/vendor/gems/thrift/lib/cpp/src/processor/PeekProcessor.cpp +122 -0
  156. data/vendor/gems/thrift/lib/cpp/src/processor/PeekProcessor.h +77 -0
  157. data/vendor/gems/thrift/lib/cpp/src/processor/StatsProcessor.h +264 -0
  158. data/vendor/gems/thrift/lib/cpp/src/protocol/TBase64Utils.cpp +79 -0
  159. data/vendor/gems/thrift/lib/cpp/src/protocol/TBase64Utils.h +42 -0
  160. data/vendor/gems/thrift/lib/cpp/src/protocol/TBinaryProtocol.cpp +394 -0
  161. data/vendor/gems/thrift/lib/cpp/src/protocol/TBinaryProtocol.h +254 -0
  162. data/vendor/gems/thrift/lib/cpp/src/protocol/TCompactProtocol.cpp +736 -0
  163. data/vendor/gems/thrift/lib/cpp/src/protocol/TCompactProtocol.h +279 -0
  164. data/vendor/gems/thrift/lib/cpp/src/protocol/TDebugProtocol.cpp +346 -0
  165. data/vendor/gems/thrift/lib/cpp/src/protocol/TDebugProtocol.h +225 -0
  166. data/vendor/gems/thrift/lib/cpp/src/protocol/TDenseProtocol.cpp +762 -0
  167. data/vendor/gems/thrift/lib/cpp/src/protocol/TDenseProtocol.h +253 -0
  168. data/vendor/gems/thrift/lib/cpp/src/protocol/TJSONProtocol.cpp +998 -0
  169. data/vendor/gems/thrift/lib/cpp/src/protocol/TJSONProtocol.h +340 -0
  170. data/vendor/gems/thrift/lib/cpp/src/protocol/TOneWayProtocol.h +304 -0
  171. data/vendor/gems/thrift/lib/cpp/src/protocol/TProtocol.h +438 -0
  172. data/vendor/gems/thrift/lib/cpp/src/protocol/TProtocolException.h +104 -0
  173. data/vendor/gems/thrift/lib/cpp/src/protocol/TProtocolTap.h +187 -0
  174. data/vendor/gems/thrift/lib/cpp/src/server/TNonblockingServer.cpp +750 -0
  175. data/vendor/gems/thrift/lib/cpp/src/server/TNonblockingServer.h +435 -0
  176. data/vendor/gems/thrift/lib/cpp/src/server/TServer.cpp +38 -0
  177. data/vendor/gems/thrift/lib/cpp/src/server/TServer.h +213 -0
  178. data/vendor/gems/thrift/lib/cpp/src/server/TSimpleServer.cpp +118 -0
  179. data/vendor/gems/thrift/lib/cpp/src/server/TSimpleServer.h +70 -0
  180. data/vendor/gems/thrift/lib/cpp/src/server/TThreadPoolServer.cpp +217 -0
  181. data/vendor/gems/thrift/lib/cpp/src/server/TThreadPoolServer.h +79 -0
  182. data/vendor/gems/thrift/lib/cpp/src/server/TThreadedServer.cpp +243 -0
  183. data/vendor/gems/thrift/lib/cpp/src/server/TThreadedServer.h +74 -0
  184. data/vendor/gems/thrift/lib/cpp/src/transport/TBufferTransports.cpp +370 -0
  185. data/vendor/gems/thrift/lib/cpp/src/transport/TBufferTransports.h +667 -0
  186. data/vendor/gems/thrift/lib/cpp/src/transport/TFDTransport.cpp +77 -0
  187. data/vendor/gems/thrift/lib/cpp/src/transport/TFDTransport.h +73 -0
  188. data/vendor/gems/thrift/lib/cpp/src/transport/TFileTransport.cpp +953 -0
  189. data/vendor/gems/thrift/lib/cpp/src/transport/TFileTransport.h +442 -0
  190. data/vendor/gems/thrift/lib/cpp/src/transport/THttpClient.cpp +348 -0
  191. data/vendor/gems/thrift/lib/cpp/src/transport/THttpClient.h +111 -0
  192. data/vendor/gems/thrift/lib/cpp/src/transport/TServerSocket.cpp +368 -0
  193. data/vendor/gems/thrift/lib/cpp/src/transport/TServerSocket.h +76 -0
  194. data/vendor/gems/thrift/lib/cpp/src/transport/TServerTransport.h +92 -0
  195. data/vendor/gems/thrift/lib/cpp/src/transport/TShortReadTransport.h +96 -0
  196. data/vendor/gems/thrift/lib/cpp/src/transport/TSimpleFileTransport.cpp +54 -0
  197. data/vendor/gems/thrift/lib/cpp/src/transport/TSimpleFileTransport.h +41 -0
  198. data/vendor/gems/thrift/lib/cpp/src/transport/TSocket.cpp +591 -0
  199. data/vendor/gems/thrift/lib/cpp/src/transport/TSocket.h +242 -0
  200. data/vendor/gems/thrift/lib/cpp/src/transport/TSocketPool.cpp +235 -0
  201. data/vendor/gems/thrift/lib/cpp/src/transport/TSocketPool.h +191 -0
  202. data/vendor/gems/thrift/lib/cpp/src/transport/TTransport.h +224 -0
  203. data/vendor/gems/thrift/lib/cpp/src/transport/TTransportException.cpp +31 -0
  204. data/vendor/gems/thrift/lib/cpp/src/transport/TTransportException.h +117 -0
  205. data/vendor/gems/thrift/lib/cpp/src/transport/TTransportUtils.cpp +178 -0
  206. data/vendor/gems/thrift/lib/cpp/src/transport/TTransportUtils.h +287 -0
  207. data/vendor/gems/thrift/lib/cpp/src/transport/TZlibTransport.cpp +299 -0
  208. data/vendor/gems/thrift/lib/cpp/src/transport/TZlibTransport.h +219 -0
  209. data/vendor/gems/thrift/lib/cpp/thrift-nb.pc.in +30 -0
  210. data/vendor/gems/thrift/lib/cpp/thrift-z.pc.in +30 -0
  211. data/vendor/gems/thrift/lib/cpp/thrift.pc.in +29 -0
  212. data/vendor/gems/thrift/lib/csharp/Makefile.am +70 -0
  213. data/vendor/gems/thrift/lib/csharp/README +26 -0
  214. data/vendor/gems/thrift/lib/csharp/ThriftMSBuildTask/Properties/AssemblyInfo.cs +55 -0
  215. data/vendor/gems/thrift/lib/csharp/ThriftMSBuildTask/ThriftBuild.cs +242 -0
  216. data/vendor/gems/thrift/lib/csharp/ThriftMSBuildTask/ThriftMSBuildTask.csproj +62 -0
  217. data/vendor/gems/thrift/lib/csharp/src/Collections/THashSet.cs +142 -0
  218. data/vendor/gems/thrift/lib/csharp/src/Protocol/TBase.cs +34 -0
  219. data/vendor/gems/thrift/lib/csharp/src/Protocol/TBinaryProtocol.cs +392 -0
  220. data/vendor/gems/thrift/lib/csharp/src/Protocol/TField.cs +58 -0
  221. data/vendor/gems/thrift/lib/csharp/src/Protocol/TList.cs +50 -0
  222. data/vendor/gems/thrift/lib/csharp/src/Protocol/TMap.cs +58 -0
  223. data/vendor/gems/thrift/lib/csharp/src/Protocol/TMessage.cs +58 -0
  224. data/vendor/gems/thrift/lib/csharp/src/Protocol/TMessageType.cs +31 -0
  225. data/vendor/gems/thrift/lib/csharp/src/Protocol/TProtocol.cs +87 -0
  226. data/vendor/gems/thrift/lib/csharp/src/Protocol/TProtocolException.cs +61 -0
  227. data/vendor/gems/thrift/lib/csharp/src/Protocol/TProtocolFactory.cs +29 -0
  228. data/vendor/gems/thrift/lib/csharp/src/Protocol/TProtocolUtil.cs +94 -0
  229. data/vendor/gems/thrift/lib/csharp/src/Protocol/TSet.cs +50 -0
  230. data/vendor/gems/thrift/lib/csharp/src/Protocol/TStruct.cs +42 -0
  231. data/vendor/gems/thrift/lib/csharp/src/Protocol/TType.cs +40 -0
  232. data/vendor/gems/thrift/lib/csharp/src/Server/TServer.cs +135 -0
  233. data/vendor/gems/thrift/lib/csharp/src/Server/TSimpleServer.cs +148 -0
  234. data/vendor/gems/thrift/lib/csharp/src/Server/TThreadPoolServer.cs +186 -0
  235. data/vendor/gems/thrift/lib/csharp/src/Server/TThreadedServer.cs +234 -0
  236. data/vendor/gems/thrift/lib/csharp/src/TApplicationException.cs +131 -0
  237. data/vendor/gems/thrift/lib/csharp/src/TProcessor.cs +29 -0
  238. data/vendor/gems/thrift/lib/csharp/src/Thrift.csproj +73 -0
  239. data/vendor/gems/thrift/lib/csharp/src/Thrift.sln +35 -0
  240. data/vendor/gems/thrift/lib/csharp/src/Transport/TBufferedTransport.cs +100 -0
  241. data/vendor/gems/thrift/lib/csharp/src/Transport/TServerSocket.cs +157 -0
  242. data/vendor/gems/thrift/lib/csharp/src/Transport/TServerTransport.cs +39 -0
  243. data/vendor/gems/thrift/lib/csharp/src/Transport/TSocket.cs +144 -0
  244. data/vendor/gems/thrift/lib/csharp/src/Transport/TStreamTransport.cs +103 -0
  245. data/vendor/gems/thrift/lib/csharp/src/Transport/TTransport.cs +66 -0
  246. data/vendor/gems/thrift/lib/csharp/src/Transport/TTransportException.cs +64 -0
  247. data/vendor/gems/thrift/lib/csharp/src/Transport/TTransportFactory.cs +38 -0
  248. data/vendor/gems/thrift/lib/erl/Makefile +37 -0
  249. data/vendor/gems/thrift/lib/erl/README +56 -0
  250. data/vendor/gems/thrift/lib/erl/build/beamver +59 -0
  251. data/vendor/gems/thrift/lib/erl/build/buildtargets.mk +15 -0
  252. data/vendor/gems/thrift/lib/erl/build/colors.mk +24 -0
  253. data/vendor/gems/thrift/lib/erl/build/docs.mk +12 -0
  254. data/vendor/gems/thrift/lib/erl/build/mime.types +98 -0
  255. data/vendor/gems/thrift/lib/erl/build/otp.mk +146 -0
  256. data/vendor/gems/thrift/lib/erl/build/otp_subdir.mk +85 -0
  257. data/vendor/gems/thrift/lib/erl/build/raw_test.mk +29 -0
  258. data/vendor/gems/thrift/lib/erl/include/thrift_constants.hrl +54 -0
  259. data/vendor/gems/thrift/lib/erl/include/thrift_protocol.hrl +31 -0
  260. data/vendor/gems/thrift/lib/erl/src/Makefile +116 -0
  261. data/vendor/gems/thrift/lib/erl/src/test_handler.erl +26 -0
  262. data/vendor/gems/thrift/lib/erl/src/test_service.erl +29 -0
  263. data/vendor/gems/thrift/lib/erl/src/thrift.app.src +44 -0
  264. data/vendor/gems/thrift/lib/erl/src/thrift.appup.src +1 -0
  265. data/vendor/gems/thrift/lib/erl/src/thrift_base64_transport.erl +64 -0
  266. data/vendor/gems/thrift/lib/erl/src/thrift_binary_protocol.erl +325 -0
  267. data/vendor/gems/thrift/lib/erl/src/thrift_buffered_transport.erl +180 -0
  268. data/vendor/gems/thrift/lib/erl/src/thrift_client.erl +384 -0
  269. data/vendor/gems/thrift/lib/erl/src/thrift_disk_log_transport.erl +118 -0
  270. data/vendor/gems/thrift/lib/erl/src/thrift_file_transport.erl +87 -0
  271. data/vendor/gems/thrift/lib/erl/src/thrift_framed_transport.erl +208 -0
  272. data/vendor/gems/thrift/lib/erl/src/thrift_http_transport.erl +199 -0
  273. data/vendor/gems/thrift/lib/erl/src/thrift_memory_buffer.erl +164 -0
  274. data/vendor/gems/thrift/lib/erl/src/thrift_processor.erl +188 -0
  275. data/vendor/gems/thrift/lib/erl/src/thrift_protocol.erl +356 -0
  276. data/vendor/gems/thrift/lib/erl/src/thrift_server.erl +183 -0
  277. data/vendor/gems/thrift/lib/erl/src/thrift_service.erl +25 -0
  278. data/vendor/gems/thrift/lib/erl/src/thrift_socket_server.erl +249 -0
  279. data/vendor/gems/thrift/lib/erl/src/thrift_socket_transport.erl +119 -0
  280. data/vendor/gems/thrift/lib/erl/src/thrift_transport.erl +57 -0
  281. data/vendor/gems/thrift/lib/erl/vsn.mk +1 -0
  282. data/vendor/gems/thrift/lib/hs/README +82 -0
  283. data/vendor/gems/thrift/lib/hs/Setup.lhs +23 -0
  284. data/vendor/gems/thrift/lib/hs/TODO +2 -0
  285. data/vendor/gems/thrift/lib/hs/Thrift.cabal +20 -0
  286. data/vendor/gems/thrift/lib/hs/src/Thrift.hs +111 -0
  287. data/vendor/gems/thrift/lib/hs/src/Thrift/Protocol.hs +191 -0
  288. data/vendor/gems/thrift/lib/hs/src/Thrift/Protocol/Binary.hs +147 -0
  289. data/vendor/gems/thrift/lib/hs/src/Thrift/Server.hs +65 -0
  290. data/vendor/gems/thrift/lib/hs/src/Thrift/Transport.hs +60 -0
  291. data/vendor/gems/thrift/lib/hs/src/Thrift/Transport/Handle.hs +58 -0
  292. data/vendor/gems/thrift/lib/java/Makefile.am +38 -0
  293. data/vendor/gems/thrift/lib/java/README +43 -0
  294. data/vendor/gems/thrift/lib/java/build.xml +195 -0
  295. data/vendor/gems/thrift/lib/java/ivy.xml +8 -0
  296. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/IntRangeSet.java +171 -0
  297. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TApplicationException.java +123 -0
  298. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TBase.java +66 -0
  299. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TBaseHelper.java +102 -0
  300. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TByteArrayOutputStream.java +46 -0
  301. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TDeserializer.java +94 -0
  302. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TException.java +45 -0
  303. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TFieldRequirementType.java +30 -0
  304. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TProcessor.java +32 -0
  305. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TProcessorFactory.java +39 -0
  306. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TSerializer.java +110 -0
  307. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/meta_data/FieldMetaData.java +69 -0
  308. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/meta_data/FieldValueMetaData.java +42 -0
  309. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/meta_data/ListMetaData.java +29 -0
  310. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/meta_data/MapMetaData.java +31 -0
  311. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/meta_data/SetMetaData.java +29 -0
  312. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/meta_data/StructMetaData.java +31 -0
  313. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TBase64Utils.java +128 -0
  314. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TBinaryProtocol.java +331 -0
  315. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TCompactProtocol.java +741 -0
  316. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TField.java +48 -0
  317. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TJSONProtocol.java +927 -0
  318. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TList.java +38 -0
  319. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TMap.java +40 -0
  320. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TMessage.java +48 -0
  321. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TMessageType.java +31 -0
  322. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TProtocol.java +146 -0
  323. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TProtocolException.java +81 -0
  324. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TProtocolFactory.java +30 -0
  325. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TProtocolUtil.java +158 -0
  326. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TSet.java +42 -0
  327. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TSimpleJSONProtocol.java +384 -0
  328. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TStruct.java +36 -0
  329. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TType.java +40 -0
  330. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/server/THsHaServer.java +304 -0
  331. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/server/TNonblockingServer.java +772 -0
  332. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/server/TServer.java +126 -0
  333. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/server/TSimpleServer.java +145 -0
  334. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/server/TThreadPoolServer.java +271 -0
  335. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TFramedTransport.java +126 -0
  336. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/THttpClient.java +157 -0
  337. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TIOStreamTransport.java +159 -0
  338. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TMemoryBuffer.java +98 -0
  339. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TNonblockingServerSocket.java +160 -0
  340. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TNonblockingServerTransport.java +31 -0
  341. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TNonblockingSocket.java +213 -0
  342. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TNonblockingTransport.java +31 -0
  343. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TServerSocket.java +145 -0
  344. metadata +348 -37
  345. data/vendor/gems/trollop/FAQ.txt +0 -35
  346. data/vendor/gems/trollop/History.txt +0 -84
  347. data/vendor/gems/trollop/Manifest.txt +0 -7
  348. data/vendor/gems/trollop/README.txt +0 -38
  349. data/vendor/gems/trollop/Rakefile +0 -36
  350. data/vendor/gems/trollop/lib/trollop.rb +0 -695
  351. data/vendor/gems/trollop/release-script.txt +0 -13
  352. data/vendor/gems/trollop/test/test_trollop.rb +0 -957
  353. data/vendor/gems/trollop/www/index.html +0 -167
@@ -0,0 +1,253 @@
1
+ /*
2
+ * Licensed to the Apache Software Foundation (ASF) under one
3
+ * or more contributor license agreements. See the NOTICE file
4
+ * distributed with this work for additional information
5
+ * regarding copyright ownership. The ASF licenses this file
6
+ * to you under the Apache License, Version 2.0 (the
7
+ * "License"); you may not use this file except in compliance
8
+ * with the License. You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing,
13
+ * software distributed under the License is distributed on an
14
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15
+ * KIND, either express or implied. See the License for the
16
+ * specific language governing permissions and limitations
17
+ * under the License.
18
+ */
19
+
20
+ #ifndef _THRIFT_PROTOCOL_TDENSEPROTOCOL_H_
21
+ #define _THRIFT_PROTOCOL_TDENSEPROTOCOL_H_ 1
22
+
23
+ #include "TBinaryProtocol.h"
24
+
25
+ namespace apache { namespace thrift { namespace protocol {
26
+
27
+ /**
28
+ * !!!WARNING!!!
29
+ * This class is still highly experimental. Incompatible changes
30
+ * WILL be made to it without notice. DO NOT USE IT YET unless
31
+ * you are coordinating your testing with the author.
32
+ *
33
+ * The dense protocol is designed to use as little space as possible.
34
+ *
35
+ * There are two types of dense protocol instances. Standalone instances
36
+ * are not used for RPC and just encoded and decode structures of
37
+ * a predetermined type. Non-standalone instances are used for RPC.
38
+ * Currently, only standalone instances exist.
39
+ *
40
+ * To use a standalone dense protocol object, you must set the type_spec
41
+ * property (either in the constructor, or with setTypeSpec) to the local
42
+ * reflection TypeSpec of the structures you will write to (or read from) the
43
+ * protocol instance.
44
+ *
45
+ * BEST PRACTICES:
46
+ * - Never use optional for primitives or containers.
47
+ * - Only use optional for structures if they are very big and very rarely set.
48
+ * - All integers are variable-length, so you can use i64 without bloating.
49
+ * - NEVER EVER change the struct definitions IN ANY WAY without either
50
+ * changing your cache keys or talking to dreiss.
51
+ *
52
+ * TODO(dreiss): New class write with old meta.
53
+ *
54
+ * We override all of TBinaryProtocol's methods.
55
+ * We inherit so that we can can explicitly call TBPs's primitive-writing
56
+ * methods within our versions.
57
+ *
58
+ */
59
+ class TDenseProtocol : public TBinaryProtocol {
60
+ protected:
61
+ static const int32_t VERSION_MASK = 0xffff0000;
62
+ // VERSION_1 (0x80010000) is taken by TBinaryProtocol.
63
+ static const int32_t VERSION_2 = 0x80020000;
64
+
65
+ public:
66
+ typedef apache::thrift::reflection::local::TypeSpec TypeSpec;
67
+ static const int FP_PREFIX_LEN;
68
+
69
+ /**
70
+ * @param tran The transport to use.
71
+ * @param type_spec The TypeSpec of the structures using this protocol.
72
+ */
73
+ TDenseProtocol(boost::shared_ptr<TTransport> trans,
74
+ TypeSpec* type_spec = NULL) :
75
+ TBinaryProtocol(trans),
76
+ type_spec_(type_spec),
77
+ standalone_(true)
78
+ {}
79
+
80
+ void setTypeSpec(TypeSpec* type_spec) {
81
+ type_spec_ = type_spec;
82
+ }
83
+ TypeSpec* getTypeSpec() {
84
+ return type_spec_;
85
+ }
86
+
87
+
88
+ /*
89
+ * Writing functions.
90
+ */
91
+
92
+ virtual uint32_t writeMessageBegin(const std::string& name,
93
+ const TMessageType messageType,
94
+ const int32_t seqid);
95
+
96
+ virtual uint32_t writeMessageEnd();
97
+
98
+
99
+ virtual uint32_t writeStructBegin(const char* name);
100
+
101
+ virtual uint32_t writeStructEnd();
102
+
103
+ virtual uint32_t writeFieldBegin(const char* name,
104
+ const TType fieldType,
105
+ const int16_t fieldId);
106
+
107
+ virtual uint32_t writeFieldEnd();
108
+
109
+ virtual uint32_t writeFieldStop();
110
+
111
+ virtual uint32_t writeMapBegin(const TType keyType,
112
+ const TType valType,
113
+ const uint32_t size);
114
+
115
+ virtual uint32_t writeMapEnd();
116
+
117
+ virtual uint32_t writeListBegin(const TType elemType,
118
+ const uint32_t size);
119
+
120
+ virtual uint32_t writeListEnd();
121
+
122
+ virtual uint32_t writeSetBegin(const TType elemType,
123
+ const uint32_t size);
124
+
125
+ virtual uint32_t writeSetEnd();
126
+
127
+ virtual uint32_t writeBool(const bool value);
128
+
129
+ virtual uint32_t writeByte(const int8_t byte);
130
+
131
+ virtual uint32_t writeI16(const int16_t i16);
132
+
133
+ virtual uint32_t writeI32(const int32_t i32);
134
+
135
+ virtual uint32_t writeI64(const int64_t i64);
136
+
137
+ virtual uint32_t writeDouble(const double dub);
138
+
139
+ virtual uint32_t writeString(const std::string& str);
140
+
141
+ virtual uint32_t writeBinary(const std::string& str);
142
+
143
+
144
+ /*
145
+ * Helper writing functions (don't do state transitions).
146
+ */
147
+ inline uint32_t subWriteI32(const int32_t i32);
148
+
149
+ inline uint32_t subWriteString(const std::string& str);
150
+
151
+ uint32_t subWriteBool(const bool value) {
152
+ return TBinaryProtocol::writeBool(value);
153
+ }
154
+
155
+
156
+ /*
157
+ * Reading functions
158
+ */
159
+
160
+ uint32_t readMessageBegin(std::string& name,
161
+ TMessageType& messageType,
162
+ int32_t& seqid);
163
+
164
+ uint32_t readMessageEnd();
165
+
166
+ uint32_t readStructBegin(std::string& name);
167
+
168
+ uint32_t readStructEnd();
169
+
170
+ uint32_t readFieldBegin(std::string& name,
171
+ TType& fieldType,
172
+ int16_t& fieldId);
173
+
174
+ uint32_t readFieldEnd();
175
+
176
+ uint32_t readMapBegin(TType& keyType,
177
+ TType& valType,
178
+ uint32_t& size);
179
+
180
+ uint32_t readMapEnd();
181
+
182
+ uint32_t readListBegin(TType& elemType,
183
+ uint32_t& size);
184
+
185
+ uint32_t readListEnd();
186
+
187
+ uint32_t readSetBegin(TType& elemType,
188
+ uint32_t& size);
189
+
190
+ uint32_t readSetEnd();
191
+
192
+ uint32_t readBool(bool& value);
193
+
194
+ uint32_t readByte(int8_t& byte);
195
+
196
+ uint32_t readI16(int16_t& i16);
197
+
198
+ uint32_t readI32(int32_t& i32);
199
+
200
+ uint32_t readI64(int64_t& i64);
201
+
202
+ uint32_t readDouble(double& dub);
203
+
204
+ uint32_t readString(std::string& str);
205
+
206
+ uint32_t readBinary(std::string& str);
207
+
208
+ /*
209
+ * Helper reading functions (don't do state transitions).
210
+ */
211
+ inline uint32_t subReadI32(int32_t& i32);
212
+
213
+ inline uint32_t subReadString(std::string& str);
214
+
215
+ uint32_t subReadBool(bool& value) {
216
+ return TBinaryProtocol::readBool(value);
217
+ }
218
+
219
+
220
+ private:
221
+
222
+ // Implementation functions, documented in the .cpp.
223
+ inline void checkTType(const TType ttype);
224
+ inline void stateTransition();
225
+
226
+ // Read and write variable-length integers.
227
+ // Uses the same technique as the MIDI file format.
228
+ inline uint32_t vlqRead(uint64_t& vlq);
229
+ inline uint32_t vlqWrite(uint64_t vlq);
230
+
231
+ // Called before throwing an exception to make the object reusable.
232
+ void resetState() {
233
+ ts_stack_.clear();
234
+ idx_stack_.clear();
235
+ mkv_stack_.clear();
236
+ }
237
+
238
+ // TypeSpec of the top-level structure to write,
239
+ // for standalone protocol objects.
240
+ TypeSpec* type_spec_;
241
+
242
+ std::vector<TypeSpec*> ts_stack_; // TypeSpec stack.
243
+ std::vector<int> idx_stack_; // InDeX stack.
244
+ std::vector<bool> mkv_stack_; // Map Key/Vlue stack.
245
+ // True = key, False = value.
246
+
247
+ // True iff this is a standalone instance (no RPC).
248
+ bool standalone_;
249
+ };
250
+
251
+ }}} // apache::thrift::protocol
252
+
253
+ #endif // #ifndef _THRIFT_PROTOCOL_TDENSEPROTOCOL_H_
@@ -0,0 +1,998 @@
1
+ /*
2
+ * Licensed to the Apache Software Foundation (ASF) under one
3
+ * or more contributor license agreements. See the NOTICE file
4
+ * distributed with this work for additional information
5
+ * regarding copyright ownership. The ASF licenses this file
6
+ * to you under the Apache License, Version 2.0 (the
7
+ * "License"); you may not use this file except in compliance
8
+ * with the License. You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing,
13
+ * software distributed under the License is distributed on an
14
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15
+ * KIND, either express or implied. See the License for the
16
+ * specific language governing permissions and limitations
17
+ * under the License.
18
+ */
19
+
20
+ #include "TJSONProtocol.h"
21
+
22
+ #include <math.h>
23
+ #include <boost/lexical_cast.hpp>
24
+ #include "TBase64Utils.h"
25
+ #include <transport/TTransportException.h>
26
+
27
+ using namespace apache::thrift::transport;
28
+
29
+ namespace apache { namespace thrift { namespace protocol {
30
+
31
+
32
+ // Static data
33
+
34
+ static const uint8_t kJSONObjectStart = '{';
35
+ static const uint8_t kJSONObjectEnd = '}';
36
+ static const uint8_t kJSONArrayStart = '[';
37
+ static const uint8_t kJSONArrayEnd = ']';
38
+ static const uint8_t kJSONNewline = '\n';
39
+ static const uint8_t kJSONPairSeparator = ':';
40
+ static const uint8_t kJSONElemSeparator = ',';
41
+ static const uint8_t kJSONBackslash = '\\';
42
+ static const uint8_t kJSONStringDelimiter = '"';
43
+ static const uint8_t kJSONZeroChar = '0';
44
+ static const uint8_t kJSONEscapeChar = 'u';
45
+
46
+ static const std::string kJSONEscapePrefix("\\u00");
47
+
48
+ static const uint32_t kThriftVersion1 = 1;
49
+
50
+ static const std::string kThriftNan("NaN");
51
+ static const std::string kThriftInfinity("Infinity");
52
+ static const std::string kThriftNegativeInfinity("-Infinity");
53
+
54
+ static const std::string kTypeNameBool("tf");
55
+ static const std::string kTypeNameByte("i8");
56
+ static const std::string kTypeNameI16("i16");
57
+ static const std::string kTypeNameI32("i32");
58
+ static const std::string kTypeNameI64("i64");
59
+ static const std::string kTypeNameDouble("dbl");
60
+ static const std::string kTypeNameStruct("rec");
61
+ static const std::string kTypeNameString("str");
62
+ static const std::string kTypeNameMap("map");
63
+ static const std::string kTypeNameList("lst");
64
+ static const std::string kTypeNameSet("set");
65
+
66
+ static const std::string &getTypeNameForTypeID(TType typeID) {
67
+ switch (typeID) {
68
+ case T_BOOL:
69
+ return kTypeNameBool;
70
+ case T_BYTE:
71
+ return kTypeNameByte;
72
+ case T_I16:
73
+ return kTypeNameI16;
74
+ case T_I32:
75
+ return kTypeNameI32;
76
+ case T_I64:
77
+ return kTypeNameI64;
78
+ case T_DOUBLE:
79
+ return kTypeNameDouble;
80
+ case T_STRING:
81
+ return kTypeNameString;
82
+ case T_STRUCT:
83
+ return kTypeNameStruct;
84
+ case T_MAP:
85
+ return kTypeNameMap;
86
+ case T_SET:
87
+ return kTypeNameSet;
88
+ case T_LIST:
89
+ return kTypeNameList;
90
+ default:
91
+ throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
92
+ "Unrecognized type");
93
+ }
94
+ }
95
+
96
+ static TType getTypeIDForTypeName(const std::string &name) {
97
+ TType result = T_STOP; // Sentinel value
98
+ if (name.length() > 1) {
99
+ switch (name[0]) {
100
+ case 'd':
101
+ result = T_DOUBLE;
102
+ break;
103
+ case 'i':
104
+ switch (name[1]) {
105
+ case '8':
106
+ result = T_BYTE;
107
+ break;
108
+ case '1':
109
+ result = T_I16;
110
+ break;
111
+ case '3':
112
+ result = T_I32;
113
+ break;
114
+ case '6':
115
+ result = T_I64;
116
+ break;
117
+ }
118
+ break;
119
+ case 'l':
120
+ result = T_LIST;
121
+ break;
122
+ case 'm':
123
+ result = T_MAP;
124
+ break;
125
+ case 'r':
126
+ result = T_STRUCT;
127
+ break;
128
+ case 's':
129
+ if (name[1] == 't') {
130
+ result = T_STRING;
131
+ }
132
+ else if (name[1] == 'e') {
133
+ result = T_SET;
134
+ }
135
+ break;
136
+ case 't':
137
+ result = T_BOOL;
138
+ break;
139
+ }
140
+ }
141
+ if (result == T_STOP) {
142
+ throw TProtocolException(TProtocolException::NOT_IMPLEMENTED,
143
+ "Unrecognized type");
144
+ }
145
+ return result;
146
+ }
147
+
148
+
149
+ // This table describes the handling for the first 0x30 characters
150
+ // 0 : escape using "\u00xx" notation
151
+ // 1 : just output index
152
+ // <other> : escape using "\<other>" notation
153
+ static const uint8_t kJSONCharTable[0x30] = {
154
+ // 0 1 2 3 4 5 6 7 8 9 A B C D E F
155
+ 0, 0, 0, 0, 0, 0, 0, 0,'b','t','n', 0,'f','r', 0, 0, // 0
156
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1
157
+ 1, 1,'"', 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 2
158
+ };
159
+
160
+
161
+ // This string's characters must match up with the elements in kEscapeCharVals.
162
+ // I don't have '/' on this list even though it appears on www.json.org --
163
+ // it is not in the RFC
164
+ const static std::string kEscapeChars("\"\\bfnrt");
165
+
166
+ // The elements of this array must match up with the sequence of characters in
167
+ // kEscapeChars
168
+ const static uint8_t kEscapeCharVals[7] = {
169
+ '"', '\\', '\b', '\f', '\n', '\r', '\t',
170
+ };
171
+
172
+
173
+ // Static helper functions
174
+
175
+ // Read 1 character from the transport trans and verify that it is the
176
+ // expected character ch.
177
+ // Throw a protocol exception if it is not.
178
+ static uint32_t readSyntaxChar(TJSONProtocol::LookaheadReader &reader,
179
+ uint8_t ch) {
180
+ uint8_t ch2 = reader.read();
181
+ if (ch2 != ch) {
182
+ throw TProtocolException(TProtocolException::INVALID_DATA,
183
+ "Expected \'" + std::string((char *)&ch, 1) +
184
+ "\'; got \'" + std::string((char *)&ch2, 1) +
185
+ "\'.");
186
+ }
187
+ return 1;
188
+ }
189
+
190
+ // Return the integer value of a hex character ch.
191
+ // Throw a protocol exception if the character is not [0-9a-f].
192
+ static uint8_t hexVal(uint8_t ch) {
193
+ if ((ch >= '0') && (ch <= '9')) {
194
+ return ch - '0';
195
+ }
196
+ else if ((ch >= 'a') && (ch <= 'f')) {
197
+ return ch - 'a';
198
+ }
199
+ else {
200
+ throw TProtocolException(TProtocolException::INVALID_DATA,
201
+ "Expected hex val ([0-9a-f]); got \'"
202
+ + std::string((char *)&ch, 1) + "\'.");
203
+ }
204
+ }
205
+
206
+ // Return the hex character representing the integer val. The value is masked
207
+ // to make sure it is in the correct range.
208
+ static uint8_t hexChar(uint8_t val) {
209
+ val &= 0x0F;
210
+ if (val < 10) {
211
+ return val + '0';
212
+ }
213
+ else {
214
+ return val + 'a';
215
+ }
216
+ }
217
+
218
+ // Return true if the character ch is in [-+0-9.Ee]; false otherwise
219
+ static bool isJSONNumeric(uint8_t ch) {
220
+ switch (ch) {
221
+ case '+':
222
+ case '-':
223
+ case '.':
224
+ case '0':
225
+ case '1':
226
+ case '2':
227
+ case '3':
228
+ case '4':
229
+ case '5':
230
+ case '6':
231
+ case '7':
232
+ case '8':
233
+ case '9':
234
+ case 'E':
235
+ case 'e':
236
+ return true;
237
+ }
238
+ return false;
239
+ }
240
+
241
+
242
+ /**
243
+ * Class to serve as base JSON context and as base class for other context
244
+ * implementations
245
+ */
246
+ class TJSONContext {
247
+
248
+ public:
249
+
250
+ TJSONContext() {};
251
+
252
+ virtual ~TJSONContext() {};
253
+
254
+ /**
255
+ * Write context data to the transport. Default is to do nothing.
256
+ */
257
+ virtual uint32_t write(TTransport &trans) {
258
+ return 0;
259
+ };
260
+
261
+ /**
262
+ * Read context data from the transport. Default is to do nothing.
263
+ */
264
+ virtual uint32_t read(TJSONProtocol::LookaheadReader &reader) {
265
+ return 0;
266
+ };
267
+
268
+ /**
269
+ * Return true if numbers need to be escaped as strings in this context.
270
+ * Default behavior is to return false.
271
+ */
272
+ virtual bool escapeNum() {
273
+ return false;
274
+ }
275
+ };
276
+
277
+ // Context class for object member key-value pairs
278
+ class JSONPairContext : public TJSONContext {
279
+
280
+ public:
281
+
282
+ JSONPairContext() :
283
+ first_(true),
284
+ colon_(true) {
285
+ }
286
+
287
+ uint32_t write(TTransport &trans) {
288
+ if (first_) {
289
+ first_ = false;
290
+ colon_ = true;
291
+ return 0;
292
+ }
293
+ else {
294
+ trans.write(colon_ ? &kJSONPairSeparator : &kJSONElemSeparator, 1);
295
+ colon_ = !colon_;
296
+ return 1;
297
+ }
298
+ }
299
+
300
+ uint32_t read(TJSONProtocol::LookaheadReader &reader) {
301
+ if (first_) {
302
+ first_ = false;
303
+ colon_ = true;
304
+ return 0;
305
+ }
306
+ else {
307
+ uint8_t ch = (colon_ ? kJSONPairSeparator : kJSONElemSeparator);
308
+ colon_ = !colon_;
309
+ return readSyntaxChar(reader, ch);
310
+ }
311
+ }
312
+
313
+ // Numbers must be turned into strings if they are the key part of a pair
314
+ virtual bool escapeNum() {
315
+ return colon_;
316
+ }
317
+
318
+ private:
319
+
320
+ bool first_;
321
+ bool colon_;
322
+ };
323
+
324
+ // Context class for lists
325
+ class JSONListContext : public TJSONContext {
326
+
327
+ public:
328
+
329
+ JSONListContext() :
330
+ first_(true) {
331
+ }
332
+
333
+ uint32_t write(TTransport &trans) {
334
+ if (first_) {
335
+ first_ = false;
336
+ return 0;
337
+ }
338
+ else {
339
+ trans.write(&kJSONElemSeparator, 1);
340
+ return 1;
341
+ }
342
+ }
343
+
344
+ uint32_t read(TJSONProtocol::LookaheadReader &reader) {
345
+ if (first_) {
346
+ first_ = false;
347
+ return 0;
348
+ }
349
+ else {
350
+ return readSyntaxChar(reader, kJSONElemSeparator);
351
+ }
352
+ }
353
+
354
+ private:
355
+ bool first_;
356
+ };
357
+
358
+
359
+ TJSONProtocol::TJSONProtocol(boost::shared_ptr<TTransport> ptrans) :
360
+ TProtocol(ptrans),
361
+ context_(new TJSONContext()),
362
+ reader_(*ptrans) {
363
+ }
364
+
365
+ TJSONProtocol::~TJSONProtocol() {}
366
+
367
+ void TJSONProtocol::pushContext(boost::shared_ptr<TJSONContext> c) {
368
+ contexts_.push(context_);
369
+ context_ = c;
370
+ }
371
+
372
+ void TJSONProtocol::popContext() {
373
+ context_ = contexts_.top();
374
+ contexts_.pop();
375
+ }
376
+
377
+ // Write the character ch as a JSON escape sequence ("\u00xx")
378
+ uint32_t TJSONProtocol::writeJSONEscapeChar(uint8_t ch) {
379
+ trans_->write((const uint8_t *)kJSONEscapePrefix.c_str(),
380
+ kJSONEscapePrefix.length());
381
+ uint8_t outCh = hexChar(ch >> 4);
382
+ trans_->write(&outCh, 1);
383
+ outCh = hexChar(ch);
384
+ trans_->write(&outCh, 1);
385
+ return 6;
386
+ }
387
+
388
+ // Write the character ch as part of a JSON string, escaping as appropriate.
389
+ uint32_t TJSONProtocol::writeJSONChar(uint8_t ch) {
390
+ if (ch >= 0x30) {
391
+ if (ch == kJSONBackslash) { // Only special character >= 0x30 is '\'
392
+ trans_->write(&kJSONBackslash, 1);
393
+ trans_->write(&kJSONBackslash, 1);
394
+ return 2;
395
+ }
396
+ else {
397
+ trans_->write(&ch, 1);
398
+ return 1;
399
+ }
400
+ }
401
+ else {
402
+ uint8_t outCh = kJSONCharTable[ch];
403
+ // Check if regular character, backslash escaped, or JSON escaped
404
+ if (outCh == 1) {
405
+ trans_->write(&ch, 1);
406
+ return 1;
407
+ }
408
+ else if (outCh > 1) {
409
+ trans_->write(&kJSONBackslash, 1);
410
+ trans_->write(&outCh, 1);
411
+ return 2;
412
+ }
413
+ else {
414
+ return writeJSONEscapeChar(ch);
415
+ }
416
+ }
417
+ }
418
+
419
+ // Write out the contents of the string str as a JSON string, escaping
420
+ // characters as appropriate.
421
+ uint32_t TJSONProtocol::writeJSONString(const std::string &str) {
422
+ uint32_t result = context_->write(*trans_);
423
+ result += 2; // For quotes
424
+ trans_->write(&kJSONStringDelimiter, 1);
425
+ std::string::const_iterator iter(str.begin());
426
+ std::string::const_iterator end(str.end());
427
+ while (iter != end) {
428
+ result += writeJSONChar(*iter++);
429
+ }
430
+ trans_->write(&kJSONStringDelimiter, 1);
431
+ return result;
432
+ }
433
+
434
+ // Write out the contents of the string as JSON string, base64-encoding
435
+ // the string's contents, and escaping as appropriate
436
+ uint32_t TJSONProtocol::writeJSONBase64(const std::string &str) {
437
+ uint32_t result = context_->write(*trans_);
438
+ result += 2; // For quotes
439
+ trans_->write(&kJSONStringDelimiter, 1);
440
+ uint8_t b[4];
441
+ const uint8_t *bytes = (const uint8_t *)str.c_str();
442
+ uint32_t len = str.length();
443
+ while (len >= 3) {
444
+ // Encode 3 bytes at a time
445
+ base64_encode(bytes, 3, b);
446
+ trans_->write(b, 4);
447
+ result += 4;
448
+ bytes += 3;
449
+ len -=3;
450
+ }
451
+ if (len) { // Handle remainder
452
+ base64_encode(bytes, len, b);
453
+ trans_->write(b, len + 1);
454
+ result += len + 1;
455
+ }
456
+ trans_->write(&kJSONStringDelimiter, 1);
457
+ return result;
458
+ }
459
+
460
+ // Convert the given integer type to a JSON number, or a string
461
+ // if the context requires it (eg: key in a map pair).
462
+ template <typename NumberType>
463
+ uint32_t TJSONProtocol::writeJSONInteger(NumberType num) {
464
+ uint32_t result = context_->write(*trans_);
465
+ std::string val(boost::lexical_cast<std::string>(num));
466
+ bool escapeNum = context_->escapeNum();
467
+ if (escapeNum) {
468
+ trans_->write(&kJSONStringDelimiter, 1);
469
+ result += 1;
470
+ }
471
+ trans_->write((const uint8_t *)val.c_str(), val.length());
472
+ result += val.length();
473
+ if (escapeNum) {
474
+ trans_->write(&kJSONStringDelimiter, 1);
475
+ result += 1;
476
+ }
477
+ return result;
478
+ }
479
+
480
+ // Convert the given double to a JSON string, which is either the number,
481
+ // "NaN" or "Infinity" or "-Infinity".
482
+ uint32_t TJSONProtocol::writeJSONDouble(double num) {
483
+ uint32_t result = context_->write(*trans_);
484
+ std::string val(boost::lexical_cast<std::string>(num));
485
+
486
+ // Normalize output of boost::lexical_cast for NaNs and Infinities
487
+ bool special = false;
488
+ switch (val[0]) {
489
+ case 'N':
490
+ case 'n':
491
+ val = kThriftNan;
492
+ special = true;
493
+ break;
494
+ case 'I':
495
+ case 'i':
496
+ val = kThriftInfinity;
497
+ special = true;
498
+ break;
499
+ case '-':
500
+ if ((val[1] == 'I') || (val[1] == 'i')) {
501
+ val = kThriftNegativeInfinity;
502
+ special = true;
503
+ }
504
+ break;
505
+ }
506
+
507
+ bool escapeNum = special || context_->escapeNum();
508
+ if (escapeNum) {
509
+ trans_->write(&kJSONStringDelimiter, 1);
510
+ result += 1;
511
+ }
512
+ trans_->write((const uint8_t *)val.c_str(), val.length());
513
+ result += val.length();
514
+ if (escapeNum) {
515
+ trans_->write(&kJSONStringDelimiter, 1);
516
+ result += 1;
517
+ }
518
+ return result;
519
+ }
520
+
521
+ uint32_t TJSONProtocol::writeJSONObjectStart() {
522
+ uint32_t result = context_->write(*trans_);
523
+ trans_->write(&kJSONObjectStart, 1);
524
+ pushContext(boost::shared_ptr<TJSONContext>(new JSONPairContext()));
525
+ return result + 1;
526
+ }
527
+
528
+ uint32_t TJSONProtocol::writeJSONObjectEnd() {
529
+ popContext();
530
+ trans_->write(&kJSONObjectEnd, 1);
531
+ return 1;
532
+ }
533
+
534
+ uint32_t TJSONProtocol::writeJSONArrayStart() {
535
+ uint32_t result = context_->write(*trans_);
536
+ trans_->write(&kJSONArrayStart, 1);
537
+ pushContext(boost::shared_ptr<TJSONContext>(new JSONListContext()));
538
+ return result + 1;
539
+ }
540
+
541
+ uint32_t TJSONProtocol::writeJSONArrayEnd() {
542
+ popContext();
543
+ trans_->write(&kJSONArrayEnd, 1);
544
+ return 1;
545
+ }
546
+
547
+ uint32_t TJSONProtocol::writeMessageBegin(const std::string& name,
548
+ const TMessageType messageType,
549
+ const int32_t seqid) {
550
+ uint32_t result = writeJSONArrayStart();
551
+ result += writeJSONInteger(kThriftVersion1);
552
+ result += writeJSONString(name);
553
+ result += writeJSONInteger(messageType);
554
+ result += writeJSONInteger(seqid);
555
+ return result;
556
+ }
557
+
558
+ uint32_t TJSONProtocol::writeMessageEnd() {
559
+ return writeJSONArrayEnd();
560
+ }
561
+
562
+ uint32_t TJSONProtocol::writeStructBegin(const char* name) {
563
+ return writeJSONObjectStart();
564
+ }
565
+
566
+ uint32_t TJSONProtocol::writeStructEnd() {
567
+ return writeJSONObjectEnd();
568
+ }
569
+
570
+ uint32_t TJSONProtocol::writeFieldBegin(const char* name,
571
+ const TType fieldType,
572
+ const int16_t fieldId) {
573
+ uint32_t result = writeJSONInteger(fieldId);
574
+ result += writeJSONObjectStart();
575
+ result += writeJSONString(getTypeNameForTypeID(fieldType));
576
+ return result;
577
+ }
578
+
579
+ uint32_t TJSONProtocol::writeFieldEnd() {
580
+ return writeJSONObjectEnd();
581
+ }
582
+
583
+ uint32_t TJSONProtocol::writeFieldStop() {
584
+ return 0;
585
+ }
586
+
587
+ uint32_t TJSONProtocol::writeMapBegin(const TType keyType,
588
+ const TType valType,
589
+ const uint32_t size) {
590
+ uint32_t result = writeJSONArrayStart();
591
+ result += writeJSONString(getTypeNameForTypeID(keyType));
592
+ result += writeJSONString(getTypeNameForTypeID(valType));
593
+ result += writeJSONInteger((int64_t)size);
594
+ result += writeJSONObjectStart();
595
+ return result;
596
+ }
597
+
598
+ uint32_t TJSONProtocol::writeMapEnd() {
599
+ return writeJSONObjectEnd() + writeJSONArrayEnd();
600
+ }
601
+
602
+ uint32_t TJSONProtocol::writeListBegin(const TType elemType,
603
+ const uint32_t size) {
604
+ uint32_t result = writeJSONArrayStart();
605
+ result += writeJSONString(getTypeNameForTypeID(elemType));
606
+ result += writeJSONInteger((int64_t)size);
607
+ return result;
608
+ }
609
+
610
+ uint32_t TJSONProtocol::writeListEnd() {
611
+ return writeJSONArrayEnd();
612
+ }
613
+
614
+ uint32_t TJSONProtocol::writeSetBegin(const TType elemType,
615
+ const uint32_t size) {
616
+ uint32_t result = writeJSONArrayStart();
617
+ result += writeJSONString(getTypeNameForTypeID(elemType));
618
+ result += writeJSONInteger((int64_t)size);
619
+ return result;
620
+ }
621
+
622
+ uint32_t TJSONProtocol::writeSetEnd() {
623
+ return writeJSONArrayEnd();
624
+ }
625
+
626
+ uint32_t TJSONProtocol::writeBool(const bool value) {
627
+ return writeJSONInteger(value);
628
+ }
629
+
630
+ uint32_t TJSONProtocol::writeByte(const int8_t byte) {
631
+ // writeByte() must be handled specially becuase boost::lexical cast sees
632
+ // int8_t as a text type instead of an integer type
633
+ return writeJSONInteger((int16_t)byte);
634
+ }
635
+
636
+ uint32_t TJSONProtocol::writeI16(const int16_t i16) {
637
+ return writeJSONInteger(i16);
638
+ }
639
+
640
+ uint32_t TJSONProtocol::writeI32(const int32_t i32) {
641
+ return writeJSONInteger(i32);
642
+ }
643
+
644
+ uint32_t TJSONProtocol::writeI64(const int64_t i64) {
645
+ return writeJSONInteger(i64);
646
+ }
647
+
648
+ uint32_t TJSONProtocol::writeDouble(const double dub) {
649
+ return writeJSONDouble(dub);
650
+ }
651
+
652
+ uint32_t TJSONProtocol::writeString(const std::string& str) {
653
+ return writeJSONString(str);
654
+ }
655
+
656
+ uint32_t TJSONProtocol::writeBinary(const std::string& str) {
657
+ return writeJSONBase64(str);
658
+ }
659
+
660
+ /**
661
+ * Reading functions
662
+ */
663
+
664
+ // Reads 1 byte and verifies that it matches ch.
665
+ uint32_t TJSONProtocol::readJSONSyntaxChar(uint8_t ch) {
666
+ return readSyntaxChar(reader_, ch);
667
+ }
668
+
669
+ // Decodes the four hex parts of a JSON escaped string character and returns
670
+ // the character via out. The first two characters must be "00".
671
+ uint32_t TJSONProtocol::readJSONEscapeChar(uint8_t *out) {
672
+ uint8_t b[2];
673
+ readJSONSyntaxChar(kJSONZeroChar);
674
+ readJSONSyntaxChar(kJSONZeroChar);
675
+ b[0] = reader_.read();
676
+ b[1] = reader_.read();
677
+ *out = (hexVal(b[0]) << 4) + hexVal(b[1]);
678
+ return 4;
679
+ }
680
+
681
+ // Decodes a JSON string, including unescaping, and returns the string via str
682
+ uint32_t TJSONProtocol::readJSONString(std::string &str, bool skipContext) {
683
+ uint32_t result = (skipContext ? 0 : context_->read(reader_));
684
+ result += readJSONSyntaxChar(kJSONStringDelimiter);
685
+ uint8_t ch;
686
+ str.clear();
687
+ while (true) {
688
+ ch = reader_.read();
689
+ ++result;
690
+ if (ch == kJSONStringDelimiter) {
691
+ break;
692
+ }
693
+ if (ch == kJSONBackslash) {
694
+ ch = reader_.read();
695
+ ++result;
696
+ if (ch == kJSONEscapeChar) {
697
+ result += readJSONEscapeChar(&ch);
698
+ }
699
+ else {
700
+ size_t pos = kEscapeChars.find(ch);
701
+ if (pos == std::string::npos) {
702
+ throw TProtocolException(TProtocolException::INVALID_DATA,
703
+ "Expected control char, got '" +
704
+ std::string((const char *)&ch, 1) + "'.");
705
+ }
706
+ ch = kEscapeCharVals[pos];
707
+ }
708
+ }
709
+ str += ch;
710
+ }
711
+ return result;
712
+ }
713
+
714
+ // Reads a block of base64 characters, decoding it, and returns via str
715
+ uint32_t TJSONProtocol::readJSONBase64(std::string &str) {
716
+ std::string tmp;
717
+ uint32_t result = readJSONString(tmp);
718
+ uint8_t *b = (uint8_t *)tmp.c_str();
719
+ uint32_t len = tmp.length();
720
+ str.clear();
721
+ while (len >= 4) {
722
+ base64_decode(b, 4);
723
+ str.append((const char *)b, 3);
724
+ b += 4;
725
+ len -= 4;
726
+ }
727
+ // Don't decode if we hit the end or got a single leftover byte (invalid
728
+ // base64 but legal for skip of regular string type)
729
+ if (len > 1) {
730
+ base64_decode(b, len);
731
+ str.append((const char *)b, len - 1);
732
+ }
733
+ return result;
734
+ }
735
+
736
+ // Reads a sequence of characters, stopping at the first one that is not
737
+ // a valid JSON numeric character.
738
+ uint32_t TJSONProtocol::readJSONNumericChars(std::string &str) {
739
+ uint32_t result = 0;
740
+ str.clear();
741
+ while (true) {
742
+ uint8_t ch = reader_.peek();
743
+ if (!isJSONNumeric(ch)) {
744
+ break;
745
+ }
746
+ reader_.read();
747
+ str += ch;
748
+ ++result;
749
+ }
750
+ return result;
751
+ }
752
+
753
+ // Reads a sequence of characters and assembles them into a number,
754
+ // returning them via num
755
+ template <typename NumberType>
756
+ uint32_t TJSONProtocol::readJSONInteger(NumberType &num) {
757
+ uint32_t result = context_->read(reader_);
758
+ if (context_->escapeNum()) {
759
+ result += readJSONSyntaxChar(kJSONStringDelimiter);
760
+ }
761
+ std::string str;
762
+ result += readJSONNumericChars(str);
763
+ try {
764
+ num = boost::lexical_cast<NumberType>(str);
765
+ }
766
+ catch (boost::bad_lexical_cast e) {
767
+ throw new TProtocolException(TProtocolException::INVALID_DATA,
768
+ "Expected numeric value; got \"" + str +
769
+ "\"");
770
+ }
771
+ if (context_->escapeNum()) {
772
+ result += readJSONSyntaxChar(kJSONStringDelimiter);
773
+ }
774
+ return result;
775
+ }
776
+
777
+ // Reads a JSON number or string and interprets it as a double.
778
+ uint32_t TJSONProtocol::readJSONDouble(double &num) {
779
+ uint32_t result = context_->read(reader_);
780
+ std::string str;
781
+ if (reader_.peek() == kJSONStringDelimiter) {
782
+ result += readJSONString(str, true);
783
+ // Check for NaN, Infinity and -Infinity
784
+ if (str == kThriftNan) {
785
+ num = HUGE_VAL/HUGE_VAL; // generates NaN
786
+ }
787
+ else if (str == kThriftInfinity) {
788
+ num = HUGE_VAL;
789
+ }
790
+ else if (str == kThriftNegativeInfinity) {
791
+ num = -HUGE_VAL;
792
+ }
793
+ else {
794
+ if (!context_->escapeNum()) {
795
+ // Throw exception -- we should not be in a string in this case
796
+ throw new TProtocolException(TProtocolException::INVALID_DATA,
797
+ "Numeric data unexpectedly quoted");
798
+ }
799
+ try {
800
+ num = boost::lexical_cast<double>(str);
801
+ }
802
+ catch (boost::bad_lexical_cast e) {
803
+ throw new TProtocolException(TProtocolException::INVALID_DATA,
804
+ "Expected numeric value; got \"" + str +
805
+ "\"");
806
+ }
807
+ }
808
+ }
809
+ else {
810
+ if (context_->escapeNum()) {
811
+ // This will throw - we should have had a quote if escapeNum == true
812
+ readJSONSyntaxChar(kJSONStringDelimiter);
813
+ }
814
+ result += readJSONNumericChars(str);
815
+ try {
816
+ num = boost::lexical_cast<double>(str);
817
+ }
818
+ catch (boost::bad_lexical_cast e) {
819
+ throw new TProtocolException(TProtocolException::INVALID_DATA,
820
+ "Expected numeric value; got \"" + str +
821
+ "\"");
822
+ }
823
+ }
824
+ return result;
825
+ }
826
+
827
+ uint32_t TJSONProtocol::readJSONObjectStart() {
828
+ uint32_t result = context_->read(reader_);
829
+ result += readJSONSyntaxChar(kJSONObjectStart);
830
+ pushContext(boost::shared_ptr<TJSONContext>(new JSONPairContext()));
831
+ return result;
832
+ }
833
+
834
+ uint32_t TJSONProtocol::readJSONObjectEnd() {
835
+ uint32_t result = readJSONSyntaxChar(kJSONObjectEnd);
836
+ popContext();
837
+ return result;
838
+ }
839
+
840
+ uint32_t TJSONProtocol::readJSONArrayStart() {
841
+ uint32_t result = context_->read(reader_);
842
+ result += readJSONSyntaxChar(kJSONArrayStart);
843
+ pushContext(boost::shared_ptr<TJSONContext>(new JSONListContext()));
844
+ return result;
845
+ }
846
+
847
+ uint32_t TJSONProtocol::readJSONArrayEnd() {
848
+ uint32_t result = readJSONSyntaxChar(kJSONArrayEnd);
849
+ popContext();
850
+ return result;
851
+ }
852
+
853
+ uint32_t TJSONProtocol::readMessageBegin(std::string& name,
854
+ TMessageType& messageType,
855
+ int32_t& seqid) {
856
+ uint32_t result = readJSONArrayStart();
857
+ uint64_t tmpVal = 0;
858
+ result += readJSONInteger(tmpVal);
859
+ if (tmpVal != kThriftVersion1) {
860
+ throw TProtocolException(TProtocolException::BAD_VERSION,
861
+ "Message contained bad version.");
862
+ }
863
+ result += readJSONString(name);
864
+ result += readJSONInteger(tmpVal);
865
+ messageType = (TMessageType)tmpVal;
866
+ result += readJSONInteger(tmpVal);
867
+ seqid = tmpVal;
868
+ return result;
869
+ }
870
+
871
+ uint32_t TJSONProtocol::readMessageEnd() {
872
+ return readJSONArrayEnd();
873
+ }
874
+
875
+ uint32_t TJSONProtocol::readStructBegin(std::string& name) {
876
+ return readJSONObjectStart();
877
+ }
878
+
879
+ uint32_t TJSONProtocol::readStructEnd() {
880
+ return readJSONObjectEnd();
881
+ }
882
+
883
+ uint32_t TJSONProtocol::readFieldBegin(std::string& name,
884
+ TType& fieldType,
885
+ int16_t& fieldId) {
886
+ uint32_t result = 0;
887
+ // Check if we hit the end of the list
888
+ uint8_t ch = reader_.peek();
889
+ if (ch == kJSONObjectEnd) {
890
+ fieldType = apache::thrift::protocol::T_STOP;
891
+ }
892
+ else {
893
+ uint64_t tmpVal = 0;
894
+ std::string tmpStr;
895
+ result += readJSONInteger(tmpVal);
896
+ fieldId = tmpVal;
897
+ result += readJSONObjectStart();
898
+ result += readJSONString(tmpStr);
899
+ fieldType = getTypeIDForTypeName(tmpStr);
900
+ }
901
+ return result;
902
+ }
903
+
904
+ uint32_t TJSONProtocol::readFieldEnd() {
905
+ return readJSONObjectEnd();
906
+ }
907
+
908
+ uint32_t TJSONProtocol::readMapBegin(TType& keyType,
909
+ TType& valType,
910
+ uint32_t& size) {
911
+ uint64_t tmpVal = 0;
912
+ std::string tmpStr;
913
+ uint32_t result = readJSONArrayStart();
914
+ result += readJSONString(tmpStr);
915
+ keyType = getTypeIDForTypeName(tmpStr);
916
+ result += readJSONString(tmpStr);
917
+ valType = getTypeIDForTypeName(tmpStr);
918
+ result += readJSONInteger(tmpVal);
919
+ size = tmpVal;
920
+ result += readJSONObjectStart();
921
+ return result;
922
+ }
923
+
924
+ uint32_t TJSONProtocol::readMapEnd() {
925
+ return readJSONObjectEnd() + readJSONArrayEnd();
926
+ }
927
+
928
+ uint32_t TJSONProtocol::readListBegin(TType& elemType,
929
+ uint32_t& size) {
930
+ uint64_t tmpVal = 0;
931
+ std::string tmpStr;
932
+ uint32_t result = readJSONArrayStart();
933
+ result += readJSONString(tmpStr);
934
+ elemType = getTypeIDForTypeName(tmpStr);
935
+ result += readJSONInteger(tmpVal);
936
+ size = tmpVal;
937
+ return result;
938
+ }
939
+
940
+ uint32_t TJSONProtocol::readListEnd() {
941
+ return readJSONArrayEnd();
942
+ }
943
+
944
+ uint32_t TJSONProtocol::readSetBegin(TType& elemType,
945
+ uint32_t& size) {
946
+ uint64_t tmpVal = 0;
947
+ std::string tmpStr;
948
+ uint32_t result = readJSONArrayStart();
949
+ result += readJSONString(tmpStr);
950
+ elemType = getTypeIDForTypeName(tmpStr);
951
+ result += readJSONInteger(tmpVal);
952
+ size = tmpVal;
953
+ return result;
954
+ }
955
+
956
+ uint32_t TJSONProtocol::readSetEnd() {
957
+ return readJSONArrayEnd();
958
+ }
959
+
960
+ uint32_t TJSONProtocol::readBool(bool& value) {
961
+ return readJSONInteger(value);
962
+ }
963
+
964
+ // readByte() must be handled properly becuase boost::lexical cast sees int8_t
965
+ // as a text type instead of an integer type
966
+ uint32_t TJSONProtocol::readByte(int8_t& byte) {
967
+ int16_t tmp = (int16_t) byte;
968
+ uint32_t result = readJSONInteger(tmp);
969
+ assert(tmp < 256);
970
+ byte = (int8_t)tmp;
971
+ return result;
972
+ }
973
+
974
+ uint32_t TJSONProtocol::readI16(int16_t& i16) {
975
+ return readJSONInteger(i16);
976
+ }
977
+
978
+ uint32_t TJSONProtocol::readI32(int32_t& i32) {
979
+ return readJSONInteger(i32);
980
+ }
981
+
982
+ uint32_t TJSONProtocol::readI64(int64_t& i64) {
983
+ return readJSONInteger(i64);
984
+ }
985
+
986
+ uint32_t TJSONProtocol::readDouble(double& dub) {
987
+ return readJSONDouble(dub);
988
+ }
989
+
990
+ uint32_t TJSONProtocol::readString(std::string &str) {
991
+ return readJSONString(str);
992
+ }
993
+
994
+ uint32_t TJSONProtocol::readBinary(std::string &str) {
995
+ return readJSONBase64(str);
996
+ }
997
+
998
+ }}} // apache::thrift::protocol