aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/client.cpp96
-rw-r--r--src/client.h14
-rw-r--r--src/queuebuf.cpp15
-rw-r--r--src/queuebuf.h1
-rw-r--r--src/tests/itoserver.cpp8
-rw-r--r--src/tests/multiserver.cpp31
-rw-r--r--src/tests/rot13.cpp8
7 files changed, 80 insertions, 93 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
82void Bu::Client::processOutput() 81void 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/*
110Bu::FString &Bu::Client::getInput() 110Bu::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
120bool Bu::Client::isOpen() 121bool Bu::Client::isOpen()
121{ 122{
@@ -125,118 +126,77 @@ bool Bu::Client::isOpen()
125 126
126void Bu::Client::write( const Bu::FString &sData ) 127void Bu::Client::write( const Bu::FString &sData )
127{ 128{
128 sWriteBuf += sData; 129 qbWrite.write( sData.getStr(), sData.getSize() );
129} 130}
130 131
131void Bu::Client::write( const void *pData, int nBytes ) 132void 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
136void Bu::Client::write( int8_t nData ) 137void 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
141void Bu::Client::write( int16_t nData ) 142void 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
146void Bu::Client::write( int32_t nData ) 147void 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
151void Bu::Client::write( int64_t nData ) 152void 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
156void Bu::Client::write( uint8_t nData ) 157void 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
161void Bu::Client::write( uint16_t nData ) 162void 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
166void Bu::Client::write( uint32_t nData ) 167void 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
171void Bu::Client::write( uint64_t nData ) 172void 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
176int Bu::Client::read( void *pData, int nBytes ) 177int 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
205int Bu::Client::peek( void *pData, int nBytes, int nOffset ) 182int 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
217void Bu::Client::seek( int nBytes ) 187void 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
237long Bu::Client::getInputSize() 192long Bu::Client::getInputSize()
238{ 193{
239 return sReadBuf.getSize()-nRBOffset; 194 return qbRead.getSize();
195}
196
197long Bu::Client::getOutputSize()
198{
199 return qbWrite.getSize();
240} 200}
241 201
242const Bu::Socket *Bu::Client::getSocket() const 202const Bu::Socket *Bu::Client::getSocket() const
diff --git a/src/client.h b/src/client.h
index aecb16c..5a933ca 100644
--- a/src/client.h
+++ b/src/client.h
@@ -11,6 +11,7 @@
11#include <stdint.h> 11#include <stdint.h>
12 12
13#include "bu/fstring.h" 13#include "bu/fstring.h"
14#include "bu/queuebuf.h"
14 15
15namespace Bu 16namespace Bu
16{ 17{
@@ -31,8 +32,8 @@ namespace Bu
31 void processInput(); 32 void processInput();
32 void processOutput(); 33 void processOutput();
33 34
34 Bu::FString &getInput(); 35 //Bu::FString &getInput();
35 Bu::FString &getOutput(); 36 //Bu::FString &getOutput();
36 void write( const Bu::FString &sData ); 37 void write( const Bu::FString &sData );
37 void write( const void *pData, int nBytes ); 38 void write( const void *pData, int nBytes );
38 void write( int8_t nData ); 39 void write( int8_t nData );
@@ -47,6 +48,7 @@ namespace Bu
47 int peek( void *pData, int nBytes, int nOffset=0 ); 48 int peek( void *pData, int nBytes, int nOffset=0 );
48 void seek( int nBytes ); 49 void seek( int nBytes );
49 long getInputSize(); 50 long getInputSize();
51 long getOutputSize();
50 52
51 void setProtocol( Protocol *pProto ); 53 void setProtocol( Protocol *pProto );
52 Bu::Protocol *getProtocol(); 54 Bu::Protocol *getProtocol();
@@ -65,7 +67,8 @@ namespace Bu
65 67
66 void onMessage( const Bu::FString &sMsg ); 68 void onMessage( const Bu::FString &sMsg );
67 69
68 bool hasOutput() { return !sWriteBuf.isEmpty(); } 70 bool hasOutput() { return qbWrite.getSize() > 0; }
71 bool hasInput() { return qbRead.getSize() > 0; }
69 72
70 template<typename filter> 73 template<typename filter>
71 void pushFilter() 74 void pushFilter()
@@ -97,9 +100,8 @@ namespace Bu
97 Bu::Stream *pTopStream; 100 Bu::Stream *pTopStream;
98 Bu::Socket *pSocket; 101 Bu::Socket *pSocket;
99 Bu::Protocol *pProto; 102 Bu::Protocol *pProto;
100 Bu::FString sReadBuf; 103 Bu::QueueBuf qbRead;
101 int nRBOffset; 104 Bu::QueueBuf qbWrite;
102 Bu::FString sWriteBuf;
103 bool bWantsDisconnect; 105 bool bWantsDisconnect;
104 class Bu::ClientLinkFactory *pfLink; 106 class Bu::ClientLinkFactory *pfLink;
105 }; 107 };
diff --git a/src/queuebuf.cpp b/src/queuebuf.cpp
index 9577793..01d92f8 100644
--- a/src/queuebuf.cpp
+++ b/src/queuebuf.cpp
@@ -76,7 +76,12 @@ size_t Bu::QueueBuf::read( void *pRawBuf, size_t nBytes )
76 return nBytes - iLeft; 76 return nBytes - iLeft;
77} 77}
78 78
79size_t Bu::QueueBuf::peek( void *pRawBuf, size_t nBytes ) 79size_t Bu::QueueBuf::peek( void *pBuf, size_t nBytes )
80{
81 return peek( pBuf, nBytes, 0 );
82}
83
84size_t Bu::QueueBuf::peek( void *pRawBuf, size_t nBytes, size_t nSkip )
80{ 85{
81 if( nBytes <= 0 ) 86 if( nBytes <= 0 )
82 return 0; 87 return 0;
@@ -87,12 +92,16 @@ size_t Bu::QueueBuf::peek( void *pRawBuf, size_t nBytes )
87 size_t iLeft = nBytes; 92 size_t iLeft = nBytes;
88 char *pBuf = (char *)pRawBuf; 93 char *pBuf = (char *)pRawBuf;
89 94
90 int iTmpReadOffset = iReadOffset; 95 int iTmpReadOffset = iReadOffset + nSkip;
91 size_t iTmpRemSize = iTotalSize; 96 size_t iTmpRemSize = iTotalSize;
92 BlockList::iterator iBlock = lBlocks.begin(); 97 BlockList::iterator iBlock = lBlocks.begin();
98 while( iTmpReadOffset > iBlockSize )
99 {
100 iTmpReadOffset -= iBlockSize;
101 iBlock++;
102 }
93 while( iLeft > 0 && iTmpRemSize > 0 ) 103 while( iLeft > 0 && iTmpRemSize > 0 )
94 { 104 {
95 // Switching to use temp variables instead of iReadOffset and iTotalSize
96 if( iTmpReadOffset == iBlockSize ) 105 if( iTmpReadOffset == iBlockSize )
97 { 106 {
98 iBlock++; 107 iBlock++;
diff --git a/src/queuebuf.h b/src/queuebuf.h
index 3591959..382863d 100644
--- a/src/queuebuf.h
+++ b/src/queuebuf.h
@@ -29,6 +29,7 @@ namespace Bu
29 virtual void close(); 29 virtual void close();
30 virtual size_t read( void *pBuf, size_t nBytes ); 30 virtual size_t read( void *pBuf, size_t nBytes );
31 virtual size_t peek( void *pBuf, size_t nBytes ); 31 virtual size_t peek( void *pBuf, size_t nBytes );
32 virtual size_t peek( void *pBuf, size_t nBytes, size_t nSkip );
32 virtual size_t write( const void *pBuf, size_t nBytes ); 33 virtual size_t write( const void *pBuf, size_t nBytes );
33 virtual long tell(); 34 virtual long tell();
34 virtual void seek( long offset ); 35 virtual void seek( long offset );
diff --git a/src/tests/itoserver.cpp b/src/tests/itoserver.cpp
index cf5f6d1..5f6e4fa 100644
--- a/src/tests/itoserver.cpp
+++ b/src/tests/itoserver.cpp
@@ -33,8 +33,12 @@ public:
33 virtual void onNewData( Bu::Client *pClient ) 33 virtual void onNewData( Bu::Client *pClient )
34 { 34 {
35 TRACE(); 35 TRACE();
36 pClient->write( pClient->getInput().getStr(), pClient->getInputSize() ); 36 char buf[1024];
37 pClient->seek( pClient->getInputSize() ); 37 while( pClient->hasInput() )
38 {
39 int iAmnt = pClient->read( buf, 1024 );
40 pClient->write( buf, iAmnt );
41 }
38 } 42 }
39}; 43};
40 44
diff --git a/src/tests/multiserver.cpp b/src/tests/multiserver.cpp
index 22ce94b..85971b5 100644
--- a/src/tests/multiserver.cpp
+++ b/src/tests/multiserver.cpp
@@ -19,8 +19,12 @@ public:
19 19
20 virtual void onNewData( Bu::Client *pClient ) 20 virtual void onNewData( Bu::Client *pClient )
21 { 21 {
22 pClient->write( pClient->getInput() ); 22 char buf[1024];
23 pClient->seek( pClient->getInputSize() ); 23 while( pClient->hasInput() )
24 {
25 int iAmnt = pClient->read( buf, 1024 );
26 pClient->write( buf, iAmnt );
27 }
24 } 28 }
25}; 29};
26 30
@@ -34,20 +38,23 @@ public:
34 38
35 virtual void onNewData( Bu::Client *pClient ) 39 virtual void onNewData( Bu::Client *pClient )
36 { 40 {
37 Bu::FString sTmp = pClient->getInput(); 41 while( pClient->hasInput() )
38 for( int j = 0; j < sTmp.getSize(); j++ )
39 { 42 {
40 if( sTmp[j] >= 'a' && sTmp[j] <= 'z' ) 43 char sTmp[1024];
41 { 44 int iAmnt = pClient->read( sTmp, 1024 );
42 sTmp[j] = ((sTmp[j]-'a'+13)%26) + 'a'; 45 for( int j = 0; j < iAmnt; j++ )
43 }
44 else if( sTmp[j] >= 'A' && sTmp[j] <= 'Z' )
45 { 46 {
46 sTmp[j] = ((sTmp[j]-'A'+13)%26) + 'A'; 47 if( sTmp[j] >= 'a' && sTmp[j] <= 'z' )
48 {
49 sTmp[j] = ((sTmp[j]-'a'+13)%26) + 'a';
50 }
51 else if( sTmp[j] >= 'A' && sTmp[j] <= 'Z' )
52 {
53 sTmp[j] = ((sTmp[j]-'A'+13)%26) + 'A';
54 }
47 } 55 }
56 pClient->write( sTmp, iAmnt );
48 } 57 }
49 pClient->write( sTmp );
50 pClient->seek( pClient->getInputSize() );
51 } 58 }
52}; 59};
53 60
diff --git a/src/tests/rot13.cpp b/src/tests/rot13.cpp
index 2326888..03ba385 100644
--- a/src/tests/rot13.cpp
+++ b/src/tests/rot13.cpp
@@ -67,8 +67,12 @@ public:
67 67
68 void onNewData( Bu::Client *pClient ) 68 void onNewData( Bu::Client *pClient )
69 { 69 {
70 pClient->write( pClient->getInput().getStr(), pClient->getInputSize() ); 70 char buf[1024];
71 pClient->seek( pClient->getInputSize() ); 71 while( pClient->hasInput() )
72 {
73 int iAmnt = pClient->read( buf, 1024 );
74 pClient->write( buf, iAmnt );
75 }
72 } 76 }
73}; 77};
74 78