passenger 2.2.11 → 2.2.12

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of passenger might be problematic. Click here for more details.

Files changed (287) hide show
  1. data/NEWS +29 -0
  2. data/bin/passenger-install-nginx-module +1 -1
  3. data/doc/Users guide Apache.html +38 -7
  4. data/doc/Users guide Nginx.html +36 -5
  5. data/doc/cxxapi/AbstractSpawnManager_8h-source.html +1 -1
  6. data/doc/cxxapi/Account_8h-source.html +1 -1
  7. data/doc/cxxapi/AccountsDatabase_8h-source.html +1 -1
  8. data/doc/cxxapi/AgentsStarter_8h-source.html +1 -1
  9. data/doc/cxxapi/BCrypt_8h-source.html +1 -1
  10. data/doc/cxxapi/Blowfish_8h-source.html +1 -1
  11. data/doc/cxxapi/Bucket_8h-source.html +5 -4
  12. data/doc/cxxapi/Constants_8h-source.html +2 -2
  13. data/doc/cxxapi/ContentHandler_8h-source.html +1 -1
  14. data/doc/cxxapi/DirectoryMapper_8h-source.html +10 -9
  15. data/doc/cxxapi/EventedServer_8h-source.html +415 -0
  16. data/doc/cxxapi/Exceptions_8h-source.html +1 -1
  17. data/doc/cxxapi/FileDescriptor_8h-source.html +1 -1
  18. data/doc/cxxapi/Hooks_8h-source.html +3 -2
  19. data/doc/cxxapi/HttpStatusExtractor_8h-source.html +324 -323
  20. data/doc/cxxapi/Logging_8h-source.html +643 -546
  21. data/doc/cxxapi/MessageChannel_8h-source.html +429 -404
  22. data/doc/cxxapi/MessageClient_8h-source.html +1 -1
  23. data/doc/cxxapi/MessageReadersWriters_8h-source.html +451 -0
  24. data/doc/cxxapi/MessageServer_8h-source.html +1 -1
  25. data/doc/cxxapi/PoolOptions_8h-source.html +287 -279
  26. data/doc/cxxapi/Process_8h-source.html +178 -167
  27. data/doc/cxxapi/RandomGenerator_8h-source.html +45 -18
  28. data/doc/cxxapi/ResourceLocator_8h-source.html +3 -3
  29. data/doc/cxxapi/ScgiRequestParser_8h-source.html +344 -343
  30. data/doc/cxxapi/ServerInstanceDir_8h-source.html +1 -1
  31. data/doc/cxxapi/Session_8h-source.html +387 -374
  32. data/doc/cxxapi/SpawnManager_8h-source.html +547 -538
  33. data/doc/cxxapi/StaticContentHandler_8h-source.html +1 -1
  34. data/doc/cxxapi/StaticString_8h-source.html +1 -1
  35. data/doc/cxxapi/StringListCreator_8h-source.html +1 -1
  36. data/doc/cxxapi/Utils_8h-source.html +545 -520
  37. data/doc/cxxapi/annotated.html +11 -8
  38. data/doc/cxxapi/apache2_2Configuration_8h-source.html +1 -1
  39. data/doc/cxxapi/classAgentWatcher-members.html +1 -1
  40. data/doc/cxxapi/classAgentWatcher.html +1 -1
  41. data/doc/cxxapi/classClient-members.html +1 -1
  42. data/doc/cxxapi/classClient.html +1 -1
  43. data/doc/cxxapi/classHooks-members.html +16 -13
  44. data/doc/cxxapi/classHooks.html +69 -73
  45. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager-members.html +1 -1
  46. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager.html +1 -1
  47. data/doc/cxxapi/classPassenger_1_1ArgumentException-members.html +1 -1
  48. data/doc/cxxapi/classPassenger_1_1ArgumentException.html +1 -1
  49. data/doc/cxxapi/classPassenger_1_1ArrayReader-members.html +33 -0
  50. data/doc/cxxapi/classPassenger_1_1ArrayReader.html +47 -0
  51. data/doc/cxxapi/classPassenger_1_1BufferedUpload-members.html +1 -1
  52. data/doc/cxxapi/classPassenger_1_1BufferedUpload.html +1 -1
  53. data/doc/cxxapi/classPassenger_1_1BusyException-members.html +1 -1
  54. data/doc/cxxapi/classPassenger_1_1BusyException.html +1 -1
  55. data/doc/cxxapi/classPassenger_1_1ConfigurationException-members.html +1 -1
  56. data/doc/cxxapi/classPassenger_1_1ConfigurationException.html +1 -1
  57. data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +18 -15
  58. data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +89 -99
  59. data/doc/cxxapi/classPassenger_1_1EOFException-members.html +1 -1
  60. data/doc/cxxapi/classPassenger_1_1EOFException.html +1 -1
  61. data/doc/cxxapi/classPassenger_1_1EventFd-members.html +1 -1
  62. data/doc/cxxapi/classPassenger_1_1EventFd.html +1 -1
  63. data/doc/cxxapi/classPassenger_1_1FileDescriptor-members.html +1 -1
  64. data/doc/cxxapi/classPassenger_1_1FileDescriptor.html +1 -1
  65. data/doc/cxxapi/classPassenger_1_1FileNotFoundException-members.html +1 -1
  66. data/doc/cxxapi/classPassenger_1_1FileNotFoundException.html +1 -1
  67. data/doc/cxxapi/classPassenger_1_1FileSystemException-members.html +1 -1
  68. data/doc/cxxapi/classPassenger_1_1FileSystemException.html +1 -1
  69. data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor-members.html +1 -1
  70. data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor.html +2 -2
  71. data/doc/cxxapi/classPassenger_1_1IOException-members.html +1 -1
  72. data/doc/cxxapi/classPassenger_1_1IOException.html +1 -1
  73. data/doc/cxxapi/classPassenger_1_1MemZeroGuard-members.html +1 -1
  74. data/doc/cxxapi/classPassenger_1_1MemZeroGuard.html +1 -1
  75. data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +1 -1
  76. data/doc/cxxapi/classPassenger_1_1MessageChannel.html +1 -1
  77. data/doc/cxxapi/classPassenger_1_1MessageServer-members.html +1 -1
  78. data/doc/cxxapi/classPassenger_1_1MessageServer.html +1 -1
  79. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext-members.html +1 -1
  80. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext.html +1 -1
  81. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext-members.html +1 -1
  82. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext.html +1 -1
  83. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler-members.html +1 -1
  84. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler.html +1 -1
  85. data/doc/cxxapi/classPassenger_1_1Process-members.html +4 -3
  86. data/doc/cxxapi/classPassenger_1_1Process.html +40 -9
  87. data/doc/cxxapi/classPassenger_1_1RandomGenerator-members.html +2 -1
  88. data/doc/cxxapi/classPassenger_1_1RandomGenerator.html +29 -2
  89. data/doc/cxxapi/classPassenger_1_1RuntimeException-members.html +1 -1
  90. data/doc/cxxapi/classPassenger_1_1RuntimeException.html +1 -1
  91. data/doc/cxxapi/classPassenger_1_1ScalarReader-members.html +33 -0
  92. data/doc/cxxapi/classPassenger_1_1ScalarReader.html +47 -0
  93. data/doc/cxxapi/classPassenger_1_1ScgiRequestParser-members.html +1 -1
  94. data/doc/cxxapi/classPassenger_1_1ScgiRequestParser.html +1 -1
  95. data/doc/cxxapi/classPassenger_1_1SecurityException-members.html +1 -1
  96. data/doc/cxxapi/classPassenger_1_1SecurityException.html +1 -1
  97. data/doc/cxxapi/classPassenger_1_1Session-members.html +1 -1
  98. data/doc/cxxapi/classPassenger_1_1Session.html +2 -2
  99. data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +1 -1
  100. data/doc/cxxapi/classPassenger_1_1SpawnException.html +1 -1
  101. data/doc/cxxapi/classPassenger_1_1SpawnManager-members.html +2 -2
  102. data/doc/cxxapi/classPassenger_1_1SpawnManager.html +6 -18
  103. data/doc/cxxapi/classPassenger_1_1StandardSession-members.html +1 -1
  104. data/doc/cxxapi/classPassenger_1_1StandardSession.html +1 -1
  105. data/doc/cxxapi/classPassenger_1_1StaticString-members.html +1 -1
  106. data/doc/cxxapi/classPassenger_1_1StaticString.html +1 -1
  107. data/doc/cxxapi/classPassenger_1_1SystemException-members.html +1 -1
  108. data/doc/cxxapi/classPassenger_1_1SystemException.html +1 -1
  109. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException-members.html +1 -1
  110. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException.html +1 -1
  111. data/doc/cxxapi/classPassenger_1_1TimeoutException-members.html +1 -1
  112. data/doc/cxxapi/classPassenger_1_1TimeoutException.html +1 -1
  113. data/doc/cxxapi/classPassenger_1_1Uint16Reader-members.html +33 -0
  114. data/doc/cxxapi/classPassenger_1_1Uint16Reader.html +47 -0
  115. data/doc/cxxapi/classPassenger_1_1Uint32Reader-members.html +33 -0
  116. data/doc/cxxapi/classPassenger_1_1Uint32Reader.html +47 -0
  117. data/doc/cxxapi/classServer-members.html +1 -1
  118. data/doc/cxxapi/classServer.html +1 -1
  119. data/doc/cxxapi/classServerInstanceDirToucher-members.html +1 -1
  120. data/doc/cxxapi/classServerInstanceDirToucher.html +1 -1
  121. data/doc/cxxapi/classes.html +13 -10
  122. data/doc/cxxapi/definitions_8h-source.html +2 -1
  123. data/doc/cxxapi/doxygen.css +91 -0
  124. data/doc/cxxapi/files.html +16 -13
  125. data/doc/cxxapi/functions.html +32 -21
  126. data/doc/cxxapi/functions_enum.html +1 -1
  127. data/doc/cxxapi/functions_eval.html +1 -1
  128. data/doc/cxxapi/functions_func.html +32 -21
  129. data/doc/cxxapi/functions_vars.html +3 -1
  130. data/doc/cxxapi/graph_legend.html +20 -15
  131. data/doc/cxxapi/graph_legend.png +0 -0
  132. data/doc/cxxapi/group__Configuration.html +51 -64
  133. data/doc/cxxapi/group__Configuration.png +0 -0
  134. data/doc/cxxapi/group__Core.html +24 -26
  135. data/doc/cxxapi/group__Core.png +0 -0
  136. data/doc/cxxapi/group__Exceptions.html +1 -1
  137. data/doc/cxxapi/group__Hooks.html +17 -15
  138. data/doc/cxxapi/group__Hooks.png +0 -0
  139. data/doc/cxxapi/group__Support.html +11 -9
  140. data/doc/cxxapi/hierarchy.html +6 -1
  141. data/doc/cxxapi/index.html +10 -5
  142. data/doc/cxxapi/inherit__graph__10.map +1 -1
  143. data/doc/cxxapi/inherit__graph__10.md5 +1 -1
  144. data/doc/cxxapi/inherit__graph__10.png +0 -0
  145. data/doc/cxxapi/inherit__graph__11.map +1 -1
  146. data/doc/cxxapi/inherit__graph__11.md5 +1 -1
  147. data/doc/cxxapi/inherit__graph__11.png +0 -0
  148. data/doc/cxxapi/inherit__graph__12.map +1 -1
  149. data/doc/cxxapi/inherit__graph__12.md5 +1 -1
  150. data/doc/cxxapi/inherit__graph__12.png +0 -0
  151. data/doc/cxxapi/inherit__graph__13.map +1 -1
  152. data/doc/cxxapi/inherit__graph__13.md5 +1 -1
  153. data/doc/cxxapi/inherit__graph__13.png +0 -0
  154. data/doc/cxxapi/inherit__graph__14.map +1 -3
  155. data/doc/cxxapi/inherit__graph__14.md5 +1 -1
  156. data/doc/cxxapi/inherit__graph__14.png +0 -0
  157. data/doc/cxxapi/inherit__graph__15.map +1 -1
  158. data/doc/cxxapi/inherit__graph__15.md5 +1 -1
  159. data/doc/cxxapi/inherit__graph__15.png +0 -0
  160. data/doc/cxxapi/inherit__graph__16.map +3 -1
  161. data/doc/cxxapi/inherit__graph__16.md5 +1 -1
  162. data/doc/cxxapi/inherit__graph__16.png +0 -0
  163. data/doc/cxxapi/inherit__graph__17.map +1 -1
  164. data/doc/cxxapi/inherit__graph__17.md5 +1 -1
  165. data/doc/cxxapi/inherit__graph__17.png +0 -0
  166. data/doc/cxxapi/inherit__graph__18.map +1 -2
  167. data/doc/cxxapi/inherit__graph__18.md5 +1 -1
  168. data/doc/cxxapi/inherit__graph__18.png +0 -0
  169. data/doc/cxxapi/inherit__graph__19.map +1 -1
  170. data/doc/cxxapi/inherit__graph__19.md5 +1 -1
  171. data/doc/cxxapi/inherit__graph__19.png +0 -0
  172. data/doc/cxxapi/inherit__graph__20.map +2 -1
  173. data/doc/cxxapi/inherit__graph__20.md5 +1 -1
  174. data/doc/cxxapi/inherit__graph__20.png +0 -0
  175. data/doc/cxxapi/inherit__graph__21.map +1 -1
  176. data/doc/cxxapi/inherit__graph__21.md5 +1 -1
  177. data/doc/cxxapi/inherit__graph__21.png +0 -0
  178. data/doc/cxxapi/inherit__graph__22.map +1 -1
  179. data/doc/cxxapi/inherit__graph__22.md5 +1 -1
  180. data/doc/cxxapi/inherit__graph__22.png +0 -0
  181. data/doc/cxxapi/inherit__graph__23.map +1 -1
  182. data/doc/cxxapi/inherit__graph__23.md5 +1 -1
  183. data/doc/cxxapi/inherit__graph__23.png +0 -0
  184. data/doc/cxxapi/inherit__graph__24.map +1 -1
  185. data/doc/cxxapi/inherit__graph__24.md5 +1 -1
  186. data/doc/cxxapi/inherit__graph__24.png +0 -0
  187. data/doc/cxxapi/inherit__graph__25.map +1 -1
  188. data/doc/cxxapi/inherit__graph__25.md5 +1 -1
  189. data/doc/cxxapi/inherit__graph__25.png +0 -0
  190. data/doc/cxxapi/inherit__graph__26.map +1 -1
  191. data/doc/cxxapi/inherit__graph__26.md5 +1 -1
  192. data/doc/cxxapi/inherit__graph__26.png +0 -0
  193. data/doc/cxxapi/inherit__graph__27.map +1 -2
  194. data/doc/cxxapi/inherit__graph__27.md5 +1 -1
  195. data/doc/cxxapi/inherit__graph__27.png +0 -0
  196. data/doc/cxxapi/inherit__graph__28.map +1 -1
  197. data/doc/cxxapi/inherit__graph__28.md5 +1 -1
  198. data/doc/cxxapi/inherit__graph__28.png +0 -0
  199. data/doc/cxxapi/inherit__graph__29.map +1 -1
  200. data/doc/cxxapi/inherit__graph__29.md5 +1 -1
  201. data/doc/cxxapi/inherit__graph__29.png +0 -0
  202. data/doc/cxxapi/inherit__graph__30.map +2 -1
  203. data/doc/cxxapi/inherit__graph__30.md5 +1 -1
  204. data/doc/cxxapi/inherit__graph__30.png +0 -0
  205. data/doc/cxxapi/inherit__graph__31.map +1 -3
  206. data/doc/cxxapi/inherit__graph__31.md5 +1 -1
  207. data/doc/cxxapi/inherit__graph__31.png +0 -0
  208. data/doc/cxxapi/inherit__graph__32.map +1 -1
  209. data/doc/cxxapi/inherit__graph__32.md5 +1 -1
  210. data/doc/cxxapi/inherit__graph__32.png +0 -0
  211. data/doc/cxxapi/inherit__graph__33.map +1 -1
  212. data/doc/cxxapi/inherit__graph__33.md5 +1 -1
  213. data/doc/cxxapi/inherit__graph__33.png +0 -0
  214. data/doc/cxxapi/inherit__graph__34.map +3 -1
  215. data/doc/cxxapi/inherit__graph__34.md5 +1 -1
  216. data/doc/cxxapi/inherit__graph__34.png +0 -0
  217. data/doc/cxxapi/inherit__graph__35.map +1 -1
  218. data/doc/cxxapi/inherit__graph__35.md5 +1 -1
  219. data/doc/cxxapi/inherit__graph__35.png +0 -0
  220. data/doc/cxxapi/inherit__graph__36.map +1 -1
  221. data/doc/cxxapi/inherit__graph__36.md5 +1 -1
  222. data/doc/cxxapi/inherit__graph__36.png +0 -0
  223. data/doc/cxxapi/inherit__graph__37.map +1 -0
  224. data/doc/cxxapi/inherit__graph__37.md5 +1 -0
  225. data/doc/cxxapi/inherit__graph__37.png +0 -0
  226. data/doc/cxxapi/inherit__graph__38.map +1 -0
  227. data/doc/cxxapi/inherit__graph__38.md5 +1 -0
  228. data/doc/cxxapi/inherit__graph__38.png +0 -0
  229. data/doc/cxxapi/inherit__graph__39.map +1 -0
  230. data/doc/cxxapi/inherit__graph__39.md5 +1 -0
  231. data/doc/cxxapi/inherit__graph__39.png +0 -0
  232. data/doc/cxxapi/inherit__graph__5.map +1 -1
  233. data/doc/cxxapi/inherit__graph__5.md5 +1 -1
  234. data/doc/cxxapi/inherit__graph__5.png +0 -0
  235. data/doc/cxxapi/inherit__graph__6.map +1 -1
  236. data/doc/cxxapi/inherit__graph__6.md5 +1 -1
  237. data/doc/cxxapi/inherit__graph__6.png +0 -0
  238. data/doc/cxxapi/inherit__graph__7.map +1 -1
  239. data/doc/cxxapi/inherit__graph__7.md5 +1 -1
  240. data/doc/cxxapi/inherit__graph__7.png +0 -0
  241. data/doc/cxxapi/inherit__graph__8.map +1 -1
  242. data/doc/cxxapi/inherit__graph__8.md5 +1 -1
  243. data/doc/cxxapi/inherit__graph__8.png +0 -0
  244. data/doc/cxxapi/inherit__graph__9.map +1 -1
  245. data/doc/cxxapi/inherit__graph__9.md5 +1 -1
  246. data/doc/cxxapi/inherit__graph__9.png +0 -0
  247. data/doc/cxxapi/inherits.html +46 -31
  248. data/doc/cxxapi/main.html +12 -11
  249. data/doc/cxxapi/modules.html +16 -13
  250. data/doc/cxxapi/namespacePassenger.html +82 -5
  251. data/doc/cxxapi/namespacemembers.html +5 -3
  252. data/doc/cxxapi/namespacemembers_enum.html +1 -1
  253. data/doc/cxxapi/namespacemembers_eval.html +1 -1
  254. data/doc/cxxapi/namespacemembers_func.html +5 -3
  255. data/doc/cxxapi/namespacemembers_type.html +1 -1
  256. data/doc/cxxapi/namespaces.html +2 -2
  257. data/doc/cxxapi/nginx_2Configuration_8h-source.html +43 -42
  258. data/doc/cxxapi/ngx__http__passenger__module_8h-source.html +1 -1
  259. data/doc/cxxapi/structPassenger_1_1AnythingToString-members.html +1 -1
  260. data/doc/cxxapi/structPassenger_1_1AnythingToString.html +1 -1
  261. data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01StaticString_01_4_01_4-members.html +33 -0
  262. data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01StaticString_01_4_01_4.html +52 -0
  263. data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4-members.html +1 -1
  264. data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4.html +1 -1
  265. data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard-members.html +1 -1
  266. data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard.html +1 -1
  267. data/doc/cxxapi/structPassenger_1_1PoolOptions-members.html +3 -2
  268. data/doc/cxxapi/structPassenger_1_1PoolOptions.html +25 -5
  269. data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash-members.html +1 -1
  270. data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash.html +1 -1
  271. data/doc/cxxapi/tabs.css +1 -1
  272. data/doc/cxxapi/tree.html +20 -17
  273. data/doc/users_guide_snippets/tips.txt +28 -0
  274. data/ext/apache2/Hooks.cpp +19 -2
  275. data/ext/common/Utils.cpp +15 -4
  276. data/ext/common/Version.h +1 -1
  277. data/ext/nginx/StaticContentHandler.c +6 -3
  278. data/ext/phusion_passenger/native_support.c +25 -0
  279. data/lib/phusion_passenger/abstract_request_handler.rb +1 -0
  280. data/lib/phusion_passenger/constants.rb +1 -1
  281. data/lib/phusion_passenger/events.rb +3 -0
  282. data/lib/phusion_passenger/platform_info.rb +2 -1
  283. data/lib/phusion_passenger/rack/application_spawner.rb +2 -0
  284. data/lib/phusion_passenger/railz/application_spawner.rb +8 -0
  285. data/lib/phusion_passenger/utils.rb +69 -9
  286. data/lib/phusion_passenger/utils/rewindable_input.rb +10 -6
  287. metadata +55 -17
