summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Buland <eichlan@xagasoft.com>2011-06-08 05:37:45 +0000
committerMike Buland <eichlan@xagasoft.com>2011-06-08 05:37:45 +0000
commit5f2c95f9116f24ecd64b6361b6e22ce983732997 (patch)
treefb27ff3927d1843b759d99506e2e3a03c88d0ab8
parent6fcf117c7543a6adec19a6afea0da7df087170ab (diff)
downloadlibbu++-5f2c95f9116f24ecd64b6361b6e22ce983732997.tar.gz
libbu++-5f2c95f9116f24ecd64b6361b6e22ce983732997.tar.bz2
libbu++-5f2c95f9116f24ecd64b6361b6e22ce983732997.tar.xz
libbu++-5f2c95f9116f24ecd64b6361b6e22ce983732997.zip
Hopefully nobody was using the buffer size parameter, if so, it's moved.
Buffer now takes an extra parameter: what to buffer, read, write, or both. This winds up being important when dealing with blocking sockets and the like.
-rw-r--r--src/buffer.cpp14
-rw-r--r--src/buffer.h10
2 files changed, 21 insertions, 3 deletions
diff --git a/src/buffer.cpp b/src/buffer.cpp
index b54f97e..47fab70 100644
--- a/src/buffer.cpp
+++ b/src/buffer.cpp
@@ -7,7 +7,7 @@
7 7
8#include "bu/buffer.h" 8#include "bu/buffer.h"
9 9
10Bu::Buffer::Buffer( Bu::Stream &rNext, int iBufSize ) : 10Bu::Buffer::Buffer( Bu::Stream &rNext, int iWhat, int iBufSize ) :
11 Bu::Filter( rNext ), 11 Bu::Filter( rNext ),
12 sSoFar( 0 ), 12 sSoFar( 0 ),
13 iBufSize( iBufSize ), 13 iBufSize( iBufSize ),
@@ -16,7 +16,8 @@ Bu::Buffer::Buffer( Bu::Stream &rNext, int iBufSize ) :
16 iReadBufFill( 0 ), 16 iReadBufFill( 0 ),
17 iReadPos( 0 ), 17 iReadPos( 0 ),
18 iWriteBufFill( 0 ), 18 iWriteBufFill( 0 ),
19 iWritePos( 0 ) 19 iWritePos( 0 ),
20 iWhat( iWhat )
20{ 21{
21 sReadBuf = new char[iBufSize]; 22 sReadBuf = new char[iBufSize];
22 sWriteBuf = new char[iBufSize]; 23 sWriteBuf = new char[iBufSize];
@@ -51,6 +52,9 @@ void Bu::Buffer::fillReadBuf()
51 52
52Bu::size Bu::Buffer::read( void *pBuf, Bu::size nBytes ) 53Bu::size Bu::Buffer::read( void *pBuf, Bu::size nBytes )
53{ 54{
55 if( (iWhat&Read) == 0 )
56 return rNext.read( pBuf, nBytes );
57
54 if( nBytes <= 0 ) 58 if( nBytes <= 0 )
55 { 59 {
56 fillReadBuf(); 60 fillReadBuf();
@@ -89,6 +93,9 @@ Bu::size Bu::Buffer::read( void *pBuf, Bu::size nBytes )
89 93
90Bu::size Bu::Buffer::write( const void *pBuf, Bu::size nBytes ) 94Bu::size Bu::Buffer::write( const void *pBuf, Bu::size nBytes )
91{ 95{
96 if( (iWhat&Write) == 0 )
97 return rNext.write( pBuf, nBytes );
98
92 Bu::size nTotWrote = 0; 99 Bu::size nTotWrote = 0;
93 100
94 do 101 do
@@ -137,6 +144,9 @@ Bu::size Bu::Buffer::write( const void *pBuf, Bu::size nBytes )
137 144
138void Bu::Buffer::flush() 145void Bu::Buffer::flush()
139{ 146{
147 if( (iWhat&Write) == 0 )
148 return rNext.flush();
149
140 if( iWriteBufFill > 0 ) 150 if( iWriteBufFill > 0 )
141 { 151 {
142 //printf("Buffer: Flushing remaining data, %db.\n", iWriteBufFill ); 152 //printf("Buffer: Flushing remaining data, %db.\n", iWriteBufFill );
diff --git a/src/buffer.h b/src/buffer.h
index 17c6d73..91ec9c2 100644
--- a/src/buffer.h
+++ b/src/buffer.h
@@ -15,9 +15,16 @@ namespace Bu
15 class Buffer : public Bu::Filter 15 class Buffer : public Bu::Filter
16 { 16 {
17 public: 17 public:
18 Buffer( Bu::Stream &rNext, int iBufSize=4096 ); 18 Buffer( Bu::Stream &rNext, int iWhat=Both, int iBufSize=4096 );
19 virtual ~Buffer(); 19 virtual ~Buffer();
20 20
21 enum
22 {
23 Write = 1,
24 Read = 2,
25 Both = 3
26 };
27
21 virtual void start(); 28 virtual void start();
22 virtual Bu::size stop(); 29 virtual Bu::size stop();
23 30
@@ -44,6 +51,7 @@ namespace Bu
44 int iReadPos; 51 int iReadPos;
45 int iWriteBufFill; 52 int iWriteBufFill;
46 int iWritePos; 53 int iWritePos;
54 int iWhat;
47 }; 55 };
48}; 56};
49 57