passenger 3.0.3 → 3.0.4

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 (621) hide show
  1. data/NEWS +14 -0
  2. data/ext/apache2/Hooks.cpp +2 -2
  3. data/ext/boost/thread/exceptions.hpp +8 -1
  4. data/ext/common/Constants.h +1 -1
  5. data/ext/nginx/Configuration.c +2 -1
  6. data/lib/phusion_passenger.rb +1 -1
  7. metadata +4 -618
  8. data/doc/cxxapi/AbstractSpawnManager_8h-source.html +0 -138
  9. data/doc/cxxapi/AbstractSpawnManager_8h_source.html +0 -141
  10. data/doc/cxxapi/Account_8h-source.html +0 -202
  11. data/doc/cxxapi/Account_8h_source.html +0 -206
  12. data/doc/cxxapi/AccountsDatabase_8h-source.html +0 -158
  13. data/doc/cxxapi/AccountsDatabase_8h_source.html +0 -161
  14. data/doc/cxxapi/AgentBase_8h_source.html +0 -70
  15. data/doc/cxxapi/AgentsStarter_8h-source.html +0 -79
  16. data/doc/cxxapi/AgentsStarter_8h_source.html +0 -112
  17. data/doc/cxxapi/BCrypt_8h-source.html +0 -101
  18. data/doc/cxxapi/BCrypt_8h_source.html +0 -104
  19. data/doc/cxxapi/BacktracesServer_8h-source.html +0 -87
  20. data/doc/cxxapi/Base64_8h-source.html +0 -85
  21. data/doc/cxxapi/Blowfish_8h-source.html +0 -131
  22. data/doc/cxxapi/Blowfish_8h_source.html +0 -134
  23. data/doc/cxxapi/Bucket_8h-source.html +0 -115
  24. data/doc/cxxapi/Bucket_8h_source.html +0 -118
  25. data/doc/cxxapi/CachedFileStat_8h-source.html +0 -79
  26. data/doc/cxxapi/Configuration_8h-source.html +0 -432
  27. data/doc/cxxapi/Configuration_8h_source.html +0 -435
  28. data/doc/cxxapi/Constants_8h-source.html +0 -71
  29. data/doc/cxxapi/Constants_8h_source.html +0 -79
  30. data/doc/cxxapi/ContentHandler_8h-source.html +0 -92
  31. data/doc/cxxapi/ContentHandler_8h_source.html +0 -95
  32. data/doc/cxxapi/DirectoryMapper_8h-source.html +0 -324
  33. data/doc/cxxapi/DirectoryMapper_8h_source.html +0 -311
  34. data/doc/cxxapi/EventedClient_8h_source.html +0 -733
  35. data/doc/cxxapi/EventedMessageServer_8h_source.html +0 -358
  36. data/doc/cxxapi/EventedServer_8h-source.html +0 -415
  37. data/doc/cxxapi/EventedServer_8h_source.html +0 -326
  38. data/doc/cxxapi/Exceptions_8h-source.html +0 -363
  39. data/doc/cxxapi/Exceptions_8h_source.html +0 -393
  40. data/doc/cxxapi/FileChangeChecker_8h-source.html +0 -237
  41. data/doc/cxxapi/FileDescriptor_8h-source.html +0 -206
  42. data/doc/cxxapi/FileDescriptor_8h_source.html +0 -324
  43. data/doc/cxxapi/Hooks_8h-source.html +0 -73
  44. data/doc/cxxapi/Hooks_8h_source.html +0 -76
  45. data/doc/cxxapi/HttpStatusExtractor_8h-source.html +0 -379
  46. data/doc/cxxapi/HttpStatusExtractor_8h_source.html +0 -382
  47. data/doc/cxxapi/IniFile_8h_source.html +0 -527
  48. data/doc/cxxapi/LoggingServer_8h-source.html +0 -165
  49. data/doc/cxxapi/Logging_8h-source.html +0 -709
  50. data/doc/cxxapi/Logging_8h_source.html +0 -796
  51. data/doc/cxxapi/MessageChannel_8h-source.html +0 -852
  52. data/doc/cxxapi/MessageChannel_8h_source.html +0 -776
  53. data/doc/cxxapi/MessageClient_8h-source.html +0 -297
  54. data/doc/cxxapi/MessageClient_8h_source.html +0 -328
  55. data/doc/cxxapi/MessageReadersWriters_8h-source.html +0 -451
  56. data/doc/cxxapi/MessageReadersWriters_8h_source.html +0 -539
  57. data/doc/cxxapi/MessageServer_8h-source.html +0 -607
  58. data/doc/cxxapi/MessageServer_8h_source.html +0 -612
  59. data/doc/cxxapi/PoolOptions_8h-source.html +0 -511
  60. data/doc/cxxapi/PoolOptions_8h_source.html +0 -549
  61. data/doc/cxxapi/Process_8h-source.html +0 -283
  62. data/doc/cxxapi/Process_8h_source.html +0 -286
  63. data/doc/cxxapi/RandomGenerator_8h-source.html +0 -183
  64. data/doc/cxxapi/RandomGenerator_8h_source.html +0 -191
  65. data/doc/cxxapi/ResourceLocator_8h-source.html +0 -104
  66. data/doc/cxxapi/ResourceLocator_8h_source.html +0 -166
  67. data/doc/cxxapi/SafeLibev_8h_source.html +0 -180
  68. data/doc/cxxapi/ScgiRequestParser_8h-source.html +0 -400
  69. data/doc/cxxapi/ScgiRequestParser_8h_source.html +0 -406
  70. data/doc/cxxapi/ServerInstanceDir_8h-source.html +0 -356
  71. data/doc/cxxapi/ServerInstanceDir_8h_source.html +0 -378
  72. data/doc/cxxapi/Session_8h-source.html +0 -496
  73. data/doc/cxxapi/Session_8h_source.html +0 -501
  74. data/doc/cxxapi/SpawnManager_8h-source.html +0 -632
  75. data/doc/cxxapi/SpawnManager_8h_source.html +0 -647
  76. data/doc/cxxapi/StaticContentHandler_8h-source.html +0 -65
  77. data/doc/cxxapi/StaticContentHandler_8h_source.html +0 -68
  78. data/doc/cxxapi/StaticString_8h-source.html +0 -214
  79. data/doc/cxxapi/StaticString_8h_source.html +0 -329
  80. data/doc/cxxapi/StringListCreator_8h-source.html +0 -111
  81. data/doc/cxxapi/StringListCreator_8h_source.html +0 -114
  82. data/doc/cxxapi/SystemTime_8h-source.html +0 -222
  83. data/doc/cxxapi/Timer_8h-source.html +0 -157
  84. data/doc/cxxapi/Utils_8h-source.html +0 -688
  85. data/doc/cxxapi/Utils_8h_source.html +0 -459
  86. data/doc/cxxapi/Version_8h-source.html +0 -59
  87. data/doc/cxxapi/annotated.html +0 -87
  88. data/doc/cxxapi/apache2_2Configuration_8h-source.html +0 -79
  89. data/doc/cxxapi/apache2_2Configuration_8h_source.html +0 -82
  90. data/doc/cxxapi/classAgentWatcher-members.html +0 -54
  91. data/doc/cxxapi/classAgentWatcher.html +0 -419
  92. data/doc/cxxapi/classClient-members.html +0 -38
  93. data/doc/cxxapi/classClient.html +0 -123
  94. data/doc/cxxapi/classHooks-members.html +0 -40
  95. data/doc/cxxapi/classHooks.html +0 -153
  96. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager-members.html +0 -40
  97. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager.html +0 -187
  98. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager__inherit__graph.map +0 -1
  99. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager__inherit__graph.md5 +0 -1
  100. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager__inherit__graph.png +0 -0
  101. data/doc/cxxapi/classPassenger_1_1ArgumentException-members.html +0 -36
  102. data/doc/cxxapi/classPassenger_1_1ArgumentException.html +0 -56
  103. data/doc/cxxapi/classPassenger_1_1ArrayMessage-members.html +0 -37
  104. data/doc/cxxapi/classPassenger_1_1ArrayMessage.html +0 -113
  105. data/doc/cxxapi/classPassenger_1_1ArrayReader-members.html +0 -33
  106. data/doc/cxxapi/classPassenger_1_1ArrayReader.html +0 -47
  107. data/doc/cxxapi/classPassenger_1_1BacktracesServer-members.html +0 -36
  108. data/doc/cxxapi/classPassenger_1_1BacktracesServer.html +0 -107
  109. data/doc/cxxapi/classPassenger_1_1BacktracesServer__inherit__graph.map +0 -1
  110. data/doc/cxxapi/classPassenger_1_1BacktracesServer__inherit__graph.md5 +0 -1
  111. data/doc/cxxapi/classPassenger_1_1BacktracesServer__inherit__graph.png +0 -0
  112. data/doc/cxxapi/classPassenger_1_1BufferedUpload-members.html +0 -38
  113. data/doc/cxxapi/classPassenger_1_1BufferedUpload.html +0 -112
  114. data/doc/cxxapi/classPassenger_1_1BusyException-members.html +0 -36
  115. data/doc/cxxapi/classPassenger_1_1BusyException.html +0 -54
  116. data/doc/cxxapi/classPassenger_1_1ConfigurationException-members.html +0 -36
  117. data/doc/cxxapi/classPassenger_1_1ConfigurationException.html +0 -51
  118. data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +0 -41
  119. data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +0 -223
  120. data/doc/cxxapi/classPassenger_1_1EOFException-members.html +0 -36
  121. data/doc/cxxapi/classPassenger_1_1EOFException.html +0 -61
  122. data/doc/cxxapi/classPassenger_1_1EOFException__inherit__graph.map +0 -1
  123. data/doc/cxxapi/classPassenger_1_1EOFException__inherit__graph.md5 +0 -1
  124. data/doc/cxxapi/classPassenger_1_1EOFException__inherit__graph.png +0 -0
  125. data/doc/cxxapi/classPassenger_1_1EventFd-members.html +0 -36
  126. data/doc/cxxapi/classPassenger_1_1EventFd.html +0 -52
  127. data/doc/cxxapi/classPassenger_1_1EventedClient-members.html +0 -59
  128. data/doc/cxxapi/classPassenger_1_1EventedClient.html +0 -531
  129. data/doc/cxxapi/classPassenger_1_1EventedMessageServer-members.html +0 -37
  130. data/doc/cxxapi/classPassenger_1_1EventedMessageServer.html +0 -59
  131. data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.map +0 -3
  132. data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.md5 +0 -1
  133. data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.png +0 -0
  134. data/doc/cxxapi/classPassenger_1_1EventedServer-members.html +0 -37
  135. data/doc/cxxapi/classPassenger_1_1EventedServer.html +0 -93
  136. data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.map +0 -3
  137. data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.md5 +0 -1
  138. data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.png +0 -0
  139. data/doc/cxxapi/classPassenger_1_1FileChangeChecker-members.html +0 -37
  140. data/doc/cxxapi/classPassenger_1_1FileChangeChecker.html +0 -166
  141. data/doc/cxxapi/classPassenger_1_1FileDescriptor-members.html +0 -41
  142. data/doc/cxxapi/classPassenger_1_1FileDescriptor.html +0 -178
  143. data/doc/cxxapi/classPassenger_1_1FileDescriptorPair-members.html +0 -36
  144. data/doc/cxxapi/classPassenger_1_1FileDescriptorPair.html +0 -52
  145. data/doc/cxxapi/classPassenger_1_1FileNotFoundException-members.html +0 -36
  146. data/doc/cxxapi/classPassenger_1_1FileNotFoundException.html +0 -58
  147. data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.map +0 -1
  148. data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.md5 +0 -1
  149. data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.png +0 -0
  150. data/doc/cxxapi/classPassenger_1_1FileSystemException-members.html +0 -41
  151. data/doc/cxxapi/classPassenger_1_1FileSystemException.html +0 -66
  152. data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.map +0 -1
  153. data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.md5 +0 -1
  154. data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.png +0 -0
  155. data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor-members.html +0 -39
  156. data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor.html +0 -128
  157. data/doc/cxxapi/classPassenger_1_1IOException-members.html +0 -36
  158. data/doc/cxxapi/classPassenger_1_1IOException.html +0 -61
  159. data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.map +0 -2
  160. data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.md5 +0 -1
  161. data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.png +0 -0
  162. data/doc/cxxapi/classPassenger_1_1MemZeroGuard-members.html +0 -36
  163. data/doc/cxxapi/classPassenger_1_1MemZeroGuard.html +0 -147
  164. data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +0 -57
  165. data/doc/cxxapi/classPassenger_1_1MessageChannel.html +0 -839
  166. data/doc/cxxapi/classPassenger_1_1MessageServer-members.html +0 -49
  167. data/doc/cxxapi/classPassenger_1_1MessageServer.html +0 -407
  168. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext-members.html +0 -36
  169. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext.html +0 -58
  170. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.map +0 -3
  171. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.md5 +0 -1
  172. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.png +0 -0
  173. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext-members.html +0 -41
  174. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext.html +0 -165
  175. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.map +0 -3
  176. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.md5 +0 -1
  177. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.png +0 -0
  178. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler-members.html +0 -39
  179. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler.html +0 -173
  180. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler__inherit__graph.map +0 -1
  181. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler__inherit__graph.md5 +0 -1
  182. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler__inherit__graph.png +0 -0
  183. data/doc/cxxapi/classPassenger_1_1Process-members.html +0 -44
  184. data/doc/cxxapi/classPassenger_1_1Process.html +0 -290
  185. data/doc/cxxapi/classPassenger_1_1RandomGenerator-members.html +0 -37
  186. data/doc/cxxapi/classPassenger_1_1RandomGenerator.html +0 -79
  187. data/doc/cxxapi/classPassenger_1_1ResourceLocator-members.html +0 -36
  188. data/doc/cxxapi/classPassenger_1_1ResourceLocator.html +0 -51
  189. data/doc/cxxapi/classPassenger_1_1RuntimeException-members.html +0 -36
  190. data/doc/cxxapi/classPassenger_1_1RuntimeException.html +0 -54
  191. data/doc/cxxapi/classPassenger_1_1SafeLibev-members.html +0 -36
  192. data/doc/cxxapi/classPassenger_1_1SafeLibev.html +0 -51
  193. data/doc/cxxapi/classPassenger_1_1ScalarMessage-members.html +0 -37
  194. data/doc/cxxapi/classPassenger_1_1ScalarMessage.html +0 -76
  195. data/doc/cxxapi/classPassenger_1_1ScalarReader-members.html +0 -33
  196. data/doc/cxxapi/classPassenger_1_1ScalarReader.html +0 -47
  197. data/doc/cxxapi/classPassenger_1_1ScgiRequestParser-members.html +0 -50
  198. data/doc/cxxapi/classPassenger_1_1ScgiRequestParser.html +0 -285
  199. data/doc/cxxapi/classPassenger_1_1SecurityException-members.html +0 -36
  200. data/doc/cxxapi/classPassenger_1_1SecurityException.html +0 -56
  201. data/doc/cxxapi/classPassenger_1_1Session-members.html +0 -53
  202. data/doc/cxxapi/classPassenger_1_1Session.html +0 -556
  203. data/doc/cxxapi/classPassenger_1_1Session__inherit__graph.map +0 -1
  204. data/doc/cxxapi/classPassenger_1_1Session__inherit__graph.md5 +0 -1
  205. data/doc/cxxapi/classPassenger_1_1Session__inherit__graph.png +0 -0
  206. data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +0 -39
  207. data/doc/cxxapi/classPassenger_1_1SpawnException.html +0 -101
  208. data/doc/cxxapi/classPassenger_1_1SpawnManager-members.html +0 -42
  209. data/doc/cxxapi/classPassenger_1_1SpawnManager.html +0 -292
  210. data/doc/cxxapi/classPassenger_1_1SpawnManager__inherit__graph.map +0 -1
  211. data/doc/cxxapi/classPassenger_1_1SpawnManager__inherit__graph.md5 +0 -1
  212. data/doc/cxxapi/classPassenger_1_1SpawnManager__inherit__graph.png +0 -0
  213. data/doc/cxxapi/classPassenger_1_1StandardSession-members.html +0 -54
  214. data/doc/cxxapi/classPassenger_1_1StandardSession.html +0 -394
  215. data/doc/cxxapi/classPassenger_1_1StandardSession__inherit__graph.map +0 -1
  216. data/doc/cxxapi/classPassenger_1_1StandardSession__inherit__graph.md5 +0 -1
  217. data/doc/cxxapi/classPassenger_1_1StandardSession__inherit__graph.png +0 -0
  218. data/doc/cxxapi/classPassenger_1_1StaticString-members.html +0 -36
  219. data/doc/cxxapi/classPassenger_1_1StaticString.html +0 -56
  220. data/doc/cxxapi/classPassenger_1_1SystemException-members.html +0 -40
  221. data/doc/cxxapi/classPassenger_1_1SystemException.html +0 -155
  222. data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.map +0 -2
  223. data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.md5 +0 -1
  224. data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.png +0 -0
  225. data/doc/cxxapi/classPassenger_1_1SystemTime-members.html +0 -43
  226. data/doc/cxxapi/classPassenger_1_1SystemTime.html +0 -173
  227. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException-members.html +0 -40
  228. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException.html +0 -61
  229. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException__inherit__graph.map +0 -1
  230. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException__inherit__graph.md5 +0 -1
  231. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException__inherit__graph.png +0 -0
  232. data/doc/cxxapi/classPassenger_1_1TimeoutException-members.html +0 -36
  233. data/doc/cxxapi/classPassenger_1_1TimeoutException.html +0 -54
  234. data/doc/cxxapi/classPassenger_1_1Timer-members.html +0 -38
  235. data/doc/cxxapi/classPassenger_1_1Timer.html +0 -163
  236. data/doc/cxxapi/classPassenger_1_1Uint16Message-members.html +0 -36
  237. data/doc/cxxapi/classPassenger_1_1Uint16Message.html +0 -51
  238. data/doc/cxxapi/classPassenger_1_1Uint16Reader-members.html +0 -33
  239. data/doc/cxxapi/classPassenger_1_1Uint16Reader.html +0 -47
  240. data/doc/cxxapi/classPassenger_1_1Uint32Message-members.html +0 -36
  241. data/doc/cxxapi/classPassenger_1_1Uint32Message.html +0 -51
  242. data/doc/cxxapi/classPassenger_1_1Uint32Reader-members.html +0 -33
  243. data/doc/cxxapi/classPassenger_1_1Uint32Reader.html +0 -47
  244. data/doc/cxxapi/classServer-members.html +0 -36
  245. data/doc/cxxapi/classServer.html +0 -49
  246. data/doc/cxxapi/classServerInstanceDirToucher-members.html +0 -36
  247. data/doc/cxxapi/classServerInstanceDirToucher.html +0 -47
  248. data/doc/cxxapi/classes.html +0 -52
  249. data/doc/cxxapi/definitions_8h-source.html +0 -33
  250. data/doc/cxxapi/definitions_8h_source.html +0 -36
  251. data/doc/cxxapi/doxygen.css +0 -532
  252. data/doc/cxxapi/doxygen.png +0 -0
  253. data/doc/cxxapi/files.html +0 -76
  254. data/doc/cxxapi/ftv2blank.png +0 -0
  255. data/doc/cxxapi/ftv2doc.png +0 -0
  256. data/doc/cxxapi/ftv2folderclosed.png +0 -0
  257. data/doc/cxxapi/ftv2folderopen.png +0 -0
  258. data/doc/cxxapi/ftv2lastnode.png +0 -0
  259. data/doc/cxxapi/ftv2link.png +0 -0
  260. data/doc/cxxapi/ftv2mlastnode.png +0 -0
  261. data/doc/cxxapi/ftv2mnode.png +0 -0
  262. data/doc/cxxapi/ftv2node.png +0 -0
  263. data/doc/cxxapi/ftv2plastnode.png +0 -0
  264. data/doc/cxxapi/ftv2pnode.png +0 -0
  265. data/doc/cxxapi/ftv2vertline.png +0 -0
  266. data/doc/cxxapi/functions.html +0 -103
  267. data/doc/cxxapi/functions_0x62.html +0 -82
  268. data/doc/cxxapi/functions_0x63.html +0 -102
  269. data/doc/cxxapi/functions_0x64.html +0 -102
  270. data/doc/cxxapi/functions_0x65.html +0 -88
  271. data/doc/cxxapi/functions_0x66.html +0 -100
  272. data/doc/cxxapi/functions_0x67.html +0 -167
  273. data/doc/cxxapi/functions_0x68.html +0 -88
  274. data/doc/cxxapi/functions_0x69.html +0 -96
  275. data/doc/cxxapi/functions_0x6b.html +0 -80
  276. data/doc/cxxapi/functions_0x6c.html +0 -88
  277. data/doc/cxxapi/functions_0x6d.html +0 -88
  278. data/doc/cxxapi/functions_0x6e.html +0 -86
  279. data/doc/cxxapi/functions_0x6f.html +0 -94
  280. data/doc/cxxapi/functions_0x70.html +0 -94
  281. data/doc/cxxapi/functions_0x72.html +0 -110
  282. data/doc/cxxapi/functions_0x73.html +0 -171
  283. data/doc/cxxapi/functions_0x74.html +0 -85
  284. data/doc/cxxapi/functions_0x75.html +0 -85
  285. data/doc/cxxapi/functions_0x77.html +0 -92
  286. data/doc/cxxapi/functions_0x7e.html +0 -79
  287. data/doc/cxxapi/functions_enum.html +0 -49
  288. data/doc/cxxapi/functions_eval.html +0 -67
  289. data/doc/cxxapi/functions_func.html +0 -531
  290. data/doc/cxxapi/functions_vars.html +0 -278
  291. data/doc/cxxapi/graph_legend.dot +0 -22
  292. data/doc/cxxapi/graph_legend.html +0 -92
  293. data/doc/cxxapi/graph_legend.png +0 -0
  294. data/doc/cxxapi/group__Configuration.html +0 -198
  295. data/doc/cxxapi/group__Configuration.map +0 -3
  296. data/doc/cxxapi/group__Configuration.png +0 -0
  297. data/doc/cxxapi/group__Core.html +0 -46
  298. data/doc/cxxapi/group__Core.map +0 -3
  299. data/doc/cxxapi/group__Core.png +0 -0
  300. data/doc/cxxapi/group__Exceptions.html +0 -53
  301. data/doc/cxxapi/group__Hooks.html +0 -42
  302. data/doc/cxxapi/group__Hooks.map +0 -3
  303. data/doc/cxxapi/group__Hooks.png +0 -0
  304. data/doc/cxxapi/group__Support.html +0 -538
  305. data/doc/cxxapi/hierarchy.html +0 -101
  306. data/doc/cxxapi/index.html +0 -16
  307. data/doc/cxxapi/inherit__graph__0.map +0 -1
  308. data/doc/cxxapi/inherit__graph__0.md5 +0 -1
  309. data/doc/cxxapi/inherit__graph__0.png +0 -0
  310. data/doc/cxxapi/inherit__graph__1.map +0 -1
  311. data/doc/cxxapi/inherit__graph__1.md5 +0 -1
  312. data/doc/cxxapi/inherit__graph__1.png +0 -0
  313. data/doc/cxxapi/inherit__graph__10.map +0 -3
  314. data/doc/cxxapi/inherit__graph__10.md5 +0 -1
  315. data/doc/cxxapi/inherit__graph__10.png +0 -0
  316. data/doc/cxxapi/inherit__graph__11.map +0 -4
  317. data/doc/cxxapi/inherit__graph__11.md5 +0 -1
  318. data/doc/cxxapi/inherit__graph__11.png +0 -0
  319. data/doc/cxxapi/inherit__graph__12.map +0 -3
  320. data/doc/cxxapi/inherit__graph__12.md5 +0 -1
  321. data/doc/cxxapi/inherit__graph__12.png +0 -0
  322. data/doc/cxxapi/inherit__graph__13.map +0 -3
  323. data/doc/cxxapi/inherit__graph__13.md5 +0 -1
  324. data/doc/cxxapi/inherit__graph__13.png +0 -0
  325. data/doc/cxxapi/inherit__graph__14.map +0 -3
  326. data/doc/cxxapi/inherit__graph__14.md5 +0 -1
  327. data/doc/cxxapi/inherit__graph__14.png +0 -0
  328. data/doc/cxxapi/inherit__graph__15.map +0 -3
  329. data/doc/cxxapi/inherit__graph__15.md5 +0 -1
  330. data/doc/cxxapi/inherit__graph__15.png +0 -0
  331. data/doc/cxxapi/inherit__graph__16.map +0 -5
  332. data/doc/cxxapi/inherit__graph__16.md5 +0 -1
  333. data/doc/cxxapi/inherit__graph__16.png +0 -0
  334. data/doc/cxxapi/inherit__graph__17.map +0 -3
  335. data/doc/cxxapi/inherit__graph__17.md5 +0 -1
  336. data/doc/cxxapi/inherit__graph__17.png +0 -0
  337. data/doc/cxxapi/inherit__graph__18.map +0 -3
  338. data/doc/cxxapi/inherit__graph__18.md5 +0 -1
  339. data/doc/cxxapi/inherit__graph__18.png +0 -0
  340. data/doc/cxxapi/inherit__graph__19.map +0 -4
  341. data/doc/cxxapi/inherit__graph__19.md5 +0 -1
  342. data/doc/cxxapi/inherit__graph__19.png +0 -0
  343. data/doc/cxxapi/inherit__graph__2.map +0 -1
  344. data/doc/cxxapi/inherit__graph__2.md5 +0 -1
  345. data/doc/cxxapi/inherit__graph__2.png +0 -0
  346. data/doc/cxxapi/inherit__graph__20.map +0 -3
  347. data/doc/cxxapi/inherit__graph__20.md5 +0 -1
  348. data/doc/cxxapi/inherit__graph__20.png +0 -0
  349. data/doc/cxxapi/inherit__graph__21.map +0 -3
  350. data/doc/cxxapi/inherit__graph__21.md5 +0 -1
  351. data/doc/cxxapi/inherit__graph__21.png +0 -0
  352. data/doc/cxxapi/inherit__graph__22.map +0 -3
  353. data/doc/cxxapi/inherit__graph__22.md5 +0 -1
  354. data/doc/cxxapi/inherit__graph__22.png +0 -0
  355. data/doc/cxxapi/inherit__graph__23.map +0 -3
  356. data/doc/cxxapi/inherit__graph__23.md5 +0 -1
  357. data/doc/cxxapi/inherit__graph__23.png +0 -0
  358. data/doc/cxxapi/inherit__graph__24.map +0 -3
  359. data/doc/cxxapi/inherit__graph__24.md5 +0 -1
  360. data/doc/cxxapi/inherit__graph__24.png +0 -0
  361. data/doc/cxxapi/inherit__graph__25.map +0 -3
  362. data/doc/cxxapi/inherit__graph__25.md5 +0 -1
  363. data/doc/cxxapi/inherit__graph__25.png +0 -0
  364. data/doc/cxxapi/inherit__graph__26.map +0 -3
  365. data/doc/cxxapi/inherit__graph__26.md5 +0 -1
  366. data/doc/cxxapi/inherit__graph__26.png +0 -0
  367. data/doc/cxxapi/inherit__graph__27.map +0 -3
  368. data/doc/cxxapi/inherit__graph__27.md5 +0 -1
  369. data/doc/cxxapi/inherit__graph__27.png +0 -0
  370. data/doc/cxxapi/inherit__graph__28.map +0 -3
  371. data/doc/cxxapi/inherit__graph__28.md5 +0 -1
  372. data/doc/cxxapi/inherit__graph__28.png +0 -0
  373. data/doc/cxxapi/inherit__graph__29.map +0 -3
  374. data/doc/cxxapi/inherit__graph__29.md5 +0 -1
  375. data/doc/cxxapi/inherit__graph__29.png +0 -0
  376. data/doc/cxxapi/inherit__graph__3.map +0 -2
  377. data/doc/cxxapi/inherit__graph__3.md5 +0 -1
  378. data/doc/cxxapi/inherit__graph__3.png +0 -0
  379. data/doc/cxxapi/inherit__graph__30.map +0 -3
  380. data/doc/cxxapi/inherit__graph__30.md5 +0 -1
  381. data/doc/cxxapi/inherit__graph__30.png +0 -0
  382. data/doc/cxxapi/inherit__graph__31.map +0 -4
  383. data/doc/cxxapi/inherit__graph__31.md5 +0 -1
  384. data/doc/cxxapi/inherit__graph__31.png +0 -0
  385. data/doc/cxxapi/inherit__graph__32.map +0 -3
  386. data/doc/cxxapi/inherit__graph__32.md5 +0 -1
  387. data/doc/cxxapi/inherit__graph__32.png +0 -0
  388. data/doc/cxxapi/inherit__graph__33.map +0 -3
  389. data/doc/cxxapi/inherit__graph__33.md5 +0 -1
  390. data/doc/cxxapi/inherit__graph__33.png +0 -0
  391. data/doc/cxxapi/inherit__graph__34.map +0 -3
  392. data/doc/cxxapi/inherit__graph__34.md5 +0 -1
  393. data/doc/cxxapi/inherit__graph__34.png +0 -0
  394. data/doc/cxxapi/inherit__graph__35.map +0 -3
  395. data/doc/cxxapi/inherit__graph__35.md5 +0 -1
  396. data/doc/cxxapi/inherit__graph__35.png +0 -0
  397. data/doc/cxxapi/inherit__graph__36.map +0 -5
  398. data/doc/cxxapi/inherit__graph__36.md5 +0 -1
  399. data/doc/cxxapi/inherit__graph__36.png +0 -0
  400. data/doc/cxxapi/inherit__graph__37.map +0 -3
  401. data/doc/cxxapi/inherit__graph__37.md5 +0 -1
  402. data/doc/cxxapi/inherit__graph__37.png +0 -0
  403. data/doc/cxxapi/inherit__graph__38.map +0 -3
  404. data/doc/cxxapi/inherit__graph__38.md5 +0 -1
  405. data/doc/cxxapi/inherit__graph__38.png +0 -0
  406. data/doc/cxxapi/inherit__graph__39.map +0 -3
  407. data/doc/cxxapi/inherit__graph__39.md5 +0 -1
  408. data/doc/cxxapi/inherit__graph__39.png +0 -0
  409. data/doc/cxxapi/inherit__graph__4.map +0 -3
  410. data/doc/cxxapi/inherit__graph__4.md5 +0 -1
  411. data/doc/cxxapi/inherit__graph__4.png +0 -0
  412. data/doc/cxxapi/inherit__graph__40.map +0 -3
  413. data/doc/cxxapi/inherit__graph__40.md5 +0 -1
  414. data/doc/cxxapi/inherit__graph__40.png +0 -0
  415. data/doc/cxxapi/inherit__graph__5.map +0 -3
  416. data/doc/cxxapi/inherit__graph__5.md5 +0 -1
  417. data/doc/cxxapi/inherit__graph__5.png +0 -0
  418. data/doc/cxxapi/inherit__graph__6.map +0 -3
  419. data/doc/cxxapi/inherit__graph__6.md5 +0 -1
  420. data/doc/cxxapi/inherit__graph__6.png +0 -0
  421. data/doc/cxxapi/inherit__graph__7.map +0 -3
  422. data/doc/cxxapi/inherit__graph__7.md5 +0 -1
  423. data/doc/cxxapi/inherit__graph__7.png +0 -0
  424. data/doc/cxxapi/inherit__graph__8.map +0 -3
  425. data/doc/cxxapi/inherit__graph__8.md5 +0 -1
  426. data/doc/cxxapi/inherit__graph__8.png +0 -0
  427. data/doc/cxxapi/inherit__graph__9.map +0 -3
  428. data/doc/cxxapi/inherit__graph__9.md5 +0 -1
  429. data/doc/cxxapi/inherit__graph__9.png +0 -0
  430. data/doc/cxxapi/inherits.html +0 -165
  431. data/doc/cxxapi/main.html +0 -28
  432. data/doc/cxxapi/md5_8h-source.html +0 -121
  433. data/doc/cxxapi/modules.html +0 -36
  434. data/doc/cxxapi/namespacePassenger.html +0 -553
  435. data/doc/cxxapi/namespacemembers.html +0 -135
  436. data/doc/cxxapi/namespacemembers_enum.html +0 -48
  437. data/doc/cxxapi/namespacemembers_eval.html +0 -57
  438. data/doc/cxxapi/namespacemembers_func.html +0 -111
  439. data/doc/cxxapi/namespacemembers_type.html +0 -54
  440. data/doc/cxxapi/namespaces.html +0 -37
  441. data/doc/cxxapi/nginx_2Configuration_8h-source.html +0 -115
  442. data/doc/cxxapi/nginx_2Configuration_8h_source.html +0 -125
  443. data/doc/cxxapi/ngx__http__passenger__module_8h-source.html +0 -91
  444. data/doc/cxxapi/ngx__http__passenger__module_8h_source.html +0 -94
  445. data/doc/cxxapi/structPassenger_1_1AnythingToString-members.html +0 -33
  446. data/doc/cxxapi/structPassenger_1_1AnythingToString.html +0 -52
  447. data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01StaticString_01_4_01_4-members.html +0 -33
  448. data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01StaticString_01_4_01_4.html +0 -52
  449. data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4-members.html +0 -33
  450. data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4.html +0 -52
  451. data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard-members.html +0 -36
  452. data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard.html +0 -51
  453. data/doc/cxxapi/structPassenger_1_1PoolOptions-members.html +0 -67
  454. data/doc/cxxapi/structPassenger_1_1PoolOptions.html +0 -647
  455. data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash-members.html +0 -36
  456. data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash.html +0 -51
  457. data/doc/cxxapi/tab_b.gif +0 -0
  458. data/doc/cxxapi/tab_l.gif +0 -0
  459. data/doc/cxxapi/tab_r.gif +0 -0
  460. data/doc/cxxapi/tabs.css +0 -105
  461. data/doc/cxxapi/tree.html +0 -249
  462. data/doc/rdoc/classes/ConditionVariable.html +0 -215
  463. data/doc/rdoc/classes/Exception.html +0 -120
  464. data/doc/rdoc/classes/GC.html +0 -113
  465. data/doc/rdoc/classes/IO.html +0 -221
  466. data/doc/rdoc/classes/PhusionPassenger.html +0 -397
  467. data/doc/rdoc/classes/PhusionPassenger/AbstractInstaller.html +0 -180
  468. data/doc/rdoc/classes/PhusionPassenger/AbstractRequestHandler.html +0 -647
  469. data/doc/rdoc/classes/PhusionPassenger/AbstractServer.html +0 -654
  470. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/InvalidPassword.html +0 -92
  471. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerAlreadyStarted.html +0 -97
  472. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerError.html +0 -96
  473. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerNotStarted.html +0 -97
  474. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/UnknownMessage.html +0 -96
  475. data/doc/rdoc/classes/PhusionPassenger/AbstractServerCollection.html +0 -619
  476. data/doc/rdoc/classes/PhusionPassenger/AdminTools.html +0 -142
  477. data/doc/rdoc/classes/PhusionPassenger/AdminTools/MemoryStats.html +0 -368
  478. data/doc/rdoc/classes/PhusionPassenger/AdminTools/MemoryStats/Process.html +0 -231
  479. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance.html +0 -588
  480. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/CorruptedDirectoryError.html +0 -92
  481. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/GenerationsAbsentError.html +0 -92
  482. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/Group.html +0 -147
  483. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/Process.html +0 -279
  484. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/RoleDeniedError.html +0 -92
  485. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/StaleDirectoryError.html +0 -92
  486. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/Stats.html +0 -123
  487. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/UnsupportedGenerationStructureVersionError.html +0 -92
  488. data/doc/rdoc/classes/PhusionPassenger/AnalyticsLogger.html +0 -368
  489. data/doc/rdoc/classes/PhusionPassenger/AnalyticsLogger/Log.html +0 -299
  490. data/doc/rdoc/classes/PhusionPassenger/AnalyticsLogger/SharedData.html +0 -206
  491. data/doc/rdoc/classes/PhusionPassenger/AppInitError.html +0 -155
  492. data/doc/rdoc/classes/PhusionPassenger/AppProcess.html +0 -367
  493. data/doc/rdoc/classes/PhusionPassenger/ClassicRails.html +0 -95
  494. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/ApplicationSpawner.html +0 -351
  495. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/ApplicationSpawner/Error.html +0 -98
  496. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/CGIFixed.html +0 -200
  497. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/FrameworkSpawner.html +0 -410
  498. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/FrameworkSpawner/Error.html +0 -98
  499. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/RequestHandler.html +0 -156
  500. data/doc/rdoc/classes/PhusionPassenger/ClassicRailsExtensions.html +0 -115
  501. data/doc/rdoc/classes/PhusionPassenger/ClassicRailsExtensions/AnalyticsLogging.html +0 -202
  502. data/doc/rdoc/classes/PhusionPassenger/ConsoleTextTemplate.html +0 -172
  503. data/doc/rdoc/classes/PhusionPassenger/DebugLogging.html +0 -273
  504. data/doc/rdoc/classes/PhusionPassenger/FrameworkInitError.html +0 -145
  505. data/doc/rdoc/classes/PhusionPassenger/HTMLTemplate.html +0 -162
  506. data/doc/rdoc/classes/PhusionPassenger/InitializationError.html +0 -141
  507. data/doc/rdoc/classes/PhusionPassenger/InvalidPath.html +0 -92
  508. data/doc/rdoc/classes/PhusionPassenger/MessageChannel.html +0 -673
  509. data/doc/rdoc/classes/PhusionPassenger/MessageChannel/InvalidHashError.html +0 -92
  510. data/doc/rdoc/classes/PhusionPassenger/MessageClient.html +0 -415
  511. data/doc/rdoc/classes/PhusionPassenger/NativeSupportLoader.html +0 -134
  512. data/doc/rdoc/classes/PhusionPassenger/Packaging.html +0 -129
  513. data/doc/rdoc/classes/PhusionPassenger/PlatformInfo.html +0 -1972
  514. data/doc/rdoc/classes/PhusionPassenger/Plugin.html +0 -237
  515. data/doc/rdoc/classes/PhusionPassenger/Rack.html +0 -91
  516. data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner.html +0 -312
  517. data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner/Error.html +0 -98
  518. data/doc/rdoc/classes/PhusionPassenger/Rack/RequestHandler.html +0 -218
  519. data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions.html +0 -114
  520. data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging.html +0 -259
  521. data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging/ACExtension.html +0 -139
  522. data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging/ASBenchmarkableExtension.html +0 -118
  523. data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging/ExceptionLogger.html +0 -135
  524. data/doc/rdoc/classes/PhusionPassenger/SpawnManager.html +0 -378
  525. data/doc/rdoc/classes/PhusionPassenger/Standalone.html +0 -111
  526. data/doc/rdoc/classes/PhusionPassenger/Standalone/AppFinder.html +0 -252
  527. data/doc/rdoc/classes/PhusionPassenger/Standalone/Command.html +0 -161
  528. data/doc/rdoc/classes/PhusionPassenger/Standalone/ConfigFile.html +0 -368
  529. data/doc/rdoc/classes/PhusionPassenger/Standalone/ConfigFile/DisallowedContextError.html +0 -132
  530. data/doc/rdoc/classes/PhusionPassenger/Standalone/HelpCommand.html +0 -151
  531. data/doc/rdoc/classes/PhusionPassenger/Standalone/Main.html +0 -189
  532. data/doc/rdoc/classes/PhusionPassenger/Standalone/PackageRuntimeCommand.html +0 -177
  533. data/doc/rdoc/classes/PhusionPassenger/Standalone/RuntimeInstaller.html +0 -341
  534. data/doc/rdoc/classes/PhusionPassenger/Standalone/StartCommand.html +0 -203
  535. data/doc/rdoc/classes/PhusionPassenger/Standalone/StatusCommand.html +0 -156
  536. data/doc/rdoc/classes/PhusionPassenger/Standalone/StopCommand.html +0 -168
  537. data/doc/rdoc/classes/PhusionPassenger/Standalone/Utils.html +0 -86
  538. data/doc/rdoc/classes/PhusionPassenger/Standalone/VersionCommand.html +0 -135
  539. data/doc/rdoc/classes/PhusionPassenger/UnknownError.html +0 -125
  540. data/doc/rdoc/classes/PhusionPassenger/Utils.html +0 -1543
  541. data/doc/rdoc/classes/PhusionPassenger/Utils/FileSystemWatcher.html +0 -204
  542. data/doc/rdoc/classes/PhusionPassenger/Utils/FileSystemWatcher/DirInfo.html +0 -171
  543. data/doc/rdoc/classes/PhusionPassenger/Utils/FileSystemWatcher/FileInfo.html +0 -140
  544. data/doc/rdoc/classes/PhusionPassenger/Utils/HostsFileParser.html +0 -260
  545. data/doc/rdoc/classes/PhusionPassenger/Utils/PseudoIO.html +0 -194
  546. data/doc/rdoc/classes/PhusionPassenger/Utils/RewindableInput.html +0 -265
  547. data/doc/rdoc/classes/PhusionPassenger/Utils/RewindableInput/Tempfile.html +0 -120
  548. data/doc/rdoc/classes/PhusionPassenger/Utils/UnseekableSocket.html +0 -561
  549. data/doc/rdoc/classes/PhusionPassenger/VersionNotFound.html +0 -140
  550. data/doc/rdoc/classes/PhusionPassenger/WSGI.html +0 -89
  551. data/doc/rdoc/classes/PhusionPassenger/WSGI/ApplicationSpawner.html +0 -182
  552. data/doc/rdoc/classes/Process.html +0 -115
  553. data/doc/rdoc/classes/Signal.html +0 -139
  554. data/doc/rdoc/created.rid +0 -1
  555. data/doc/rdoc/files/DEVELOPERS_TXT.html +0 -280
  556. data/doc/rdoc/files/README.html +0 -157
  557. data/doc/rdoc/files/lib/phusion_passenger/abstract_installer_rb.html +0 -130
  558. data/doc/rdoc/files/lib/phusion_passenger/abstract_request_handler_rb.html +0 -135
  559. data/doc/rdoc/files/lib/phusion_passenger/abstract_server_collection_rb.html +0 -126
  560. data/doc/rdoc/files/lib/phusion_passenger/abstract_server_rb.html +0 -128
  561. data/doc/rdoc/files/lib/phusion_passenger/admin_tools/memory_stats_rb.html +0 -126
  562. data/doc/rdoc/files/lib/phusion_passenger/admin_tools/server_instance_rb.html +0 -132
  563. data/doc/rdoc/files/lib/phusion_passenger/admin_tools_rb.html +0 -122
  564. data/doc/rdoc/files/lib/phusion_passenger/analytics_logger_rb.html +0 -129
  565. data/doc/rdoc/files/lib/phusion_passenger/app_process_rb.html +0 -127
  566. data/doc/rdoc/files/lib/phusion_passenger/classic_rails/application_spawner_rb.html +0 -141
  567. data/doc/rdoc/files/lib/phusion_passenger/classic_rails/cgi_fixed_rb.html +0 -126
  568. data/doc/rdoc/files/lib/phusion_passenger/classic_rails/framework_spawner_rb.html +0 -146
  569. data/doc/rdoc/files/lib/phusion_passenger/classic_rails/request_handler_rb.html +0 -125
  570. data/doc/rdoc/files/lib/phusion_passenger/classic_rails_extensions/init_rb.html +0 -132
  571. data/doc/rdoc/files/lib/phusion_passenger/console_text_template_rb.html +0 -126
  572. data/doc/rdoc/files/lib/phusion_passenger/constants_rb.html +0 -122
  573. data/doc/rdoc/files/lib/phusion_passenger/debug_logging_rb.html +0 -122
  574. data/doc/rdoc/files/lib/phusion_passenger/dependencies_rb.html +0 -147
  575. data/doc/rdoc/files/lib/phusion_passenger/exceptions_rb.html +0 -122
  576. data/doc/rdoc/files/lib/phusion_passenger/html_template_rb.html +0 -127
  577. data/doc/rdoc/files/lib/phusion_passenger/message_channel_rb.html +0 -120
  578. data/doc/rdoc/files/lib/phusion_passenger/message_client_rb.html +0 -127
  579. data/doc/rdoc/files/lib/phusion_passenger/native_support_rb.html +0 -132
  580. data/doc/rdoc/files/lib/phusion_passenger/packaging_rb.html +0 -122
  581. data/doc/rdoc/files/lib/phusion_passenger/platform_info/apache_rb.html +0 -127
  582. data/doc/rdoc/files/lib/phusion_passenger/platform_info/binary_compatibility_rb.html +0 -129
  583. data/doc/rdoc/files/lib/phusion_passenger/platform_info/compiler_rb.html +0 -127
  584. data/doc/rdoc/files/lib/phusion_passenger/platform_info/curl_rb.html +0 -126
  585. data/doc/rdoc/files/lib/phusion_passenger/platform_info/documentation_tools_rb.html +0 -126
  586. data/doc/rdoc/files/lib/phusion_passenger/platform_info/linux_rb.html +0 -126
  587. data/doc/rdoc/files/lib/phusion_passenger/platform_info/operating_system_rb.html +0 -127
  588. data/doc/rdoc/files/lib/phusion_passenger/platform_info/ruby_rb.html +0 -128
  589. data/doc/rdoc/files/lib/phusion_passenger/platform_info/zlib_rb.html +0 -126
  590. data/doc/rdoc/files/lib/phusion_passenger/platform_info_rb.html +0 -122
  591. data/doc/rdoc/files/lib/phusion_passenger/plugin_rb.html +0 -127
  592. data/doc/rdoc/files/lib/phusion_passenger/public_api_rb.html +0 -127
  593. data/doc/rdoc/files/lib/phusion_passenger/rack/application_spawner_rb.html +0 -137
  594. data/doc/rdoc/files/lib/phusion_passenger/rack/request_handler_rb.html +0 -125
  595. data/doc/rdoc/files/lib/phusion_passenger/rails3_extensions/init_rb.html +0 -127
  596. data/doc/rdoc/files/lib/phusion_passenger/simple_benchmarking_rb.html +0 -122
  597. data/doc/rdoc/files/lib/phusion_passenger/spawn_manager_rb.html +0 -160
  598. data/doc/rdoc/files/lib/phusion_passenger/standalone/app_finder_rb.html +0 -127
  599. data/doc/rdoc/files/lib/phusion_passenger/standalone/command_rb.html +0 -136
  600. data/doc/rdoc/files/lib/phusion_passenger/standalone/config_file_rb.html +0 -126
  601. data/doc/rdoc/files/lib/phusion_passenger/standalone/help_command_rb.html +0 -126
  602. data/doc/rdoc/files/lib/phusion_passenger/standalone/main_rb.html +0 -126
  603. data/doc/rdoc/files/lib/phusion_passenger/standalone/package_runtime_command_rb.html +0 -127
  604. data/doc/rdoc/files/lib/phusion_passenger/standalone/runtime_installer_rb.html +0 -133
  605. data/doc/rdoc/files/lib/phusion_passenger/standalone/start_command_rb.html +0 -136
  606. data/doc/rdoc/files/lib/phusion_passenger/standalone/status_command_rb.html +0 -126
  607. data/doc/rdoc/files/lib/phusion_passenger/standalone/stop_command_rb.html +0 -126
  608. data/doc/rdoc/files/lib/phusion_passenger/standalone/utils_rb.html +0 -126
  609. data/doc/rdoc/files/lib/phusion_passenger/standalone/version_command_rb.html +0 -127
  610. data/doc/rdoc/files/lib/phusion_passenger/utils/file_system_watcher_rb.html +0 -126
  611. data/doc/rdoc/files/lib/phusion_passenger/utils/hosts_file_parser_rb.html +0 -120
  612. data/doc/rdoc/files/lib/phusion_passenger/utils/rewindable_input_rb.html +0 -100
  613. data/doc/rdoc/files/lib/phusion_passenger/utils/tmpdir_rb.html +0 -122
  614. data/doc/rdoc/files/lib/phusion_passenger/utils/unseekable_socket_rb.html +0 -126
  615. data/doc/rdoc/files/lib/phusion_passenger/utils_rb.html +0 -179
  616. data/doc/rdoc/files/lib/phusion_passenger/wsgi/application_spawner_rb.html +0 -132
  617. data/doc/rdoc/fr_class_index.html +0 -139
  618. data/doc/rdoc/fr_file_index.html +0 -108
  619. data/doc/rdoc/fr_method_index.html +0 -439
  620. data/doc/rdoc/index.html +0 -26
  621. data/doc/rdoc/rdoc-style.css +0 -187
