diff options
Diffstat (limited to 'src/client.cpp')
-rw-r--r-- | src/client.cpp | 96 |
1 files changed, 28 insertions, 68 deletions
diff --git a/src/client.cpp b/src/client.cpp index 95008f9..88eb49d 100644 --- a/src/client.cpp +++ b/src/client.cpp | |||
@@ -20,7 +20,6 @@ Bu::Client::Client( Bu::Socket *pSocket, class Bu::ClientLinkFactory *pfLink ) : | |||
20 | pTopStream( pSocket ), | 20 | pTopStream( pSocket ), |
21 | pSocket( pSocket ), | 21 | pSocket( pSocket ), |
22 | pProto( NULL ), | 22 | pProto( NULL ), |
23 | nRBOffset( 0 ), | ||
24 | bWantsDisconnect( false ), | 23 | bWantsDisconnect( false ), |
25 | pfLink( pfLink ) | 24 | pfLink( pfLink ) |
26 | { | 25 | { |
@@ -54,7 +53,7 @@ void Bu::Client::processInput() | |||
54 | else | 53 | else |
55 | { | 54 | { |
56 | nTotal += nRead; | 55 | nTotal += nRead; |
57 | sReadBuf.append( buf, nRead ); | 56 | qbRead.write( buf, nRead ); |
58 | if( !pTopStream->canRead() ) | 57 | if( !pTopStream->canRead() ) |
59 | break; | 58 | break; |
60 | } | 59 | } |
@@ -81,13 +80,14 @@ void Bu::Client::processInput() | |||
81 | 80 | ||
82 | void Bu::Client::processOutput() | 81 | void Bu::Client::processOutput() |
83 | { | 82 | { |
84 | if( sWriteBuf.getSize() > 0 ) | 83 | if( qbWrite.getSize() > 0 ) |
85 | { | 84 | { |
86 | int nAmnt = (sWriteBuf.getSize()<2048)?(sWriteBuf.getSize()):(2048); | 85 | int nAmnt = RBS; |
87 | int nReal = pTopStream->write( sWriteBuf.getStr(), nAmnt ); | 86 | char *buf = new char[nAmnt]; |
87 | nAmnt = qbWrite.peek( buf, nAmnt ); | ||
88 | int nReal = pTopStream->write( buf, nAmnt ); | ||
89 | qbWrite.seek( nReal ); | ||
88 | pTopStream->flush(); | 90 | pTopStream->flush(); |
89 | sWriteBuf.trimFront( nReal ); | ||
90 | //sWriteBuf.clear(); | ||
91 | } | 91 | } |
92 | } | 92 | } |
93 | 93 | ||
@@ -106,7 +106,7 @@ void Bu::Client::clearProtocol() | |||
106 | { | 106 | { |
107 | pProto = NULL; | 107 | pProto = NULL; |
108 | } | 108 | } |
109 | 109 | /* | |
110 | Bu::FString &Bu::Client::getInput() | 110 | Bu::FString &Bu::Client::getInput() |
111 | { | 111 | { |
112 | return sReadBuf; | 112 | return sReadBuf; |
@@ -116,6 +116,7 @@ Bu::FString &Bu::Client::getOutput() | |||
116 | { | 116 | { |
117 | return sWriteBuf; | 117 | return sWriteBuf; |
118 | } | 118 | } |
119 | */ | ||
119 | 120 | ||
120 | bool Bu::Client::isOpen() | 121 | bool Bu::Client::isOpen() |
121 | { | 122 | { |
@@ -125,118 +126,77 @@ bool Bu::Client::isOpen() | |||
125 | 126 | ||
126 | void Bu::Client::write( const Bu::FString &sData ) | 127 | void Bu::Client::write( const Bu::FString &sData ) |
127 | { | 128 | { |
128 | sWriteBuf += sData; | 129 | qbWrite.write( sData.getStr(), sData.getSize() ); |
129 | } | 130 | } |
130 | 131 | ||
131 | void Bu::Client::write( const void *pData, int nBytes ) | 132 | void Bu::Client::write( const void *pData, int nBytes ) |
132 | { | 133 | { |
133 | sWriteBuf.append( (const char *)pData, nBytes ); | 134 | qbWrite.write( pData, nBytes ); |
134 | } | 135 | } |
135 | 136 | ||
136 | void Bu::Client::write( int8_t nData ) | 137 | void Bu::Client::write( int8_t nData ) |
137 | { | 138 | { |
138 | sWriteBuf.append( (const char *)&nData, sizeof(nData) ); | 139 | qbWrite.write( (const char *)&nData, sizeof(nData) ); |
139 | } | 140 | } |
140 | 141 | ||
141 | void Bu::Client::write( int16_t nData ) | 142 | void Bu::Client::write( int16_t nData ) |
142 | { | 143 | { |
143 | sWriteBuf.append( (const char *)&nData, sizeof(nData) ); | 144 | qbWrite.write( (const char *)&nData, sizeof(nData) ); |
144 | } | 145 | } |
145 | 146 | ||
146 | void Bu::Client::write( int32_t nData ) | 147 | void Bu::Client::write( int32_t nData ) |
147 | { | 148 | { |
148 | sWriteBuf.append( (const char *)&nData, sizeof(nData) ); | 149 | qbWrite.write( (const char *)&nData, sizeof(nData) ); |
149 | } | 150 | } |
150 | 151 | ||
151 | void Bu::Client::write( int64_t nData ) | 152 | void Bu::Client::write( int64_t nData ) |
152 | { | 153 | { |
153 | sWriteBuf.append( (const char *)&nData, sizeof(nData) ); | 154 | qbWrite.write( (const char *)&nData, sizeof(nData) ); |
154 | } | 155 | } |
155 | 156 | ||
156 | void Bu::Client::write( uint8_t nData ) | 157 | void Bu::Client::write( uint8_t nData ) |
157 | { | 158 | { |
158 | sWriteBuf.append( (const char *)&nData, sizeof(nData) ); | 159 | qbWrite.write( (const char *)&nData, sizeof(nData) ); |
159 | } | 160 | } |
160 | 161 | ||
161 | void Bu::Client::write( uint16_t nData ) | 162 | void Bu::Client::write( uint16_t nData ) |
162 | { | 163 | { |
163 | sWriteBuf.append( (const char *)&nData, sizeof(nData) ); | 164 | qbWrite.write( (const char *)&nData, sizeof(nData) ); |
164 | } | 165 | } |
165 | 166 | ||
166 | void Bu::Client::write( uint32_t nData ) | 167 | void Bu::Client::write( uint32_t nData ) |
167 | { | 168 | { |
168 | sWriteBuf.append( (const char *)&nData, sizeof(nData) ); | 169 | qbWrite.write( (const char *)&nData, sizeof(nData) ); |
169 | } | 170 | } |
170 | 171 | ||
171 | void Bu::Client::write( uint64_t nData ) | 172 | void Bu::Client::write( uint64_t nData ) |
172 | { | 173 | { |
173 | sWriteBuf.append( (const char *)&nData, sizeof(nData) ); | 174 | qbWrite.write( (const char *)&nData, sizeof(nData) ); |
174 | } | 175 | } |
175 | 176 | ||
176 | int Bu::Client::read( void *pData, int nBytes ) | 177 | int Bu::Client::read( void *pData, int nBytes ) |
177 | { | 178 | { |
178 | if( nBytes > sReadBuf.getSize()-nRBOffset ) | 179 | return qbRead.read( pData, nBytes ); |
179 | { | ||
180 | nBytes = sReadBuf.getSize()-nRBOffset; | ||
181 | if( nBytes <= 0 ) | ||
182 | return 0; | ||
183 | } | ||
184 | memcpy( pData, sReadBuf.getStr()+nRBOffset, nBytes ); | ||
185 | nRBOffset += nBytes; | ||
186 | if( sReadBuf.getSize()-nRBOffset == 0 ) | ||
187 | { | ||
188 | sReadBuf.clear(); | ||
189 | nRBOffset = 0; | ||
190 | } | ||
191 | // This is an experimental threshold, maybe I'll make this configurable | ||
192 | // later on. | ||
193 | else if( | ||
194 | (sReadBuf.getSize() >= 1024 && nRBOffset >= sReadBuf.getSize()/2) || | ||
195 | (nRBOffset >= sReadBuf.getSize()/4) | ||
196 | ) | ||
197 | { | ||
198 | sReadBuf.trimFront( nRBOffset ); | ||
199 | nRBOffset = 0; | ||
200 | } | ||
201 | |||
202 | return nBytes; | ||
203 | } | 180 | } |
204 | 181 | ||
205 | int Bu::Client::peek( void *pData, int nBytes, int nOffset ) | 182 | int Bu::Client::peek( void *pData, int nBytes, int nOffset ) |
206 | { | 183 | { |
207 | if( nBytes+nOffset > sReadBuf.getSize()-nRBOffset ) | 184 | return qbRead.peek( pData, nBytes, nOffset ); |
208 | { | ||
209 | nBytes = sReadBuf.getSize()-nRBOffset-nOffset; | ||
210 | if( nBytes <= 0 ) | ||
211 | return 0; | ||
212 | } | ||
213 | memcpy( pData, sReadBuf.getStr()+nRBOffset+nOffset, nBytes ); | ||
214 | return nBytes; | ||
215 | } | 185 | } |
216 | 186 | ||
217 | void Bu::Client::seek( int nBytes ) | 187 | void Bu::Client::seek( int nBytes ) |
218 | { | 188 | { |
219 | nRBOffset += nBytes; | 189 | return qbRead.seek( nBytes ); |
220 | if( sReadBuf.getSize()-nRBOffset == 0 ) | ||
221 | { | ||
222 | sReadBuf.clear(); | ||
223 | nRBOffset = 0; | ||
224 | } | ||
225 | // This is an experimental threshold, maybe I'll make this configurable | ||
226 | // later on. | ||
227 | else if( | ||
228 | (sReadBuf.getSize() >= 1024 && nRBOffset >= sReadBuf.getSize()/2) || | ||
229 | (nRBOffset >= sReadBuf.getSize()/4) | ||
230 | ) | ||
231 | { | ||
232 | sReadBuf.trimFront( nRBOffset ); | ||
233 | nRBOffset = 0; | ||
234 | } | ||
235 | } | 190 | } |
236 | 191 | ||
237 | long Bu::Client::getInputSize() | 192 | long Bu::Client::getInputSize() |
238 | { | 193 | { |
239 | return sReadBuf.getSize()-nRBOffset; | 194 | return qbRead.getSize(); |
195 | } | ||
196 | |||
197 | long Bu::Client::getOutputSize() | ||
198 | { | ||
199 | return qbWrite.getSize(); | ||
240 | } | 200 | } |
241 | 201 | ||
242 | const Bu::Socket *Bu::Client::getSocket() const | 202 | const Bu::Socket *Bu::Client::getSocket() const |