diff options
author | Mike Buland <eichlan@xagasoft.com> | 2007-06-18 19:42:34 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2007-06-18 19:42:34 +0000 |
commit | 8b12972092777af56ae21f65b41f4c40d52c2367 (patch) | |
tree | 3ee45c4b69899acb0cdbd013ea8e6ea54bcdc023 /src | |
parent | 5292e5831934dc719d1ac06332bd252abe4ac3bc (diff) | |
download | libbu++-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 '')
-rw-r--r-- | src/bzip2.cpp | 7 | ||||
-rw-r--r-- | src/bzip2.h | 2 | ||||
-rw-r--r-- | src/client.cpp | 69 | ||||
-rw-r--r-- | src/client.h | 20 | ||||
-rw-r--r-- | src/file.cpp | 17 | ||||
-rw-r--r-- | src/file.h | 6 | ||||
-rw-r--r-- | src/filter.cpp | 19 | ||||
-rw-r--r-- | src/filter.h | 6 | ||||
-rw-r--r-- | src/protocol.cpp | 12 | ||||
-rw-r--r-- | src/protocol.h | 26 | ||||
-rw-r--r-- | src/server.cpp | 11 | ||||
-rw-r--r-- | src/server.h | 8 | ||||
-rw-r--r-- | src/socket.cpp | 48 | ||||
-rw-r--r-- | src/socket.h | 6 | ||||
-rw-r--r-- | src/stream.h | 35 |
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 | ||
188 | bool 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 | ||
3 | Bu::Client::Client() | 8 | /** Read buffer size. */ |
9 | #define RBS (1024*2) | ||
10 | |||
11 | Bu::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 | ||
21 | void 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 | |||
56 | void Bu::Client::setProtocol( Protocol *pProto ) | ||
57 | { | ||
58 | this->pProto = pProto; | ||
59 | } | ||
60 | |||
61 | Bu::Protocol *Bu::Client::getProtocol() | ||
62 | { | ||
63 | return pProto; | ||
64 | } | ||
65 | |||
66 | void Bu::Client::clearProtocol() | ||
67 | { | ||
68 | pProto = NULL; | ||
69 | } | ||
70 | |||
71 | Bu::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 | ||
7 | namespace Bu | 8 | namespace 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 | ||
112 | bool Bu::File::canSeek() | 112 | bool Bu::File::isReadable() |
113 | { | ||
114 | return true; | ||
115 | } | ||
116 | |||
117 | bool Bu::File::isWritable() | ||
118 | { | ||
119 | return true; | ||
120 | } | ||
121 | |||
122 | bool 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 | ||
152 | bool Bu::File::isOpen() | ||
153 | { | ||
154 | return (fh != NULL); | ||
155 | } | ||
156 | |||
@@ -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 | ||
53 | bool Bu::Filter::isOpen() | ||
54 | { | ||
55 | return rNext.isOpen(); | ||
56 | } | ||
57 | |||
53 | bool Bu::Filter::canRead() | 58 | bool 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 | ||
63 | bool Bu::Filter::canSeek() | 68 | bool Bu::Filter::isReadable() |
69 | { | ||
70 | return rNext.isReadable(); | ||
71 | } | ||
72 | |||
73 | bool Bu::Filter::isWritable() | ||
74 | { | ||
75 | return rNext.isWritable(); | ||
76 | } | ||
77 | |||
78 | bool Bu::Filter::isSeekable() | ||
64 | { | 79 | { |
65 | return rNext.canSeek(); | 80 | return rNext.isSeekable(); |
66 | } | 81 | } |
67 | 82 | ||
68 | bool Bu::Filter::isBlocking() | 83 | bool 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 | |||
3 | using namespace Bu; | ||
4 | |||
5 | Bu::Protocol::Protocol() | ||
6 | { | ||
7 | } | ||
8 | |||
9 | Bu::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 | |||
6 | namespace 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 | ||
4 | Bu::Server::Server() : | 7 | Bu::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 | ||
9 | namespace Bu | 9 | namespace 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 | ||
219 | bool Bu::Socket::canRead() | 212 | bool 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 | ||
224 | bool Bu::Socket::canWrite() | 229 | bool 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 | ||
229 | bool Bu::Socket::canSeek() | 246 | bool Bu::Socket::isReadable() |
247 | { | ||
248 | return true; | ||
249 | } | ||
250 | |||
251 | bool Bu::Socket::isWritable() | ||
252 | { | ||
253 | return true; | ||
254 | } | ||
255 | |||
256 | bool 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 | ||
274 | bool 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; |