diff options
Diffstat (limited to 'src')
-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; |