@@ -290,7 +290,7 @@
290
290
  <a name="l00268"></a>00268
291
291
  <a name="l00269"></a>00269 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_MESSAGE_CLIENT_H_ */</span>
292
292
  </pre></div></div>
293
- <hr size="1"><address style="text-align: right;"><small>Generated on Sun Feb 21 12:22:45 2010 for Passenger by&nbsp;
293
+ <hr size="1"><address style="text-align: right;"><small>Generated on Sun Mar 28 14:11:56 2010 for Passenger by&nbsp;
294
294
  <a href="http://www.doxygen.org/index.html">
295
295
  <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.8 </small></address>
296
296
  </body>
@@ -0,0 +1,451 @@
1
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2
+ <html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
3
+ <title>Passenger: MessageReadersWriters.h Source File</title>
4
+ <link href="tabs.css" rel="stylesheet" type="text/css">
5
+ <link href="doxygen.css" rel="stylesheet" type="text/css">
6
+ </head><body>
7
+ <!-- Generated by Doxygen 1.5.8 -->
8
+ <div class="navigation" id="top">
9
+ <div class="tabs">
10
+ <ul>
11
+ <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
12
+ <li><a href="modules.html"><span>Modules</span></a></li>
13
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
14
+ <li><a href="annotated.html"><span>Classes</span></a></li>
15
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
16
+ </ul>
17
+ </div>
18
+ <div class="tabs">
19
+ <ul>
20
+ <li><a href="files.html"><span>File&nbsp;List</span></a></li>
21
+ </ul>
22
+ </div>
23
+ <h1>MessageReadersWriters.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
24
+ <a name="l00002"></a>00002 <span class="comment"> * Phusion Passenger - http://www.modrails.com/</span>
25
+ <a name="l00003"></a>00003 <span class="comment"> * Copyright (c) 2010 Phusion</span>
26
+ <a name="l00004"></a>00004 <span class="comment"> *</span>
27
+ <a name="l00005"></a>00005 <span class="comment"> * "Phusion Passenger" is a trademark of Hongli Lai &amp; Ninh Bui.</span>
28
+ <a name="l00006"></a>00006 <span class="comment"> *</span>
29
+ <a name="l00007"></a>00007 <span class="comment"> * Permission is hereby granted, free of charge, to any person obtaining a copy</span>
30
+ <a name="l00008"></a>00008 <span class="comment"> * of this software and associated documentation files (the "Software"), to deal</span>
31
+ <a name="l00009"></a>00009 <span class="comment"> * in the Software without restriction, including without limitation the rights</span>
32
+ <a name="l00010"></a>00010 <span class="comment"> * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell</span>
33
+ <a name="l00011"></a>00011 <span class="comment"> * copies of the Software, and to permit persons to whom the Software is</span>
34
+ <a name="l00012"></a>00012 <span class="comment"> * furnished to do so, subject to the following conditions:</span>
35
+ <a name="l00013"></a>00013 <span class="comment"> *</span>
36
+ <a name="l00014"></a>00014 <span class="comment"> * The above copyright notice and this permission notice shall be included in</span>
37
+ <a name="l00015"></a>00015 <span class="comment"> * all copies or substantial portions of the Software.</span>
38
+ <a name="l00016"></a>00016 <span class="comment"> *</span>
39
+ <a name="l00017"></a>00017 <span class="comment"> * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span>
40
+ <a name="l00018"></a>00018 <span class="comment"> * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span>
41
+ <a name="l00019"></a>00019 <span class="comment"> * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE</span>
42
+ <a name="l00020"></a>00020 <span class="comment"> * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span>
43
+ <a name="l00021"></a>00021 <span class="comment"> * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</span>
44
+ <a name="l00022"></a>00022 <span class="comment"> * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN</span>
45
+ <a name="l00023"></a>00023 <span class="comment"> * THE SOFTWARE.</span>
46
+ <a name="l00024"></a>00024 <span class="comment"> */</span>
47
+ <a name="l00025"></a>00025 <span class="preprocessor">#ifndef _PASSENGER_MESSAGE_READERS_WRITERS_H_</span>
48
+ <a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#define _PASSENGER_MESSAGE_READERS_WRITERS_H_</span>
49
+ <a name="l00027"></a>00027 <span class="preprocessor"></span>
50
+ <a name="l00028"></a>00028 <span class="preprocessor">#include &lt;boost/cstdint.hpp&gt;</span>
51
+ <a name="l00029"></a>00029 <span class="preprocessor">#include &lt;algorithm&gt;</span>
52
+ <a name="l00030"></a>00030 <span class="preprocessor">#include &lt;vector&gt;</span>
53
+ <a name="l00031"></a>00031 <span class="preprocessor">#include &lt;string&gt;</span>
54
+ <a name="l00032"></a>00032 <span class="preprocessor">#include &lt;sys/types.h&gt;</span>
55
+ <a name="l00033"></a>00033 <span class="preprocessor">#include &lt;cstring&gt;</span>
56
+ <a name="l00034"></a>00034 <span class="preprocessor">#include &lt;arpa/inet.h&gt;</span>
57
+ <a name="l00035"></a>00035 <span class="preprocessor">#include "StaticString.h"</span>
58
+ <a name="l00036"></a>00036 <span class="comment"></span>
59
+ <a name="l00037"></a>00037 <span class="comment">/**</span>
60
+ <a name="l00038"></a>00038 <span class="comment"> * This file provides a bunch of classes for reading and writing messages in the</span>
61
+ <a name="l00039"></a>00039 <span class="comment"> * MessageChannel format. Unlike MessageChannel, whose operations take control over</span>
62
+ <a name="l00040"></a>00040 <span class="comment"> * the I/O handle and may block, these classes are like parsers and data generators.</span>
63
+ <a name="l00041"></a>00041 <span class="comment"> * Reader classes require the user to feed data to them. Writer classes generate a</span>
64
+ <a name="l00042"></a>00042 <span class="comment"> * bunch of bytes that the user can send out. These classes will never block, making</span>
65
+ <a name="l00043"></a>00043 <span class="comment"> * them ideal for use in evented servers.</span>
66
+ <a name="l00044"></a>00044 <span class="comment"> *</span>
67
+ <a name="l00045"></a>00045 <span class="comment"> * &lt;h2&gt;Reading messages&lt;/h2&gt;</span>
68
+ <a name="l00046"></a>00046 <span class="comment"> * To read a single message, one must instantiate a reader object and feed network</span>
69
+ <a name="l00047"></a>00047 <span class="comment"> * data to it with the feed() method. This method returns the number of bytes</span>
70
+ <a name="l00048"></a>00048 <span class="comment"> * actually processed by the reader (i.e. the number of bytes that it has recognized</span>
71
+ <a name="l00049"></a>00049 <span class="comment"> * as part of the message).</span>
72
+ <a name="l00050"></a>00050 <span class="comment"> *</span>
73
+ <a name="l00051"></a>00051 <span class="comment"> * When the reader has either successfully parsed the data or encountered an error,</span>
74
+ <a name="l00052"></a>00052 <span class="comment"> * it will indicate so via the done() method. With hasError() one can check whether</span>
75
+ <a name="l00053"></a>00053 <span class="comment"> * an error was encountered or whether the reader succeeded, and with errorCode()</span>
76
+ <a name="l00054"></a>00054 <span class="comment"> * one can obtain the exact error reason. Not all readers support hasError() and</span>
77
+ <a name="l00055"></a>00055 <span class="comment"> * errorCode() because some readers can never encounter errors and some readers</span>
78
+ <a name="l00056"></a>00056 <span class="comment"> * only have a single reason to fail.</span>
79
+ <a name="l00057"></a>00057 <span class="comment"> *</span>
80
+ <a name="l00058"></a>00058 <span class="comment"> * When successful, the parsed message can be obtained with value(). This method</span>
81
+ <a name="l00059"></a>00059 <span class="comment"> * may only be called when done() is true and there is no error, otherwise the</span>
82
+ <a name="l00060"></a>00060 <span class="comment"> * return value is undefined.</span>
83
+ <a name="l00061"></a>00061 <span class="comment"> *</span>
84
+ <a name="l00062"></a>00062 <span class="comment"> * At this point, the reader object cannot process any more data and feed() will</span>
85
+ <a name="l00063"></a>00063 <span class="comment"> * always return 0. To reuse the object for processing another message, one must</span>
86
+ <a name="l00064"></a>00064 <span class="comment"> * reset its state by calling reset().</span>
87
+ <a name="l00065"></a>00065 <span class="comment"> *</span>
88
+ <a name="l00066"></a>00066 <span class="comment"> * The following example demonstrates how to read a continuous stream of 32-bit</span>
89
+ <a name="l00067"></a>00067 <span class="comment"> * integers:</span>
90
+ <a name="l00068"></a>00068 <span class="comment"> * @code</span>
91
+ <a name="l00069"></a>00069 <span class="comment"> Uint32Reader intReader;</span>
92
+ <a name="l00070"></a>00070 <span class="comment"> while (true) {</span>
93
+ <a name="l00071"></a>00071 <span class="comment"> // Read a bunch of network data...</span>
94
+ <a name="l00072"></a>00072 <span class="comment"> char buf[1024];</span>
95
+ <a name="l00073"></a>00073 <span class="comment"> ssize_t size = recv(fd, buf, sizeof(buf));</span>
96
+ <a name="l00074"></a>00074 <span class="comment"> size_t consumed = 0;</span>
97
+ <a name="l00075"></a>00075 <span class="comment"> </span>
98
+ <a name="l00076"></a>00076 <span class="comment"> // ...and process it all. We only feed data to the reader that</span>
99
+ <a name="l00077"></a>00077 <span class="comment"> // hasn't already been fed.</span>
100
+ <a name="l00078"></a>00078 <span class="comment"> while (consumed &lt; size) {</span>
101
+ <a name="l00079"></a>00079 <span class="comment"> consumed += intReader.feed(buf + consumed, size - consumed);</span>
102
+ <a name="l00080"></a>00080 <span class="comment"> if (intReader.done()) {</span>
103
+ <a name="l00081"></a>00081 <span class="comment"> printf("Integer: %d\n", (int) intReader.value());</span>
104
+ <a name="l00082"></a>00082 <span class="comment"> // The state must be reset before the reader can be reused.</span>
105
+ <a name="l00083"></a>00083 <span class="comment"> intReader.reset();</span>
106
+ <a name="l00084"></a>00084 <span class="comment"> }</span>
107
+ <a name="l00085"></a>00085 <span class="comment"> }</span>
108
+ <a name="l00086"></a>00086 <span class="comment"> }</span>
109
+ <a name="l00087"></a>00087 <span class="comment"> * @endcode</span>
110
+ <a name="l00088"></a>00088 <span class="comment"> *</span>
111
+ <a name="l00089"></a>00089 <span class="comment"> * Some readers return non-primitive values in their value() methods, such as</span>
112
+ <a name="l00090"></a>00090 <span class="comment"> * ArrayReader and ScalarReader which return &lt;tt&gt;const vector&lt;StaticString&gt; &amp;&lt;/tt&gt;</span>
113
+ <a name="l00091"></a>00091 <span class="comment"> * and &lt;tt&gt;StaticString&lt;/tt&gt;, respectively. These values are only valid until either</span>
114
+ <a name="l00092"></a>00092 <span class="comment"> * of the following things occur:</span>
115
+ <a name="l00093"></a>00093 <span class="comment"> *</span>
116
+ <a name="l00094"></a>00094 <span class="comment"> * - The buffer containing last the fed data has been destroyed or modified.</span>
117
+ <a name="l00095"></a>00095 <span class="comment"> * - The reader itself has been destroyed.</span>
118
+ <a name="l00096"></a>00096 <span class="comment"> *</span>
119
+ <a name="l00097"></a>00097 <span class="comment"> * This is because the readers try to apply copy-zero optimizations whenever</span>
120
+ <a name="l00098"></a>00098 <span class="comment"> * possible. For example, in case of ScalarReader, it'll check whether the data</span>
121
+ <a name="l00099"></a>00099 <span class="comment"> * that has been fed in the first feed() call already contains a full scalar message.</span>
122
+ <a name="l00100"></a>00100 <span class="comment"> * If so then it'll just return a StaticString that points to the scalar message</span>
123
+ <a name="l00101"></a>00101 <span class="comment"> * in the fed data; it will not copy the fed data. In this case it is important</span>
124
+ <a name="l00102"></a>00102 <span class="comment"> * that the buffer containing the fed data is not modified or destroyed while the</span>
125
+ <a name="l00103"></a>00103 <span class="comment"> * StaticString is in use.</span>
126
+ <a name="l00104"></a>00104 <span class="comment"> * If the first feed() call does not supply a full scalar message then it will</span>
127
+ <a name="l00105"></a>00105 <span class="comment"> * buffer all fed data until the buffer contains a full scalar message, and the</span>
128
+ <a name="l00106"></a>00106 <span class="comment"> * result will point to this buffer. Because the buffer is owned by the reader,</span>
129
+ <a name="l00107"></a>00107 <span class="comment"> * the result will be invalidated as soon as the reader is destroyed.</span>
130
+ <a name="l00108"></a>00108 <span class="comment"> */</span>
131
+ <a name="l00109"></a>00109
132
+ <a name="l00110"></a>00110 <span class="keyword">namespace </span>Passenger {
133
+ <a name="l00111"></a>00111
134
+ <a name="l00112"></a>00112 <span class="keyword">using namespace </span>std;
135
+ <a name="l00113"></a>00113 <span class="comment"></span>
136
+ <a name="l00114"></a>00114 <span class="comment">/**</span>
137
+ <a name="l00115"></a>00115 <span class="comment"> * Class for reading a 16-bit big-endian integer.</span>
138
+ <a name="l00116"></a>00116 <span class="comment"> */</span>
139
+ <a name="l00117"></a><a class="code" href="classPassenger_1_1Uint16Reader.html">00117</a> <span class="keyword">class </span><a class="code" href="classPassenger_1_1Uint16Reader.html" title="Class for reading a 16-bit big-endian integer.">Uint16Reader</a> {
140
+ <a name="l00118"></a>00118 <span class="keyword">private</span>:
141
+ <a name="l00119"></a>00119 uint16_t val;
142
+ <a name="l00120"></a>00120 uint8_t consumed;
143
+ <a name="l00121"></a>00121
144
+ <a name="l00122"></a>00122 <span class="keyword">public</span>:
145
+ <a name="l00123"></a>00123 <a class="code" href="classPassenger_1_1Uint16Reader.html" title="Class for reading a 16-bit big-endian integer.">Uint16Reader</a>() {
146
+ <a name="l00124"></a>00124 consumed = 0;
147
+ <a name="l00125"></a>00125 }
148
+ <a name="l00126"></a>00126
149
+ <a name="l00127"></a>00127 <span class="keywordtype">void</span> reset() {
150
+ <a name="l00128"></a>00128 consumed = 0;
151
+ <a name="l00129"></a>00129 }
152
+ <a name="l00130"></a>00130
153
+ <a name="l00131"></a>00131 <span class="keywordtype">size_t</span> feed(<span class="keyword">const</span> <span class="keywordtype">char</span> *data, <span class="keywordtype">size_t</span> size) {
154
+ <a name="l00132"></a>00132 <span class="keywordtype">size_t</span> locallyConsumed;
155
+ <a name="l00133"></a>00133
156
+ <a name="l00134"></a>00134 locallyConsumed = std::min(size, <span class="keyword">sizeof</span>(uint16_t) - consumed);
157
+ <a name="l00135"></a>00135 memcpy(&amp;val + consumed, data, locallyConsumed);
158
+ <a name="l00136"></a>00136 consumed += locallyConsumed;
159
+ <a name="l00137"></a>00137 <span class="keywordflow">if</span> (done()) {
160
+ <a name="l00138"></a>00138 val = ntohs(val);
161
+ <a name="l00139"></a>00139 }
162
+ <a name="l00140"></a>00140 <span class="keywordflow">return</span> locallyConsumed;
163
+ <a name="l00141"></a>00141 }
164
+ <a name="l00142"></a>00142
165
+ <a name="l00143"></a>00143 <span class="keywordtype">bool</span> done()<span class="keyword"> const </span>{
166
+ <a name="l00144"></a>00144 <span class="keywordflow">return</span> consumed == <span class="keyword">sizeof</span>(uint16_t);
167
+ <a name="l00145"></a>00145 }
168
+ <a name="l00146"></a>00146
169
+ <a name="l00147"></a>00147 uint16_t value()<span class="keyword"> const </span>{
170
+ <a name="l00148"></a>00148 <span class="keywordflow">return</span> val;
171
+ <a name="l00149"></a>00149 }
172
+ <a name="l00150"></a>00150
173
+ <a name="l00151"></a>00151 <span class="keywordtype">void</span> generate(<span class="keywordtype">void</span> *buf, uint16_t val)<span class="keyword"> const </span>{
174
+ <a name="l00152"></a>00152 val = htons(val);
175
+ <a name="l00153"></a>00153 memcpy(buf, &amp;val, <span class="keyword">sizeof</span>(val));
176
+ <a name="l00154"></a>00154 }
177
+ <a name="l00155"></a>00155 };
178
+ <a name="l00156"></a>00156 <span class="comment"></span>
179
+ <a name="l00157"></a>00157 <span class="comment">/**</span>
180
+ <a name="l00158"></a>00158 <span class="comment"> * Class for reading a 32-bit big-endian integer.</span>
181
+ <a name="l00159"></a>00159 <span class="comment"> */</span>
182
+ <a name="l00160"></a><a class="code" href="classPassenger_1_1Uint32Reader.html">00160</a> <span class="keyword">class </span><a class="code" href="classPassenger_1_1Uint32Reader.html" title="Class for reading a 32-bit big-endian integer.">Uint32Reader</a> {
183
+ <a name="l00161"></a>00161 <span class="keyword">private</span>:
184
+ <a name="l00162"></a>00162 uint32_t val;
185
+ <a name="l00163"></a>00163 uint8_t consumed;
186
+ <a name="l00164"></a>00164
187
+ <a name="l00165"></a>00165 <span class="keyword">public</span>:
188
+ <a name="l00166"></a>00166 <a class="code" href="classPassenger_1_1Uint32Reader.html" title="Class for reading a 32-bit big-endian integer.">Uint32Reader</a>() {
189
+ <a name="l00167"></a>00167 consumed = 0;
190
+ <a name="l00168"></a>00168 }
191
+ <a name="l00169"></a>00169
192
+ <a name="l00170"></a>00170 <span class="keywordtype">void</span> reset() {
193
+ <a name="l00171"></a>00171 consumed = 0;
194
+ <a name="l00172"></a>00172 }
195
+ <a name="l00173"></a>00173
196
+ <a name="l00174"></a>00174 <span class="keywordtype">size_t</span> feed(<span class="keyword">const</span> <span class="keywordtype">char</span> *data, <span class="keywordtype">size_t</span> size) {
197
+ <a name="l00175"></a>00175 <span class="keywordtype">size_t</span> locallyConsumed;
198
+ <a name="l00176"></a>00176
199
+ <a name="l00177"></a>00177 locallyConsumed = std::min(size, <span class="keyword">sizeof</span>(uint32_t) - consumed);
200
+ <a name="l00178"></a>00178 memcpy(&amp;val + consumed, data, locallyConsumed);
201
+ <a name="l00179"></a>00179 consumed += locallyConsumed;
202
+ <a name="l00180"></a>00180 <span class="keywordflow">if</span> (done()) {
203
+ <a name="l00181"></a>00181 val = ntohl(val);
204
+ <a name="l00182"></a>00182 }
205
+ <a name="l00183"></a>00183 <span class="keywordflow">return</span> locallyConsumed;
206
+ <a name="l00184"></a>00184 }
207
+ <a name="l00185"></a>00185
208
+ <a name="l00186"></a>00186 <span class="keywordtype">bool</span> done()<span class="keyword"> const </span>{
209
+ <a name="l00187"></a>00187 <span class="keywordflow">return</span> consumed == <span class="keyword">sizeof</span>(uint32_t);
210
+ <a name="l00188"></a>00188 }
211
+ <a name="l00189"></a>00189
212
+ <a name="l00190"></a>00190 uint32_t value()<span class="keyword"> const </span>{
213
+ <a name="l00191"></a>00191 <span class="keywordflow">return</span> val;
214
+ <a name="l00192"></a>00192 }
215
+ <a name="l00193"></a>00193 };
216
+ <a name="l00194"></a>00194 <span class="comment"></span>
217
+ <a name="l00195"></a>00195 <span class="comment">/**</span>
218
+ <a name="l00196"></a>00196 <span class="comment"> * Class for reading a an array message.</span>
219
+ <a name="l00197"></a>00197 <span class="comment"> */</span>
220
+ <a name="l00198"></a><a class="code" href="classPassenger_1_1ArrayReader.html">00198</a> <span class="keyword">class </span><a class="code" href="classPassenger_1_1ArrayReader.html" title="Class for reading a an array message.">ArrayReader</a> {
221
+ <a name="l00199"></a>00199 <span class="keyword">public</span>:
222
+ <a name="l00200"></a>00200 <span class="keyword">enum</span> Error {
223
+ <a name="l00201"></a>00201 TOO_LARGE
224
+ <a name="l00202"></a>00202 };
225
+ <a name="l00203"></a>00203
226
+ <a name="l00204"></a>00204 <span class="keyword">private</span>:
227
+ <a name="l00205"></a>00205 <span class="keyword">enum</span> State {
228
+ <a name="l00206"></a>00206 READING_HEADER,
229
+ <a name="l00207"></a>00207 READING_BODY,
230
+ <a name="l00208"></a>00208 DONE,
231
+ <a name="l00209"></a>00209 ERROR
232
+ <a name="l00210"></a>00210 };
233
+ <a name="l00211"></a>00211
234
+ <a name="l00212"></a>00212 uint16_t toReserve;
235
+ <a name="l00213"></a>00213 uint16_t maxSize;
236
+ <a name="l00214"></a>00214 <a class="code" href="classPassenger_1_1Uint16Reader.html" title="Class for reading a 16-bit big-endian integer.">Uint16Reader</a> headerReader;
237
+ <a name="l00215"></a>00215 uint8_t state;
238
+ <a name="l00216"></a>00216 uint8_t error;
239
+ <a name="l00217"></a>00217 <span class="keywordtype">string</span> buffer;
240
+ <a name="l00218"></a>00218 vector&lt;StaticString&gt; result;
241
+ <a name="l00219"></a>00219
242
+ <a name="l00220"></a>00220 <span class="keywordtype">void</span> parseBody(<span class="keyword">const</span> <span class="keywordtype">char</span> *data, <span class="keywordtype">size_t</span> size) {
243
+ <a name="l00221"></a>00221 <span class="keyword">const</span> <span class="keywordtype">char</span> *start = data;
244
+ <a name="l00222"></a>00222 <span class="keyword">const</span> <span class="keywordtype">char</span> *terminator;
245
+ <a name="l00223"></a>00223 <span class="keywordtype">size_t</span> rest = size;
246
+ <a name="l00224"></a>00224
247
+ <a name="l00225"></a>00225 <span class="keywordflow">while</span> ((terminator = (<span class="keyword">const</span> <span class="keywordtype">char</span> *) memchr(start, <span class="charliteral">'\0'</span>, rest)) != NULL) {
248
+ <a name="l00226"></a>00226 <span class="keywordtype">size_t</span> len = terminator - start;
249
+ <a name="l00227"></a>00227 result.push_back(<a class="code" href="classPassenger_1_1StaticString.html" title="An immutable, static byte buffer.">StaticString</a>(start, len));
250
+ <a name="l00228"></a>00228 start = terminator + 1;
251
+ <a name="l00229"></a>00229 rest = size - (start - data);
252
+ <a name="l00230"></a>00230 }
253
+ <a name="l00231"></a>00231 }
254
+ <a name="l00232"></a>00232
255
+ <a name="l00233"></a>00233 <span class="keyword">public</span>:
256
+ <a name="l00234"></a>00234 <a class="code" href="classPassenger_1_1ArrayReader.html" title="Class for reading a an array message.">ArrayReader</a>() {
257
+ <a name="l00235"></a>00235 state = READING_HEADER;
258
+ <a name="l00236"></a>00236 toReserve = 0;
259
+ <a name="l00237"></a>00237 maxSize = 0;
260
+ <a name="l00238"></a>00238 }
261
+ <a name="l00239"></a>00239
262
+ <a name="l00240"></a>00240 <span class="keywordtype">void</span> reserve(uint16_t size) {
263
+ <a name="l00241"></a>00241 toReserve = size;
264
+ <a name="l00242"></a>00242 result.reserve(size);
265
+ <a name="l00243"></a>00243 }
266
+ <a name="l00244"></a>00244
267
+ <a name="l00245"></a>00245 <span class="keywordtype">void</span> setMaxSize(uint16_t size) {
268
+ <a name="l00246"></a>00246 maxSize = size;
269
+ <a name="l00247"></a>00247 }
270
+ <a name="l00248"></a>00248
271
+ <a name="l00249"></a>00249 <span class="keywordtype">void</span> reset() {
272
+ <a name="l00250"></a>00250 state = READING_HEADER;
273
+ <a name="l00251"></a>00251 headerReader.<a class="code" href="classPassenger_1_1Uint16Reader.html#aecb35ecdfce03ea97340809bf284393">reset</a>();
274
+ <a name="l00252"></a>00252 buffer.clear();
275
+ <a name="l00253"></a>00253 result.clear();
276
+ <a name="l00254"></a>00254 <span class="keywordflow">if</span> (toReserve &gt; 0) {
277
+ <a name="l00255"></a>00255 result.reserve(toReserve);
278
+ <a name="l00256"></a>00256 }
279
+ <a name="l00257"></a>00257 }
280
+ <a name="l00258"></a>00258
281
+ <a name="l00259"></a>00259 <span class="keywordtype">size_t</span> feed(<span class="keyword">const</span> <span class="keywordtype">char</span> *data, <span class="keywordtype">size_t</span> size) {
282
+ <a name="l00260"></a>00260 <span class="keywordtype">size_t</span> consumed = 0;
283
+ <a name="l00261"></a>00261
284
+ <a name="l00262"></a>00262 <span class="keywordflow">while</span> (consumed &lt; size &amp;&amp; !done()) {
285
+ <a name="l00263"></a>00263 <span class="keyword">const</span> <span class="keywordtype">char</span> *current = data + consumed;
286
+ <a name="l00264"></a>00264 <span class="keywordtype">size_t</span> rest = size - consumed;
287
+ <a name="l00265"></a>00265
288
+ <a name="l00266"></a>00266 <span class="keywordflow">switch</span> (state) {
289
+ <a name="l00267"></a>00267 <span class="keywordflow">case</span> READING_HEADER:
290
+ <a name="l00268"></a>00268 consumed += headerReader.<a class="code" href="classPassenger_1_1Uint16Reader.html#438586de9a05b56f6e75fa09d690ede3">feed</a>(current, rest);
291
+ <a name="l00269"></a>00269 <span class="keywordflow">if</span> (headerReader.<a class="code" href="classPassenger_1_1Uint16Reader.html#9807b9b7799f5c8e3fe76f8813ed5b66">done</a>()) {
292
+ <a name="l00270"></a>00270 <span class="keywordflow">if</span> (maxSize &gt; 0 &amp;&amp; headerReader.<a class="code" href="classPassenger_1_1Uint16Reader.html#a3ccc4eefabd1666cd279f316d932283">value</a>() &gt; maxSize) {
293
+ <a name="l00271"></a>00271 state = ERROR;
294
+ <a name="l00272"></a>00272 error = TOO_LARGE;
295
+ <a name="l00273"></a>00273 } <span class="keywordflow">else</span> {
296
+ <a name="l00274"></a>00274 state = READING_BODY;
297
+ <a name="l00275"></a>00275 }
298
+ <a name="l00276"></a>00276 }
299
+ <a name="l00277"></a>00277 <span class="keywordflow">break</span>;
300
+ <a name="l00278"></a>00278 <span class="keywordflow">case</span> READING_BODY:
301
+ <a name="l00279"></a>00279 <span class="keywordflow">if</span> (buffer.empty() &amp;&amp; rest &gt;= headerReader.<a class="code" href="classPassenger_1_1Uint16Reader.html#a3ccc4eefabd1666cd279f316d932283">value</a>()) {
302
+ <a name="l00280"></a>00280 parseBody(current, headerReader.<a class="code" href="classPassenger_1_1Uint16Reader.html#a3ccc4eefabd1666cd279f316d932283">value</a>());
303
+ <a name="l00281"></a>00281 state = DONE;
304
+ <a name="l00282"></a>00282 consumed += headerReader.<a class="code" href="classPassenger_1_1Uint16Reader.html#a3ccc4eefabd1666cd279f316d932283">value</a>();
305
+ <a name="l00283"></a>00283 } <span class="keywordflow">else</span> {
306
+ <a name="l00284"></a>00284 <span class="keywordtype">size_t</span> toConsume = std::min(rest,
307
+ <a name="l00285"></a>00285 headerReader.<a class="code" href="classPassenger_1_1Uint16Reader.html#a3ccc4eefabd1666cd279f316d932283">value</a>() - buffer.size());
308
+ <a name="l00286"></a>00286 <span class="keywordflow">if</span> (buffer.capacity() &lt; headerReader.<a class="code" href="classPassenger_1_1Uint16Reader.html#a3ccc4eefabd1666cd279f316d932283">value</a>()) {
309
+ <a name="l00287"></a>00287 buffer.reserve(headerReader.<a class="code" href="classPassenger_1_1Uint16Reader.html#a3ccc4eefabd1666cd279f316d932283">value</a>());
310
+ <a name="l00288"></a>00288 }
311
+ <a name="l00289"></a>00289 buffer.append(current, toConsume);
312
+ <a name="l00290"></a>00290 consumed += toConsume;
313
+ <a name="l00291"></a>00291 <span class="keywordflow">if</span> (buffer.size() == headerReader.<a class="code" href="classPassenger_1_1Uint16Reader.html#a3ccc4eefabd1666cd279f316d932283">value</a>()) {
314
+ <a name="l00292"></a>00292 parseBody(buffer.data(), buffer.size());
315
+ <a name="l00293"></a>00293 state = DONE;
316
+ <a name="l00294"></a>00294 }
317
+ <a name="l00295"></a>00295 }
318
+ <a name="l00296"></a>00296 <span class="keywordflow">break</span>;
319
+ <a name="l00297"></a>00297 <span class="keywordflow">default</span>:
320
+ <a name="l00298"></a>00298 <span class="comment">// Never reached.</span>
321
+ <a name="l00299"></a>00299 abort();
322
+ <a name="l00300"></a>00300 }
323
+ <a name="l00301"></a>00301 }
324
+ <a name="l00302"></a>00302 <span class="keywordflow">return</span> consumed;
325
+ <a name="l00303"></a>00303 }
326
+ <a name="l00304"></a>00304
327
+ <a name="l00305"></a>00305 <span class="keywordtype">bool</span> done()<span class="keyword"> const </span>{
328
+ <a name="l00306"></a>00306 <span class="keywordflow">return</span> state == DONE || state == ERROR;
329
+ <a name="l00307"></a>00307 }
330
+ <a name="l00308"></a>00308
331
+ <a name="l00309"></a>00309 <span class="keywordtype">bool</span> hasError()<span class="keyword"> const </span>{
332
+ <a name="l00310"></a>00310 <span class="keywordflow">return</span> state == ERROR;
333
+ <a name="l00311"></a>00311 }
334
+ <a name="l00312"></a>00312
335
+ <a name="l00313"></a>00313 Error errorCode()<span class="keyword"> const </span>{
336
+ <a name="l00314"></a>00314 <span class="keywordflow">return</span> (Error) error;
337
+ <a name="l00315"></a>00315 }
338
+ <a name="l00316"></a>00316
339
+ <a name="l00317"></a>00317 <span class="keyword">const</span> vector&lt;StaticString&gt; &amp;value()<span class="keyword"> const </span>{
340
+ <a name="l00318"></a>00318 <span class="keywordflow">return</span> result;
341
+ <a name="l00319"></a>00319 }
342
+ <a name="l00320"></a>00320 };
343
+ <a name="l00321"></a>00321 <span class="comment"></span>
344
+ <a name="l00322"></a>00322 <span class="comment">/**</span>
345
+ <a name="l00323"></a>00323 <span class="comment"> * Class for reading a scalar message.</span>
346
+ <a name="l00324"></a>00324 <span class="comment"> */</span>
347
+ <a name="l00325"></a><a class="code" href="classPassenger_1_1ScalarReader.html">00325</a> <span class="keyword">class </span><a class="code" href="classPassenger_1_1ScalarReader.html" title="Class for reading a scalar message.">ScalarReader</a> {
348
+ <a name="l00326"></a>00326 <span class="keyword">public</span>:
349
+ <a name="l00327"></a>00327 <span class="keyword">enum</span> Error {
350
+ <a name="l00328"></a>00328 TOO_LARGE
351
+ <a name="l00329"></a>00329 };
352
+ <a name="l00330"></a>00330
353
+ <a name="l00331"></a>00331 <span class="keyword">private</span>:
354
+ <a name="l00332"></a>00332 <span class="keyword">enum</span> State {
355
+ <a name="l00333"></a>00333 READING_HEADER,
356
+ <a name="l00334"></a>00334 READING_BODY,
357
+ <a name="l00335"></a>00335 DONE,
358
+ <a name="l00336"></a>00336 ERROR
359
+ <a name="l00337"></a>00337 };
360
+ <a name="l00338"></a>00338
361
+ <a name="l00339"></a>00339 uint8_t state;
362
+ <a name="l00340"></a>00340 uint8_t error;
363
+ <a name="l00341"></a>00341 uint32_t maxSize;
364
+ <a name="l00342"></a>00342 <a class="code" href="classPassenger_1_1Uint32Reader.html" title="Class for reading a 32-bit big-endian integer.">Uint32Reader</a> headerReader;
365
+ <a name="l00343"></a>00343 <span class="keywordtype">string</span> buffer;
366
+ <a name="l00344"></a>00344 <a class="code" href="classPassenger_1_1StaticString.html" title="An immutable, static byte buffer.">StaticString</a> result;
367
+ <a name="l00345"></a>00345
368
+ <a name="l00346"></a>00346 <span class="keyword">public</span>:
369
+ <a name="l00347"></a>00347 <a class="code" href="classPassenger_1_1ScalarReader.html" title="Class for reading a scalar message.">ScalarReader</a>(uint32_t maxSize = 0) {
370
+ <a name="l00348"></a>00348 state = READING_HEADER;
371
+ <a name="l00349"></a>00349 this-&gt;maxSize = maxSize;
372
+ <a name="l00350"></a>00350 }
373
+ <a name="l00351"></a>00351
374
+ <a name="l00352"></a>00352 <span class="keywordtype">void</span> reset() {
375
+ <a name="l00353"></a>00353 state = READING_HEADER;
376
+ <a name="l00354"></a>00354 headerReader.<a class="code" href="classPassenger_1_1Uint32Reader.html#7823202c3b514da0200d6fa866819b74">reset</a>();
377
+ <a name="l00355"></a>00355 buffer.clear();
378
+ <a name="l00356"></a>00356 }
379
+ <a name="l00357"></a>00357
380
+ <a name="l00358"></a>00358 <span class="keywordtype">size_t</span> feed(<span class="keyword">const</span> <span class="keywordtype">char</span> *data, <span class="keywordtype">size_t</span> size) {
381
+ <a name="l00359"></a>00359 <span class="keywordtype">size_t</span> consumed = 0;
382
+ <a name="l00360"></a>00360
383
+ <a name="l00361"></a>00361 <span class="keywordflow">while</span> (consumed &lt; size &amp;&amp; !done()) {
384
+ <a name="l00362"></a>00362 <span class="keyword">const</span> <span class="keywordtype">char</span> *current = data + consumed;
385
+ <a name="l00363"></a>00363 <span class="keywordtype">size_t</span> rest = size - consumed;
386
+ <a name="l00364"></a>00364
387
+ <a name="l00365"></a>00365 <span class="keywordflow">switch</span> (state) {
388
+ <a name="l00366"></a>00366 <span class="keywordflow">case</span> READING_HEADER:
389
+ <a name="l00367"></a>00367 consumed += headerReader.<a class="code" href="classPassenger_1_1Uint32Reader.html#92f66847a0b669b9801bac82d5955206">feed</a>(current, rest);
390
+ <a name="l00368"></a>00368 <span class="keywordflow">if</span> (headerReader.<a class="code" href="classPassenger_1_1Uint32Reader.html#75b694f6ed347941a3a044bfaf166103">done</a>()) {
391
+ <a name="l00369"></a>00369 <span class="keywordflow">if</span> (maxSize &gt; 0 &amp;&amp; headerReader.<a class="code" href="classPassenger_1_1Uint32Reader.html#11d408aa1607d33702250795d0b9c1ae">value</a>() &gt; maxSize) {
392
+ <a name="l00370"></a>00370 state = ERROR;
393
+ <a name="l00371"></a>00371 error = TOO_LARGE;
394
+ <a name="l00372"></a>00372 } <span class="keywordflow">else</span> {
395
+ <a name="l00373"></a>00373 state = READING_BODY;
396
+ <a name="l00374"></a>00374 }
397
+ <a name="l00375"></a>00375 }
398
+ <a name="l00376"></a>00376 <span class="keywordflow">break</span>;
399
+ <a name="l00377"></a>00377 <span class="keywordflow">case</span> READING_BODY:
400
+ <a name="l00378"></a>00378 <span class="keywordflow">if</span> (buffer.empty() &amp;&amp; rest &gt;= headerReader.<a class="code" href="classPassenger_1_1Uint32Reader.html#11d408aa1607d33702250795d0b9c1ae">value</a>()) {
401
+ <a name="l00379"></a>00379 result = <a class="code" href="classPassenger_1_1StaticString.html" title="An immutable, static byte buffer.">StaticString</a>(current, headerReader.<a class="code" href="classPassenger_1_1Uint32Reader.html#11d408aa1607d33702250795d0b9c1ae">value</a>());
402
+ <a name="l00380"></a>00380 state = DONE;
403
+ <a name="l00381"></a>00381 consumed += headerReader.<a class="code" href="classPassenger_1_1Uint32Reader.html#11d408aa1607d33702250795d0b9c1ae">value</a>();
404
+ <a name="l00382"></a>00382 } <span class="keywordflow">else</span> {
405
+ <a name="l00383"></a>00383 <span class="keywordtype">size_t</span> toConsume = std::min(rest,
406
+ <a name="l00384"></a>00384 headerReader.<a class="code" href="classPassenger_1_1Uint32Reader.html#11d408aa1607d33702250795d0b9c1ae">value</a>() - buffer.size());
407
+ <a name="l00385"></a>00385 <span class="keywordflow">if</span> (buffer.capacity() &lt; headerReader.<a class="code" href="classPassenger_1_1Uint32Reader.html#11d408aa1607d33702250795d0b9c1ae">value</a>()) {
408
+ <a name="l00386"></a>00386 buffer.reserve(headerReader.<a class="code" href="classPassenger_1_1Uint32Reader.html#11d408aa1607d33702250795d0b9c1ae">value</a>());
409
+ <a name="l00387"></a>00387 }
410
+ <a name="l00388"></a>00388 buffer.append(current, toConsume);
411
+ <a name="l00389"></a>00389 consumed += toConsume;
412
+ <a name="l00390"></a>00390 <span class="keywordflow">if</span> (buffer.size() == headerReader.<a class="code" href="classPassenger_1_1Uint32Reader.html#11d408aa1607d33702250795d0b9c1ae">value</a>()) {
413
+ <a name="l00391"></a>00391 result = <a class="code" href="classPassenger_1_1StaticString.html" title="An immutable, static byte buffer.">StaticString</a>(buffer);
414
+ <a name="l00392"></a>00392 state = DONE;
415
+ <a name="l00393"></a>00393 }
416
+ <a name="l00394"></a>00394 }
417
+ <a name="l00395"></a>00395 <span class="keywordflow">break</span>;
418
+ <a name="l00396"></a>00396 <span class="keywordflow">default</span>:
419
+ <a name="l00397"></a>00397 <span class="comment">// Never reached.</span>
420
+ <a name="l00398"></a>00398 abort();
421
+ <a name="l00399"></a>00399 };
422
+ <a name="l00400"></a>00400 }
423
+ <a name="l00401"></a>00401 <span class="keywordflow">return</span> consumed;
424
+ <a name="l00402"></a>00402 }
425
+ <a name="l00403"></a>00403
426
+ <a name="l00404"></a>00404 <span class="keywordtype">bool</span> done()<span class="keyword"> const </span>{
427
+ <a name="l00405"></a>00405 <span class="keywordflow">return</span> state == DONE || state == ERROR;
428
+ <a name="l00406"></a>00406 }
429
+ <a name="l00407"></a>00407
430
+ <a name="l00408"></a>00408 <span class="keywordtype">bool</span> hasError()<span class="keyword"> const </span>{
431
+ <a name="l00409"></a>00409 <span class="keywordflow">return</span> state == ERROR;
432
+ <a name="l00410"></a>00410 }
433
+ <a name="l00411"></a>00411
434
+ <a name="l00412"></a>00412 Error errorCode()<span class="keyword"> const </span>{
435
+ <a name="l00413"></a>00413 <span class="keywordflow">return</span> (Error) error;
436
+ <a name="l00414"></a>00414 }
437
+ <a name="l00415"></a>00415
438
+ <a name="l00416"></a>00416 <a class="code" href="classPassenger_1_1StaticString.html" title="An immutable, static byte buffer.">StaticString</a> value()<span class="keyword"> const </span>{
439
+ <a name="l00417"></a>00417 <span class="keywordflow">return</span> result;
440
+ <a name="l00418"></a>00418 }
441
+ <a name="l00419"></a>00419 };
442
+ <a name="l00420"></a>00420
443
+ <a name="l00421"></a>00421 } <span class="comment">// namespace Passenger</span>
444
+ <a name="l00422"></a>00422
445
+ <a name="l00423"></a>00423 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_MESSAGE_READERS_WRITERS_H_ */</span>
446
+ </pre></div></div>
447
+ <hr size="1"><address style="text-align: right;"><small>Generated on Sun Mar 28 14:11:56 2010 for Passenger by&nbsp;
448
+ <a href="http://www.doxygen.org/index.html">
449
+ <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.8 </small></address>
450
+ </body>
451
+ </html>