passenger 2.2.11 → 2.2.12
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of passenger might be problematic. Click here for more details.
- data/NEWS +29 -0
- data/bin/passenger-install-nginx-module +1 -1
- data/doc/Users guide Apache.html +38 -7
- data/doc/Users guide Nginx.html +36 -5
- data/doc/cxxapi/AbstractSpawnManager_8h-source.html +1 -1
- data/doc/cxxapi/Account_8h-source.html +1 -1
- data/doc/cxxapi/AccountsDatabase_8h-source.html +1 -1
- data/doc/cxxapi/AgentsStarter_8h-source.html +1 -1
- data/doc/cxxapi/BCrypt_8h-source.html +1 -1
- data/doc/cxxapi/Blowfish_8h-source.html +1 -1
- data/doc/cxxapi/Bucket_8h-source.html +5 -4
- data/doc/cxxapi/Constants_8h-source.html +2 -2
- data/doc/cxxapi/ContentHandler_8h-source.html +1 -1
- data/doc/cxxapi/DirectoryMapper_8h-source.html +10 -9
- data/doc/cxxapi/EventedServer_8h-source.html +415 -0
- data/doc/cxxapi/Exceptions_8h-source.html +1 -1
- data/doc/cxxapi/FileDescriptor_8h-source.html +1 -1
- data/doc/cxxapi/Hooks_8h-source.html +3 -2
- data/doc/cxxapi/HttpStatusExtractor_8h-source.html +324 -323
- data/doc/cxxapi/Logging_8h-source.html +643 -546
- data/doc/cxxapi/MessageChannel_8h-source.html +429 -404
- data/doc/cxxapi/MessageClient_8h-source.html +1 -1
- data/doc/cxxapi/MessageReadersWriters_8h-source.html +451 -0
- data/doc/cxxapi/MessageServer_8h-source.html +1 -1
- data/doc/cxxapi/PoolOptions_8h-source.html +287 -279
- data/doc/cxxapi/Process_8h-source.html +178 -167
- data/doc/cxxapi/RandomGenerator_8h-source.html +45 -18
- data/doc/cxxapi/ResourceLocator_8h-source.html +3 -3
- data/doc/cxxapi/ScgiRequestParser_8h-source.html +344 -343
- data/doc/cxxapi/ServerInstanceDir_8h-source.html +1 -1
- data/doc/cxxapi/Session_8h-source.html +387 -374
- data/doc/cxxapi/SpawnManager_8h-source.html +547 -538
- data/doc/cxxapi/StaticContentHandler_8h-source.html +1 -1
- data/doc/cxxapi/StaticString_8h-source.html +1 -1
- data/doc/cxxapi/StringListCreator_8h-source.html +1 -1
- data/doc/cxxapi/Utils_8h-source.html +545 -520
- data/doc/cxxapi/annotated.html +11 -8
- data/doc/cxxapi/apache2_2Configuration_8h-source.html +1 -1
- data/doc/cxxapi/classAgentWatcher-members.html +1 -1
- data/doc/cxxapi/classAgentWatcher.html +1 -1
- data/doc/cxxapi/classClient-members.html +1 -1
- data/doc/cxxapi/classClient.html +1 -1
- data/doc/cxxapi/classHooks-members.html +16 -13
- data/doc/cxxapi/classHooks.html +69 -73
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager.html +1 -1
- data/doc/cxxapi/classPassenger_1_1ArgumentException-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1ArgumentException.html +1 -1
- data/doc/cxxapi/classPassenger_1_1ArrayReader-members.html +33 -0
- data/doc/cxxapi/classPassenger_1_1ArrayReader.html +47 -0
- data/doc/cxxapi/classPassenger_1_1BufferedUpload-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1BufferedUpload.html +1 -1
- data/doc/cxxapi/classPassenger_1_1BusyException-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1BusyException.html +1 -1
- data/doc/cxxapi/classPassenger_1_1ConfigurationException-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1ConfigurationException.html +1 -1
- data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +18 -15
- data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +89 -99
- data/doc/cxxapi/classPassenger_1_1EOFException-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1EOFException.html +1 -1
- data/doc/cxxapi/classPassenger_1_1EventFd-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1EventFd.html +1 -1
- data/doc/cxxapi/classPassenger_1_1FileDescriptor-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1FileDescriptor.html +1 -1
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException.html +1 -1
- data/doc/cxxapi/classPassenger_1_1FileSystemException-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1FileSystemException.html +1 -1
- data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor.html +2 -2
- data/doc/cxxapi/classPassenger_1_1IOException-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1IOException.html +1 -1
- data/doc/cxxapi/classPassenger_1_1MemZeroGuard-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1MemZeroGuard.html +1 -1
- data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1MessageChannel.html +1 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer.html +1 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext.html +1 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext.html +1 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler.html +1 -1
- data/doc/cxxapi/classPassenger_1_1Process-members.html +4 -3
- data/doc/cxxapi/classPassenger_1_1Process.html +40 -9
- data/doc/cxxapi/classPassenger_1_1RandomGenerator-members.html +2 -1
- data/doc/cxxapi/classPassenger_1_1RandomGenerator.html +29 -2
- data/doc/cxxapi/classPassenger_1_1RuntimeException-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1RuntimeException.html +1 -1
- data/doc/cxxapi/classPassenger_1_1ScalarReader-members.html +33 -0
- data/doc/cxxapi/classPassenger_1_1ScalarReader.html +47 -0
- data/doc/cxxapi/classPassenger_1_1ScgiRequestParser-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1ScgiRequestParser.html +1 -1
- data/doc/cxxapi/classPassenger_1_1SecurityException-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1SecurityException.html +1 -1
- data/doc/cxxapi/classPassenger_1_1Session-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1Session.html +2 -2
- data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1SpawnException.html +1 -1
- data/doc/cxxapi/classPassenger_1_1SpawnManager-members.html +2 -2
- data/doc/cxxapi/classPassenger_1_1SpawnManager.html +6 -18
- data/doc/cxxapi/classPassenger_1_1StandardSession-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1StandardSession.html +1 -1
- data/doc/cxxapi/classPassenger_1_1StaticString-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1StaticString.html +1 -1
- data/doc/cxxapi/classPassenger_1_1SystemException-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1SystemException.html +1 -1
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException.html +1 -1
- data/doc/cxxapi/classPassenger_1_1TimeoutException-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1TimeoutException.html +1 -1
- data/doc/cxxapi/classPassenger_1_1Uint16Reader-members.html +33 -0
- data/doc/cxxapi/classPassenger_1_1Uint16Reader.html +47 -0
- data/doc/cxxapi/classPassenger_1_1Uint32Reader-members.html +33 -0
- data/doc/cxxapi/classPassenger_1_1Uint32Reader.html +47 -0
- data/doc/cxxapi/classServer-members.html +1 -1
- data/doc/cxxapi/classServer.html +1 -1
- data/doc/cxxapi/classServerInstanceDirToucher-members.html +1 -1
- data/doc/cxxapi/classServerInstanceDirToucher.html +1 -1
- data/doc/cxxapi/classes.html +13 -10
- data/doc/cxxapi/definitions_8h-source.html +2 -1
- data/doc/cxxapi/doxygen.css +91 -0
- data/doc/cxxapi/files.html +16 -13
- data/doc/cxxapi/functions.html +32 -21
- data/doc/cxxapi/functions_enum.html +1 -1
- data/doc/cxxapi/functions_eval.html +1 -1
- data/doc/cxxapi/functions_func.html +32 -21
- data/doc/cxxapi/functions_vars.html +3 -1
- data/doc/cxxapi/graph_legend.html +20 -15
- data/doc/cxxapi/graph_legend.png +0 -0
- data/doc/cxxapi/group__Configuration.html +51 -64
- data/doc/cxxapi/group__Configuration.png +0 -0
- data/doc/cxxapi/group__Core.html +24 -26
- data/doc/cxxapi/group__Core.png +0 -0
- data/doc/cxxapi/group__Exceptions.html +1 -1
- data/doc/cxxapi/group__Hooks.html +17 -15
- data/doc/cxxapi/group__Hooks.png +0 -0
- data/doc/cxxapi/group__Support.html +11 -9
- data/doc/cxxapi/hierarchy.html +6 -1
- data/doc/cxxapi/index.html +10 -5
- data/doc/cxxapi/inherit__graph__10.map +1 -1
- data/doc/cxxapi/inherit__graph__10.md5 +1 -1
- data/doc/cxxapi/inherit__graph__10.png +0 -0
- data/doc/cxxapi/inherit__graph__11.map +1 -1
- data/doc/cxxapi/inherit__graph__11.md5 +1 -1
- data/doc/cxxapi/inherit__graph__11.png +0 -0
- data/doc/cxxapi/inherit__graph__12.map +1 -1
- data/doc/cxxapi/inherit__graph__12.md5 +1 -1
- data/doc/cxxapi/inherit__graph__12.png +0 -0
- data/doc/cxxapi/inherit__graph__13.map +1 -1
- data/doc/cxxapi/inherit__graph__13.md5 +1 -1
- data/doc/cxxapi/inherit__graph__13.png +0 -0
- data/doc/cxxapi/inherit__graph__14.map +1 -3
- data/doc/cxxapi/inherit__graph__14.md5 +1 -1
- data/doc/cxxapi/inherit__graph__14.png +0 -0
- data/doc/cxxapi/inherit__graph__15.map +1 -1
- data/doc/cxxapi/inherit__graph__15.md5 +1 -1
- data/doc/cxxapi/inherit__graph__15.png +0 -0
- data/doc/cxxapi/inherit__graph__16.map +3 -1
- data/doc/cxxapi/inherit__graph__16.md5 +1 -1
- data/doc/cxxapi/inherit__graph__16.png +0 -0
- data/doc/cxxapi/inherit__graph__17.map +1 -1
- data/doc/cxxapi/inherit__graph__17.md5 +1 -1
- data/doc/cxxapi/inherit__graph__17.png +0 -0
- data/doc/cxxapi/inherit__graph__18.map +1 -2
- data/doc/cxxapi/inherit__graph__18.md5 +1 -1
- data/doc/cxxapi/inherit__graph__18.png +0 -0
- data/doc/cxxapi/inherit__graph__19.map +1 -1
- data/doc/cxxapi/inherit__graph__19.md5 +1 -1
- data/doc/cxxapi/inherit__graph__19.png +0 -0
- data/doc/cxxapi/inherit__graph__20.map +2 -1
- data/doc/cxxapi/inherit__graph__20.md5 +1 -1
- data/doc/cxxapi/inherit__graph__20.png +0 -0
- data/doc/cxxapi/inherit__graph__21.map +1 -1
- data/doc/cxxapi/inherit__graph__21.md5 +1 -1
- data/doc/cxxapi/inherit__graph__21.png +0 -0
- data/doc/cxxapi/inherit__graph__22.map +1 -1
- data/doc/cxxapi/inherit__graph__22.md5 +1 -1
- data/doc/cxxapi/inherit__graph__22.png +0 -0
- data/doc/cxxapi/inherit__graph__23.map +1 -1
- data/doc/cxxapi/inherit__graph__23.md5 +1 -1
- data/doc/cxxapi/inherit__graph__23.png +0 -0
- data/doc/cxxapi/inherit__graph__24.map +1 -1
- data/doc/cxxapi/inherit__graph__24.md5 +1 -1
- data/doc/cxxapi/inherit__graph__24.png +0 -0
- data/doc/cxxapi/inherit__graph__25.map +1 -1
- data/doc/cxxapi/inherit__graph__25.md5 +1 -1
- data/doc/cxxapi/inherit__graph__25.png +0 -0
- data/doc/cxxapi/inherit__graph__26.map +1 -1
- data/doc/cxxapi/inherit__graph__26.md5 +1 -1
- data/doc/cxxapi/inherit__graph__26.png +0 -0
- data/doc/cxxapi/inherit__graph__27.map +1 -2
- data/doc/cxxapi/inherit__graph__27.md5 +1 -1
- data/doc/cxxapi/inherit__graph__27.png +0 -0
- data/doc/cxxapi/inherit__graph__28.map +1 -1
- data/doc/cxxapi/inherit__graph__28.md5 +1 -1
- data/doc/cxxapi/inherit__graph__28.png +0 -0
- data/doc/cxxapi/inherit__graph__29.map +1 -1
- data/doc/cxxapi/inherit__graph__29.md5 +1 -1
- data/doc/cxxapi/inherit__graph__29.png +0 -0
- data/doc/cxxapi/inherit__graph__30.map +2 -1
- data/doc/cxxapi/inherit__graph__30.md5 +1 -1
- data/doc/cxxapi/inherit__graph__30.png +0 -0
- data/doc/cxxapi/inherit__graph__31.map +1 -3
- data/doc/cxxapi/inherit__graph__31.md5 +1 -1
- data/doc/cxxapi/inherit__graph__31.png +0 -0
- data/doc/cxxapi/inherit__graph__32.map +1 -1
- data/doc/cxxapi/inherit__graph__32.md5 +1 -1
- data/doc/cxxapi/inherit__graph__32.png +0 -0
- data/doc/cxxapi/inherit__graph__33.map +1 -1
- data/doc/cxxapi/inherit__graph__33.md5 +1 -1
- data/doc/cxxapi/inherit__graph__33.png +0 -0
- data/doc/cxxapi/inherit__graph__34.map +3 -1
- data/doc/cxxapi/inherit__graph__34.md5 +1 -1
- data/doc/cxxapi/inherit__graph__34.png +0 -0
- data/doc/cxxapi/inherit__graph__35.map +1 -1
- data/doc/cxxapi/inherit__graph__35.md5 +1 -1
- data/doc/cxxapi/inherit__graph__35.png +0 -0
- data/doc/cxxapi/inherit__graph__36.map +1 -1
- data/doc/cxxapi/inherit__graph__36.md5 +1 -1
- data/doc/cxxapi/inherit__graph__36.png +0 -0
- data/doc/cxxapi/inherit__graph__37.map +1 -0
- data/doc/cxxapi/inherit__graph__37.md5 +1 -0
- data/doc/cxxapi/inherit__graph__37.png +0 -0
- data/doc/cxxapi/inherit__graph__38.map +1 -0
- data/doc/cxxapi/inherit__graph__38.md5 +1 -0
- data/doc/cxxapi/inherit__graph__38.png +0 -0
- data/doc/cxxapi/inherit__graph__39.map +1 -0
- data/doc/cxxapi/inherit__graph__39.md5 +1 -0
- data/doc/cxxapi/inherit__graph__39.png +0 -0
- data/doc/cxxapi/inherit__graph__5.map +1 -1
- data/doc/cxxapi/inherit__graph__5.md5 +1 -1
- data/doc/cxxapi/inherit__graph__5.png +0 -0
- data/doc/cxxapi/inherit__graph__6.map +1 -1
- data/doc/cxxapi/inherit__graph__6.md5 +1 -1
- data/doc/cxxapi/inherit__graph__6.png +0 -0
- data/doc/cxxapi/inherit__graph__7.map +1 -1
- data/doc/cxxapi/inherit__graph__7.md5 +1 -1
- data/doc/cxxapi/inherit__graph__7.png +0 -0
- data/doc/cxxapi/inherit__graph__8.map +1 -1
- data/doc/cxxapi/inherit__graph__8.md5 +1 -1
- data/doc/cxxapi/inherit__graph__8.png +0 -0
- data/doc/cxxapi/inherit__graph__9.map +1 -1
- data/doc/cxxapi/inherit__graph__9.md5 +1 -1
- data/doc/cxxapi/inherit__graph__9.png +0 -0
- data/doc/cxxapi/inherits.html +46 -31
- data/doc/cxxapi/main.html +12 -11
- data/doc/cxxapi/modules.html +16 -13
- data/doc/cxxapi/namespacePassenger.html +82 -5
- data/doc/cxxapi/namespacemembers.html +5 -3
- data/doc/cxxapi/namespacemembers_enum.html +1 -1
- data/doc/cxxapi/namespacemembers_eval.html +1 -1
- data/doc/cxxapi/namespacemembers_func.html +5 -3
- data/doc/cxxapi/namespacemembers_type.html +1 -1
- data/doc/cxxapi/namespaces.html +2 -2
- data/doc/cxxapi/nginx_2Configuration_8h-source.html +43 -42
- data/doc/cxxapi/ngx__http__passenger__module_8h-source.html +1 -1
- data/doc/cxxapi/structPassenger_1_1AnythingToString-members.html +1 -1
- data/doc/cxxapi/structPassenger_1_1AnythingToString.html +1 -1
- data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01StaticString_01_4_01_4-members.html +33 -0
- data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01StaticString_01_4_01_4.html +52 -0
- data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4-members.html +1 -1
- data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4.html +1 -1
- data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard-members.html +1 -1
- data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard.html +1 -1
- data/doc/cxxapi/structPassenger_1_1PoolOptions-members.html +3 -2
- data/doc/cxxapi/structPassenger_1_1PoolOptions.html +25 -5
- data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash-members.html +1 -1
- data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash.html +1 -1
- data/doc/cxxapi/tabs.css +1 -1
- data/doc/cxxapi/tree.html +20 -17
- data/doc/users_guide_snippets/tips.txt +28 -0
- data/ext/apache2/Hooks.cpp +19 -2
- data/ext/common/Utils.cpp +15 -4
- data/ext/common/Version.h +1 -1
- data/ext/nginx/StaticContentHandler.c +6 -3
- data/ext/phusion_passenger/native_support.c +25 -0
- data/lib/phusion_passenger/abstract_request_handler.rb +1 -0
- data/lib/phusion_passenger/constants.rb +1 -1
- data/lib/phusion_passenger/events.rb +3 -0
- data/lib/phusion_passenger/platform_info.rb +2 -1
- data/lib/phusion_passenger/rack/application_spawner.rb +2 -0
- data/lib/phusion_passenger/railz/application_spawner.rb +8 -0
- data/lib/phusion_passenger/utils.rb +69 -9
- data/lib/phusion_passenger/utils/rewindable_input.rb +10 -6
- metadata +55 -17
@@ -290,7 +290,7 @@
|
|
290
290
|
<a name="l00268"></a>00268
|
291
291
|
<a name="l00269"></a>00269 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_MESSAGE_CLIENT_H_ */</span>
|
292
292
|
</pre></div></div>
|
293
|
-
<hr size="1"><address style="text-align: right;"><small>Generated on Sun
|
293
|
+
<hr size="1"><address style="text-align: right;"><small>Generated on Sun Mar 28 14:11:56 2010 for Passenger by
|
294
294
|
<a href="http://www.doxygen.org/index.html">
|
295
295
|
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.8 </small></address>
|
296
296
|
</body>
|
@@ -0,0 +1,451 @@
|
|
1
|
+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
2
|
+
<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
|
3
|
+
<title>Passenger: MessageReadersWriters.h Source File</title>
|
4
|
+
<link href="tabs.css" rel="stylesheet" type="text/css">
|
5
|
+
<link href="doxygen.css" rel="stylesheet" type="text/css">
|
6
|
+
</head><body>
|
7
|
+
<!-- Generated by Doxygen 1.5.8 -->
|
8
|
+
<div class="navigation" id="top">
|
9
|
+
<div class="tabs">
|
10
|
+
<ul>
|
11
|
+
<li><a href="main.html"><span>Main 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>
|