19 #ifndef INCLUDE_RCF_ASIOSERVERTRANSPORT_HPP 20 #define INCLUDE_RCF_ASIOSERVERTRANSPORT_HPP 26 #include <RCF/Asio.hpp> 27 #include <RCF/AsioBuffers.hpp> 28 #include <RCF/ByteBuffer.hpp> 29 #include <RCF/Export.hpp> 30 #include <RCF/ServerTransport.hpp> 31 #include <RCF/Service.hpp> 32 #include <RCF/ThreadLibrary.hpp> 33 #include <RCF/Tools.hpp> 38 class TcpClientTransport;
39 class AsioNetworkSession;
40 class AsioServerTransport;
42 typedef std::shared_ptr<AsioNetworkSession> AsioNetworkSessionPtr;
43 typedef std::weak_ptr<AsioNetworkSession> AsioNetworkSessionWeakPtr;
46 typedef std::shared_ptr<ReallocBuffer> ReallocBufferPtr;
53 typedef std::shared_ptr<I_RcfClient> RcfClientPtr;
58 virtual ~AsioAcceptor();
61 typedef std::unique_ptr<AsioAcceptor> AsioAcceptorPtr;
63 class RCF_EXPORT AsioServerTransport :
64 public ServerTransport,
65 public ServerTransportEx,
71 friend class TcpTransportFactory;
72 friend class HttpTransportFactory;
73 friend class HttpsTransportFactory;
75 friend class Win32NamedPipeNetworkSession;
77 typedef std::weak_ptr<RcfSession> SessionWeakPtr;
79 AsioNetworkSessionPtr createNetworkSession();
85 createClientTransport(
86 const Endpoint &endpoint);
88 SessionPtr createServerSession(
89 ClientTransportUniquePtr & clientTransportUniquePtr,
90 RcfClientPtr stubEntryPtr,
91 bool keepClientConnection);
94 createClientTransport(
95 SessionPtr sessionPtr);
104 void onServiceAdded( RcfServer & server);
105 void onServiceRemoved( RcfServer & server);
109 void onServerStart( RcfServer & server);
110 void onServerStop( RcfServer & server);
111 void setServer( RcfServer & server);
113 void startAccepting();
117 void startAcceptingThread(Exception & eRet);
121 RcfServer & getServer();
122 RcfServer & getSessionManager();
126 void registerSession(NetworkSessionWeakPtr session);
127 void unregisterSession(NetworkSessionWeakPtr session);
128 void cancelOutstandingIo();
130 friend class AsioNetworkSession;
131 friend class FilterAdapter;
132 friend class ServerTcpFrame;
133 friend class ServerHttpFrame;
137 AsioServerTransport();
138 ~AsioServerTransport();
140 AsioIoService * mpIoService;
141 AsioAcceptorPtr mAcceptorPtr;
143 WireProtocol mWireProtocol;
147 volatile bool mStopFlag;
148 RcfServer * mpServer;
152 virtual AsioNetworkSessionPtr implCreateNetworkSession() = 0;
153 virtual void implOpen() = 0;
156 const Endpoint &endpoint) = 0;
160 AsioAcceptor & getAcceptor();
162 AsioIoService & getIoService();
168 ReadHandler(AsioNetworkSessionPtr networkSessionPtr);
169 void operator()(AsioErrorCode err, std::size_t bytes);
170 void * allocate(std::size_t size);
171 AsioNetworkSessionPtr mNetworkSessionPtr;
177 WriteHandler(AsioNetworkSessionPtr networkSessionPtr);
178 void operator()(AsioErrorCode err, std::size_t bytes);
179 void * allocate(std::size_t size);
180 AsioNetworkSessionPtr mNetworkSessionPtr;
183 void * asio_handler_allocate(std::size_t size, ReadHandler * pHandler);
184 void asio_handler_deallocate(
void * pointer, std::size_t size, ReadHandler * pHandler);
185 void * asio_handler_allocate(std::size_t size, WriteHandler * pHandler);
186 void asio_handler_deallocate(
void * pointer, std::size_t size, WriteHandler * pHandler);
188 class RCF_EXPORT AsioNetworkSession :
189 public NetworkSession,
194 friend class ReadHandler;
195 friend class WriteHandler;
196 friend class ServerTcpFrame;
197 friend class ServerHttpFrame;
200 typedef std::weak_ptr<AsioNetworkSession> AsioNetworkSessionWeakPtr;
201 typedef std::shared_ptr<AsioNetworkSession> AsioNetworkSessionPtr;
204 AsioServerTransport &transport,
205 AsioIoService & ioService);
207 virtual ~AsioNetworkSession();
209 AsioNetworkSessionPtr sharedFromThis();
213 AsioErrorCode getLastError();
215 void setCloseAfterWrite();
218 AsioIoService & mIoService;
220 std::vector<char> mReadHandlerBuffer;
221 std::vector<char> mWriteHandlerBuffer;
223 AsioErrorCode mLastError;
229 const ByteBuffer &byteBuffer,
230 std::size_t bytesRequested);
233 const std::vector<ByteBuffer> &byteBuffers);
237 void setTransportFilters(
238 const std::vector<FilterPtr> &filters);
240 void getTransportFilters(
241 std::vector<FilterPtr> &filters);
244 const std::vector<FilterPtr> &filters);
247 std::vector<FilterPtr> &filters);
249 AsioServerTransport & getAsioServerTransport();
257 void onAcceptCompleted(
const AsioErrorCode & error);
259 void onNetworkReadCompleted(
261 size_t bytesTransferred);
263 void onNetworkWriteCompleted(
265 size_t bytesTransferred);
267 friend class HttpSessionFilter;
268 void onAppReadWriteCompleted(
269 size_t bytesTransferred);
271 void sendServerError(
int error);
273 void doCustomFraming(
size_t bytesTransferred);
274 void doRegularFraming(
size_t bytesTransferred);
277 friend class AsioServerTransport;
278 friend class TcpNetworkSession;
279 friend class UnixLocalNetworkSession;
280 friend class Win32NamedPipeNetworkSession;
281 friend class FilterAdapter;
293 bool mIssueZeroByteRead;
294 std::size_t mReadBufferRemaining;
295 std::size_t mWriteBufferRemaining;
297 std::vector<FilterPtr> mTransportFilters;
299 friend class HttpServerTransport;
300 friend class PublishingService;
301 std::vector<FilterPtr> mWireFilters;
303 AsioServerTransport & mTransport;
305 std::vector<ByteBuffer> mWriteByteBuffers;
306 std::vector<ByteBuffer> mSlicedWriteByteBuffers;
308 ReallocBufferPtr mAppReadBufferPtr;
309 ByteBuffer mAppReadByteBuffer;
311 ReallocBufferPtr mNetworkReadBufferPtr;
312 ByteBuffer mNetworkReadByteBuffer;
315 FilterPtr mFilterAdapterPtr;
317 bool mCloseAfterWrite;
319 NetworkSessionWeakPtr mWeakThisPtr;
323 std::shared_ptr<Mutex> mSocketOpsMutexPtr;
330 ByteBuffer getReadByteBuffer();
331 void postWrite(std::vector<ByteBuffer> &byteBuffers);
333 ServerTransport & getServerTransport();
334 const RemoteAddress & getRemoteAddress();
339 virtual const RemoteAddress & implGetRemoteAddress() = 0;
340 virtual void implRead(
char * buffer, std::size_t bufferLen) = 0;
341 virtual void implWrite(
const std::vector<ByteBuffer> & buffers) = 0;
342 virtual void implAccept() = 0;
343 virtual bool implOnAccept() = 0;
344 virtual bool implIsConnected() = 0;
345 virtual void implClose() = 0;
346 virtual void implCloseAfterWrite() {}
347 virtual void implTransferNativeFrom(ClientTransport & clientTransport) = 0;
354 #endif // ! INCLUDE_RCF_ASIOSERVERTRANSPORT_HPP std::unique_ptr< ClientTransport > ClientTransportUniquePtr
Unique pointer wrapper for RCF::ClientTransport.
Definition: RcfFwd.hpp:43
Definition: AmiIoHandler.hpp:24