19 #ifndef INCLUDE_RCF_ASIOSERVERTRANSPORT_HPP
20 #define INCLUDE_RCF_ASIOSERVERTRANSPORT_HPP
25 #include <boost/shared_ptr.hpp>
26 #include <boost/weak_ptr.hpp>
28 #include <RCF/Asio.hpp>
29 #include <RCF/AsioBuffers.hpp>
30 #include <RCF/Enums.hpp>
31 #include <RCF/Export.hpp>
32 #include <RCF/IpAddress.hpp>
33 #include <RCF/IpServerTransport.hpp>
34 #include <RCF/ServerTransport.hpp>
35 #include <RCF/Service.hpp>
36 #include <RCF/ThreadLibrary.hpp>
41 class TcpClientTransport;
42 class AsioNetworkSession;
43 class AsioServerTransport;
45 typedef boost::shared_ptr<AsioNetworkSession> AsioNetworkSessionPtr;
46 typedef boost::weak_ptr<AsioNetworkSession> AsioNetworkSessionWeakPtr;
51 virtual ~AsioAcceptor()
55 typedef boost::scoped_ptr<AsioAcceptor> AsioAcceptorPtr;
57 class RCF_EXPORT AsioServerTransport :
58 public ServerTransport,
59 public ServerTransportEx,
65 friend class TcpTransportFactory;
66 friend class HttpTransportFactory;
67 friend class HttpsTransportFactory;
69 friend class Win32NamedPipeNetworkSession;
71 typedef boost::weak_ptr<I_Session> SessionWeakPtr;
73 AsioNetworkSessionPtr createNetworkSession();
78 ClientTransportAutoPtr
79 createClientTransport(
80 const Endpoint &endpoint);
82 SessionPtr createServerSession(
83 ClientTransportAutoPtr & clientTransportAutoPtr,
84 StubEntryPtr stubEntryPtr,
85 bool keepClientConnection);
87 ClientTransportAutoPtr
88 createClientTransport(
89 SessionPtr sessionPtr);
98 void onServiceAdded( RcfServer & server);
99 void onServiceRemoved( RcfServer & server);
103 void onServerStart( RcfServer & server);
104 void onServerStop( RcfServer & server);
105 void setServer( RcfServer & server);
107 void startAccepting();
111 void startAcceptingThread(Exception & eRet);
115 RcfServer & getServer();
116 RcfServer & getSessionManager();
120 void registerSession(AsioNetworkSessionWeakPtr session);
121 void unregisterSession(AsioNetworkSessionWeakPtr session);
122 void cancelOutstandingIo();
124 friend class AsioNetworkSession;
125 friend class FilterAdapter;
126 friend class ServerTcpFrame;
127 friend class ServerHttpFrame;
131 AsioServerTransport();
132 ~AsioServerTransport();
134 AsioIoService * mpIoService;
135 AsioAcceptorPtr mAcceptorPtr;
137 WireProtocol mWireProtocol;
141 volatile bool mStopFlag;
142 RcfServer * mpServer;
146 virtual AsioNetworkSessionPtr implCreateNetworkSession() = 0;
147 virtual void implOpen() = 0;
149 virtual ClientTransportAutoPtr implCreateClientTransport(
150 const Endpoint &endpoint) = 0;
154 AsioAcceptor & getAcceptor();
156 AsioIoService & getIoService();
162 ReadHandler(AsioNetworkSessionPtr networkSessionPtr);
163 void operator()(AsioErrorCode err, std::size_t bytes);
164 void * allocate(std::size_t size);
165 AsioNetworkSessionPtr mNetworkSessionPtr;
171 WriteHandler(AsioNetworkSessionPtr networkSessionPtr);
172 void operator()(AsioErrorCode err, std::size_t bytes);
173 void * allocate(std::size_t size);
174 AsioNetworkSessionPtr mNetworkSessionPtr;
177 void * asio_handler_allocate(std::size_t size, ReadHandler * pHandler);
178 void asio_handler_deallocate(
void * pointer, std::size_t size, ReadHandler * pHandler);
179 void * asio_handler_allocate(std::size_t size, WriteHandler * pHandler);
180 void asio_handler_deallocate(
void * pointer, std::size_t size, WriteHandler * pHandler);
182 class RCF_EXPORT AsioNetworkSession :
183 public NetworkSession,
188 friend class ReadHandler;
189 friend class WriteHandler;
190 friend class ServerTcpFrame;
191 friend class ServerHttpFrame;
194 typedef boost::weak_ptr<AsioNetworkSession> AsioNetworkSessionWeakPtr;
195 typedef boost::shared_ptr<AsioNetworkSession> AsioNetworkSessionPtr;
198 AsioServerTransport &transport,
199 AsioIoService & ioService);
201 virtual ~AsioNetworkSession();
203 AsioNetworkSessionPtr sharedFromThis();
207 AsioErrorCode getLastError();
209 void setCloseAfterWrite();
212 AsioIoService & mIoService;
214 std::vector<char> mReadHandlerBuffer;
215 std::vector<char> mWriteHandlerBuffer;
217 AsioErrorCode mLastError;
223 const ByteBuffer &byteBuffer,
224 std::size_t bytesRequested);
227 const std::vector<ByteBuffer> &byteBuffers);
231 void setTransportFilters(
232 const std::vector<FilterPtr> &filters);
234 void getTransportFilters(
235 std::vector<FilterPtr> &filters);
238 const std::vector<FilterPtr> &filters);
241 std::vector<FilterPtr> &filters);
243 AsioServerTransport & getAsioServerTransport();
251 void onAcceptCompleted(
const AsioErrorCode & error);
253 void onNetworkReadCompleted(
255 size_t bytesTransferred);
257 void onNetworkWriteCompleted(
259 size_t bytesTransferred);
261 friend class HttpSessionFilter;
262 void onAppReadWriteCompleted(
263 size_t bytesTransferred);
265 void sendServerError(
int error);
267 void doCustomFraming(
size_t bytesTransferred);
268 void doRegularFraming(
size_t bytesTransferred);
271 friend class AsioServerTransport;
272 friend class TcpNetworkSession;
273 friend class UnixLocalNetworkSession;
274 friend class Win32NamedPipeNetworkSession;
275 friend class FilterAdapter;
287 bool mIssueZeroByteRead;
288 std::size_t mReadBufferRemaining;
289 std::size_t mWriteBufferRemaining;
291 std::vector<FilterPtr> mTransportFilters;
293 friend class HttpServerTransport;
294 friend class PublishingService;
295 std::vector<FilterPtr> mWireFilters;
297 AsioServerTransport & mTransport;
299 std::vector<ByteBuffer> mWriteByteBuffers;
300 std::vector<ByteBuffer> mSlicedWriteByteBuffers;
302 ReallocBufferPtr mAppReadBufferPtr;
303 ByteBuffer mAppReadByteBuffer;
305 ReallocBufferPtr mNetworkReadBufferPtr;
306 ByteBuffer mNetworkReadByteBuffer;
309 FilterPtr mFilterAdapterPtr;
311 bool mCloseAfterWrite;
313 AsioNetworkSessionWeakPtr mWeakThisPtr;
317 boost::shared_ptr<Mutex> mSocketOpsMutexPtr;
324 ByteBuffer getReadByteBuffer();
325 void postWrite(std::vector<ByteBuffer> &byteBuffers);
327 ServerTransport & getServerTransport();
328 const RemoteAddress & getRemoteAddress();
333 virtual const RemoteAddress & implGetRemoteAddress() = 0;
334 virtual void implRead(
char * buffer, std::size_t bufferLen) = 0;
335 virtual void implWrite(
const std::vector<ByteBuffer> & buffers) = 0;
336 virtual void implAccept() = 0;
337 virtual bool implOnAccept() = 0;
338 virtual bool implIsConnected() = 0;
339 virtual void implClose() = 0;
340 virtual void implCloseAfterWrite() {}
341 virtual void implTransferNativeFrom(ClientTransport & clientTransport) = 0;
342 virtual ClientTransportAutoPtr implCreateClientTransport() = 0;
348 #endif // ! INCLUDE_RCF_ASIOSERVERTRANSPORT_HPP