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.
- data/NEWS +14 -0
- data/ext/apache2/Hooks.cpp +2 -2
- data/ext/boost/thread/exceptions.hpp +8 -1
- data/ext/common/Constants.h +1 -1
- data/ext/nginx/Configuration.c +2 -1
- data/lib/phusion_passenger.rb +1 -1
- metadata +4 -618
- data/doc/cxxapi/AbstractSpawnManager_8h-source.html +0 -138
- data/doc/cxxapi/AbstractSpawnManager_8h_source.html +0 -141
- data/doc/cxxapi/Account_8h-source.html +0 -202
- data/doc/cxxapi/Account_8h_source.html +0 -206
- data/doc/cxxapi/AccountsDatabase_8h-source.html +0 -158
- data/doc/cxxapi/AccountsDatabase_8h_source.html +0 -161
- data/doc/cxxapi/AgentBase_8h_source.html +0 -70
- data/doc/cxxapi/AgentsStarter_8h-source.html +0 -79
- data/doc/cxxapi/AgentsStarter_8h_source.html +0 -112
- data/doc/cxxapi/BCrypt_8h-source.html +0 -101
- data/doc/cxxapi/BCrypt_8h_source.html +0 -104
- data/doc/cxxapi/BacktracesServer_8h-source.html +0 -87
- data/doc/cxxapi/Base64_8h-source.html +0 -85
- data/doc/cxxapi/Blowfish_8h-source.html +0 -131
- data/doc/cxxapi/Blowfish_8h_source.html +0 -134
- data/doc/cxxapi/Bucket_8h-source.html +0 -115
- data/doc/cxxapi/Bucket_8h_source.html +0 -118
- data/doc/cxxapi/CachedFileStat_8h-source.html +0 -79
- data/doc/cxxapi/Configuration_8h-source.html +0 -432
- data/doc/cxxapi/Configuration_8h_source.html +0 -435
- data/doc/cxxapi/Constants_8h-source.html +0 -71
- data/doc/cxxapi/Constants_8h_source.html +0 -79
- data/doc/cxxapi/ContentHandler_8h-source.html +0 -92
- data/doc/cxxapi/ContentHandler_8h_source.html +0 -95
- data/doc/cxxapi/DirectoryMapper_8h-source.html +0 -324
- data/doc/cxxapi/DirectoryMapper_8h_source.html +0 -311
- data/doc/cxxapi/EventedClient_8h_source.html +0 -733
- data/doc/cxxapi/EventedMessageServer_8h_source.html +0 -358
- data/doc/cxxapi/EventedServer_8h-source.html +0 -415
- data/doc/cxxapi/EventedServer_8h_source.html +0 -326
- data/doc/cxxapi/Exceptions_8h-source.html +0 -363
- data/doc/cxxapi/Exceptions_8h_source.html +0 -393
- data/doc/cxxapi/FileChangeChecker_8h-source.html +0 -237
- data/doc/cxxapi/FileDescriptor_8h-source.html +0 -206
- data/doc/cxxapi/FileDescriptor_8h_source.html +0 -324
- data/doc/cxxapi/Hooks_8h-source.html +0 -73
- data/doc/cxxapi/Hooks_8h_source.html +0 -76
- data/doc/cxxapi/HttpStatusExtractor_8h-source.html +0 -379
- data/doc/cxxapi/HttpStatusExtractor_8h_source.html +0 -382
- data/doc/cxxapi/IniFile_8h_source.html +0 -527
- data/doc/cxxapi/LoggingServer_8h-source.html +0 -165
- data/doc/cxxapi/Logging_8h-source.html +0 -709
- data/doc/cxxapi/Logging_8h_source.html +0 -796
- data/doc/cxxapi/MessageChannel_8h-source.html +0 -852
- data/doc/cxxapi/MessageChannel_8h_source.html +0 -776
- data/doc/cxxapi/MessageClient_8h-source.html +0 -297
- data/doc/cxxapi/MessageClient_8h_source.html +0 -328
- data/doc/cxxapi/MessageReadersWriters_8h-source.html +0 -451
- data/doc/cxxapi/MessageReadersWriters_8h_source.html +0 -539
- data/doc/cxxapi/MessageServer_8h-source.html +0 -607
- data/doc/cxxapi/MessageServer_8h_source.html +0 -612
- data/doc/cxxapi/PoolOptions_8h-source.html +0 -511
- data/doc/cxxapi/PoolOptions_8h_source.html +0 -549
- data/doc/cxxapi/Process_8h-source.html +0 -283
- data/doc/cxxapi/Process_8h_source.html +0 -286
- data/doc/cxxapi/RandomGenerator_8h-source.html +0 -183
- data/doc/cxxapi/RandomGenerator_8h_source.html +0 -191
- data/doc/cxxapi/ResourceLocator_8h-source.html +0 -104
- data/doc/cxxapi/ResourceLocator_8h_source.html +0 -166
- data/doc/cxxapi/SafeLibev_8h_source.html +0 -180
- data/doc/cxxapi/ScgiRequestParser_8h-source.html +0 -400
- data/doc/cxxapi/ScgiRequestParser_8h_source.html +0 -406
- data/doc/cxxapi/ServerInstanceDir_8h-source.html +0 -356
- data/doc/cxxapi/ServerInstanceDir_8h_source.html +0 -378
- data/doc/cxxapi/Session_8h-source.html +0 -496
- data/doc/cxxapi/Session_8h_source.html +0 -501
- data/doc/cxxapi/SpawnManager_8h-source.html +0 -632
- data/doc/cxxapi/SpawnManager_8h_source.html +0 -647
- data/doc/cxxapi/StaticContentHandler_8h-source.html +0 -65
- data/doc/cxxapi/StaticContentHandler_8h_source.html +0 -68
- data/doc/cxxapi/StaticString_8h-source.html +0 -214
- data/doc/cxxapi/StaticString_8h_source.html +0 -329
- data/doc/cxxapi/StringListCreator_8h-source.html +0 -111
- data/doc/cxxapi/StringListCreator_8h_source.html +0 -114
- data/doc/cxxapi/SystemTime_8h-source.html +0 -222
- data/doc/cxxapi/Timer_8h-source.html +0 -157
- data/doc/cxxapi/Utils_8h-source.html +0 -688
- data/doc/cxxapi/Utils_8h_source.html +0 -459
- data/doc/cxxapi/Version_8h-source.html +0 -59
- data/doc/cxxapi/annotated.html +0 -87
- data/doc/cxxapi/apache2_2Configuration_8h-source.html +0 -79
- data/doc/cxxapi/apache2_2Configuration_8h_source.html +0 -82
- data/doc/cxxapi/classAgentWatcher-members.html +0 -54
- data/doc/cxxapi/classAgentWatcher.html +0 -419
- data/doc/cxxapi/classClient-members.html +0 -38
- data/doc/cxxapi/classClient.html +0 -123
- data/doc/cxxapi/classHooks-members.html +0 -40
- data/doc/cxxapi/classHooks.html +0 -153
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager-members.html +0 -40
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager.html +0 -187
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager__inherit__graph.map +0 -1
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1ArgumentException-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1ArgumentException.html +0 -56
- data/doc/cxxapi/classPassenger_1_1ArrayMessage-members.html +0 -37
- data/doc/cxxapi/classPassenger_1_1ArrayMessage.html +0 -113
- data/doc/cxxapi/classPassenger_1_1ArrayReader-members.html +0 -33
- data/doc/cxxapi/classPassenger_1_1ArrayReader.html +0 -47
- data/doc/cxxapi/classPassenger_1_1BacktracesServer-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1BacktracesServer.html +0 -107
- data/doc/cxxapi/classPassenger_1_1BacktracesServer__inherit__graph.map +0 -1
- data/doc/cxxapi/classPassenger_1_1BacktracesServer__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1BacktracesServer__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1BufferedUpload-members.html +0 -38
- data/doc/cxxapi/classPassenger_1_1BufferedUpload.html +0 -112
- data/doc/cxxapi/classPassenger_1_1BusyException-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1BusyException.html +0 -54
- data/doc/cxxapi/classPassenger_1_1ConfigurationException-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1ConfigurationException.html +0 -51
- data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +0 -41
- data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +0 -223
- data/doc/cxxapi/classPassenger_1_1EOFException-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1EOFException.html +0 -61
- data/doc/cxxapi/classPassenger_1_1EOFException__inherit__graph.map +0 -1
- data/doc/cxxapi/classPassenger_1_1EOFException__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1EOFException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1EventFd-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1EventFd.html +0 -52
- data/doc/cxxapi/classPassenger_1_1EventedClient-members.html +0 -59
- data/doc/cxxapi/classPassenger_1_1EventedClient.html +0 -531
- data/doc/cxxapi/classPassenger_1_1EventedMessageServer-members.html +0 -37
- data/doc/cxxapi/classPassenger_1_1EventedMessageServer.html +0 -59
- data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.map +0 -3
- data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1EventedServer-members.html +0 -37
- data/doc/cxxapi/classPassenger_1_1EventedServer.html +0 -93
- data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.map +0 -3
- data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1FileChangeChecker-members.html +0 -37
- data/doc/cxxapi/classPassenger_1_1FileChangeChecker.html +0 -166
- data/doc/cxxapi/classPassenger_1_1FileDescriptor-members.html +0 -41
- data/doc/cxxapi/classPassenger_1_1FileDescriptor.html +0 -178
- data/doc/cxxapi/classPassenger_1_1FileDescriptorPair-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1FileDescriptorPair.html +0 -52
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException.html +0 -58
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.map +0 -1
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1FileSystemException-members.html +0 -41
- data/doc/cxxapi/classPassenger_1_1FileSystemException.html +0 -66
- data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.map +0 -1
- data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor-members.html +0 -39
- data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor.html +0 -128
- data/doc/cxxapi/classPassenger_1_1IOException-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1IOException.html +0 -61
- data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.map +0 -2
- data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1MemZeroGuard-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1MemZeroGuard.html +0 -147
- data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +0 -57
- data/doc/cxxapi/classPassenger_1_1MessageChannel.html +0 -839
- data/doc/cxxapi/classPassenger_1_1MessageServer-members.html +0 -49
- data/doc/cxxapi/classPassenger_1_1MessageServer.html +0 -407
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext.html +0 -58
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.map +0 -3
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext-members.html +0 -41
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext.html +0 -165
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.map +0 -3
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler-members.html +0 -39
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler.html +0 -173
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler__inherit__graph.map +0 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1Process-members.html +0 -44
- data/doc/cxxapi/classPassenger_1_1Process.html +0 -290
- data/doc/cxxapi/classPassenger_1_1RandomGenerator-members.html +0 -37
- data/doc/cxxapi/classPassenger_1_1RandomGenerator.html +0 -79
- data/doc/cxxapi/classPassenger_1_1ResourceLocator-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1ResourceLocator.html +0 -51
- data/doc/cxxapi/classPassenger_1_1RuntimeException-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1RuntimeException.html +0 -54
- data/doc/cxxapi/classPassenger_1_1SafeLibev-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1SafeLibev.html +0 -51
- data/doc/cxxapi/classPassenger_1_1ScalarMessage-members.html +0 -37
- data/doc/cxxapi/classPassenger_1_1ScalarMessage.html +0 -76
- data/doc/cxxapi/classPassenger_1_1ScalarReader-members.html +0 -33
- data/doc/cxxapi/classPassenger_1_1ScalarReader.html +0 -47
- data/doc/cxxapi/classPassenger_1_1ScgiRequestParser-members.html +0 -50
- data/doc/cxxapi/classPassenger_1_1ScgiRequestParser.html +0 -285
- data/doc/cxxapi/classPassenger_1_1SecurityException-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1SecurityException.html +0 -56
- data/doc/cxxapi/classPassenger_1_1Session-members.html +0 -53
- data/doc/cxxapi/classPassenger_1_1Session.html +0 -556
- data/doc/cxxapi/classPassenger_1_1Session__inherit__graph.map +0 -1
- data/doc/cxxapi/classPassenger_1_1Session__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1Session__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +0 -39
- data/doc/cxxapi/classPassenger_1_1SpawnException.html +0 -101
- data/doc/cxxapi/classPassenger_1_1SpawnManager-members.html +0 -42
- data/doc/cxxapi/classPassenger_1_1SpawnManager.html +0 -292
- data/doc/cxxapi/classPassenger_1_1SpawnManager__inherit__graph.map +0 -1
- data/doc/cxxapi/classPassenger_1_1SpawnManager__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1SpawnManager__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1StandardSession-members.html +0 -54
- data/doc/cxxapi/classPassenger_1_1StandardSession.html +0 -394
- data/doc/cxxapi/classPassenger_1_1StandardSession__inherit__graph.map +0 -1
- data/doc/cxxapi/classPassenger_1_1StandardSession__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1StandardSession__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1StaticString-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1StaticString.html +0 -56
- data/doc/cxxapi/classPassenger_1_1SystemException-members.html +0 -40
- data/doc/cxxapi/classPassenger_1_1SystemException.html +0 -155
- data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.map +0 -2
- data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1SystemTime-members.html +0 -43
- data/doc/cxxapi/classPassenger_1_1SystemTime.html +0 -173
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException-members.html +0 -40
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException.html +0 -61
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException__inherit__graph.map +0 -1
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1TimeoutException-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1TimeoutException.html +0 -54
- data/doc/cxxapi/classPassenger_1_1Timer-members.html +0 -38
- data/doc/cxxapi/classPassenger_1_1Timer.html +0 -163
- data/doc/cxxapi/classPassenger_1_1Uint16Message-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1Uint16Message.html +0 -51
- data/doc/cxxapi/classPassenger_1_1Uint16Reader-members.html +0 -33
- data/doc/cxxapi/classPassenger_1_1Uint16Reader.html +0 -47
- data/doc/cxxapi/classPassenger_1_1Uint32Message-members.html +0 -36
- data/doc/cxxapi/classPassenger_1_1Uint32Message.html +0 -51
- data/doc/cxxapi/classPassenger_1_1Uint32Reader-members.html +0 -33
- data/doc/cxxapi/classPassenger_1_1Uint32Reader.html +0 -47
- data/doc/cxxapi/classServer-members.html +0 -36
- data/doc/cxxapi/classServer.html +0 -49
- data/doc/cxxapi/classServerInstanceDirToucher-members.html +0 -36
- data/doc/cxxapi/classServerInstanceDirToucher.html +0 -47
- data/doc/cxxapi/classes.html +0 -52
- data/doc/cxxapi/definitions_8h-source.html +0 -33
- data/doc/cxxapi/definitions_8h_source.html +0 -36
- data/doc/cxxapi/doxygen.css +0 -532
- data/doc/cxxapi/doxygen.png +0 -0
- data/doc/cxxapi/files.html +0 -76
- data/doc/cxxapi/ftv2blank.png +0 -0
- data/doc/cxxapi/ftv2doc.png +0 -0
- data/doc/cxxapi/ftv2folderclosed.png +0 -0
- data/doc/cxxapi/ftv2folderopen.png +0 -0
- data/doc/cxxapi/ftv2lastnode.png +0 -0
- data/doc/cxxapi/ftv2link.png +0 -0
- data/doc/cxxapi/ftv2mlastnode.png +0 -0
- data/doc/cxxapi/ftv2mnode.png +0 -0
- data/doc/cxxapi/ftv2node.png +0 -0
- data/doc/cxxapi/ftv2plastnode.png +0 -0
- data/doc/cxxapi/ftv2pnode.png +0 -0
- data/doc/cxxapi/ftv2vertline.png +0 -0
- data/doc/cxxapi/functions.html +0 -103
- data/doc/cxxapi/functions_0x62.html +0 -82
- data/doc/cxxapi/functions_0x63.html +0 -102
- data/doc/cxxapi/functions_0x64.html +0 -102
- data/doc/cxxapi/functions_0x65.html +0 -88
- data/doc/cxxapi/functions_0x66.html +0 -100
- data/doc/cxxapi/functions_0x67.html +0 -167
- data/doc/cxxapi/functions_0x68.html +0 -88
- data/doc/cxxapi/functions_0x69.html +0 -96
- data/doc/cxxapi/functions_0x6b.html +0 -80
- data/doc/cxxapi/functions_0x6c.html +0 -88
- data/doc/cxxapi/functions_0x6d.html +0 -88
- data/doc/cxxapi/functions_0x6e.html +0 -86
- data/doc/cxxapi/functions_0x6f.html +0 -94
- data/doc/cxxapi/functions_0x70.html +0 -94
- data/doc/cxxapi/functions_0x72.html +0 -110
- data/doc/cxxapi/functions_0x73.html +0 -171
- data/doc/cxxapi/functions_0x74.html +0 -85
- data/doc/cxxapi/functions_0x75.html +0 -85
- data/doc/cxxapi/functions_0x77.html +0 -92
- data/doc/cxxapi/functions_0x7e.html +0 -79
- data/doc/cxxapi/functions_enum.html +0 -49
- data/doc/cxxapi/functions_eval.html +0 -67
- data/doc/cxxapi/functions_func.html +0 -531
- data/doc/cxxapi/functions_vars.html +0 -278
- data/doc/cxxapi/graph_legend.dot +0 -22
- data/doc/cxxapi/graph_legend.html +0 -92
- data/doc/cxxapi/graph_legend.png +0 -0
- data/doc/cxxapi/group__Configuration.html +0 -198
- data/doc/cxxapi/group__Configuration.map +0 -3
- data/doc/cxxapi/group__Configuration.png +0 -0
- data/doc/cxxapi/group__Core.html +0 -46
- data/doc/cxxapi/group__Core.map +0 -3
- data/doc/cxxapi/group__Core.png +0 -0
- data/doc/cxxapi/group__Exceptions.html +0 -53
- data/doc/cxxapi/group__Hooks.html +0 -42
- data/doc/cxxapi/group__Hooks.map +0 -3
- data/doc/cxxapi/group__Hooks.png +0 -0
- data/doc/cxxapi/group__Support.html +0 -538
- data/doc/cxxapi/hierarchy.html +0 -101
- data/doc/cxxapi/index.html +0 -16
- data/doc/cxxapi/inherit__graph__0.map +0 -1
- data/doc/cxxapi/inherit__graph__0.md5 +0 -1
- data/doc/cxxapi/inherit__graph__0.png +0 -0
- data/doc/cxxapi/inherit__graph__1.map +0 -1
- data/doc/cxxapi/inherit__graph__1.md5 +0 -1
- data/doc/cxxapi/inherit__graph__1.png +0 -0
- data/doc/cxxapi/inherit__graph__10.map +0 -3
- data/doc/cxxapi/inherit__graph__10.md5 +0 -1
- data/doc/cxxapi/inherit__graph__10.png +0 -0
- data/doc/cxxapi/inherit__graph__11.map +0 -4
- data/doc/cxxapi/inherit__graph__11.md5 +0 -1
- data/doc/cxxapi/inherit__graph__11.png +0 -0
- data/doc/cxxapi/inherit__graph__12.map +0 -3
- data/doc/cxxapi/inherit__graph__12.md5 +0 -1
- data/doc/cxxapi/inherit__graph__12.png +0 -0
- data/doc/cxxapi/inherit__graph__13.map +0 -3
- data/doc/cxxapi/inherit__graph__13.md5 +0 -1
- data/doc/cxxapi/inherit__graph__13.png +0 -0
- data/doc/cxxapi/inherit__graph__14.map +0 -3
- data/doc/cxxapi/inherit__graph__14.md5 +0 -1
- data/doc/cxxapi/inherit__graph__14.png +0 -0
- data/doc/cxxapi/inherit__graph__15.map +0 -3
- data/doc/cxxapi/inherit__graph__15.md5 +0 -1
- data/doc/cxxapi/inherit__graph__15.png +0 -0
- data/doc/cxxapi/inherit__graph__16.map +0 -5
- data/doc/cxxapi/inherit__graph__16.md5 +0 -1
- data/doc/cxxapi/inherit__graph__16.png +0 -0
- data/doc/cxxapi/inherit__graph__17.map +0 -3
- data/doc/cxxapi/inherit__graph__17.md5 +0 -1
- data/doc/cxxapi/inherit__graph__17.png +0 -0
- data/doc/cxxapi/inherit__graph__18.map +0 -3
- data/doc/cxxapi/inherit__graph__18.md5 +0 -1
- data/doc/cxxapi/inherit__graph__18.png +0 -0
- data/doc/cxxapi/inherit__graph__19.map +0 -4
- data/doc/cxxapi/inherit__graph__19.md5 +0 -1
- data/doc/cxxapi/inherit__graph__19.png +0 -0
- data/doc/cxxapi/inherit__graph__2.map +0 -1
- data/doc/cxxapi/inherit__graph__2.md5 +0 -1
- data/doc/cxxapi/inherit__graph__2.png +0 -0
- data/doc/cxxapi/inherit__graph__20.map +0 -3
- data/doc/cxxapi/inherit__graph__20.md5 +0 -1
- data/doc/cxxapi/inherit__graph__20.png +0 -0
- data/doc/cxxapi/inherit__graph__21.map +0 -3
- data/doc/cxxapi/inherit__graph__21.md5 +0 -1
- data/doc/cxxapi/inherit__graph__21.png +0 -0
- data/doc/cxxapi/inherit__graph__22.map +0 -3
- data/doc/cxxapi/inherit__graph__22.md5 +0 -1
- data/doc/cxxapi/inherit__graph__22.png +0 -0
- data/doc/cxxapi/inherit__graph__23.map +0 -3
- data/doc/cxxapi/inherit__graph__23.md5 +0 -1
- data/doc/cxxapi/inherit__graph__23.png +0 -0
- data/doc/cxxapi/inherit__graph__24.map +0 -3
- data/doc/cxxapi/inherit__graph__24.md5 +0 -1
- data/doc/cxxapi/inherit__graph__24.png +0 -0
- data/doc/cxxapi/inherit__graph__25.map +0 -3
- data/doc/cxxapi/inherit__graph__25.md5 +0 -1
- data/doc/cxxapi/inherit__graph__25.png +0 -0
- data/doc/cxxapi/inherit__graph__26.map +0 -3
- data/doc/cxxapi/inherit__graph__26.md5 +0 -1
- data/doc/cxxapi/inherit__graph__26.png +0 -0
- data/doc/cxxapi/inherit__graph__27.map +0 -3
- data/doc/cxxapi/inherit__graph__27.md5 +0 -1
- data/doc/cxxapi/inherit__graph__27.png +0 -0
- data/doc/cxxapi/inherit__graph__28.map +0 -3
- data/doc/cxxapi/inherit__graph__28.md5 +0 -1
- data/doc/cxxapi/inherit__graph__28.png +0 -0
- data/doc/cxxapi/inherit__graph__29.map +0 -3
- data/doc/cxxapi/inherit__graph__29.md5 +0 -1
- data/doc/cxxapi/inherit__graph__29.png +0 -0
- data/doc/cxxapi/inherit__graph__3.map +0 -2
- data/doc/cxxapi/inherit__graph__3.md5 +0 -1
- data/doc/cxxapi/inherit__graph__3.png +0 -0
- data/doc/cxxapi/inherit__graph__30.map +0 -3
- data/doc/cxxapi/inherit__graph__30.md5 +0 -1
- data/doc/cxxapi/inherit__graph__30.png +0 -0
- data/doc/cxxapi/inherit__graph__31.map +0 -4
- data/doc/cxxapi/inherit__graph__31.md5 +0 -1
- data/doc/cxxapi/inherit__graph__31.png +0 -0
- data/doc/cxxapi/inherit__graph__32.map +0 -3
- data/doc/cxxapi/inherit__graph__32.md5 +0 -1
- data/doc/cxxapi/inherit__graph__32.png +0 -0
- data/doc/cxxapi/inherit__graph__33.map +0 -3
- data/doc/cxxapi/inherit__graph__33.md5 +0 -1
- data/doc/cxxapi/inherit__graph__33.png +0 -0
- data/doc/cxxapi/inherit__graph__34.map +0 -3
- data/doc/cxxapi/inherit__graph__34.md5 +0 -1
- data/doc/cxxapi/inherit__graph__34.png +0 -0
- data/doc/cxxapi/inherit__graph__35.map +0 -3
- data/doc/cxxapi/inherit__graph__35.md5 +0 -1
- data/doc/cxxapi/inherit__graph__35.png +0 -0
- data/doc/cxxapi/inherit__graph__36.map +0 -5
- data/doc/cxxapi/inherit__graph__36.md5 +0 -1
- data/doc/cxxapi/inherit__graph__36.png +0 -0
- data/doc/cxxapi/inherit__graph__37.map +0 -3
- data/doc/cxxapi/inherit__graph__37.md5 +0 -1
- data/doc/cxxapi/inherit__graph__37.png +0 -0
- data/doc/cxxapi/inherit__graph__38.map +0 -3
- data/doc/cxxapi/inherit__graph__38.md5 +0 -1
- data/doc/cxxapi/inherit__graph__38.png +0 -0
- data/doc/cxxapi/inherit__graph__39.map +0 -3
- data/doc/cxxapi/inherit__graph__39.md5 +0 -1
- data/doc/cxxapi/inherit__graph__39.png +0 -0
- data/doc/cxxapi/inherit__graph__4.map +0 -3
- data/doc/cxxapi/inherit__graph__4.md5 +0 -1
- data/doc/cxxapi/inherit__graph__4.png +0 -0
- data/doc/cxxapi/inherit__graph__40.map +0 -3
- data/doc/cxxapi/inherit__graph__40.md5 +0 -1
- data/doc/cxxapi/inherit__graph__40.png +0 -0
- data/doc/cxxapi/inherit__graph__5.map +0 -3
- data/doc/cxxapi/inherit__graph__5.md5 +0 -1
- data/doc/cxxapi/inherit__graph__5.png +0 -0
- data/doc/cxxapi/inherit__graph__6.map +0 -3
- data/doc/cxxapi/inherit__graph__6.md5 +0 -1
- data/doc/cxxapi/inherit__graph__6.png +0 -0
- data/doc/cxxapi/inherit__graph__7.map +0 -3
- data/doc/cxxapi/inherit__graph__7.md5 +0 -1
- data/doc/cxxapi/inherit__graph__7.png +0 -0
- data/doc/cxxapi/inherit__graph__8.map +0 -3
- data/doc/cxxapi/inherit__graph__8.md5 +0 -1
- data/doc/cxxapi/inherit__graph__8.png +0 -0
- data/doc/cxxapi/inherit__graph__9.map +0 -3
- data/doc/cxxapi/inherit__graph__9.md5 +0 -1
- data/doc/cxxapi/inherit__graph__9.png +0 -0
- data/doc/cxxapi/inherits.html +0 -165
- data/doc/cxxapi/main.html +0 -28
- data/doc/cxxapi/md5_8h-source.html +0 -121
- data/doc/cxxapi/modules.html +0 -36
- data/doc/cxxapi/namespacePassenger.html +0 -553
- data/doc/cxxapi/namespacemembers.html +0 -135
- data/doc/cxxapi/namespacemembers_enum.html +0 -48
- data/doc/cxxapi/namespacemembers_eval.html +0 -57
- data/doc/cxxapi/namespacemembers_func.html +0 -111
- data/doc/cxxapi/namespacemembers_type.html +0 -54
- data/doc/cxxapi/namespaces.html +0 -37
- data/doc/cxxapi/nginx_2Configuration_8h-source.html +0 -115
- data/doc/cxxapi/nginx_2Configuration_8h_source.html +0 -125
- data/doc/cxxapi/ngx__http__passenger__module_8h-source.html +0 -91
- data/doc/cxxapi/ngx__http__passenger__module_8h_source.html +0 -94
- data/doc/cxxapi/structPassenger_1_1AnythingToString-members.html +0 -33
- data/doc/cxxapi/structPassenger_1_1AnythingToString.html +0 -52
- data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01StaticString_01_4_01_4-members.html +0 -33
- data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01StaticString_01_4_01_4.html +0 -52
- data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4-members.html +0 -33
- data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4.html +0 -52
- data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard-members.html +0 -36
- data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard.html +0 -51
- data/doc/cxxapi/structPassenger_1_1PoolOptions-members.html +0 -67
- data/doc/cxxapi/structPassenger_1_1PoolOptions.html +0 -647
- data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash-members.html +0 -36
- data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash.html +0 -51
- data/doc/cxxapi/tab_b.gif +0 -0
- data/doc/cxxapi/tab_l.gif +0 -0
- data/doc/cxxapi/tab_r.gif +0 -0
- data/doc/cxxapi/tabs.css +0 -105
- data/doc/cxxapi/tree.html +0 -249
- data/doc/rdoc/classes/ConditionVariable.html +0 -215
- data/doc/rdoc/classes/Exception.html +0 -120
- data/doc/rdoc/classes/GC.html +0 -113
- data/doc/rdoc/classes/IO.html +0 -221
- data/doc/rdoc/classes/PhusionPassenger.html +0 -397
- data/doc/rdoc/classes/PhusionPassenger/AbstractInstaller.html +0 -180
- data/doc/rdoc/classes/PhusionPassenger/AbstractRequestHandler.html +0 -647
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer.html +0 -654
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer/InvalidPassword.html +0 -92
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerAlreadyStarted.html +0 -97
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerError.html +0 -96
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerNotStarted.html +0 -97
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer/UnknownMessage.html +0 -96
- data/doc/rdoc/classes/PhusionPassenger/AbstractServerCollection.html +0 -619
- data/doc/rdoc/classes/PhusionPassenger/AdminTools.html +0 -142
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/MemoryStats.html +0 -368
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/MemoryStats/Process.html +0 -231
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance.html +0 -588
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/CorruptedDirectoryError.html +0 -92
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/GenerationsAbsentError.html +0 -92
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/Group.html +0 -147
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/Process.html +0 -279
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/RoleDeniedError.html +0 -92
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/StaleDirectoryError.html +0 -92
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/Stats.html +0 -123
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/UnsupportedGenerationStructureVersionError.html +0 -92
- data/doc/rdoc/classes/PhusionPassenger/AnalyticsLogger.html +0 -368
- data/doc/rdoc/classes/PhusionPassenger/AnalyticsLogger/Log.html +0 -299
- data/doc/rdoc/classes/PhusionPassenger/AnalyticsLogger/SharedData.html +0 -206
- data/doc/rdoc/classes/PhusionPassenger/AppInitError.html +0 -155
- data/doc/rdoc/classes/PhusionPassenger/AppProcess.html +0 -367
- data/doc/rdoc/classes/PhusionPassenger/ClassicRails.html +0 -95
- data/doc/rdoc/classes/PhusionPassenger/ClassicRails/ApplicationSpawner.html +0 -351
- data/doc/rdoc/classes/PhusionPassenger/ClassicRails/ApplicationSpawner/Error.html +0 -98
- data/doc/rdoc/classes/PhusionPassenger/ClassicRails/CGIFixed.html +0 -200
- data/doc/rdoc/classes/PhusionPassenger/ClassicRails/FrameworkSpawner.html +0 -410
- data/doc/rdoc/classes/PhusionPassenger/ClassicRails/FrameworkSpawner/Error.html +0 -98
- data/doc/rdoc/classes/PhusionPassenger/ClassicRails/RequestHandler.html +0 -156
- data/doc/rdoc/classes/PhusionPassenger/ClassicRailsExtensions.html +0 -115
- data/doc/rdoc/classes/PhusionPassenger/ClassicRailsExtensions/AnalyticsLogging.html +0 -202
- data/doc/rdoc/classes/PhusionPassenger/ConsoleTextTemplate.html +0 -172
- data/doc/rdoc/classes/PhusionPassenger/DebugLogging.html +0 -273
- data/doc/rdoc/classes/PhusionPassenger/FrameworkInitError.html +0 -145
- data/doc/rdoc/classes/PhusionPassenger/HTMLTemplate.html +0 -162
- data/doc/rdoc/classes/PhusionPassenger/InitializationError.html +0 -141
- data/doc/rdoc/classes/PhusionPassenger/InvalidPath.html +0 -92
- data/doc/rdoc/classes/PhusionPassenger/MessageChannel.html +0 -673
- data/doc/rdoc/classes/PhusionPassenger/MessageChannel/InvalidHashError.html +0 -92
- data/doc/rdoc/classes/PhusionPassenger/MessageClient.html +0 -415
- data/doc/rdoc/classes/PhusionPassenger/NativeSupportLoader.html +0 -134
- data/doc/rdoc/classes/PhusionPassenger/Packaging.html +0 -129
- data/doc/rdoc/classes/PhusionPassenger/PlatformInfo.html +0 -1972
- data/doc/rdoc/classes/PhusionPassenger/Plugin.html +0 -237
- data/doc/rdoc/classes/PhusionPassenger/Rack.html +0 -91
- data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner.html +0 -312
- data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner/Error.html +0 -98
- data/doc/rdoc/classes/PhusionPassenger/Rack/RequestHandler.html +0 -218
- data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions.html +0 -114
- data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging.html +0 -259
- data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging/ACExtension.html +0 -139
- data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging/ASBenchmarkableExtension.html +0 -118
- data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging/ExceptionLogger.html +0 -135
- data/doc/rdoc/classes/PhusionPassenger/SpawnManager.html +0 -378
- data/doc/rdoc/classes/PhusionPassenger/Standalone.html +0 -111
- data/doc/rdoc/classes/PhusionPassenger/Standalone/AppFinder.html +0 -252
- data/doc/rdoc/classes/PhusionPassenger/Standalone/Command.html +0 -161
- data/doc/rdoc/classes/PhusionPassenger/Standalone/ConfigFile.html +0 -368
- data/doc/rdoc/classes/PhusionPassenger/Standalone/ConfigFile/DisallowedContextError.html +0 -132
- data/doc/rdoc/classes/PhusionPassenger/Standalone/HelpCommand.html +0 -151
- data/doc/rdoc/classes/PhusionPassenger/Standalone/Main.html +0 -189
- data/doc/rdoc/classes/PhusionPassenger/Standalone/PackageRuntimeCommand.html +0 -177
- data/doc/rdoc/classes/PhusionPassenger/Standalone/RuntimeInstaller.html +0 -341
- data/doc/rdoc/classes/PhusionPassenger/Standalone/StartCommand.html +0 -203
- data/doc/rdoc/classes/PhusionPassenger/Standalone/StatusCommand.html +0 -156
- data/doc/rdoc/classes/PhusionPassenger/Standalone/StopCommand.html +0 -168
- data/doc/rdoc/classes/PhusionPassenger/Standalone/Utils.html +0 -86
- data/doc/rdoc/classes/PhusionPassenger/Standalone/VersionCommand.html +0 -135
- data/doc/rdoc/classes/PhusionPassenger/UnknownError.html +0 -125
- data/doc/rdoc/classes/PhusionPassenger/Utils.html +0 -1543
- data/doc/rdoc/classes/PhusionPassenger/Utils/FileSystemWatcher.html +0 -204
- data/doc/rdoc/classes/PhusionPassenger/Utils/FileSystemWatcher/DirInfo.html +0 -171
- data/doc/rdoc/classes/PhusionPassenger/Utils/FileSystemWatcher/FileInfo.html +0 -140
- data/doc/rdoc/classes/PhusionPassenger/Utils/HostsFileParser.html +0 -260
- data/doc/rdoc/classes/PhusionPassenger/Utils/PseudoIO.html +0 -194
- data/doc/rdoc/classes/PhusionPassenger/Utils/RewindableInput.html +0 -265
- data/doc/rdoc/classes/PhusionPassenger/Utils/RewindableInput/Tempfile.html +0 -120
- data/doc/rdoc/classes/PhusionPassenger/Utils/UnseekableSocket.html +0 -561
- data/doc/rdoc/classes/PhusionPassenger/VersionNotFound.html +0 -140
- data/doc/rdoc/classes/PhusionPassenger/WSGI.html +0 -89
- data/doc/rdoc/classes/PhusionPassenger/WSGI/ApplicationSpawner.html +0 -182
- data/doc/rdoc/classes/Process.html +0 -115
- data/doc/rdoc/classes/Signal.html +0 -139
- data/doc/rdoc/created.rid +0 -1
- data/doc/rdoc/files/DEVELOPERS_TXT.html +0 -280
- data/doc/rdoc/files/README.html +0 -157
- data/doc/rdoc/files/lib/phusion_passenger/abstract_installer_rb.html +0 -130
- data/doc/rdoc/files/lib/phusion_passenger/abstract_request_handler_rb.html +0 -135
- data/doc/rdoc/files/lib/phusion_passenger/abstract_server_collection_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/abstract_server_rb.html +0 -128
- data/doc/rdoc/files/lib/phusion_passenger/admin_tools/memory_stats_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/admin_tools/server_instance_rb.html +0 -132
- data/doc/rdoc/files/lib/phusion_passenger/admin_tools_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/analytics_logger_rb.html +0 -129
- data/doc/rdoc/files/lib/phusion_passenger/app_process_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/classic_rails/application_spawner_rb.html +0 -141
- data/doc/rdoc/files/lib/phusion_passenger/classic_rails/cgi_fixed_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/classic_rails/framework_spawner_rb.html +0 -146
- data/doc/rdoc/files/lib/phusion_passenger/classic_rails/request_handler_rb.html +0 -125
- data/doc/rdoc/files/lib/phusion_passenger/classic_rails_extensions/init_rb.html +0 -132
- data/doc/rdoc/files/lib/phusion_passenger/console_text_template_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/constants_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/debug_logging_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/dependencies_rb.html +0 -147
- data/doc/rdoc/files/lib/phusion_passenger/exceptions_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/html_template_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/message_channel_rb.html +0 -120
- data/doc/rdoc/files/lib/phusion_passenger/message_client_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/native_support_rb.html +0 -132
- data/doc/rdoc/files/lib/phusion_passenger/packaging_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/apache_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/binary_compatibility_rb.html +0 -129
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/compiler_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/curl_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/documentation_tools_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/linux_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/operating_system_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/ruby_rb.html +0 -128
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/zlib_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/platform_info_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/plugin_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/public_api_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/rack/application_spawner_rb.html +0 -137
- data/doc/rdoc/files/lib/phusion_passenger/rack/request_handler_rb.html +0 -125
- data/doc/rdoc/files/lib/phusion_passenger/rails3_extensions/init_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/simple_benchmarking_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/spawn_manager_rb.html +0 -160
- data/doc/rdoc/files/lib/phusion_passenger/standalone/app_finder_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/standalone/command_rb.html +0 -136
- data/doc/rdoc/files/lib/phusion_passenger/standalone/config_file_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/standalone/help_command_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/standalone/main_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/standalone/package_runtime_command_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/standalone/runtime_installer_rb.html +0 -133
- data/doc/rdoc/files/lib/phusion_passenger/standalone/start_command_rb.html +0 -136
- data/doc/rdoc/files/lib/phusion_passenger/standalone/status_command_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/standalone/stop_command_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/standalone/utils_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/standalone/version_command_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/utils/file_system_watcher_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/utils/hosts_file_parser_rb.html +0 -120
- data/doc/rdoc/files/lib/phusion_passenger/utils/rewindable_input_rb.html +0 -100
- data/doc/rdoc/files/lib/phusion_passenger/utils/tmpdir_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/utils/unseekable_socket_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/utils_rb.html +0 -179
- data/doc/rdoc/files/lib/phusion_passenger/wsgi/application_spawner_rb.html +0 -132
- data/doc/rdoc/fr_class_index.html +0 -139
- data/doc/rdoc/fr_file_index.html +0 -108
- data/doc/rdoc/fr_method_index.html +0 -439
- data/doc/rdoc/index.html +0 -26
- 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 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 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 & 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 <boost/cstdint.hpp></span>
|
51
|
-
<a name="l00029"></a>00029 <span class="preprocessor">#include <algorithm></span>
|
52
|
-
<a name="l00030"></a>00030 <span class="preprocessor">#include <vector></span>
|
53
|
-
<a name="l00031"></a>00031 <span class="preprocessor">#include <string></span>
|
54
|
-
<a name="l00032"></a>00032 <span class="preprocessor">#include <sys/types.h></span>
|
55
|
-
<a name="l00033"></a>00033 <span class="preprocessor">#include <cstring></span>
|
56
|
-
<a name="l00034"></a>00034 <span class="preprocessor">#include <arpa/inet.h></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"> * <h2>Reading messages</h2></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 < 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 <tt>const vector<StaticString> &</tt></span>
|
113
|
-
<a name="l00091"></a>00091 <span class="comment"> * and <tt>StaticString</tt>, 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(&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, &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(&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<StaticString> 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 > 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 < size && !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 > 0 && headerReader.<a class="code" href="classPassenger_1_1Uint16Reader.html#a3ccc4eefabd1666cd279f316d932283">value</a>() > 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() && rest >= 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() < 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<StaticString> &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->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 < size && !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 > 0 && headerReader.<a class="code" href="classPassenger_1_1Uint32Reader.html#11d408aa1607d33702250795d0b9c1ae">value</a>() > 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() && rest >= 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() < 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
|
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 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 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"> * "Phusion Passenger" is a trademark of Hongli Lai & 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 "Software"), 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 "AS IS", 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 <boost/cstdint.hpp></span>
|
54
|
-
<a name="l00029"></a>00029 <span class="preprocessor">#include <oxt/macros.hpp></span>
|
55
|
-
<a name="l00030"></a>00030 <span class="preprocessor">#include <algorithm></span>
|
56
|
-
<a name="l00031"></a>00031 <span class="preprocessor">#include <vector></span>
|
57
|
-
<a name="l00032"></a>00032 <span class="preprocessor">#include <string></span>
|
58
|
-
<a name="l00033"></a>00033 <span class="preprocessor">#include <sys/types.h></span>
|
59
|
-
<a name="l00034"></a>00034 <span class="preprocessor">#include <cstring></span>
|
60
|
-
<a name="l00035"></a>00035 <span class="preprocessor">#include <arpa/inet.h></span>
|
61
|
-
<a name="l00036"></a>00036 <span class="preprocessor">#include "StaticString.h"</span>
|
62
|
-
<a name="l00037"></a>00037 <span class="preprocessor">#include "Exceptions.h"</span>
|
63
|
-
<a name="l00038"></a>00038 <span class="preprocessor">#include "Utils/MemZeroGuard.h"</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"> * <h2>Reading messages</h2></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't already been fed.</span>
|
106
|
-
<a name="l00081"></a>00081 <span class="comment"> while (consumed < 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("Integer: %d\n", (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 <tt>const vector<StaticString> &</tt></span>
|
119
|
-
<a name="l00094"></a>00094 <span class="comment"> * and <tt>StaticString</tt>, 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'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'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> *) &val + consumed, data, locallyConsumed);
|
164
|
-
<a name="l00139"></a>00139 consumed += locallyConsumed;
|
165
|
-
<a name="l00140"></a>00140 <span class="keywordflow">if</span> (locallyConsumed > 0 && 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, &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> *) &val + consumed, data, locallyConsumed);
|
207
|
-
<a name="l00182"></a>00182 consumed += locallyConsumed;
|
208
|
-
<a name="l00183"></a>00183 <span class="keywordflow">if</span> (locallyConsumed > 0 && 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, &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<StaticString> 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">'\0'</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 > 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 < size && !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 > 0 && headerReader.value() > 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() && rest >= 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() < 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<StaticString> &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 <em>args</em> as well as <em>headerBuf</em>,</span>
|
361
|
-
<a name="l00336"></a>00336 <span class="comment"> * so <em>args</em> and <em>headerBuf</em> 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 <em>args</em>.</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 <tt>outputSize(argsCount)</tt></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 <em>out</em>.</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 < 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">"outCount too small."</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 < 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 > 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">"Data size exceeds maximum size for array messages."</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 < 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">"\0"</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->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->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 <em>zeroBuffer</em> 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 < size && !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 > 0 && headerReader.value() > 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() && rest >= 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() < 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 &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 &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() > 0xFFFFFFFF)) {
|
522
|
-
<a name="l00497"></a>00497 <span class="keywordflow">throw</span> ArgumentException(<span class="stringliteral">"Data size exceeds maximum size for scalar messages."</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
|
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>
|