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;
225 void runOnDestroyCallbacks();
231 const ByteBuffer &byteBuffer,
232 std::size_t bytesRequested);
235 const std::vector<ByteBuffer> &byteBuffers);
239 void setTransportFilters(
240 const std::vector<FilterPtr> &filters);
242 void getTransportFilters(
243 std::vector<FilterPtr> &filters);
246 const std::vector<FilterPtr> &filters);
249 std::vector<FilterPtr> &filters);
251 AsioServerTransport & getAsioServerTransport();
259 void onAcceptCompleted(
const AsioErrorCode & error);
261 void onNetworkReadCompleted(
263 size_t bytesTransferred);
265 void onNetworkWriteCompleted(
267 size_t bytesTransferred);
269 friend class HttpSessionFilter;
270 void onAppReadWriteCompleted(
271 size_t bytesTransferred);
273 void sendServerError(
int error);
275 void doCustomFraming(
size_t bytesTransferred);
276 void doRegularFraming(
size_t bytesTransferred);
279 friend class AsioServerTransport;
280 friend class TcpNetworkSession;
281 friend class UnixLocalNetworkSession;
282 friend class Win32NamedPipeNetworkSession;
283 friend class FilterAdapter;
295 bool mIssueZeroByteRead;
296 std::size_t mReadBufferRemaining;
297 std::size_t mWriteBufferRemaining;
299 std::vector<FilterPtr> mTransportFilters;
301 friend class HttpServerTransport;
302 friend class PublishingService;
303 std::vector<FilterPtr> mWireFilters;
305 AsioServerTransport & mTransport;
307 std::vector<ByteBuffer> mWriteByteBuffers;
308 std::vector<ByteBuffer> mSlicedWriteByteBuffers;
310 ReallocBufferPtr mAppReadBufferPtr;
311 ByteBuffer mAppReadByteBuffer;
313 ReallocBufferPtr mNetworkReadBufferPtr;
314 ByteBuffer mNetworkReadByteBuffer;
317 FilterPtr mFilterAdapterPtr;
319 bool mCloseAfterWrite;
321 NetworkSessionWeakPtr mWeakThisPtr;
325 std::shared_ptr<Mutex> mSocketOpsMutexPtr;
332 ByteBuffer getReadByteBuffer();
333 void postWrite(std::vector<ByteBuffer> &byteBuffers);
335 ServerTransport & getServerTransport();
336 const RemoteAddress & getRemoteAddress();
341 virtual const RemoteAddress & implGetRemoteAddress() = 0;
342 virtual void implRead(
char * buffer, std::size_t bufferLen) = 0;
343 virtual void implWrite(
const std::vector<ByteBuffer> & buffers) = 0;
344 virtual void implAccept() = 0;
345 virtual bool implOnAccept() = 0;
346 virtual bool implIsConnected() = 0;
347 virtual void implClose() = 0;
348 virtual void implCloseAfterWrite() {}
349 virtual void implTransferNativeFrom(ClientTransport & clientTransport) = 0;
356 #endif // ! INCLUDE_RCF_ASIOSERVERTRANSPORT_HPP std::unique_ptr< ClientTransport > ClientTransportUniquePtr
Unique pointer wrapper for RCF::ClientTransport.
Definition: RcfFwd.hpp:43
Definition: AmiIoHandler.hpp:24