18 #ifndef INCLUDE_RCF_ASIOSERVERTRANSPORT_HPP 19 #define INCLUDE_RCF_ASIOSERVERTRANSPORT_HPP 25 #include <RCF/Asio.hpp> 26 #include <RCF/AsioBuffers.hpp> 27 #include <RCF/ByteBuffer.hpp> 28 #include <RCF/Export.hpp> 29 #include <RCF/ServerTransport.hpp> 30 #include <RCF/Service.hpp> 31 #include <RCF/ThreadLibrary.hpp> 32 #include <RCF/Tools.hpp> 37 class TcpClientTransport;
38 class AsioNetworkSession;
39 class AsioServerTransport;
41 typedef std::shared_ptr<AsioNetworkSession> AsioNetworkSessionPtr;
42 typedef std::weak_ptr<AsioNetworkSession> AsioNetworkSessionWeakPtr;
45 typedef std::shared_ptr<ReallocBuffer> ReallocBufferPtr;
52 typedef std::shared_ptr<I_RcfClient> RcfClientPtr;
57 virtual ~AsioAcceptor();
60 typedef std::unique_ptr<AsioAcceptor> AsioAcceptorPtr;
62 class RCF_EXPORT AsioServerTransport :
63 public ServerTransport,
64 public ServerTransportEx,
70 friend class TcpTransportFactory;
71 friend class HttpTransportFactory;
72 friend class HttpsTransportFactory;
74 friend class Win32NamedPipeNetworkSession;
76 typedef std::weak_ptr<RcfSession> SessionWeakPtr;
78 AsioNetworkSessionPtr createNetworkSession();
84 createClientTransport(
85 const Endpoint &endpoint);
87 SessionPtr createServerSession(
88 ClientTransportUniquePtr & clientTransportUniquePtr,
89 RcfClientPtr stubEntryPtr,
90 bool keepClientConnection);
93 createClientTransport(
94 SessionPtr sessionPtr);
103 void onServiceAdded( RcfServer & server);
104 void onServiceRemoved( RcfServer & server);
108 void onServerStart( RcfServer & server);
109 void onServerStop( RcfServer & server);
110 void setServer( RcfServer & server);
112 void startAccepting();
116 void startAcceptingThread(Exception & eRet);
120 RcfServer & getServer();
121 RcfServer & getSessionManager();
125 void registerSession(NetworkSessionWeakPtr session);
126 void unregisterSession(NetworkSessionWeakPtr session);
127 void cancelOutstandingIo();
129 friend class AsioNetworkSession;
130 friend class FilterAdapter;
131 friend class ServerTcpFrame;
132 friend class ServerHttpFrame;
136 AsioServerTransport();
137 ~AsioServerTransport();
139 AsioIoService * mpIoService;
140 AsioAcceptorPtr mAcceptorPtr;
142 WireProtocol mWireProtocol;
146 volatile bool mStopFlag;
147 RcfServer * mpServer;
151 virtual AsioNetworkSessionPtr implCreateNetworkSession() = 0;
152 virtual void implOpen() = 0;
155 const Endpoint &endpoint) = 0;
159 AsioAcceptor & getAcceptor();
161 AsioIoService & getIoService();
167 ReadHandler(AsioNetworkSessionPtr networkSessionPtr);
168 void operator()(AsioErrorCode err, std::size_t bytes);
169 void * allocate(std::size_t size);
170 AsioNetworkSessionPtr mNetworkSessionPtr;
176 WriteHandler(AsioNetworkSessionPtr networkSessionPtr);
177 void operator()(AsioErrorCode err, std::size_t bytes);
178 void * allocate(std::size_t size);
179 AsioNetworkSessionPtr mNetworkSessionPtr;
182 void * asio_handler_allocate(std::size_t size, ReadHandler * pHandler);
183 void asio_handler_deallocate(
void * pointer, std::size_t size, ReadHandler * pHandler);
184 void * asio_handler_allocate(std::size_t size, WriteHandler * pHandler);
185 void asio_handler_deallocate(
void * pointer, std::size_t size, WriteHandler * pHandler);
187 class RCF_EXPORT AsioNetworkSession :
188 public NetworkSession,
193 friend class ReadHandler;
194 friend class WriteHandler;
195 friend class ServerTcpFrame;
196 friend class ServerHttpFrame;
199 typedef std::weak_ptr<AsioNetworkSession> AsioNetworkSessionWeakPtr;
200 typedef std::shared_ptr<AsioNetworkSession> AsioNetworkSessionPtr;
203 AsioServerTransport &transport,
204 AsioIoService & ioService);
206 virtual ~AsioNetworkSession();
208 AsioNetworkSessionPtr sharedFromThis();
212 AsioErrorCode getLastError();
214 void setCloseAfterWrite();
217 AsioIoService & mIoService;
219 std::vector<char> mReadHandlerBuffer;
220 std::vector<char> mWriteHandlerBuffer;
222 AsioErrorCode mLastError;
224 void runOnDestroyCallbacks();
230 const ByteBuffer &byteBuffer,
231 std::size_t bytesRequested);
234 const std::vector<ByteBuffer> &byteBuffers);
238 void setTransportFilters(
239 const std::vector<FilterPtr> &filters);
241 void getTransportFilters(
242 std::vector<FilterPtr> &filters);
245 const std::vector<FilterPtr> &filters);
248 std::vector<FilterPtr> &filters);
250 AsioServerTransport & getAsioServerTransport();
258 void onAcceptCompleted(
const AsioErrorCode & error);
260 void onNetworkReadCompleted(
262 size_t bytesTransferred);
264 void onNetworkWriteCompleted(
266 size_t bytesTransferred);
268 friend class HttpSessionFilter;
269 void onAppReadWriteCompleted(
270 size_t bytesTransferred);
272 void sendServerError(
int error);
274 void doCustomFraming(
size_t bytesTransferred);
275 void doRegularFraming(
size_t bytesTransferred);
278 friend class AsioServerTransport;
279 friend class TcpNetworkSession;
280 friend class UnixLocalNetworkSession;
281 friend class Win32NamedPipeNetworkSession;
282 friend class FilterAdapter;
294 bool mIssueZeroByteRead;
295 std::size_t mReadBufferRemaining;
296 std::size_t mWriteBufferRemaining;
298 std::vector<FilterPtr> mTransportFilters;
300 friend class HttpServerTransport;
301 friend class PublishingService;
302 std::vector<FilterPtr> mWireFilters;
304 AsioServerTransport & mTransport;
306 std::vector<ByteBuffer> mWriteByteBuffers;
307 std::vector<ByteBuffer> mSlicedWriteByteBuffers;
309 ReallocBufferPtr mAppReadBufferPtr;
310 ByteBuffer mAppReadByteBuffer;
312 ReallocBufferPtr mNetworkReadBufferPtr;
313 ByteBuffer mNetworkReadByteBuffer;
316 FilterPtr mFilterAdapterPtr;
318 bool mCloseAfterWrite;
320 NetworkSessionWeakPtr mWeakThisPtr;
324 std::shared_ptr<Mutex> mSocketOpsMutexPtr;
331 ByteBuffer getReadByteBuffer();
332 void postWrite(std::vector<ByteBuffer> &byteBuffers);
334 ServerTransport & getServerTransport();
335 const RemoteAddress & getRemoteAddress();
340 virtual const RemoteAddress & implGetRemoteAddress() = 0;
341 virtual void implRead(
char * buffer, std::size_t bufferLen) = 0;
342 virtual void implWrite(
const std::vector<ByteBuffer> & buffers) = 0;
343 virtual void implAccept() = 0;
344 virtual bool implOnAccept() = 0;
345 virtual bool implIsConnected() = 0;
346 virtual void implClose() = 0;
347 virtual void implCloseAfterWrite() {}
348 virtual void implTransferNativeFrom(ClientTransport & clientTransport) = 0;
355 #endif // ! INCLUDE_RCF_ASIOSERVERTRANSPORT_HPP std::unique_ptr< ClientTransport > ClientTransportUniquePtr
Unique pointer wrapper for RCF::ClientTransport.
Definition: RcfFwd.hpp:43
Definition: AmiIoHandler.hpp:23