@@ -1,451 +0,0 @@
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>
@@ -1,539 +0,0 @@
1
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
- <html xmlns="http://www.w3.org/1999/xhtml">
3
- <head>
4
- <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
5
- <title>Passenger: MessageReadersWriters.h Source File</title>
6
- <link href="tabs.css" rel="stylesheet" type="text/css"/>
7
- <link href="doxygen.css" rel="stylesheet" type="text/css"/>
8
- </head>
9
- <body>
10
- <!-- Generated by Doxygen 1.6.2 -->
11
- <div class="navigation" id="top">
12
- <div class="tabs">
13
- <ul>
14
- <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
15
- <li><a href="modules.html"><span>Modules</span></a></li>
16
- <li><a href="namespaces.html"><span>Namespaces</span></a></li>
17
- <li><a href="annotated.html"><span>Classes</span></a></li>
18
- <li class="current"><a href="files.html"><span>Files</span></a></li>
19
- </ul>
20
- </div>
21
- <div class="tabs">
22
- <ul>
23
- <li><a href="files.html"><span>File&nbsp;List</span></a></li>
24
- </ul>
25
- </div>
26
- <h1>MessageReadersWriters.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
27
- <a name="l00002"></a>00002 <span class="comment"> * Phusion Passenger - http://www.modrails.com/</span>
28
- <a name="l00003"></a>00003 <span class="comment"> * Copyright (c) 2010 Phusion</span>
29
- <a name="l00004"></a>00004 <span class="comment"> *</span>
30
- <a name="l00005"></a>00005 <span class="comment"> * &quot;Phusion Passenger&quot; is a trademark of Hongli Lai &amp; Ninh Bui.</span>
31
- <a name="l00006"></a>00006 <span class="comment"> *</span>
32
- <a name="l00007"></a>00007 <span class="comment"> * Permission is hereby granted, free of charge, to any person obtaining a copy</span>
33
- <a name="l00008"></a>00008 <span class="comment"> * of this software and associated documentation files (the &quot;Software&quot;), to deal</span>
34
- <a name="l00009"></a>00009 <span class="comment"> * in the Software without restriction, including without limitation the rights</span>
35
- <a name="l00010"></a>00010 <span class="comment"> * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell</span>
36
- <a name="l00011"></a>00011 <span class="comment"> * copies of the Software, and to permit persons to whom the Software is</span>
37
- <a name="l00012"></a>00012 <span class="comment"> * furnished to do so, subject to the following conditions:</span>
38
- <a name="l00013"></a>00013 <span class="comment"> *</span>
39
- <a name="l00014"></a>00014 <span class="comment"> * The above copyright notice and this permission notice shall be included in</span>
40
- <a name="l00015"></a>00015 <span class="comment"> * all copies or substantial portions of the Software.</span>
41
- <a name="l00016"></a>00016 <span class="comment"> *</span>
42
- <a name="l00017"></a>00017 <span class="comment"> * THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span>
43
- <a name="l00018"></a>00018 <span class="comment"> * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span>
44
- <a name="l00019"></a>00019 <span class="comment"> * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE</span>
45
- <a name="l00020"></a>00020 <span class="comment"> * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span>
46
- <a name="l00021"></a>00021 <span class="comment"> * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</span>
47
- <a name="l00022"></a>00022 <span class="comment"> * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN</span>
48
- <a name="l00023"></a>00023 <span class="comment"> * THE SOFTWARE.</span>
49
- <a name="l00024"></a>00024 <span class="comment"> */</span>
50
- <a name="l00025"></a>00025 <span class="preprocessor">#ifndef _PASSENGER_MESSAGE_READERS_WRITERS_H_</span>
51
- <a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#define _PASSENGER_MESSAGE_READERS_WRITERS_H_</span>
52
- <a name="l00027"></a>00027 <span class="preprocessor"></span>
53
- <a name="l00028"></a>00028 <span class="preprocessor">#include &lt;boost/cstdint.hpp&gt;</span>
54
- <a name="l00029"></a>00029 <span class="preprocessor">#include &lt;oxt/macros.hpp&gt;</span>
55
- <a name="l00030"></a>00030 <span class="preprocessor">#include &lt;algorithm&gt;</span>
56
- <a name="l00031"></a>00031 <span class="preprocessor">#include &lt;vector&gt;</span>
57
- <a name="l00032"></a>00032 <span class="preprocessor">#include &lt;string&gt;</span>
58
- <a name="l00033"></a>00033 <span class="preprocessor">#include &lt;sys/types.h&gt;</span>
59
- <a name="l00034"></a>00034 <span class="preprocessor">#include &lt;cstring&gt;</span>
60
- <a name="l00035"></a>00035 <span class="preprocessor">#include &lt;arpa/inet.h&gt;</span>
61
- <a name="l00036"></a>00036 <span class="preprocessor">#include &quot;StaticString.h&quot;</span>
62
- <a name="l00037"></a>00037 <span class="preprocessor">#include &quot;Exceptions.h&quot;</span>
63
- <a name="l00038"></a>00038 <span class="preprocessor">#include &quot;Utils/MemZeroGuard.h&quot;</span>
64
- <a name="l00039"></a>00039 <span class="comment"></span>
65
- <a name="l00040"></a>00040 <span class="comment">/**</span>
66
- <a name="l00041"></a>00041 <span class="comment"> * This file provides a bunch of classes for reading and writing messages in the</span>
67
- <a name="l00042"></a>00042 <span class="comment"> * MessageChannel format. Unlike MessageChannel, whose operations take control over</span>
68
- <a name="l00043"></a>00043 <span class="comment"> * the I/O handle and may block, these classes act like parsers and data generators.</span>
69
- <a name="l00044"></a>00044 <span class="comment"> * To read messages one must feed data to them. To write messages one must instruct</span>
70
- <a name="l00045"></a>00045 <span class="comment"> * the classes to generate a bunch of data. These classes will never block, making</span>
71
- <a name="l00046"></a>00046 <span class="comment"> * them ideal for use in evented servers.</span>
72
- <a name="l00047"></a>00047 <span class="comment"> *</span>
73
- <a name="l00048"></a>00048 <span class="comment"> * &lt;h2&gt;Reading messages&lt;/h2&gt;</span>
74
- <a name="l00049"></a>00049 <span class="comment"> * To read a single message, one must instantiate a message object and feed network</span>
75
- <a name="l00050"></a>00050 <span class="comment"> * data to it with the feed() method. This method returns the number of bytes</span>
76
- <a name="l00051"></a>00051 <span class="comment"> * actually processed by the message object (i.e. the number of bytes that it has</span>
77
- <a name="l00052"></a>00052 <span class="comment"> * recognized as part of the message).</span>
78
- <a name="l00053"></a>00053 <span class="comment"> *</span>
79
- <a name="l00054"></a>00054 <span class="comment"> * When the message object has either successfully parsed the data or encountered</span>
80
- <a name="l00055"></a>00055 <span class="comment"> * an error, it will indicate so via the done() method. With hasError() one can</span>
81
- <a name="l00056"></a>00056 <span class="comment"> * check whether an error was encountered or whether the reader succeeded, and</span>
82
- <a name="l00057"></a>00057 <span class="comment"> * with errorCode() one can obtain the exact error reason. Not all message objects</span>
83
- <a name="l00058"></a>00058 <span class="comment"> * support hasError() and errorCode() because some of them can never encounter</span>
84
- <a name="l00059"></a>00059 <span class="comment"> * errors and some of them can only fail for a single reason.</span>
85
- <a name="l00060"></a>00060 <span class="comment"> *</span>
86
- <a name="l00061"></a>00061 <span class="comment"> * When successful, the parsed message can be obtained with value(). This method</span>
87
- <a name="l00062"></a>00062 <span class="comment"> * may only be called when done() is true and there is no error, otherwise the</span>
88
- <a name="l00063"></a>00063 <span class="comment"> * return value is undefined.</span>
89
- <a name="l00064"></a>00064 <span class="comment"> *</span>
90
- <a name="l00065"></a>00065 <span class="comment"> * At this point, the message object cannot process any more data and feed() will</span>
91
- <a name="l00066"></a>00066 <span class="comment"> * always return 0. To reuse the object for processing another message, one must</span>
92
- <a name="l00067"></a>00067 <span class="comment"> * reset its state by calling reset().</span>
93
- <a name="l00068"></a>00068 <span class="comment"> *</span>
94
- <a name="l00069"></a>00069 <span class="comment"> * The following example demonstrates how to read a continuous stream of 32-bit</span>
95
- <a name="l00070"></a>00070 <span class="comment"> * integers:</span>
96
- <a name="l00071"></a>00071 <span class="comment"> * @code</span>
97
- <a name="l00072"></a>00072 <span class="comment"> Uint32Message intMessage;</span>
98
- <a name="l00073"></a>00073 <span class="comment"> while (true) {</span>
99
- <a name="l00074"></a>00074 <span class="comment"> // Read a bunch of network data...</span>
100
- <a name="l00075"></a>00075 <span class="comment"> char buf[1024];</span>
101
- <a name="l00076"></a>00076 <span class="comment"> ssize_t size = recv(fd, buf, sizeof(buf));</span>
102
- <a name="l00077"></a>00077 <span class="comment"> size_t consumed = 0;</span>
103
- <a name="l00078"></a>00078 <span class="comment"> </span>
104
- <a name="l00079"></a>00079 <span class="comment"> // ...and process it all. We only feed data to the message object</span>
105
- <a name="l00080"></a>00080 <span class="comment"> // that hasn&#39;t already been fed.</span>
106
- <a name="l00081"></a>00081 <span class="comment"> while (consumed &lt; size) {</span>
107
- <a name="l00082"></a>00082 <span class="comment"> consumed += intReader.feed(buf + consumed, size - consumed);</span>
108
- <a name="l00083"></a>00083 <span class="comment"> if (intMessage.done()) {</span>
109
- <a name="l00084"></a>00084 <span class="comment"> printf(&quot;Integer: %d\n&quot;, (int) intMessage.value());</span>
110
- <a name="l00085"></a>00085 <span class="comment"> // The state must be reset before the reader can be reused.</span>
111
- <a name="l00086"></a>00086 <span class="comment"> intMessage.reset();</span>
112
- <a name="l00087"></a>00087 <span class="comment"> }</span>
113
- <a name="l00088"></a>00088 <span class="comment"> }</span>
114
- <a name="l00089"></a>00089 <span class="comment"> }</span>
115
- <a name="l00090"></a>00090 <span class="comment"> * @endcode</span>
116
- <a name="l00091"></a>00091 <span class="comment"> *</span>
117
- <a name="l00092"></a>00092 <span class="comment"> * Some message objects return non-primitive values in their value() methods, such as</span>
118
- <a name="l00093"></a>00093 <span class="comment"> * ArrayMessage and ScalarMessage which return &lt;tt&gt;const vector&lt;StaticString&gt; &amp;&lt;/tt&gt;</span>
119
- <a name="l00094"></a>00094 <span class="comment"> * and &lt;tt&gt;StaticString&lt;/tt&gt;, respectively. These values are only valid until either</span>
120
- <a name="l00095"></a>00095 <span class="comment"> * of the following things occur:</span>
121
- <a name="l00096"></a>00096 <span class="comment"> *</span>
122
- <a name="l00097"></a>00097 <span class="comment"> * - The buffer containing last the fed data has been destroyed or modified.</span>
123
- <a name="l00098"></a>00098 <span class="comment"> * - The message object itself has been destroyed.</span>
124
- <a name="l00099"></a>00099 <span class="comment"> *</span>
125
- <a name="l00100"></a>00100 <span class="comment"> * This is because the message objects try to apply copy-zero optimizations whenever</span>
126
- <a name="l00101"></a>00101 <span class="comment"> * possible. For example, in case of ScalarMessage, it&#39;ll check whether the data</span>
127
- <a name="l00102"></a>00102 <span class="comment"> * that has been fed in the first feed() call already contains a full scalar message.</span>
128
- <a name="l00103"></a>00103 <span class="comment"> * If so then it&#39;ll just return a StaticString that points to the scalar message</span>
129
- <a name="l00104"></a>00104 <span class="comment"> * in the fed data; it will not copy the fed data. In this case it is important</span>
130
- <a name="l00105"></a>00105 <span class="comment"> * that the buffer containing the fed data is not modified or destroyed while the</span>
131
- <a name="l00106"></a>00106 <span class="comment"> * StaticString is in use.</span>
132
- <a name="l00107"></a>00107 <span class="comment"> * If the first feed() call does not supply a full scalar message then it will</span>
133
- <a name="l00108"></a>00108 <span class="comment"> * buffer all fed data until the buffer contains a full scalar message, and the</span>
134
- <a name="l00109"></a>00109 <span class="comment"> * result will point to this buffer. Because the buffer is owned by the message</span>
135
- <a name="l00110"></a>00110 <span class="comment"> * object, the result will be invalidated as soon as the message object is destroyed.</span>
136
- <a name="l00111"></a>00111 <span class="comment"> */</span>
137
- <a name="l00112"></a>00112
138
- <a name="l00113"></a>00113 <span class="keyword">namespace </span>Passenger {
139
- <a name="l00114"></a>00114
140
- <a name="l00115"></a>00115 <span class="keyword">using namespace </span>std;
141
- <a name="l00116"></a>00116 <span class="comment"></span>
142
- <a name="l00117"></a>00117 <span class="comment">/**</span>
143
- <a name="l00118"></a>00118 <span class="comment"> * For 16-bit big-endian integers.</span>
144
- <a name="l00119"></a>00119 <span class="comment"> */</span>
145
- <a name="l00120"></a><a class="code" href="classPassenger_1_1Uint16Message.html">00120</a> <span class="keyword">class </span><a class="code" href="classPassenger_1_1Uint16Message.html" title="For 16-bit big-endian integers.">Uint16Message</a> {
146
- <a name="l00121"></a>00121 <span class="keyword">private</span>:
147
- <a name="l00122"></a>00122 uint16_t val;
148
- <a name="l00123"></a>00123 uint8_t consumed;
149
- <a name="l00124"></a>00124
150
- <a name="l00125"></a>00125 <span class="keyword">public</span>:
151
- <a name="l00126"></a>00126 <a class="code" href="classPassenger_1_1Uint16Message.html" title="For 16-bit big-endian integers.">Uint16Message</a>() {
152
- <a name="l00127"></a>00127 consumed = 0;
153
- <a name="l00128"></a>00128 }
154
- <a name="l00129"></a>00129
155
- <a name="l00130"></a>00130 <span class="keywordtype">void</span> reset() {
156
- <a name="l00131"></a>00131 consumed = 0;
157
- <a name="l00132"></a>00132 }
158
- <a name="l00133"></a>00133
159
- <a name="l00134"></a>00134 <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) {
160
- <a name="l00135"></a>00135 <span class="keywordtype">size_t</span> locallyConsumed;
161
- <a name="l00136"></a>00136
162
- <a name="l00137"></a>00137 locallyConsumed = std::min(size, <span class="keyword">sizeof</span>(uint16_t) - consumed);
163
- <a name="l00138"></a>00138 memcpy((<span class="keywordtype">char</span> *) &amp;val + consumed, data, locallyConsumed);
164
- <a name="l00139"></a>00139 consumed += locallyConsumed;
165
- <a name="l00140"></a>00140 <span class="keywordflow">if</span> (locallyConsumed &gt; 0 &amp;&amp; done()) {
166
- <a name="l00141"></a>00141 val = ntohs(val);
167
- <a name="l00142"></a>00142 }
168
- <a name="l00143"></a>00143 <span class="keywordflow">return</span> locallyConsumed;
169
- <a name="l00144"></a>00144 }
170
- <a name="l00145"></a>00145
171
- <a name="l00146"></a>00146 <span class="keywordtype">bool</span> done()<span class="keyword"> const </span>{
172
- <a name="l00147"></a>00147 <span class="keywordflow">return</span> consumed == <span class="keyword">sizeof</span>(uint16_t);
173
- <a name="l00148"></a>00148 }
174
- <a name="l00149"></a>00149
175
- <a name="l00150"></a>00150 uint16_t value()<span class="keyword"> const </span>{
176
- <a name="l00151"></a>00151 <span class="keywordflow">return</span> val;
177
- <a name="l00152"></a>00152 }
178
- <a name="l00153"></a>00153
179
- <a name="l00154"></a>00154 <span class="keyword">static</span> <span class="keywordtype">void</span> generate(<span class="keywordtype">void</span> *buf, uint16_t val) {
180
- <a name="l00155"></a>00155 val = htons(val);
181
- <a name="l00156"></a>00156 memcpy(buf, &amp;val, <span class="keyword">sizeof</span>(val));
182
- <a name="l00157"></a>00157 }
183
- <a name="l00158"></a>00158 };
184
- <a name="l00159"></a>00159 <span class="comment"></span>
185
- <a name="l00160"></a>00160 <span class="comment">/**</span>
186
- <a name="l00161"></a>00161 <span class="comment"> * For 32-bit big-endian integers.</span>
187
- <a name="l00162"></a>00162 <span class="comment"> */</span>
188
- <a name="l00163"></a><a class="code" href="classPassenger_1_1Uint32Message.html">00163</a> <span class="keyword">class </span><a class="code" href="classPassenger_1_1Uint32Message.html" title="For 32-bit big-endian integers.">Uint32Message</a> {
189
- <a name="l00164"></a>00164 <span class="keyword">private</span>:
190
- <a name="l00165"></a>00165 uint32_t val;
191
- <a name="l00166"></a>00166 uint8_t consumed;
192
- <a name="l00167"></a>00167
193
- <a name="l00168"></a>00168 <span class="keyword">public</span>:
194
- <a name="l00169"></a>00169 <a class="code" href="classPassenger_1_1Uint32Message.html" title="For 32-bit big-endian integers.">Uint32Message</a>() {
195
- <a name="l00170"></a>00170 consumed = 0;
196
- <a name="l00171"></a>00171 }
197
- <a name="l00172"></a>00172
198
- <a name="l00173"></a>00173 <span class="keywordtype">void</span> reset() {
199
- <a name="l00174"></a>00174 consumed = 0;
200
- <a name="l00175"></a>00175 }
201
- <a name="l00176"></a>00176
202
- <a name="l00177"></a>00177 <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) {
203
- <a name="l00178"></a>00178 <span class="keywordtype">size_t</span> locallyConsumed;
204
- <a name="l00179"></a>00179
205
- <a name="l00180"></a>00180 locallyConsumed = std::min(size, <span class="keyword">sizeof</span>(uint32_t) - consumed);
206
- <a name="l00181"></a>00181 memcpy((<span class="keywordtype">char</span> *) &amp;val + consumed, data, locallyConsumed);
207
- <a name="l00182"></a>00182 consumed += locallyConsumed;
208
- <a name="l00183"></a>00183 <span class="keywordflow">if</span> (locallyConsumed &gt; 0 &amp;&amp; done()) {
209
- <a name="l00184"></a>00184 val = ntohl(val);
210
- <a name="l00185"></a>00185 }
211
- <a name="l00186"></a>00186 <span class="keywordflow">return</span> locallyConsumed;
212
- <a name="l00187"></a>00187 }
213
- <a name="l00188"></a>00188
214
- <a name="l00189"></a>00189 <span class="keywordtype">bool</span> done()<span class="keyword"> const </span>{
215
- <a name="l00190"></a>00190 <span class="keywordflow">return</span> consumed == <span class="keyword">sizeof</span>(uint32_t);
216
- <a name="l00191"></a>00191 }
217
- <a name="l00192"></a>00192
218
- <a name="l00193"></a>00193 uint32_t value()<span class="keyword"> const </span>{
219
- <a name="l00194"></a>00194 <span class="keywordflow">return</span> val;
220
- <a name="l00195"></a>00195 }
221
- <a name="l00196"></a>00196
222
- <a name="l00197"></a>00197 <span class="keyword">static</span> <span class="keywordtype">void</span> generate(<span class="keywordtype">void</span> *buf, uint32_t val) {
223
- <a name="l00198"></a>00198 val = htonl(val);
224
- <a name="l00199"></a>00199 memcpy(buf, &amp;val, <span class="keyword">sizeof</span>(val));
225
- <a name="l00200"></a>00200 }
226
- <a name="l00201"></a>00201 };
227
- <a name="l00202"></a>00202 <span class="comment"></span>
228
- <a name="l00203"></a>00203 <span class="comment">/**</span>
229
- <a name="l00204"></a>00204 <span class="comment"> * For array messages.</span>
230
- <a name="l00205"></a>00205 <span class="comment"> */</span>
231
- <a name="l00206"></a><a class="code" href="classPassenger_1_1ArrayMessage.html">00206</a> <span class="keyword">class </span><a class="code" href="classPassenger_1_1ArrayMessage.html" title="For array messages.">ArrayMessage</a> {
232
- <a name="l00207"></a>00207 <span class="keyword">public</span>:
233
- <a name="l00208"></a>00208 <span class="keyword">enum</span> Error {
234
- <a name="l00209"></a>00209 TOO_LARGE
235
- <a name="l00210"></a>00210 };
236
- <a name="l00211"></a>00211
237
- <a name="l00212"></a>00212 <span class="keyword">private</span>:
238
- <a name="l00213"></a>00213 <span class="keyword">enum</span> State {
239
- <a name="l00214"></a>00214 READING_HEADER,
240
- <a name="l00215"></a>00215 READING_BODY,
241
- <a name="l00216"></a>00216 DONE,
242
- <a name="l00217"></a>00217 ERROR
243
- <a name="l00218"></a>00218 };
244
- <a name="l00219"></a>00219
245
- <a name="l00220"></a>00220 uint16_t toReserve;
246
- <a name="l00221"></a>00221 uint16_t maxSize;
247
- <a name="l00222"></a>00222 <a class="code" href="classPassenger_1_1Uint16Message.html" title="For 16-bit big-endian integers.">Uint16Message</a> headerReader;
248
- <a name="l00223"></a>00223 uint8_t state;
249
- <a name="l00224"></a>00224 uint8_t error;
250
- <a name="l00225"></a>00225 <span class="keywordtype">string</span> buffer;
251
- <a name="l00226"></a>00226 vector&lt;StaticString&gt; result;
252
- <a name="l00227"></a>00227
253
- <a name="l00228"></a>00228 <span class="keywordtype">void</span> parseBody(<span class="keyword">const</span> <span class="keywordtype">char</span> *data, <span class="keywordtype">size_t</span> size) {
254
- <a name="l00229"></a>00229 <span class="keyword">const</span> <span class="keywordtype">char</span> *start = data;
255
- <a name="l00230"></a>00230 <span class="keyword">const</span> <span class="keywordtype">char</span> *terminator;
256
- <a name="l00231"></a>00231 <span class="keywordtype">size_t</span> rest = size;
257
- <a name="l00232"></a>00232
258
- <a name="l00233"></a>00233 <span class="keywordflow">while</span> ((terminator = (<span class="keyword">const</span> <span class="keywordtype">char</span> *) memchr(start, <span class="charliteral">&#39;\0&#39;</span>, rest)) != NULL) {
259
- <a name="l00234"></a>00234 <span class="keywordtype">size_t</span> len = terminator - start;
260
- <a name="l00235"></a>00235 result.push_back(<a class="code" href="classPassenger_1_1StaticString.html" title="An immutable, static byte buffer.">StaticString</a>(start, len));
261
- <a name="l00236"></a>00236 start = terminator + 1;
262
- <a name="l00237"></a>00237 rest = size - (start - data);
263
- <a name="l00238"></a>00238 }
264
- <a name="l00239"></a>00239 }
265
- <a name="l00240"></a>00240
266
- <a name="l00241"></a>00241 <span class="keyword">public</span>:
267
- <a name="l00242"></a>00242 <a class="code" href="classPassenger_1_1ArrayMessage.html" title="For array messages.">ArrayMessage</a>() {
268
- <a name="l00243"></a>00243 state = READING_HEADER;
269
- <a name="l00244"></a>00244 toReserve = 0;
270
- <a name="l00245"></a>00245 maxSize = 0;
271
- <a name="l00246"></a>00246 }
272
- <a name="l00247"></a>00247
273
- <a name="l00248"></a>00248 <span class="keywordtype">void</span> reserve(uint16_t size) {
274
- <a name="l00249"></a>00249 toReserve = size;
275
- <a name="l00250"></a>00250 result.reserve(size);
276
- <a name="l00251"></a>00251 }
277
- <a name="l00252"></a>00252
278
- <a name="l00253"></a>00253 <span class="keywordtype">void</span> setMaxSize(uint16_t size) {
279
- <a name="l00254"></a>00254 maxSize = size;
280
- <a name="l00255"></a>00255 }
281
- <a name="l00256"></a>00256
282
- <a name="l00257"></a>00257 <span class="keywordtype">void</span> reset() {
283
- <a name="l00258"></a>00258 state = READING_HEADER;
284
- <a name="l00259"></a>00259 headerReader.reset();
285
- <a name="l00260"></a>00260 buffer.clear();
286
- <a name="l00261"></a>00261 result.clear();
287
- <a name="l00262"></a>00262 <span class="keywordflow">if</span> (toReserve &gt; 0) {
288
- <a name="l00263"></a>00263 result.reserve(toReserve);
289
- <a name="l00264"></a>00264 }
290
- <a name="l00265"></a>00265 }
291
- <a name="l00266"></a>00266
292
- <a name="l00267"></a>00267 <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) {
293
- <a name="l00268"></a>00268 <span class="keywordtype">size_t</span> consumed = 0;
294
- <a name="l00269"></a>00269
295
- <a name="l00270"></a>00270 <span class="keywordflow">while</span> (consumed &lt; size &amp;&amp; !done()) {
296
- <a name="l00271"></a>00271 <span class="keyword">const</span> <span class="keywordtype">char</span> *current = data + consumed;
297
- <a name="l00272"></a>00272 <span class="keywordtype">size_t</span> rest = size - consumed;
298
- <a name="l00273"></a>00273
299
- <a name="l00274"></a>00274 <span class="keywordflow">switch</span> (state) {
300
- <a name="l00275"></a>00275 <span class="keywordflow">case</span> READING_HEADER:
301
- <a name="l00276"></a>00276 consumed += headerReader.feed(current, rest);
302
- <a name="l00277"></a>00277 <span class="keywordflow">if</span> (headerReader.done()) {
303
- <a name="l00278"></a>00278 <span class="keywordflow">if</span> (maxSize &gt; 0 &amp;&amp; headerReader.value() &gt; maxSize) {
304
- <a name="l00279"></a>00279 state = ERROR;
305
- <a name="l00280"></a>00280 error = TOO_LARGE;
306
- <a name="l00281"></a>00281 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (headerReader.value() == 0) {
307
- <a name="l00282"></a>00282 state = DONE;
308
- <a name="l00283"></a>00283 } <span class="keywordflow">else</span> {
309
- <a name="l00284"></a>00284 state = READING_BODY;
310
- <a name="l00285"></a>00285 }
311
- <a name="l00286"></a>00286 }
312
- <a name="l00287"></a>00287 <span class="keywordflow">break</span>;
313
- <a name="l00288"></a>00288 <span class="keywordflow">case</span> READING_BODY:
314
- <a name="l00289"></a>00289 <span class="keywordflow">if</span> (buffer.empty() &amp;&amp; rest &gt;= headerReader.value()) {
315
- <a name="l00290"></a>00290 parseBody(current, headerReader.value());
316
- <a name="l00291"></a>00291 state = DONE;
317
- <a name="l00292"></a>00292 consumed += headerReader.value();
318
- <a name="l00293"></a>00293 } <span class="keywordflow">else</span> {
319
- <a name="l00294"></a>00294 <span class="keywordtype">size_t</span> toConsume = std::min(rest,
320
- <a name="l00295"></a>00295 headerReader.value() - buffer.size());
321
- <a name="l00296"></a>00296 <span class="keywordflow">if</span> (buffer.capacity() &lt; headerReader.value()) {
322
- <a name="l00297"></a>00297 buffer.reserve(headerReader.value());
323
- <a name="l00298"></a>00298 }
324
- <a name="l00299"></a>00299 buffer.append(current, toConsume);
325
- <a name="l00300"></a>00300 consumed += toConsume;
326
- <a name="l00301"></a>00301 <span class="keywordflow">if</span> (buffer.size() == headerReader.value()) {
327
- <a name="l00302"></a>00302 parseBody(buffer.data(), buffer.size());
328
- <a name="l00303"></a>00303 state = DONE;
329
- <a name="l00304"></a>00304 }
330
- <a name="l00305"></a>00305 }
331
- <a name="l00306"></a>00306 <span class="keywordflow">break</span>;
332
- <a name="l00307"></a>00307 <span class="keywordflow">default</span>:
333
- <a name="l00308"></a>00308 <span class="comment">// Never reached.</span>
334
- <a name="l00309"></a>00309 abort();
335
- <a name="l00310"></a>00310 }
336
- <a name="l00311"></a>00311 }
337
- <a name="l00312"></a>00312 <span class="keywordflow">return</span> consumed;
338
- <a name="l00313"></a>00313 }
339
- <a name="l00314"></a>00314
340
- <a name="l00315"></a>00315 <span class="keywordtype">bool</span> done()<span class="keyword"> const </span>{
341
- <a name="l00316"></a>00316 <span class="keywordflow">return</span> state == DONE || state == ERROR;
342
- <a name="l00317"></a>00317 }
343
- <a name="l00318"></a>00318
344
- <a name="l00319"></a>00319 <span class="keywordtype">bool</span> hasError()<span class="keyword"> const </span>{
345
- <a name="l00320"></a>00320 <span class="keywordflow">return</span> state == ERROR;
346
- <a name="l00321"></a>00321 }
347
- <a name="l00322"></a>00322
348
- <a name="l00323"></a>00323 Error errorCode()<span class="keyword"> const </span>{
349
- <a name="l00324"></a>00324 <span class="keywordflow">return</span> (Error) error;
350
- <a name="l00325"></a>00325 }
351
- <a name="l00326"></a>00326
352
- <a name="l00327"></a>00327 <span class="keyword">const</span> vector&lt;StaticString&gt; &amp;value()<span class="keyword"> const </span>{
353
- <a name="l00328"></a>00328 <span class="keywordflow">return</span> result;
354
- <a name="l00329"></a>00329 }
355
- <a name="l00330"></a>00330 <span class="comment"></span>
356
- <a name="l00331"></a>00331 <span class="comment"> /**</span>
357
- <a name="l00332"></a>00332 <span class="comment"> * Given a bunch of array items, generates an array message. The message is</span>
358
- <a name="l00333"></a>00333 <span class="comment"> * generated in the form of an array of StaticStrings which must all be written</span>
359
- <a name="l00334"></a>00334 <span class="comment"> * out (e.g. with writev()) in the given order. These StaticStrings point</span>
360
- <a name="l00335"></a>00335 <span class="comment"> * to the buffers pointed to by &lt;em&gt;args&lt;/em&gt; as well as &lt;em&gt;headerBuf&lt;/em&gt;,</span>
361
- <a name="l00336"></a>00336 <span class="comment"> * so &lt;em&gt;args&lt;/em&gt; and &lt;em&gt;headerBuf&lt;/em&gt; must stay valid until the message</span>
362
- <a name="l00337"></a>00337 <span class="comment"> * has been written out or copied.</span>
363
- <a name="l00338"></a>00338 <span class="comment"> *</span>
364
- <a name="l00339"></a>00339 <span class="comment"> * @param args An array of array items to be included in the array message.</span>
365
- <a name="l00340"></a>00340 <span class="comment"> * @param argsCount The number of items in &lt;em&gt;args&lt;/em&gt;.</span>
366
- <a name="l00341"></a>00341 <span class="comment"> * @param headerBuf A pointer to a buffer in which the array message header</span>
367
- <a name="l00342"></a>00342 <span class="comment"> * is to be stored.</span>
368
- <a name="l00343"></a>00343 <span class="comment"> * @param out A pointer to a StaticString array in which the generated array</span>
369
- <a name="l00344"></a>00344 <span class="comment"> * message data will be stored. Exactly &lt;tt&gt;outputSize(argsCount)&lt;/tt&gt;</span>
370
- <a name="l00345"></a>00345 <span class="comment"> * items will be stored in this array.</span>
371
- <a name="l00346"></a>00346 <span class="comment"> * @param outCount The number of items in &lt;em&gt;out&lt;/em&gt;.</span>
372
- <a name="l00347"></a>00347 <span class="comment"> */</span>
373
- <a name="l00348"></a><a class="code" href="classPassenger_1_1ArrayMessage.html#a25603619576f11f0d76286a17a014a92">00348</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classPassenger_1_1ArrayMessage.html#a25603619576f11f0d76286a17a014a92" title="Given a bunch of array items, generates an array message.">generate</a>(<a class="code" href="classPassenger_1_1StaticString.html" title="An immutable, static byte buffer.">StaticString</a> args[], <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> argsCount,
374
- <a name="l00349"></a>00349 <span class="keywordtype">char</span> headerBuf[<span class="keyword">sizeof</span>(uint16_t)], <a class="code" href="classPassenger_1_1StaticString.html" title="An immutable, static byte buffer.">StaticString</a> *out, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outCount)
375
- <a name="l00350"></a>00350 {
376
- <a name="l00351"></a>00351 <span class="keywordflow">if</span> (OXT_UNLIKELY(outCount &lt; outputSize(argsCount))) {
377
- <a name="l00352"></a>00352 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1ArgumentException.html" title="Indicates that a specified argument is incorrect or violates a requirement.">ArgumentException</a>(<span class="stringliteral">&quot;outCount too small.&quot;</span>);
378
- <a name="l00353"></a>00353 }
379
- <a name="l00354"></a>00354
380
- <a name="l00355"></a>00355 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size = 0;
381
- <a name="l00356"></a>00356 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i;
382
- <a name="l00357"></a>00357
383
- <a name="l00358"></a>00358 <span class="keywordflow">for</span> (i = 0; i &lt; argsCount; i++) {
384
- <a name="l00359"></a>00359 size += args[i].size() + 1;
385
- <a name="l00360"></a>00360 }
386
- <a name="l00361"></a>00361 <span class="keywordflow">if</span> (OXT_UNLIKELY(size &gt; 0xFFFF)) {
387
- <a name="l00362"></a>00362 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1ArgumentException.html" title="Indicates that a specified argument is incorrect or violates a requirement.">ArgumentException</a>(<span class="stringliteral">&quot;Data size exceeds maximum size for array messages.&quot;</span>);
388
- <a name="l00363"></a>00363 }
389
- <a name="l00364"></a>00364
390
- <a name="l00365"></a>00365 <a class="code" href="classPassenger_1_1ArrayMessage.html#a25603619576f11f0d76286a17a014a92" title="Given a bunch of array items, generates an array message.">Uint16Message::generate</a>(headerBuf, size);
391
- <a name="l00366"></a>00366 out[0] = <a class="code" href="classPassenger_1_1StaticString.html" title="An immutable, static byte buffer.">StaticString</a>(headerBuf, <span class="keyword">sizeof</span>(uint16_t));
392
- <a name="l00367"></a>00367 <span class="keywordflow">for</span> (i = 0; i &lt; argsCount; i++) {
393
- <a name="l00368"></a>00368 out[1 + 2 * i] = args[i];
394
- <a name="l00369"></a>00369 out[1 + 2 * i + 1] = <a class="code" href="classPassenger_1_1StaticString.html" title="An immutable, static byte buffer.">StaticString</a>(<span class="stringliteral">&quot;\0&quot;</span>, 1);
395
- <a name="l00370"></a>00370 }
396
- <a name="l00371"></a>00371 }
397
- <a name="l00372"></a>00372
398
- <a name="l00373"></a>00373 <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outputSize(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> argsCount) {
399
- <a name="l00374"></a>00374 <span class="keywordflow">return</span> argsCount * 2 + 1;
400
- <a name="l00375"></a>00375 }
401
- <a name="l00376"></a>00376 };
402
- <a name="l00377"></a>00377 <span class="comment"></span>
403
- <a name="l00378"></a>00378 <span class="comment">/**</span>
404
- <a name="l00379"></a>00379 <span class="comment"> * Class for reading a scalar message.</span>
405
- <a name="l00380"></a>00380 <span class="comment"> */</span>
406
- <a name="l00381"></a><a class="code" href="classPassenger_1_1ScalarMessage.html">00381</a> <span class="keyword">class </span><a class="code" href="classPassenger_1_1ScalarMessage.html" title="Class for reading a scalar message.">ScalarMessage</a> {
407
- <a name="l00382"></a>00382 <span class="keyword">public</span>:
408
- <a name="l00383"></a>00383 <span class="keyword">enum</span> Error {
409
- <a name="l00384"></a>00384 TOO_LARGE
410
- <a name="l00385"></a>00385 };
411
- <a name="l00386"></a>00386
412
- <a name="l00387"></a>00387 <span class="keyword">private</span>:
413
- <a name="l00388"></a>00388 <span class="keyword">enum</span> State {
414
- <a name="l00389"></a>00389 READING_HEADER,
415
- <a name="l00390"></a>00390 READING_BODY,
416
- <a name="l00391"></a>00391 DONE,
417
- <a name="l00392"></a>00392 ERROR
418
- <a name="l00393"></a>00393 };
419
- <a name="l00394"></a>00394
420
- <a name="l00395"></a>00395 uint8_t state;
421
- <a name="l00396"></a>00396 uint8_t error;
422
- <a name="l00397"></a>00397 uint32_t maxSize;
423
- <a name="l00398"></a>00398 <a class="code" href="classPassenger_1_1Uint32Message.html" title="For 32-bit big-endian integers.">Uint32Message</a> headerReader;
424
- <a name="l00399"></a>00399 <span class="keywordtype">string</span> buffer;
425
- <a name="l00400"></a>00400 <a class="code" href="classPassenger_1_1StaticString.html" title="An immutable, static byte buffer.">StaticString</a> result;
426
- <a name="l00401"></a>00401
427
- <a name="l00402"></a>00402 <span class="keyword">public</span>:
428
- <a name="l00403"></a>00403 <a class="code" href="classPassenger_1_1ScalarMessage.html" title="Class for reading a scalar message.">ScalarMessage</a>(uint32_t maxSize = 0) {
429
- <a name="l00404"></a>00404 state = READING_HEADER;
430
- <a name="l00405"></a>00405 this-&gt;maxSize = maxSize;
431
- <a name="l00406"></a>00406 }
432
- <a name="l00407"></a>00407
433
- <a name="l00408"></a>00408 <span class="keywordtype">void</span> setMaxSize(uint32_t maxSize) {
434
- <a name="l00409"></a>00409 this-&gt;maxSize = maxSize;
435
- <a name="l00410"></a>00410 }
436
- <a name="l00411"></a>00411 <span class="comment"></span>
437
- <a name="l00412"></a>00412 <span class="comment"> /**</span>
438
- <a name="l00413"></a>00413 <span class="comment"> * Resets the internal state so that this object can be used for processing</span>
439
- <a name="l00414"></a>00414 <span class="comment"> * another scalar message.</span>
440
- <a name="l00415"></a>00415 <span class="comment"> *</span>
441
- <a name="l00416"></a>00416 <span class="comment"> * If &lt;em&gt;zeroBuffer&lt;/em&gt; is true, then the contents of the internal buffer</span>
442
- <a name="l00417"></a>00417 <span class="comment"> * will be securely filled with zeroes. This is useful if e.g. the buffer</span>
443
- <a name="l00418"></a>00418 <span class="comment"> * might contain sensitive password data.</span>
444
- <a name="l00419"></a>00419 <span class="comment"> */</span>
445
- <a name="l00420"></a><a class="code" href="classPassenger_1_1ScalarMessage.html#aadcc25dfe89d8acbf308bf951cc5bf32">00420</a> <span class="keywordtype">void</span> <a class="code" href="classPassenger_1_1ScalarMessage.html#aadcc25dfe89d8acbf308bf951cc5bf32" title="Resets the internal state so that this object can be used for processing another...">reset</a>(<span class="keywordtype">bool</span> zeroBuffer = <span class="keyword">false</span>) {
446
- <a name="l00421"></a>00421 state = READING_HEADER;
447
- <a name="l00422"></a>00422 <span class="keywordflow">if</span> (zeroBuffer) {
448
- <a name="l00423"></a>00423 MemZeroGuard guard(buffer);
449
- <a name="l00424"></a>00424 }
450
- <a name="l00425"></a>00425 headerReader.reset();
451
- <a name="l00426"></a>00426 buffer.clear();
452
- <a name="l00427"></a>00427 }
453
- <a name="l00428"></a>00428
454
- <a name="l00429"></a>00429 <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) {
455
- <a name="l00430"></a>00430 <span class="keywordtype">size_t</span> consumed = 0;
456
- <a name="l00431"></a>00431
457
- <a name="l00432"></a>00432 <span class="keywordflow">while</span> (consumed &lt; size &amp;&amp; !done()) {
458
- <a name="l00433"></a>00433 <span class="keyword">const</span> <span class="keywordtype">char</span> *current = data + consumed;
459
- <a name="l00434"></a>00434 <span class="keywordtype">size_t</span> rest = size - consumed;
460
- <a name="l00435"></a>00435
461
- <a name="l00436"></a>00436 <span class="keywordflow">switch</span> (state) {
462
- <a name="l00437"></a>00437 <span class="keywordflow">case</span> READING_HEADER:
463
- <a name="l00438"></a>00438 consumed += headerReader.feed(current, rest);
464
- <a name="l00439"></a>00439 <span class="keywordflow">if</span> (headerReader.done()) {
465
- <a name="l00440"></a>00440 <span class="keywordflow">if</span> (maxSize &gt; 0 &amp;&amp; headerReader.value() &gt; maxSize) {
466
- <a name="l00441"></a>00441 state = ERROR;
467
- <a name="l00442"></a>00442 error = TOO_LARGE;
468
- <a name="l00443"></a>00443 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (headerReader.value() == 0) {
469
- <a name="l00444"></a>00444 state = DONE;
470
- <a name="l00445"></a>00445 } <span class="keywordflow">else</span> {
471
- <a name="l00446"></a>00446 state = READING_BODY;
472
- <a name="l00447"></a>00447 }
473
- <a name="l00448"></a>00448 }
474
- <a name="l00449"></a>00449 <span class="keywordflow">break</span>;
475
- <a name="l00450"></a>00450 <span class="keywordflow">case</span> READING_BODY:
476
- <a name="l00451"></a>00451 <span class="keywordflow">if</span> (buffer.empty() &amp;&amp; rest &gt;= headerReader.value()) {
477
- <a name="l00452"></a>00452 result = StaticString(current, headerReader.value());
478
- <a name="l00453"></a>00453 state = DONE;
479
- <a name="l00454"></a>00454 consumed += headerReader.value();
480
- <a name="l00455"></a>00455 } <span class="keywordflow">else</span> {
481
- <a name="l00456"></a>00456 <span class="keywordtype">size_t</span> toConsume = std::min(rest,
482
- <a name="l00457"></a>00457 headerReader.value() - buffer.size());
483
- <a name="l00458"></a>00458 <span class="keywordflow">if</span> (buffer.capacity() &lt; headerReader.value()) {
484
- <a name="l00459"></a>00459 buffer.reserve(headerReader.value());
485
- <a name="l00460"></a>00460 }
486
- <a name="l00461"></a>00461 buffer.append(current, toConsume);
487
- <a name="l00462"></a>00462 consumed += toConsume;
488
- <a name="l00463"></a>00463 <span class="keywordflow">if</span> (buffer.size() == headerReader.value()) {
489
- <a name="l00464"></a>00464 result = StaticString(buffer);
490
- <a name="l00465"></a>00465 state = DONE;
491
- <a name="l00466"></a>00466 }
492
- <a name="l00467"></a>00467 }
493
- <a name="l00468"></a>00468 <span class="keywordflow">break</span>;
494
- <a name="l00469"></a>00469 <span class="keywordflow">default</span>:
495
- <a name="l00470"></a>00470 <span class="comment">// Never reached.</span>
496
- <a name="l00471"></a>00471 abort();
497
- <a name="l00472"></a>00472 };
498
- <a name="l00473"></a>00473 }
499
- <a name="l00474"></a>00474 <span class="keywordflow">return</span> consumed;
500
- <a name="l00475"></a>00475 }
501
- <a name="l00476"></a>00476
502
- <a name="l00477"></a>00477 <span class="keywordtype">bool</span> done()<span class="keyword"> const </span>{
503
- <a name="l00478"></a>00478 <span class="keywordflow">return</span> state == DONE || state == ERROR;
504
- <a name="l00479"></a>00479 }
505
- <a name="l00480"></a>00480
506
- <a name="l00481"></a>00481 <span class="keywordtype">bool</span> hasError()<span class="keyword"> const </span>{
507
- <a name="l00482"></a>00482 <span class="keywordflow">return</span> state == ERROR;
508
- <a name="l00483"></a>00483 }
509
- <a name="l00484"></a>00484
510
- <a name="l00485"></a>00485 Error errorCode()<span class="keyword"> const </span>{
511
- <a name="l00486"></a>00486 <span class="keywordflow">return</span> (Error) error;
512
- <a name="l00487"></a>00487 }
513
- <a name="l00488"></a>00488
514
- <a name="l00489"></a>00489 <span class="keyword">const</span> StaticString &amp;value()<span class="keyword"> const </span>{
515
- <a name="l00490"></a>00490 <span class="keywordflow">return</span> result;
516
- <a name="l00491"></a>00491 }
517
- <a name="l00492"></a>00492
518
- <a name="l00493"></a>00493 <span class="keyword">static</span> <span class="keywordtype">void</span> generate(<span class="keyword">const</span> StaticString &amp;data, <span class="keywordtype">char</span> headerBuf[<span class="keyword">sizeof</span>(uint32_t)],
519
- <a name="l00494"></a>00494 StaticString output[2])
520
- <a name="l00495"></a>00495 {
521
- <a name="l00496"></a>00496 <span class="keywordflow">if</span> (OXT_UNLIKELY(data.size() &gt; 0xFFFFFFFF)) {
522
- <a name="l00497"></a>00497 <span class="keywordflow">throw</span> ArgumentException(<span class="stringliteral">&quot;Data size exceeds maximum size for scalar messages.&quot;</span>);
523
- <a name="l00498"></a>00498 }
524
- <a name="l00499"></a>00499
525
- <a name="l00500"></a>00500 Uint32Message::generate(headerBuf, data.size());
526
- <a name="l00501"></a>00501 output[0] = StaticString(headerBuf, <span class="keyword">sizeof</span>(uint32_t));
527
- <a name="l00502"></a>00502 output[1] = data;
528
- <a name="l00503"></a>00503 }
529
- <a name="l00504"></a>00504 };
530
- <a name="l00505"></a>00505
531
- <a name="l00506"></a>00506 } <span class="comment">// namespace Passenger</span>
532
- <a name="l00507"></a>00507
533
- <a name="l00508"></a>00508 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_MESSAGE_READERS_WRITERS_H_ */</span>
534
- </pre></div></div>
535
- <hr size="1"/><address style="text-align: right;"><small>Generated by&nbsp;
536
- <a href="http://www.doxygen.org/index.html">
537
- <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.2 </small></address>
538
- </body>
539
- </html>