aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Buland <eichlan@xagasoft.com>2007-06-18 19:42:34 +0000
committerMike Buland <eichlan@xagasoft.com>2007-06-18 19:42:34 +0000
commit8b12972092777af56ae21f65b41f4c40d52c2367 (patch)
tree3ee45c4b69899acb0cdbd013ea8e6ea54bcdc023 /src
parent5292e5831934dc719d1ac06332bd252abe4ac3bc (diff)
downloadlibbu++-8b12972092777af56ae21f65b41f4c40d52c2367.tar.gz
libbu++-8b12972092777af56ae21f65b41f4c40d52c2367.tar.bz2
libbu++-8b12972092777af56ae21f65b41f4c40d52c2367.tar.xz
libbu++-8b12972092777af56ae21f65b41f4c40d52c2367.zip
Added the protocol class. servers work, but don't send data, updated the streams
to include many more state indicators and caps queries, and everything is working better in general.
Diffstat (limited to 'src')
-rw-r--r--src/bzip2.cpp7
-rw-r--r--src/bzip2.h2
-rw-r--r--src/client.cpp69
-rw-r--r--src/client.h20
-rw-r--r--src/file.cpp17
-rw-r--r--src/file.h6
-rw-r--r--src/filter.cpp19
-rw-r--r--src/filter.h6
-rw-r--r--src/protocol.cpp12
-rw-r--r--src/protocol.h26
-rw-r--r--src/server.cpp11
-rw-r--r--src/server.h8
-rw-r--r--src/socket.cpp48
-rw-r--r--src/socket.h6
-rw-r--r--src/stream.h35
15 files changed, 266 insertions, 26 deletions
diff --git a/src/bzip2.cpp b/src/bzip2.cpp
index d3f237a..66786e4 100644
--- a/src/bzip2.cpp
+++ b/src/bzip2.cpp
@@ -128,7 +128,7 @@ size_t Bu::BZip2::read( void *pData, size_t nBytes )
128 { 128 {
129 if( bzState.avail_in > 0 ) 129 if( bzState.avail_in > 0 )
130 { 130 {
131 if( rNext.canSeek() ) 131 if( rNext.isSeekable() )
132 { 132 {
133 rNext.seek( -bzState.avail_in ); 133 rNext.seek( -bzState.avail_in );
134 } 134 }
@@ -185,3 +185,8 @@ size_t Bu::BZip2::write( const void *pData, size_t nBytes )
185 return sTotalOut; 185 return sTotalOut;
186} 186}
187 187
188bool Bu::BZip2::isOpen()
189{
190 return (bzState.state != NULL);
191}
192
diff --git a/src/bzip2.h b/src/bzip2.h
index a23f07a..25f10c5 100644
--- a/src/bzip2.h
+++ b/src/bzip2.h
@@ -22,6 +22,8 @@ namespace Bu
22 virtual size_t read( void *pBuf, size_t nBytes ); 22 virtual size_t read( void *pBuf, size_t nBytes );
23 virtual size_t write( const void *pBuf, size_t nBytes ); 23 virtual size_t write( const void *pBuf, size_t nBytes );
24 24
25 virtual bool isOpen();
26
25 private: 27 private:
26 void bzError( int code ); 28 void bzError( int code );
27 bz_stream bzState; 29 bz_stream bzState;
diff --git a/src/client.cpp b/src/client.cpp
index a33cdc3..cf96424 100644
--- a/src/client.cpp
+++ b/src/client.cpp
@@ -1,6 +1,16 @@
1#include "client.h" 1#include "bu/client.h"
2#include "bu/socket.h"
3#include <stdlib.h>
4#include <errno.h>
5#include "bu/exceptions.h"
6#include "bu/protocol.h"
2 7
3Bu::Client::Client() 8/** Read buffer size. */
9#define RBS (1024*2)
10
11Bu::Client::Client( Bu::Socket *pSocket ) :
12 pSocket( pSocket ),
13 pProto( NULL )
4{ 14{
5} 15}
6 16
@@ -8,3 +18,58 @@ Bu::Client::~Client()
8{ 18{
9} 19}
10 20
21void Bu::Client::processInput()
22{
23 char buf[RBS];
24 size_t nRead, nTotal=0;
25
26 for(;;)
27 {
28 nRead = pSocket->read( buf, nRead );
29 if( nRead < 0 )
30 {
31 throw Bu::ConnectionException(
32 excodeReadError,
33 "Read error: %s",
34 strerror( errno )
35 );
36 }
37 else if( nRead == 0 )
38 {
39 break;
40 }
41 else
42 {
43 nTotal += nRead;
44 sReadBuf.append( buf, nRead );
45 if( !pSocket->canRead() )
46 break;
47 }
48 }
49
50 if( pProto && nTotal )
51 {
52 pProto->onNewData( this );
53 }
54}
55
56void Bu::Client::setProtocol( Protocol *pProto )
57{
58 this->pProto = pProto;
59}
60
61Bu::Protocol *Bu::Client::getProtocol()
62{
63 return pProto;
64}
65
66void Bu::Client::clearProtocol()
67{
68 pProto = NULL;
69}
70
71Bu::FString &Bu::Client::getInput()
72{
73 return sReadBuf;
74}
75
diff --git a/src/client.h b/src/client.h
index 27fbad4..1a189e2 100644
--- a/src/client.h
+++ b/src/client.h
@@ -2,21 +2,35 @@
2#define CLIENT_H 2#define CLIENT_H
3 3
4#include <stdint.h> 4#include <stdint.h>
5#include "bu/socket.h" 5
6#include "bu/fstring.h"
6 7
7namespace Bu 8namespace Bu
8{ 9{
10 class Protocol;
11 class Socket;
12
9 /** 13 /**
10 * 14 *
11 */ 15 */
12 class Client 16 class Client
13 { 17 {
14 public: 18 public:
15 Client(); 19 Client( Bu::Socket *pSocket );
16 virtual ~Client(); 20 virtual ~Client();
17 21
18 private: 22 void processInput();
19 23
24 Bu::FString &getInput();
25
26 void setProtocol( Protocol *pProto );
27 Bu::Protocol *getProtocol();
28 void clearProtocol();
29
30 private:
31 Bu::Socket *pSocket;
32 Bu::Protocol *pProto;
33 Bu::FString sReadBuf;
20 }; 34 };
21} 35}
22 36
diff --git a/src/file.cpp b/src/file.cpp
index 2965afa..368b788 100644
--- a/src/file.cpp
+++ b/src/file.cpp
@@ -109,7 +109,17 @@ bool Bu::File::canWrite()
109 return true; 109 return true;
110} 110}
111 111
112bool Bu::File::canSeek() 112bool Bu::File::isReadable()
113{
114 return true;
115}
116
117bool Bu::File::isWritable()
118{
119 return true;
120}
121
122bool Bu::File::isSeekable()
113{ 123{
114 return true; 124 return true;
115} 125}
@@ -139,3 +149,8 @@ void Bu::File::chmod( mode_t t )
139 fchmod( fileno( fh ), t ); 149 fchmod( fileno( fh ), t );
140} 150}
141 151
152bool Bu::File::isOpen()
153{
154 return (fh != NULL);
155}
156
diff --git a/src/file.h b/src/file.h
index 8107a1b..fe8dbda 100644
--- a/src/file.h
+++ b/src/file.h
@@ -25,12 +25,16 @@ namespace Bu
25 virtual void setPos( long pos ); 25 virtual void setPos( long pos );
26 virtual void setPosEnd( long pos ); 26 virtual void setPosEnd( long pos );
27 virtual bool isEOS(); 27 virtual bool isEOS();
28 virtual bool isOpen();
28 29
29 virtual void flush(); 30 virtual void flush();
30 31
31 virtual bool canRead(); 32 virtual bool canRead();
32 virtual bool canWrite(); 33 virtual bool canWrite();
33 virtual bool canSeek(); 34
35 virtual bool isReadable();
36 virtual bool isWritable();
37 virtual bool isSeekable();
34 38
35 virtual bool isBlocking(); 39 virtual bool isBlocking();
36 virtual void setBlocking( bool bBlocking=true ); 40 virtual void setBlocking( bool bBlocking=true );
diff --git a/src/filter.cpp b/src/filter.cpp
index 693fb9f..96a8694 100644
--- a/src/filter.cpp
+++ b/src/filter.cpp
@@ -50,6 +50,11 @@ bool Bu::Filter::isEOS()
50 return rNext.isEOS(); 50 return rNext.isEOS();
51} 51}
52 52
53bool Bu::Filter::isOpen()
54{
55 return rNext.isOpen();
56}
57
53bool Bu::Filter::canRead() 58bool Bu::Filter::canRead()
54{ 59{
55 return rNext.canRead(); 60 return rNext.canRead();
@@ -60,9 +65,19 @@ bool Bu::Filter::canWrite()
60 return rNext.canWrite(); 65 return rNext.canWrite();
61} 66}
62 67
63bool Bu::Filter::canSeek() 68bool Bu::Filter::isReadable()
69{
70 return rNext.isReadable();
71}
72
73bool Bu::Filter::isWritable()
74{
75 return rNext.isWritable();
76}
77
78bool Bu::Filter::isSeekable()
64{ 79{
65 return rNext.canSeek(); 80 return rNext.isSeekable();
66} 81}
67 82
68bool Bu::Filter::isBlocking() 83bool Bu::Filter::isBlocking()
diff --git a/src/filter.h b/src/filter.h
index 088d46e..7bb04bc 100644
--- a/src/filter.h
+++ b/src/filter.h
@@ -40,12 +40,16 @@ namespace Bu
40 virtual void setPos( long pos ); 40 virtual void setPos( long pos );
41 virtual void setPosEnd( long pos ); 41 virtual void setPosEnd( long pos );
42 virtual bool isEOS(); 42 virtual bool isEOS();
43 virtual bool isOpen();
43 44
44 virtual void flush(); 45 virtual void flush();
45 46
46 virtual bool canRead(); 47 virtual bool canRead();
47 virtual bool canWrite(); 48 virtual bool canWrite();
48 virtual bool canSeek(); 49
50 virtual bool isReadable();
51 virtual bool isWritable();
52 virtual bool isSeekable();
49 53
50 virtual bool isBlocking(); 54 virtual bool isBlocking();
51 virtual void setBlocking( bool bBlocking=true ); 55 virtual void setBlocking( bool bBlocking=true );
diff --git a/src/protocol.cpp b/src/protocol.cpp
new file mode 100644
index 0000000..0976b3b
--- /dev/null
+++ b/src/protocol.cpp
@@ -0,0 +1,12 @@
1#include "bu/protocol.h"
2
3using namespace Bu;
4
5Bu::Protocol::Protocol()
6{
7}
8
9Bu::Protocol::~Protocol()
10{
11}
12
diff --git a/src/protocol.h b/src/protocol.h
new file mode 100644
index 0000000..3accd99
--- /dev/null
+++ b/src/protocol.h
@@ -0,0 +1,26 @@
1#ifndef PROTOCOL_H
2#define PROTOCOL_H
3
4#include <stdint.h>
5
6namespace Bu
7{
8 class Client;
9
10 /**
11 *
12 */
13 class Protocol
14 {
15 public:
16 Protocol();
17 virtual ~Protocol();
18
19 virtual void onNewData( Bu::Client *pClient )=0;
20
21 private:
22
23 };
24}
25
26#endif
diff --git a/src/server.cpp b/src/server.cpp
index abf4c5b..bceeb81 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -1,5 +1,8 @@
1#include "server.h" 1#include "bu/server.h"
2#include <errno.h> 2#include <errno.h>
3#include "bu/serversocket.h"
4#include "bu/client.h"
5#include "bu/socket.h"
3 6
4Bu::Server::Server() : 7Bu::Server::Server() :
5 nTimeoutSec( 0 ), 8 nTimeoutSec( 0 ),
@@ -58,7 +61,7 @@ void Bu::Server::scan()
58 } 61 }
59 else 62 else
60 { 63 {
61 64 hClients.get( j )->processInput();
62 } 65 }
63 } 66 }
64 } 67 }
@@ -68,7 +71,9 @@ void Bu::Server::addClient( int nSocket, int nPort )
68{ 71{
69 FD_SET( nSocket, &fdActive ); 72 FD_SET( nSocket, &fdActive );
70 73
71 Client *c = new Client(); 74 Client *c = new Client(
75 new Bu::Socket( nSocket )
76 );
72 hClients.insert( nSocket, c ); 77 hClients.insert( nSocket, c );
73 78
74 onNewConnection( c, nPort ); 79 onNewConnection( c, nPort );
diff --git a/src/server.h b/src/server.h
index 942eb32..3331d2c 100644
--- a/src/server.h
+++ b/src/server.h
@@ -2,12 +2,16 @@
2#define SERVER_H 2#define SERVER_H
3 3
4#include <stdint.h> 4#include <stdint.h>
5#include "bu/serversocket.h" 5
6#include "bu/fstring.h"
6#include "bu/list.h" 7#include "bu/list.h"
7#include "bu/client.h"
8 8
9namespace Bu 9namespace Bu
10{ 10{
11 class ServerSocket;
12 class Socket;
13 class Client;
14
11 /** 15 /**
12 * Core of a network server. This class is distinct from a ServerSocket in 16 * Core of a network server. This class is distinct from a ServerSocket in
13 * that a ServerSocket is one listening socket, nothing more. Socket will 17 * that a ServerSocket is one listening socket, nothing more. Socket will
diff --git a/src/socket.cpp b/src/socket.cpp
index 1832898..bd05024 100644
--- a/src/socket.cpp
+++ b/src/socket.cpp
@@ -109,13 +109,6 @@ void Bu::Socket::close()
109 ::close( nSocket ); 109 ::close( nSocket );
110 } 110 }
111 bActive = false; 111 bActive = false;
112 //xInputBuf.clearData();
113 //xOutputBuf.clearData();
114 //if( pProtocol != NULL )
115 //{
116 // delete pProtocol;
117 // pProtocol = NULL;
118 //}
119} 112}
120 113
121/* 114/*
@@ -218,15 +211,49 @@ bool Bu::Socket::isEOS()
218 211
219bool Bu::Socket::canRead() 212bool Bu::Socket::canRead()
220{ 213{
214 fd_set rfds;
215 FD_ZERO(&rfds);
216 FD_SET(nSocket, &rfds);
217 struct timeval tv = { 0, 0 };
218 int retval = select( nSocket+1, &rfds, NULL, NULL, &tv );
219 if( retval == -1 )
220 throw ConnectionException(
221 excodeBadReadError,
222 "Bad Read error"
223 );
224 if( !FD_ISSET( nSocket, &rfds ) )
225 return false;
221 return true; 226 return true;
222} 227}
223 228
224bool Bu::Socket::canWrite() 229bool Bu::Socket::canWrite()
225{ 230{
231 fd_set wfds;
232 FD_ZERO(&wfds);
233 FD_SET(nSocket, &wfds);
234 struct timeval tv = { 0, 0 };
235 int retval = select( nSocket+1, NULL, &wfds, NULL, &tv );
236 if( retval == -1 )
237 throw ConnectionException(
238 excodeBadReadError,
239 "Bad Read error"
240 );
241 if( !FD_ISSET( nSocket, &wfds ) )
242 return false;
226 return true; 243 return true;
227} 244}
228 245
229bool Bu::Socket::canSeek() 246bool Bu::Socket::isReadable()
247{
248 return true;
249}
250
251bool Bu::Socket::isWritable()
252{
253 return true;
254}
255
256bool Bu::Socket::isSeekable()
230{ 257{
231 return false; 258 return false;
232} 259}
@@ -244,3 +271,8 @@ void Bu::Socket::flush()
244{ 271{
245} 272}
246 273
274bool Bu::Socket::isOpen()
275{
276 return bActive;
277}
278
diff --git a/src/socket.h b/src/socket.h
index 30a43fb..c9dbd8d 100644
--- a/src/socket.h
+++ b/src/socket.h
@@ -28,12 +28,16 @@ namespace Bu
28 virtual void setPos( long pos ); 28 virtual void setPos( long pos );
29 virtual void setPosEnd( long pos ); 29 virtual void setPosEnd( long pos );
30 virtual bool isEOS(); 30 virtual bool isEOS();
31 virtual bool isOpen();
31 32
32 virtual void flush(); 33 virtual void flush();
33 34
34 virtual bool canRead(); 35 virtual bool canRead();
35 virtual bool canWrite(); 36 virtual bool canWrite();
36 virtual bool canSeek(); 37
38 virtual bool isReadable();
39 virtual bool isWritable();
40 virtual bool isSeekable();
37 41
38 virtual bool isBlocking(); 42 virtual bool isBlocking();
39 virtual void setBlocking( bool bBlocking=true ); 43 virtual void setBlocking( bool bBlocking=true );
diff --git a/src/stream.h b/src/stream.h
index a80586b..ba070d3 100644
--- a/src/stream.h
+++ b/src/stream.h
@@ -31,12 +31,45 @@ namespace Bu
31 virtual void setPos( long pos ) = 0; 31 virtual void setPos( long pos ) = 0;
32 virtual void setPosEnd( long pos ) = 0; 32 virtual void setPosEnd( long pos ) = 0;
33 virtual bool isEOS() = 0; 33 virtual bool isEOS() = 0;
34 virtual bool isOpen() = 0;
34 35
35 virtual void flush() = 0; 36 virtual void flush() = 0;
36 37
38 /**
39 * In non-blocking streams this indicates if a read operation will
40 * return data at the moment or not. In blocking streams this should
41 * return the same value as isEOS().
42 */
37 virtual bool canRead() = 0; 43 virtual bool canRead() = 0;
44
45 /**
46 * In non-blocking streams this indicates if a write operation will
47 * succeed or fail. In some cases writing is not allowed (e.g.
48 * internal buffers are full) temporarilly. In blocking streams this
49 * should return the same value as isWritable.
50 */
38 virtual bool canWrite() = 0; 51 virtual bool canWrite() = 0;
39 virtual bool canSeek() = 0; 52
53 /**
54 * Indicates if the stream is capable of read operations. This does not
55 * indicate if such operations will return useful data, see canRead for
56 * that.
57 */
58 virtual bool isReadable() = 0;
59
60 /**
61 * Indicates if the stream is capable of write operations. This does
62 * not indicate if such operations will succeed or fail, see canWrite
63 * for that.
64 */
65 virtual bool isWritable() = 0;
66
67 /**
68 * Indicates if the stream is capable of seek operations. This is
69 * generally false for non-blocking streams. Some buffered streams may
70 * support limited in-buffer seeking.
71 */
72 virtual bool isSeekable() = 0;
40 73
41 virtual bool isBlocking() = 0; 74 virtual bool isBlocking() = 0;
42 virtual void setBlocking( bool bBlocking=true ) = 0; 75 virtual void setBlocking( bool bBlocking=true ) = 0;