19 #ifndef INCLUDE_RCF_CONNECTIONORIENTEDCLIENTTRANSPORT_HPP
20 #define INCLUDE_RCF_CONNECTIONORIENTEDCLIENTTRANSPORT_HPP
22 #include <boost/enable_shared_from_this.hpp>
24 #include <RCF/AmiThreadPool.hpp>
25 #include <RCF/AsioBuffers.hpp>
26 #include <RCF/AsioDeadlineTimer.hpp>
27 #include <RCF/Filter.hpp>
28 #include <RCF/ByteOrdering.hpp>
29 #include <RCF/ClientProgress.hpp>
30 #include <RCF/ClientTransport.hpp>
31 #include <RCF/Export.hpp>
32 #include <RCF/RecursionLimiter.hpp>
36 class ConnectedClientTransport;
38 class ClientFilterProxy;
40 class TcpClientTransport;
41 typedef boost::shared_ptr<TcpClientTransport> TcpClientTransportPtr;
42 class TcpClientFilterProxy;
45 typedef boost::shared_ptr<OverlappedAmi> OverlappedAmiPtr;
47 class RCF_EXPORT ConnectedClientTransport :
48 public ClientTransport,
49 public WithProgressCallback
53 ConnectedClientTransport(
const ConnectedClientTransport &rhs);
54 ConnectedClientTransport();
55 ~ConnectedClientTransport();
58 void setMaxSendSize(std::size_t maxSendSize);
59 std::size_t getMaxSendSize();
63 void read(
const ByteBuffer &byteBuffer_, std::size_t bytesRequested);
64 void write(
const std::vector<ByteBuffer> &byteBuffers);
65 std::size_t timedSend(
const std::vector<ByteBuffer> &data);
66 std::size_t timedReceive(ByteBuffer &byteBuffer, std::size_t bytesRequested);
68 void setTransportFilters(
const std::vector<FilterPtr> &filters);
69 void getTransportFilters(std::vector<FilterPtr> &filters);
70 void connectTransportFilters();
72 void connect(ClientTransportCallback &clientStub,
unsigned int timeoutMs);
73 void disconnect(
unsigned int timeoutMs);
74 int timedSend(
const char *buffer, std::size_t bufferLen);
75 int timedReceive(
char *buffer, std::size_t bufferLen);
79 void onReadCompleted(
const ByteBuffer &byteBuffer);
80 void onWriteCompleted(std::size_t bytes);
82 friend class HttpServerTransport;
83 friend class AsioServerTransport;
84 friend class PublishingService;
85 void setWireFilters(
const std::vector<FilterPtr> & wireFilters);
89 std::size_t mMaxSendSize;
90 std::size_t mBytesTransferred;
91 std::size_t mBytesSent;
92 std::size_t mBytesRead;
93 std::size_t mBytesTotal;
96 unsigned int mEndTimeMs;
98 std::vector<FilterPtr> mTransportFilters;
99 std::vector<FilterPtr> mWireFilters;
100 std::vector<ByteBuffer> mByteBuffers;
101 std::vector<ByteBuffer> mSlicedByteBuffers;
102 ReallocBufferPtr mReadBufferPtr;
103 ReallocBufferPtr mReadBuffer2Ptr;
105 friend class ClientFilterProxy;
106 friend class ClientTcpFrame;
107 friend class ClientHttpFrame;
111 virtual std::size_t implRead(
112 const ByteBuffer &byteBuffer_,
113 std::size_t bytesRequested) = 0;
115 virtual std::size_t implReadAsync(
116 const ByteBuffer &byteBuffer_,
117 std::size_t bytesRequested) = 0;
119 virtual std::size_t implWrite(
120 const std::vector<ByteBuffer> &byteBuffers) = 0;
122 virtual std::size_t implWriteAsync(
123 const std::vector<ByteBuffer> &byteBuffers) = 0;
125 virtual void implConnect(
126 ClientTransportCallback &clientStub,
127 unsigned int timeoutMs) = 0;
129 virtual void implConnectAsync(
130 ClientTransportCallback &clientStub,
131 unsigned int timeoutMs) = 0;
133 virtual void implClose() = 0;
145 std::size_t mReadBufferPos;
146 std::size_t mWriteBufferPos;
148 ClientTransportCallback * mpClientStub;
150 ByteBuffer * mpClientStubReadBuffer;
151 ByteBuffer mReadBuffer;
152 std::size_t mBytesToRead;
153 std::size_t mBytesRequested;
154 ByteBuffer mByteBuffer;
157 friend class Subscription;
158 OverlappedAmiPtr mOverlappedPtr;
161 MutexPtr mSocketOpsMutexPtr;
163 AsioBuffers mAsioBuffers;
167 typedef boost::shared_ptr<Lock> LockPtr;
169 AsioDeadlineTimerPtr mAsioTimerPtr;
171 friend class TcpClientFilterProxy;
178 boost::uint32_t timeoutMs,
179 ClientTransportCallback *pClientStub);
181 void onTimerExpired();
184 RecursionState<std::size_t, int> mRecursionState;
189 void onTransitionCompleted(std::size_t bytesTransferred);
191 void onCompletion(
int bytesTransferred);
192 void onTimedRecvCompleted(
int ret,
int err);
193 void onTimedSendCompleted(
int ret,
int err);
194 void onConnectCompleted(
int err);
197 void onTransitionCompleted_(std::size_t bytesTransferred);
198 void issueRead(
const ByteBuffer &buffer, std::size_t bytesToRead);
199 void issueWrite(
const std::vector<ByteBuffer> &byteBuffers);
202 ClientTransportCallback &clientStub,
203 const std::vector<ByteBuffer> &data,
204 unsigned int timeoutMs);
207 ClientTransportCallback &clientStub,
208 ByteBuffer &byteBuffer,
209 unsigned int timeoutMs);
211 void setSocketOpsMutex(MutexPtr mutexPtr);
213 friend class OverlappedAmi;
219 #endif // ! INCLUDE_RCF_CONNECTIONORIENTEDCLIENTTRANSPORT_HPP