diff options
author | Mike Buland <eichlan@xagasoft.com> | 2010-10-16 03:02:11 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2010-10-16 03:02:11 +0000 |
commit | 9031e2af7dd4e65ec70890ee78a7cf600d1b2cc5 (patch) | |
tree | 17bc9d96b13d16d79385016c087321fc1267743f /src | |
parent | 93c028162318a00b9bd03fc4a48383f830cc529d (diff) | |
download | libbu++-9031e2af7dd4e65ec70890ee78a7cf600d1b2cc5.tar.gz libbu++-9031e2af7dd4e65ec70890ee78a7cf600d1b2cc5.tar.bz2 libbu++-9031e2af7dd4e65ec70890ee78a7cf600d1b2cc5.tar.xz libbu++-9031e2af7dd4e65ec70890ee78a7cf600d1b2cc5.zip |
Many, many changes. Documentation changes, renamed the socket class to
TcpSocket, fixed many other things, and finally removed ParamProc. Anything
that needs it will now have to switch to OptParser.
Diffstat (limited to 'src')
-rw-r--r-- | src/array.h | 2 | ||||
-rw-r--r-- | src/client.cpp | 9 | ||||
-rw-r--r-- | src/client.h | 8 | ||||
-rw-r--r-- | src/fastcgi.cpp | 22 | ||||
-rw-r--r-- | src/fastcgi.h | 18 | ||||
-rw-r--r-- | src/fbasicstring.h | 2 | ||||
-rw-r--r-- | src/hash.h | 2 | ||||
-rw-r--r-- | src/heap.h | 2 | ||||
-rw-r--r-- | src/httpget.h | 4 | ||||
-rw-r--r-- | src/itoserver.cpp | 12 | ||||
-rw-r--r-- | src/itoserver.h | 6 | ||||
-rw-r--r-- | src/newline.h | 2 | ||||
-rw-r--r-- | src/paramproc.cpp | 523 | ||||
-rw-r--r-- | src/paramproc.h | 163 | ||||
-rw-r--r-- | src/ringbuffer.h | 2 | ||||
-rw-r--r-- | src/server.cpp | 14 | ||||
-rw-r--r-- | src/server.h | 6 | ||||
-rw-r--r-- | src/sharedcore.h | 47 | ||||
-rw-r--r-- | src/tcpserversocket.cpp (renamed from src/serversocket.cpp) | 36 | ||||
-rw-r--r-- | src/tcpserversocket.h (renamed from src/serversocket.h) | 18 | ||||
-rw-r--r-- | src/tcpsocket.cpp (renamed from src/socket.cpp) | 148 | ||||
-rw-r--r-- | src/tcpsocket.h (renamed from src/socket.h) | 31 | ||||
-rw-r--r-- | src/tests/socketblock.cpp | 10 | ||||
-rw-r--r-- | src/tests/socketbreak.cpp | 10 | ||||
-rw-r--r-- | src/tests/tcpsocket.cpp (renamed from src/tests/socket.cpp) | 4 | ||||
-rw-r--r-- | src/variant.h | 18 |
26 files changed, 256 insertions, 863 deletions
diff --git a/src/array.h b/src/array.h index fc4fb12..f225c97 100644 --- a/src/array.h +++ b/src/array.h | |||
@@ -20,6 +20,7 @@ namespace Bu | |||
20 | template<typename value, int inc, typename valuealloc> | 20 | template<typename value, int inc, typename valuealloc> |
21 | class Array; | 21 | class Array; |
22 | 22 | ||
23 | /** @cond DEVEL */ | ||
23 | template<typename value, int inc, typename valuealloc> | 24 | template<typename value, int inc, typename valuealloc> |
24 | class ArrayCore | 25 | class ArrayCore |
25 | { | 26 | { |
@@ -107,6 +108,7 @@ namespace Bu | |||
107 | long iSize; | 108 | long iSize; |
108 | long iCapacity; | 109 | long iCapacity; |
109 | }; | 110 | }; |
111 | /** @endcond */ | ||
110 | 112 | ||
111 | /** | 113 | /** |
112 | * Array type container, just like a normal array only flexible and keeps | 114 | * Array type container, just like a normal array only flexible and keeps |
diff --git a/src/client.cpp b/src/client.cpp index becd1bd..b635c8b 100644 --- a/src/client.cpp +++ b/src/client.cpp | |||
@@ -6,7 +6,7 @@ | |||
6 | */ | 6 | */ |
7 | 7 | ||
8 | #include "bu/client.h" | 8 | #include "bu/client.h" |
9 | #include "bu/socket.h" | 9 | #include "bu/tcpsocket.h" |
10 | #include <stdlib.h> | 10 | #include <stdlib.h> |
11 | #include <errno.h> | 11 | #include <errno.h> |
12 | #include "bu/protocol.h" | 12 | #include "bu/protocol.h" |
@@ -16,7 +16,8 @@ | |||
16 | /** Read buffer size. */ | 16 | /** Read buffer size. */ |
17 | #define RBS (1024*2) | 17 | #define RBS (1024*2) |
18 | 18 | ||
19 | Bu::Client::Client( Bu::Socket *pSocket, class Bu::ClientLinkFactory *pfLink ) : | 19 | Bu::Client::Client( Bu::TcpSocket *pSocket, |
20 | class Bu::ClientLinkFactory *pfLink ) : | ||
20 | pTopStream( pSocket ), | 21 | pTopStream( pSocket ), |
21 | pSocket( pSocket ), | 22 | pSocket( pSocket ), |
22 | pProto( NULL ), | 23 | pProto( NULL ), |
@@ -59,7 +60,7 @@ void Bu::Client::processInput() | |||
59 | break; | 60 | break; |
60 | } | 61 | } |
61 | } | 62 | } |
62 | catch( Bu::SocketException &e ) | 63 | catch( Bu::TcpSocketException &e ) |
63 | { | 64 | { |
64 | pTopStream->close(); | 65 | pTopStream->close(); |
65 | bWantsDisconnect = true; | 66 | bWantsDisconnect = true; |
@@ -195,7 +196,7 @@ long Bu::Client::getOutputSize() | |||
195 | return qbWrite.getSize(); | 196 | return qbWrite.getSize(); |
196 | } | 197 | } |
197 | 198 | ||
198 | const Bu::Socket *Bu::Client::getSocket() const | 199 | const Bu::TcpSocket *Bu::Client::getSocket() const |
199 | { | 200 | { |
200 | return pSocket; | 201 | return pSocket; |
201 | } | 202 | } |
diff --git a/src/client.h b/src/client.h index f336524..096df2f 100644 --- a/src/client.h +++ b/src/client.h | |||
@@ -17,7 +17,7 @@ namespace Bu | |||
17 | { | 17 | { |
18 | class Protocol; | 18 | class Protocol; |
19 | class Stream; | 19 | class Stream; |
20 | class Socket; | 20 | class TcpSocket; |
21 | class ClientLinkFactory; | 21 | class ClientLinkFactory; |
22 | 22 | ||
23 | /** | 23 | /** |
@@ -26,7 +26,7 @@ namespace Bu | |||
26 | class Client : public Bu::Stream | 26 | class Client : public Bu::Stream |
27 | { | 27 | { |
28 | public: | 28 | public: |
29 | Client( Bu::Socket *pSocket, Bu::ClientLinkFactory *pfLink ); | 29 | Client( Bu::TcpSocket *pSocket, Bu::ClientLinkFactory *pfLink ); |
30 | virtual ~Client(); | 30 | virtual ~Client(); |
31 | 31 | ||
32 | void processInput(); | 32 | void processInput(); |
@@ -58,7 +58,7 @@ namespace Bu | |||
58 | void close(); | 58 | void close(); |
59 | void tick(); | 59 | void tick(); |
60 | 60 | ||
61 | const Bu::Socket *getSocket() const; | 61 | const Bu::TcpSocket *getSocket() const; |
62 | 62 | ||
63 | void disconnect(); | 63 | void disconnect(); |
64 | bool wantsDisconnect(); | 64 | bool wantsDisconnect(); |
@@ -117,7 +117,7 @@ namespace Bu | |||
117 | typedef Bu::List<Bu::Stream *> FilterList; | 117 | typedef Bu::List<Bu::Stream *> FilterList; |
118 | FilterList lFilts; | 118 | FilterList lFilts; |
119 | Bu::Stream *pTopStream; | 119 | Bu::Stream *pTopStream; |
120 | Bu::Socket *pSocket; | 120 | Bu::TcpSocket *pSocket; |
121 | Bu::Protocol *pProto; | 121 | Bu::Protocol *pProto; |
122 | Bu::QueueBuf qbRead; | 122 | Bu::QueueBuf qbRead; |
123 | Bu::QueueBuf qbWrite; | 123 | Bu::QueueBuf qbWrite; |
diff --git a/src/fastcgi.cpp b/src/fastcgi.cpp index 8168928..ca3010e 100644 --- a/src/fastcgi.cpp +++ b/src/fastcgi.cpp | |||
@@ -24,14 +24,14 @@ Bu::FastCgi::FastCgi() : | |||
24 | pSrv( NULL ), | 24 | pSrv( NULL ), |
25 | bRunning( true ) | 25 | bRunning( true ) |
26 | { | 26 | { |
27 | pSrv = new Bu::ServerSocket( STDIN_FILENO, false ); | 27 | pSrv = new Bu::TcpServerSocket( STDIN_FILENO, false ); |
28 | } | 28 | } |
29 | 29 | ||
30 | Bu::FastCgi::FastCgi( int iPort ) : | 30 | Bu::FastCgi::FastCgi( int iPort ) : |
31 | pSrv( NULL ), | 31 | pSrv( NULL ), |
32 | bRunning( true ) | 32 | bRunning( true ) |
33 | { | 33 | { |
34 | pSrv = new Bu::ServerSocket( iPort ); | 34 | pSrv = new Bu::TcpServerSocket( iPort ); |
35 | } | 35 | } |
36 | 36 | ||
37 | Bu::FastCgi::~FastCgi() | 37 | Bu::FastCgi::~FastCgi() |
@@ -64,17 +64,17 @@ bool Bu::FastCgi::isEmbedded() | |||
64 | #endif | 64 | #endif |
65 | } | 65 | } |
66 | 66 | ||
67 | void Bu::FastCgi::read( Bu::Socket &s, Bu::FastCgi::Record &r ) | 67 | void Bu::FastCgi::read( Bu::TcpSocket &s, Bu::FastCgi::Record &r ) |
68 | { | 68 | { |
69 | int iRead = s.read( &r, sizeof(Record) ); | 69 | int iRead = s.read( &r, sizeof(Record) ); |
70 | if( iRead != sizeof(Record) ) | 70 | if( iRead != sizeof(Record) ) |
71 | throw Bu::SocketException("Hey, the size %d is wrong for Record. (%s)", | 71 | throw Bu::TcpSocketException("Hey, the size %d is wrong for Record. (%s)", |
72 | iRead, strerror( errno ) ); | 72 | iRead, strerror( errno ) ); |
73 | r.uRequestId = ntohs( r.uRequestId ); | 73 | r.uRequestId = ntohs( r.uRequestId ); |
74 | r.uContentLength = ntohs( r.uContentLength ); | 74 | r.uContentLength = ntohs( r.uContentLength ); |
75 | } | 75 | } |
76 | 76 | ||
77 | void Bu::FastCgi::write( Bu::Socket &s, Bu::FastCgi::Record r ) | 77 | void Bu::FastCgi::write( Bu::TcpSocket &s, Bu::FastCgi::Record r ) |
78 | { | 78 | { |
79 | // sio << "Out -> " << r << sio.nl; | 79 | // sio << "Out -> " << r << sio.nl; |
80 | r.uRequestId = htons( r.uRequestId ); | 80 | r.uRequestId = htons( r.uRequestId ); |
@@ -82,19 +82,19 @@ void Bu::FastCgi::write( Bu::Socket &s, Bu::FastCgi::Record r ) | |||
82 | s.write( &r, sizeof(Record) ); | 82 | s.write( &r, sizeof(Record) ); |
83 | } | 83 | } |
84 | 84 | ||
85 | void Bu::FastCgi::read( Bu::Socket &s, Bu::FastCgi::BeginRequestBody &b ) | 85 | void Bu::FastCgi::read( Bu::TcpSocket &s, Bu::FastCgi::BeginRequestBody &b ) |
86 | { | 86 | { |
87 | s.read( &b, sizeof(BeginRequestBody) ); | 87 | s.read( &b, sizeof(BeginRequestBody) ); |
88 | b.uRole = ntohs( b.uRole ); | 88 | b.uRole = ntohs( b.uRole ); |
89 | } | 89 | } |
90 | 90 | ||
91 | void Bu::FastCgi::write( Bu::Socket &s, Bu::FastCgi::EndRequestBody b ) | 91 | void Bu::FastCgi::write( Bu::TcpSocket &s, Bu::FastCgi::EndRequestBody b ) |
92 | { | 92 | { |
93 | b.uStatus = htonl( b.uStatus ); | 93 | b.uStatus = htonl( b.uStatus ); |
94 | s.write( &b, sizeof(b) ); | 94 | s.write( &b, sizeof(b) ); |
95 | } | 95 | } |
96 | 96 | ||
97 | uint32_t Bu::FastCgi::readLen( Bu::Socket &s, uint16_t &uRead ) | 97 | uint32_t Bu::FastCgi::readLen( Bu::TcpSocket &s, uint16_t &uRead ) |
98 | { | 98 | { |
99 | uint8_t uByte[4]; | 99 | uint8_t uByte[4]; |
100 | s.read( uByte, 1 ); | 100 | s.read( uByte, 1 ); |
@@ -107,7 +107,7 @@ uint32_t Bu::FastCgi::readLen( Bu::Socket &s, uint16_t &uRead ) | |||
107 | return ((uByte[0]&0x7f)<<24)|(uByte[1]<<16)|(uByte[2]<<8)|(uByte[3]); | 107 | return ((uByte[0]&0x7f)<<24)|(uByte[1]<<16)|(uByte[2]<<8)|(uByte[3]); |
108 | } | 108 | } |
109 | 109 | ||
110 | void Bu::FastCgi::readPair( Bu::Socket &s, StrHash &hParams, uint16_t &uRead ) | 110 | void Bu::FastCgi::readPair( Bu::TcpSocket &s, StrHash &hParams, uint16_t &uRead ) |
111 | { | 111 | { |
112 | uint32_t uName = readLen( s, uRead ); | 112 | uint32_t uName = readLen( s, uRead ); |
113 | uint32_t uValue = readLen( s, uRead ); | 113 | uint32_t uValue = readLen( s, uRead ); |
@@ -162,7 +162,7 @@ void Bu::FastCgi::run() | |||
162 | if( iSock < 0 ) | 162 | if( iSock < 0 ) |
163 | continue; | 163 | continue; |
164 | 164 | ||
165 | Bu::Socket s( iSock ); | 165 | Bu::TcpSocket s( iSock ); |
166 | s.setBlocking( true ); | 166 | s.setBlocking( true ); |
167 | // sio << "Got connection, blocking? " << s.isBlocking() << sio.nl; | 167 | // sio << "Got connection, blocking? " << s.isBlocking() << sio.nl; |
168 | try | 168 | try |
@@ -362,7 +362,7 @@ void Bu::FastCgi::run() | |||
362 | } | 362 | } |
363 | } | 363 | } |
364 | } | 364 | } |
365 | catch( Bu::SocketException &e ) | 365 | catch( Bu::TcpSocketException &e ) |
366 | { | 366 | { |
367 | // sio << "Bu::SocketException: " << e.what() << sio.nl << | 367 | // sio << "Bu::SocketException: " << e.what() << sio.nl << |
368 | // "\tSocket open: " << s.isOpen() << sio.nl; | 368 | // "\tSocket open: " << s.isOpen() << sio.nl; |
diff --git a/src/fastcgi.h b/src/fastcgi.h index 262872c..7c1c04c 100644 --- a/src/fastcgi.h +++ b/src/fastcgi.h | |||
@@ -11,8 +11,8 @@ | |||
11 | #include "bu/fstring.h" | 11 | #include "bu/fstring.h" |
12 | #include "bu/hash.h" | 12 | #include "bu/hash.h" |
13 | #include "bu/array.h" | 13 | #include "bu/array.h" |
14 | #include "bu/socket.h" | 14 | #include "bu/tcpsocket.h" |
15 | #include "bu/serversocket.h" | 15 | #include "bu/tcpserversocket.h" |
16 | 16 | ||
17 | namespace Bu | 17 | namespace Bu |
18 | { | 18 | { |
@@ -109,18 +109,18 @@ namespace Bu | |||
109 | virtual void onUninit() { }; | 109 | virtual void onUninit() { }; |
110 | 110 | ||
111 | private: | 111 | private: |
112 | void read( Bu::Socket &s, Record &r ); | 112 | void read( Bu::TcpSocket &s, Record &r ); |
113 | void read( Bu::Socket &s, BeginRequestBody &b ); | 113 | void read( Bu::TcpSocket &s, BeginRequestBody &b ); |
114 | uint32_t readLen( Bu::Socket &s, uint16_t &uUsed ); | 114 | uint32_t readLen( Bu::TcpSocket &s, uint16_t &uUsed ); |
115 | void readPair( Bu::Socket &s, StrHash &hParams, uint16_t &uUsed ); | 115 | void readPair( Bu::TcpSocket &s, StrHash &hParams, uint16_t &uUsed ); |
116 | 116 | ||
117 | void write( Bu::Socket &s, Record r ); | 117 | void write( Bu::TcpSocket &s, Record r ); |
118 | void write( Bu::Socket &s, EndRequestBody b ); | 118 | void write( Bu::TcpSocket &s, EndRequestBody b ); |
119 | 119 | ||
120 | bool hasChannel( int iChan ); | 120 | bool hasChannel( int iChan ); |
121 | 121 | ||
122 | private: | 122 | private: |
123 | Bu::ServerSocket *pSrv; | 123 | Bu::TcpServerSocket *pSrv; |
124 | bool bRunning; | 124 | bool bRunning; |
125 | Bu::Array<Channel *> aChannel; | 125 | Bu::Array<Channel *> aChannel; |
126 | }; | 126 | }; |
diff --git a/src/fbasicstring.h b/src/fbasicstring.h index 82c5137..7167f4a 100644 --- a/src/fbasicstring.h +++ b/src/fbasicstring.h | |||
@@ -25,6 +25,7 @@ | |||
25 | 25 | ||
26 | namespace Bu | 26 | namespace Bu |
27 | { | 27 | { |
28 | /** @cond DEVEL */ | ||
28 | template< typename chr > | 29 | template< typename chr > |
29 | struct FStringChunk | 30 | struct FStringChunk |
30 | { | 31 | { |
@@ -166,6 +167,7 @@ namespace Bu | |||
166 | nLength += pNewChunk->nLength; | 167 | nLength += pNewChunk->nLength; |
167 | } | 168 | } |
168 | }; | 169 | }; |
170 | /** @endcond */ | ||
169 | 171 | ||
170 | /** | 172 | /** |
171 | * Flexible String class. This class was designed with string passing and | 173 | * Flexible String class. This class was designed with string passing and |
@@ -54,6 +54,7 @@ namespace Bu | |||
54 | typename valuealloc, typename challoc> | 54 | typename valuealloc, typename challoc> |
55 | class Hash; | 55 | class Hash; |
56 | 56 | ||
57 | /** @cond DEVEL */ | ||
57 | template<typename key, typename value, typename sizecalc, typename keyalloc, | 58 | template<typename key, typename value, typename sizecalc, typename keyalloc, |
58 | typename valuealloc, typename challoc > | 59 | typename valuealloc, typename challoc > |
59 | class HashCore | 60 | class HashCore |
@@ -399,6 +400,7 @@ namespace Bu | |||
399 | challoc ca; | 400 | challoc ca; |
400 | sizecalc szCalc; | 401 | sizecalc szCalc; |
401 | }; | 402 | }; |
403 | /** @endcond */ | ||
402 | 404 | ||
403 | /** | 405 | /** |
404 | * Libbu++ Template Hash Table. This is your average hash table, that uses | 406 | * Libbu++ Template Hash Table. This is your average hash table, that uses |
@@ -22,6 +22,7 @@ namespace Bu | |||
22 | template<typename item, typename cmpfunc, typename itemalloc> | 22 | template<typename item, typename cmpfunc, typename itemalloc> |
23 | class Heap; | 23 | class Heap; |
24 | 24 | ||
25 | /** @cond DEVEL */ | ||
25 | template<typename item, typename cmpfunc, typename itemalloc> | 26 | template<typename item, typename cmpfunc, typename itemalloc> |
26 | class HeapCore | 27 | class HeapCore |
27 | { | 28 | { |
@@ -183,6 +184,7 @@ namespace Bu | |||
183 | cmpfunc cmp; | 184 | cmpfunc cmp; |
184 | itemalloc ia; | 185 | itemalloc ia; |
185 | }; | 186 | }; |
187 | /** @endcond */ | ||
186 | 188 | ||
187 | /** | 189 | /** |
188 | * A priority queue that allows for an unlimited number of priorities. All | 190 | * A priority queue that allows for an unlimited number of priorities. All |
diff --git a/src/httpget.h b/src/httpget.h index 410914c..783f880 100644 --- a/src/httpget.h +++ b/src/httpget.h | |||
@@ -11,7 +11,7 @@ | |||
11 | #include "bu/stream.h" | 11 | #include "bu/stream.h" |
12 | #include "bu/fstring.h" | 12 | #include "bu/fstring.h" |
13 | #include "bu/url.h" | 13 | #include "bu/url.h" |
14 | #include "bu/socket.h" | 14 | #include "bu/tcpsocket.h" |
15 | #include "bu/hash.h" | 15 | #include "bu/hash.h" |
16 | 16 | ||
17 | namespace Bu | 17 | namespace Bu |
@@ -52,7 +52,7 @@ namespace Bu | |||
52 | private: | 52 | private: |
53 | Bu::Url uSrc; | 53 | Bu::Url uSrc; |
54 | Bu::FString sMethod; | 54 | Bu::FString sMethod; |
55 | Bu::Socket sSrv; | 55 | Bu::TcpSocket sSrv; |
56 | typedef Bu::Hash<Bu::FString,Bu::FString> MimeHash; | 56 | typedef Bu::Hash<Bu::FString,Bu::FString> MimeHash; |
57 | MimeHash hMimeIn; | 57 | MimeHash hMimeIn; |
58 | MimeHash hMimeOut; | 58 | MimeHash hMimeOut; |
diff --git a/src/itoserver.cpp b/src/itoserver.cpp index a1d804a..ea737bf 100644 --- a/src/itoserver.cpp +++ b/src/itoserver.cpp | |||
@@ -7,9 +7,9 @@ | |||
7 | 7 | ||
8 | #include "bu/itoserver.h" | 8 | #include "bu/itoserver.h" |
9 | #include <errno.h> | 9 | #include <errno.h> |
10 | #include "bu/serversocket.h" | 10 | #include "bu/tcpserversocket.h" |
11 | #include "bu/client.h" | 11 | #include "bu/client.h" |
12 | #include "bu/socket.h" | 12 | #include "bu/tcpsocket.h" |
13 | 13 | ||
14 | #include "bu/config.h" | 14 | #include "bu/config.h" |
15 | 15 | ||
@@ -41,7 +41,7 @@ Bu::ItoServer::~ItoServer() | |||
41 | 41 | ||
42 | void Bu::ItoServer::addPort( int nPort, int nPoolSize ) | 42 | void Bu::ItoServer::addPort( int nPort, int nPoolSize ) |
43 | { | 43 | { |
44 | ServerSocket *s = new ServerSocket( nPort, nPoolSize ); | 44 | TcpServerSocket *s = new TcpServerSocket( nPort, nPoolSize ); |
45 | int nSocket = s->getSocket(); | 45 | int nSocket = s->getSocket(); |
46 | FD_SET( nSocket, &fdActive ); | 46 | FD_SET( nSocket, &fdActive ); |
47 | hServers.insert( nSocket, s ); | 47 | hServers.insert( nSocket, s ); |
@@ -49,7 +49,7 @@ void Bu::ItoServer::addPort( int nPort, int nPoolSize ) | |||
49 | 49 | ||
50 | void Bu::ItoServer::addPort( const FString &sAddr, int nPort, int nPoolSize ) | 50 | void Bu::ItoServer::addPort( const FString &sAddr, int nPort, int nPoolSize ) |
51 | { | 51 | { |
52 | ServerSocket *s = new ServerSocket( sAddr, nPort, nPoolSize ); | 52 | TcpServerSocket *s = new TcpServerSocket( sAddr, nPort, nPoolSize ); |
53 | int nSocket = s->getSocket(); | 53 | int nSocket = s->getSocket(); |
54 | FD_SET( nSocket, &fdActive ); | 54 | FD_SET( nSocket, &fdActive ); |
55 | hServers.insert( nSocket, s ); | 55 | hServers.insert( nSocket, s ); |
@@ -92,7 +92,7 @@ void Bu::ItoServer::run() | |||
92 | { | 92 | { |
93 | if( FD_ISSET( i.getKey(), &fdRead ) ) | 93 | if( FD_ISSET( i.getKey(), &fdRead ) ) |
94 | { | 94 | { |
95 | ServerSocket *pSrv = i.getValue(); | 95 | TcpServerSocket *pSrv = i.getValue(); |
96 | addClient( pSrv->accept(), pSrv->getPort() ); | 96 | addClient( pSrv->accept(), pSrv->getPort() ); |
97 | } | 97 | } |
98 | } | 98 | } |
@@ -126,7 +126,7 @@ Bu::ItoServer::ItoClient::ItoClient( ItoServer &rSrv, int iSocket, int iPort, | |||
126 | FD_SET( iSocket, &fdActive ); | 126 | FD_SET( iSocket, &fdActive ); |
127 | 127 | ||
128 | pClient = new Client( | 128 | pClient = new Client( |
129 | new Bu::Socket( iSocket ), | 129 | new Bu::TcpSocket( iSocket ), |
130 | new SrvClientLinkFactory( rSrv ) | 130 | new SrvClientLinkFactory( rSrv ) |
131 | ); | 131 | ); |
132 | } | 132 | } |
diff --git a/src/itoserver.h b/src/itoserver.h index c08d453..81e42cc 100644 --- a/src/itoserver.h +++ b/src/itoserver.h | |||
@@ -26,8 +26,8 @@ | |||
26 | 26 | ||
27 | namespace Bu | 27 | namespace Bu |
28 | { | 28 | { |
29 | class ServerSocket; | 29 | class TcpServerSocket; |
30 | class Socket; | 30 | class TcpSocket; |
31 | class Client; | 31 | class Client; |
32 | 32 | ||
33 | /** | 33 | /** |
@@ -126,7 +126,7 @@ namespace Bu | |||
126 | int nTimeoutSec; | 126 | int nTimeoutSec; |
127 | int nTimeoutUSec; | 127 | int nTimeoutUSec; |
128 | fd_set fdActive; | 128 | fd_set fdActive; |
129 | typedef Hash<int,ServerSocket *> ServerHash; | 129 | typedef Hash<int,TcpServerSocket *> ServerHash; |
130 | ServerHash hServers; | 130 | ServerHash hServers; |
131 | typedef Hash<int,ItoClient *> ClientHash; | 131 | typedef Hash<int,ItoClient *> ClientHash; |
132 | typedef ItoQueue<ItoClient *> ClientQueue; | 132 | typedef ItoQueue<ItoClient *> ClientQueue; |
diff --git a/src/newline.h b/src/newline.h index b69cdb5..243c876 100644 --- a/src/newline.h +++ b/src/newline.h | |||
@@ -14,7 +14,7 @@ namespace Bu | |||
14 | { | 14 | { |
15 | /** | 15 | /** |
16 | * Converts new-line characters from any standard convention into linefeeds | 16 | * Converts new-line characters from any standard convention into linefeeds |
17 | * (\n) on reading, and converts them to either your OS's standard or a | 17 | * (\\n) on reading, and converts them to either your OS's standard or a |
18 | * specified standard, depending on how you construct the class. | 18 | * specified standard, depending on how you construct the class. |
19 | * | 19 | * |
20 | * If you're reading in a text file, then this filter is practically | 20 | * If you're reading in a text file, then this filter is practically |
diff --git a/src/paramproc.cpp b/src/paramproc.cpp deleted file mode 100644 index f4fd36e..0000000 --- a/src/paramproc.cpp +++ /dev/null | |||
@@ -1,523 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2007-2010 Xagasoft, All rights reserved. | ||
3 | * | ||
4 | * This file is part of the libbu++ library and is released under the | ||
5 | * terms of the license contained in the file LICENSE. | ||
6 | */ | ||
7 | |||
8 | #include "bu/paramproc.h" | ||
9 | #include <stdio.h> | ||
10 | #include <stdlib.h> | ||
11 | #include <string.h> | ||
12 | |||
13 | #define ptrtype( iitype, iiname ) \ | ||
14 | Bu::ParamProc::ParamPtr::ParamPtr( iitype *iiname ) : \ | ||
15 | type( vt ##iiname ) { val.iiname = iiname; } | ||
16 | |||
17 | Bu::ParamProc::ParamPtr::ParamPtr() | ||
18 | { | ||
19 | val.str = NULL; | ||
20 | type = vtunset; | ||
21 | } | ||
22 | |||
23 | ptrtype( Bu::FString, str ); | ||
24 | ptrtype( uint64_t, uint64 ); | ||
25 | ptrtype( uint32_t, uint32 ); | ||
26 | ptrtype( uint16_t, uint16 ); | ||
27 | ptrtype( uint8_t, uint8 ); | ||
28 | ptrtype( int64_t, int64 ); | ||
29 | ptrtype( int32_t, int32 ); | ||
30 | ptrtype( int16_t, int16 ); | ||
31 | ptrtype( int8_t, int8 ); | ||
32 | ptrtype( float, float32 ); | ||
33 | ptrtype( double, float64 ); | ||
34 | ptrtype( long double, float96 ); | ||
35 | ptrtype( bool, bln ); | ||
36 | |||
37 | Bu::ParamProc::ParamPtr &Bu::ParamProc::ParamPtr::operator=( ParamProc::ParamPtr &ptr ) | ||
38 | { | ||
39 | val = ptr.val; | ||
40 | type = ptr.type; | ||
41 | |||
42 | return *this; | ||
43 | } | ||
44 | |||
45 | bool Bu::ParamProc::ParamPtr::isSet() | ||
46 | { | ||
47 | return type != vtunset; | ||
48 | } | ||
49 | |||
50 | Bu::ParamProc::ParamPtr &Bu::ParamProc::ParamPtr::operator=( const char *str ) | ||
51 | { | ||
52 | if( !isSet() ) return *this; | ||
53 | switch( type ) | ||
54 | { | ||
55 | case vtstr: | ||
56 | (*val.str) = str; | ||
57 | break; | ||
58 | |||
59 | case vtuint64: | ||
60 | (*val.uint64) = strtoull( str, NULL, 10 ); | ||
61 | break; | ||
62 | |||
63 | case vtuint32: | ||
64 | (*val.uint32) = strtoul( str, NULL, 10 ); | ||
65 | break; | ||
66 | |||
67 | case vtuint16: | ||
68 | (*val.uint16) = (uint16_t)strtoul( str, NULL, 10 ); | ||
69 | break; | ||
70 | |||
71 | case vtuint8: | ||
72 | (*val.uint8) = (uint8_t)strtoul( str, NULL, 10 ); | ||
73 | break; | ||
74 | |||
75 | case vtint64: | ||
76 | (*val.int64) = strtoll( str, NULL, 10 ); | ||
77 | break; | ||
78 | |||
79 | case vtint32: | ||
80 | (*val.int32) = strtol( str, NULL, 10 ); | ||
81 | break; | ||
82 | |||
83 | case vtint16: | ||
84 | (*val.int16) = (int16_t)strtol( str, NULL, 10 ); | ||
85 | break; | ||
86 | |||
87 | case vtint8: | ||
88 | (*val.int8) = (int8_t)strtol( str, NULL, 10 ); | ||
89 | break; | ||
90 | |||
91 | case vtfloat32: | ||
92 | (*val.float32) = strtof( str, NULL ); | ||
93 | break; | ||
94 | |||
95 | case vtfloat64: | ||
96 | (*val.float64) = strtod( str, NULL ); | ||
97 | break; | ||
98 | |||
99 | case vtfloat96: | ||
100 | (*val.float96) = strtold( str, NULL ); | ||
101 | break; | ||
102 | |||
103 | case vtbln: | ||
104 | if( strcasecmp("yes", str ) == 0 || | ||
105 | strcasecmp("true", str ) == 0 ) | ||
106 | { | ||
107 | (*val.bln) = true; | ||
108 | } | ||
109 | else | ||
110 | { | ||
111 | (*val.bln) = false; | ||
112 | } | ||
113 | break; | ||
114 | } | ||
115 | |||
116 | return *this; | ||
117 | } | ||
118 | |||
119 | Bu::ParamProc::ParamProc() | ||
120 | { | ||
121 | } | ||
122 | |||
123 | Bu::ParamProc::~ParamProc() | ||
124 | { | ||
125 | for( Bu::List<ArgSpec *>::iterator i = lArg.begin(); | ||
126 | i != lArg.end(); i++ ) | ||
127 | { | ||
128 | delete *i; | ||
129 | } | ||
130 | |||
131 | for( Bu::List<Banner *>::iterator i = lBan.begin(); | ||
132 | i != lBan.end(); i++ ) | ||
133 | { | ||
134 | delete *i; | ||
135 | } | ||
136 | |||
137 | } | ||
138 | /* | ||
139 | void Bu::ParamProc::addParam( const char *lpWord, char cChar, Proc proc, ParamPtr val ) | ||
140 | { | ||
141 | printf("Calling callback...\n"); | ||
142 | val = "Hello there, this is set in the ParamProc"; | ||
143 | (this->*proc)(); | ||
144 | }*/ | ||
145 | |||
146 | void Bu::ParamProc::addParam( const char *lpWord, char cChar, Proc proc, | ||
147 | ParamPtr val, const char *lpDesc, const char *lpExtra, | ||
148 | const char *lpValue ) | ||
149 | { | ||
150 | ArgSpec *as = new ArgSpec; | ||
151 | if( lpWord ) | ||
152 | as->sWord = lpWord; | ||
153 | |||
154 | as->cChar = cChar; | ||
155 | as->proc = proc; | ||
156 | as->val = val; | ||
157 | if( lpDesc ) | ||
158 | as->sDesc = lpDesc; | ||
159 | if( lpExtra ) | ||
160 | as->sExtra = lpExtra; | ||
161 | if( lpValue ) | ||
162 | as->sValue = lpValue; | ||
163 | |||
164 | lArg.append( as ); | ||
165 | |||
166 | if( !lBan.isEmpty() ) | ||
167 | { | ||
168 | if( lBan.last()->pBefore == NULL ) | ||
169 | lBan.last()->pBefore = as; | ||
170 | } | ||
171 | } | ||
172 | |||
173 | void Bu::ParamProc::addParam( const char *lpWord, char cChar, Proc proc, | ||
174 | const char *lpDesc, const char *lpExtra, | ||
175 | const char *lpValue ) | ||
176 | { | ||
177 | addParam( lpWord, cChar, proc, ParamPtr(), lpDesc, lpExtra, lpValue ); | ||
178 | } | ||
179 | |||
180 | void Bu::ParamProc::addParam( const char *lpWord, char cChar, ParamPtr val, | ||
181 | const char *lpDesc, const char *lpExtra, | ||
182 | const char *lpValue ) | ||
183 | { | ||
184 | addParam( lpWord, cChar, NULL, val, lpDesc, lpExtra, lpValue ); | ||
185 | } | ||
186 | |||
187 | void Bu::ParamProc::addParam( const char *lpWord, Proc proc, ParamPtr val, | ||
188 | const char *lpDesc, const char *lpExtra, | ||
189 | const char *lpValue ) | ||
190 | { | ||
191 | addParam( lpWord, '\0', proc, val, lpDesc, lpExtra, lpValue ); | ||
192 | } | ||
193 | |||
194 | void Bu::ParamProc::addParam( const char *lpWord, Proc proc, | ||
195 | const char *lpDesc, const char *lpExtra, | ||
196 | const char *lpValue ) | ||
197 | { | ||
198 | addParam( lpWord, '\0', proc, ParamPtr(), lpDesc, lpExtra, lpValue ); | ||
199 | } | ||
200 | |||
201 | void Bu::ParamProc::addParam( const char *lpWord, ParamPtr val, | ||
202 | const char *lpDesc, const char *lpExtra, | ||
203 | const char *lpValue ) | ||
204 | { | ||
205 | addParam( lpWord, '\0', NULL, val, lpDesc, lpExtra, lpValue ); | ||
206 | } | ||
207 | |||
208 | void Bu::ParamProc::addParam( char cChar, Proc proc, ParamPtr val, | ||
209 | const char *lpDesc, const char *lpExtra, | ||
210 | const char *lpValue ) | ||
211 | { | ||
212 | addParam( NULL, cChar, proc, val, lpDesc, lpExtra, lpValue ); | ||
213 | } | ||
214 | |||
215 | void Bu::ParamProc::addParam( char cChar, Proc proc, | ||
216 | const char *lpDesc, const char *lpExtra, | ||
217 | const char *lpValue ) | ||
218 | { | ||
219 | addParam( NULL, cChar, proc, ParamPtr(), lpDesc, lpExtra, lpValue ); | ||
220 | } | ||
221 | |||
222 | void Bu::ParamProc::addParam( char cChar, ParamPtr val, | ||
223 | const char *lpDesc, const char *lpExtra, | ||
224 | const char *lpValue ) | ||
225 | { | ||
226 | addParam( NULL, cChar, NULL, val, lpDesc, lpExtra, lpValue ); | ||
227 | } | ||
228 | |||
229 | void Bu::ParamProc::process( int argc, char *argv[] ) | ||
230 | { | ||
231 | for( int arg = 1; arg < argc; arg++ ) | ||
232 | { | ||
233 | //printf(":::%d:::%s\n", arg, argv[arg] ); | ||
234 | if( argv[arg][0] == '-' ) | ||
235 | { | ||
236 | if( argv[arg][1] == '-' ) | ||
237 | { | ||
238 | ArgSpec *s = checkWord( argv[arg]+2 ); | ||
239 | if( s ) | ||
240 | { | ||
241 | if( argv[arg][s->sWord.getSize()+2] == '=' ) | ||
242 | { | ||
243 | if( s->val.isSet() ) | ||
244 | { | ||
245 | if( s->sValue == "" ) | ||
246 | { | ||
247 | s->val = argv[arg]+s->sWord.getSize()+3; | ||
248 | } | ||
249 | else | ||
250 | { | ||
251 | s->val = s->sValue.getStr(); | ||
252 | } | ||
253 | } | ||
254 | if( s->proc ) | ||
255 | { | ||
256 | char **tmp = new char*[argc-arg]; | ||
257 | tmp[0] = argv[arg]+s->sWord.getSize()+3; | ||
258 | for( int k = 1; k < argc-arg; k++ ) | ||
259 | tmp[k] = argv[arg+k]; | ||
260 | int ret = (this->*s->proc)( argc-arg, tmp ); | ||
261 | if( ret > 0 ) | ||
262 | { | ||
263 | arg += ret-1; | ||
264 | } | ||
265 | delete tmp; | ||
266 | } | ||
267 | } | ||
268 | else | ||
269 | { | ||
270 | int add = 0; | ||
271 | if( s->val.isSet() ) | ||
272 | { | ||
273 | if( s->sValue == "" ) | ||
274 | { | ||
275 | if( arg+1 >= argc ) | ||
276 | { | ||
277 | return; | ||
278 | } | ||
279 | s->val = argv[arg+1]; | ||
280 | add++; | ||
281 | } | ||
282 | else | ||
283 | { | ||
284 | s->val = s->sValue.getStr(); | ||
285 | } | ||
286 | } | ||
287 | if( s->proc ) | ||
288 | { | ||
289 | int ret = (this->*s->proc)( | ||
290 | argc-arg-1, argv+arg+1 ); | ||
291 | |||
292 | if( ret > add ) | ||
293 | add = 0; | ||
294 | else | ||
295 | add -= ret; | ||
296 | arg += ret; | ||
297 | } | ||
298 | arg += add; | ||
299 | } | ||
300 | continue; | ||
301 | } | ||
302 | else | ||
303 | { | ||
304 | unknownParam( argc-arg, argv+arg ); | ||
305 | } | ||
306 | } | ||
307 | else | ||
308 | { | ||
309 | for( int chr = 1; argv[arg][chr]; chr++ ) | ||
310 | { | ||
311 | ArgSpec *s = checkLetr( argv[arg][chr] ); | ||
312 | if( s ) | ||
313 | { | ||
314 | if( argv[arg][chr+1] != '\0' ) | ||
315 | { | ||
316 | bool bUsed = false; | ||
317 | if( s->val.isSet() ) | ||
318 | { | ||
319 | if( s->sValue == "" ) | ||
320 | { | ||
321 | s->val = argv[arg]+chr+1; | ||
322 | bUsed = true; | ||
323 | } | ||
324 | else | ||
325 | { | ||
326 | s->val = s->sValue.getStr(); | ||
327 | } | ||
328 | } | ||
329 | if( s->proc ) | ||
330 | { | ||
331 | char **tmp = new char*[argc-arg]; | ||
332 | tmp[0] = argv[arg]+chr+1; | ||
333 | for( int k = 1; k < argc-arg; k++ ) | ||
334 | tmp[k] = argv[arg+k]; | ||
335 | int ret = (this->*s->proc)( argc-arg, tmp ); | ||
336 | if( ret > 0 ) | ||
337 | { | ||
338 | arg += ret - 1; | ||
339 | delete tmp; | ||
340 | break; | ||
341 | } | ||
342 | delete tmp; | ||
343 | } | ||
344 | if( bUsed ) | ||
345 | { | ||
346 | break; | ||
347 | } | ||
348 | } | ||
349 | else | ||
350 | { | ||
351 | bool bUsed = false; | ||
352 | if( s->val.isSet() ) | ||
353 | { | ||
354 | if( s->sValue == "" ) | ||
355 | { | ||
356 | s->val = argv[arg+1]; | ||
357 | bUsed = true; | ||
358 | } | ||
359 | else | ||
360 | { | ||
361 | s->val = s->sValue.getStr(); | ||
362 | } | ||
363 | } | ||
364 | if( s->proc ) | ||
365 | { | ||
366 | int ret = (this->*s->proc)( | ||
367 | argc-arg-1, argv+arg+1 | ||
368 | ); | ||
369 | if( ret > 0 ) | ||
370 | { | ||
371 | arg += ret; | ||
372 | break; | ||
373 | } | ||
374 | } | ||
375 | if( bUsed ) | ||
376 | { | ||
377 | arg++; | ||
378 | break; | ||
379 | } | ||
380 | } | ||
381 | } | ||
382 | else | ||
383 | { | ||
384 | unknownParam( argc-arg, argv+arg ); | ||
385 | } | ||
386 | } | ||
387 | } | ||
388 | } | ||
389 | else | ||
390 | { | ||
391 | cmdParam( argc-arg, argv+arg ); | ||
392 | } | ||
393 | } | ||
394 | } | ||
395 | |||
396 | Bu::ParamProc::ArgSpec *Bu::ParamProc::checkWord( const char *arg ) | ||
397 | { | ||
398 | //printf("Checking \"%s\"...\n", arg ); | ||
399 | Bu::List<ArgSpec *>::const_iterator i = lArg.begin(); | ||
400 | for( ; i != lArg.end(); i++ ) | ||
401 | { | ||
402 | if( (*i)->sWord == "" ) | ||
403 | continue; | ||
404 | |||
405 | if( !strcmp( (*i)->sWord.getStr(), arg ) ) | ||
406 | return *i; | ||
407 | |||
408 | if( (*i)->val.isSet() ) | ||
409 | { | ||
410 | if( !strncmp( (*i)->sWord.getStr(), arg, (*i)->sWord.getSize() ) && | ||
411 | arg[(*i)->sWord.getSize()] == '=' ) | ||
412 | { | ||
413 | return *i; | ||
414 | } | ||
415 | } | ||
416 | } | ||
417 | |||
418 | return NULL; | ||
419 | } | ||
420 | |||
421 | Bu::ParamProc::ArgSpec *Bu::ParamProc::checkLetr( const char arg ) | ||
422 | { | ||
423 | //printf("Checking \'%c\'...\n", arg ); | ||
424 | Bu::List<ArgSpec *>::const_iterator i = lArg.begin(); | ||
425 | for( ; i != lArg.end(); i++ ) | ||
426 | { | ||
427 | if( (*i)->cChar == '\0' ) | ||
428 | continue; | ||
429 | |||
430 | if( (*i)->cChar == arg ) | ||
431 | { | ||
432 | return *i; | ||
433 | } | ||
434 | } | ||
435 | |||
436 | return NULL; | ||
437 | } | ||
438 | |||
439 | int Bu::ParamProc::cmdParam( int /*argc*/, char *argv[] ) | ||
440 | { | ||
441 | printf("Unhandled command parameter \"%s\" found!\n", argv[0] ); | ||
442 | return 0; | ||
443 | } | ||
444 | |||
445 | int Bu::ParamProc::unknownParam( int /*argc*/, char *argv[] ) | ||
446 | { | ||
447 | printf("Unknown parameter \"%s\" found!\n", argv[0] ); | ||
448 | return 0; | ||
449 | } | ||
450 | |||
451 | int Bu::ParamProc::help( int /*argc*/, char * /*argv*/ [] ) | ||
452 | { | ||
453 | Bu::List<Banner *>::const_iterator b = lBan.begin(); | ||
454 | Bu::List<ArgSpec *>::const_iterator i = lArg.begin(); | ||
455 | int len=0; | ||
456 | for( ; i != lArg.end(); i++ ) | ||
457 | { | ||
458 | if( len < (*i)->sWord.getSize() + (*i)->sExtra.getSize() ) | ||
459 | len = (*i)->sWord.getSize() + (*i)->sExtra.getSize(); | ||
460 | } | ||
461 | char fmt[10]; | ||
462 | sprintf( fmt, "%%-%ds ", len ); | ||
463 | |||
464 | for( i = lArg.begin(); i != lArg.end(); i++ ) | ||
465 | { | ||
466 | if( b != lBan.end() ) | ||
467 | { | ||
468 | if( (*b)->pBefore == (*i) ) | ||
469 | { | ||
470 | printf( (*b)->sBanner.getStr() ); | ||
471 | b++; | ||
472 | } | ||
473 | } | ||
474 | printf(" "); | ||
475 | if( (*i)->cChar ) | ||
476 | { | ||
477 | if( (*i)->sWord.getStr() ) | ||
478 | { | ||
479 | printf("-%c, ", (*i)->cChar ); | ||
480 | } | ||
481 | else | ||
482 | { | ||
483 | printf("-%c ", (*i)->cChar ); | ||
484 | } | ||
485 | } | ||
486 | else | ||
487 | { | ||
488 | printf(" "); | ||
489 | } | ||
490 | if( (*i)->sWord.getStr() ) | ||
491 | { | ||
492 | printf("--"); | ||
493 | Bu::FString sTmp = (*i)->sWord.getStr(); | ||
494 | if( (*i)->sExtra.getStr() ) | ||
495 | sTmp += (*i)->sExtra.getStr(); | ||
496 | printf( fmt, sTmp.getStr() ); | ||
497 | } | ||
498 | else | ||
499 | { | ||
500 | printf(" "); | ||
501 | printf(fmt, "" ); | ||
502 | } | ||
503 | printf("%s\n", (*i)->sDesc.getStr() ); | ||
504 | } | ||
505 | if( b != lBan.end() ) | ||
506 | { | ||
507 | if( (*b)->pBefore == NULL ) | ||
508 | { | ||
509 | printf( (*b)->sBanner.getStr() ); | ||
510 | } | ||
511 | } | ||
512 | |||
513 | exit( 0 ); | ||
514 | } | ||
515 | |||
516 | void Bu::ParamProc::addHelpBanner( const char *sHelpBanner ) | ||
517 | { | ||
518 | Banner *pBan = new Banner; | ||
519 | pBan->sBanner = sHelpBanner; | ||
520 | pBan->pBefore = NULL; | ||
521 | lBan.append( pBan ); | ||
522 | } | ||
523 | |||
diff --git a/src/paramproc.h b/src/paramproc.h deleted file mode 100644 index ddc1876..0000000 --- a/src/paramproc.h +++ /dev/null | |||
@@ -1,163 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2007-2010 Xagasoft, All rights reserved. | ||
3 | * | ||
4 | * This file is part of the libbu++ library and is released under the | ||
5 | * terms of the license contained in the file LICENSE. | ||
6 | */ | ||
7 | |||
8 | #ifndef BU_PARAM_PROC_H | ||
9 | #define BU_PARAM_PROC_H | ||
10 | |||
11 | #include <stdint.h> | ||
12 | #include "bu/list.h" | ||
13 | #include "bu/fstring.h" | ||
14 | |||
15 | namespace Bu | ||
16 | { | ||
17 | class ParamProc | ||
18 | { | ||
19 | public: | ||
20 | class ParamPtr | ||
21 | { | ||
22 | public: | ||
23 | ParamPtr(); | ||
24 | ParamPtr( Bu::FString *str ); | ||
25 | ParamPtr( uint64_t *uint64 ); | ||
26 | ParamPtr( uint32_t *uint32 ); | ||
27 | ParamPtr( uint16_t *uint16 ); | ||
28 | ParamPtr( uint8_t *uint8 ); | ||
29 | ParamPtr( int64_t *int64 ); | ||
30 | ParamPtr( int32_t *int32 ); | ||
31 | ParamPtr( int16_t *int16 ); | ||
32 | ParamPtr( int8_t *int8 ); | ||
33 | ParamPtr( float *float32 ); | ||
34 | ParamPtr( double *float64 ); | ||
35 | ParamPtr( long double *float96 ); | ||
36 | ParamPtr( bool *bln ); | ||
37 | |||
38 | enum | ||
39 | { | ||
40 | vtunset, | ||
41 | vtstr, | ||
42 | vtuint64, | ||
43 | vtuint32, | ||
44 | vtuint16, | ||
45 | vtuint8, | ||
46 | vtint64, | ||
47 | vtint32, | ||
48 | vtint16, | ||
49 | vtint8, | ||
50 | vtfloat32, | ||
51 | vtfloat64, | ||
52 | vtfloat96, | ||
53 | vtbln, | ||
54 | }; | ||
55 | ParamPtr &operator=( ParamPtr &ptr ); | ||
56 | ParamPtr &operator=( const char *str ); | ||
57 | |||
58 | bool isSet(); | ||
59 | |||
60 | private: | ||
61 | int type; | ||
62 | union | ||
63 | { | ||
64 | Bu::FString *str; | ||
65 | uint64_t *uint64; | ||
66 | uint32_t *uint32; | ||
67 | uint16_t *uint16; | ||
68 | uint8_t *uint8; | ||
69 | int64_t *int64; | ||
70 | int32_t *int32; | ||
71 | int16_t *int16; | ||
72 | int8_t *int8; | ||
73 | float *float32; | ||
74 | double *float64; | ||
75 | long double *float96; | ||
76 | bool *bln; | ||
77 | } val; | ||
78 | }; | ||
79 | |||
80 | typedef int (ParamProc::*Proc)( int, char *[] ); | ||
81 | |||
82 | typedef struct ArgSpec | ||
83 | { | ||
84 | uint8_t nFlags; | ||
85 | Bu::FString sWord; | ||
86 | char cChar; | ||
87 | Proc proc; | ||
88 | ParamProc::ParamPtr val; | ||
89 | Bu::FString sExtra; | ||
90 | Bu::FString sDesc; | ||
91 | Bu::FString sValue; | ||
92 | } ArgSpec; | ||
93 | |||
94 | public: | ||
95 | DEPRECATED | ||
96 | ParamProc(); | ||
97 | virtual ~ParamProc(); | ||
98 | |||
99 | void addParam( const char *lpWord, char cChar, Proc proc, ParamPtr val, | ||
100 | const char *lpDesc=NULL, const char *lpExtra=NULL, | ||
101 | const char *lpValue=NULL | ||
102 | ); | ||
103 | void addParam( const char *lpWord, char cChar, Proc proc, | ||
104 | const char *lpDesc=NULL, const char *lpExtra=NULL, | ||
105 | const char *lpValue=NULL | ||
106 | ); | ||
107 | void addParam( const char *lpWord, char cChar, ParamPtr val, | ||
108 | const char *lpDesc=NULL, const char *lpExtra=NULL, | ||
109 | const char *lpValue=NULL | ||
110 | ); | ||
111 | |||
112 | void addParam( const char *lpWord, Proc proc, ParamPtr val, | ||
113 | const char *lpDesc=NULL, const char *lpExtra=NULL, | ||
114 | const char *lpValue=NULL | ||
115 | ); | ||
116 | void addParam( const char *lpWord, Proc proc, | ||
117 | const char *lpDesc=NULL, const char *lpExtra=NULL, | ||
118 | const char *lpValue=NULL | ||
119 | ); | ||
120 | void addParam( const char *lpWord, ParamPtr val, | ||
121 | const char *lpDesc=NULL, const char *lpExtra=NULL, | ||
122 | const char *lpValue=NULL | ||
123 | ); | ||
124 | |||
125 | void addParam( char cChar, Proc proc, ParamPtr val, | ||
126 | const char *lpDesc=NULL, const char *lpExtra=NULL, | ||
127 | const char *lpValue=NULL | ||
128 | ); | ||
129 | void addParam( char cChar, Proc proc, | ||
130 | const char *lpDesc=NULL, const char *lpExtra=NULL, | ||
131 | const char *lpValue=NULL | ||
132 | ); | ||
133 | void addParam( char cChar, ParamPtr val, | ||
134 | const char *lpDesc=NULL, const char *lpExtra=NULL, | ||
135 | const char *lpValue=NULL | ||
136 | ); | ||
137 | |||
138 | void process( int argc, char *argv[] ); | ||
139 | void addHelpBanner( const char *sHelpBanner ); | ||
140 | |||
141 | private: | ||
142 | ArgSpec *checkWord( const char *arg ); | ||
143 | ArgSpec *checkLetr( const char arg ); | ||
144 | |||
145 | public: | ||
146 | virtual int cmdParam( int argc, char *argv[] ); | ||
147 | virtual int unknownParam( int argc, char *argv[] ); | ||
148 | virtual int help( int argc, char *argv[] ); | ||
149 | |||
150 | private: | ||
151 | typedef struct Banner | ||
152 | { | ||
153 | Bu::FString sBanner; | ||
154 | ArgSpec *pBefore; | ||
155 | } Banner; | ||
156 | Bu::List<Banner *> lBan; | ||
157 | Bu::List<ArgSpec *> lArg; | ||
158 | }; | ||
159 | } | ||
160 | |||
161 | #define mkproc( cls ) static_cast<int (Bu::ParamProc::*)( int, char *[])>(&cls) | ||
162 | |||
163 | #endif | ||
diff --git a/src/ringbuffer.h b/src/ringbuffer.h index 04add42..f4fd58c 100644 --- a/src/ringbuffer.h +++ b/src/ringbuffer.h | |||
@@ -17,6 +17,7 @@ namespace Bu | |||
17 | { | 17 | { |
18 | template<typename value, typename valuealloc> class RingBuffer; | 18 | template<typename value, typename valuealloc> class RingBuffer; |
19 | 19 | ||
20 | /** @cond DEVEL */ | ||
20 | template<typename value, typename valuealloc> | 21 | template<typename value, typename valuealloc> |
21 | class RingBufferCore | 22 | class RingBufferCore |
22 | { | 23 | { |
@@ -119,6 +120,7 @@ namespace Bu | |||
119 | value *aData; | 120 | value *aData; |
120 | valuealloc va; | 121 | valuealloc va; |
121 | }; | 122 | }; |
123 | /** @endcond */ | ||
122 | 124 | ||
123 | /** | 125 | /** |
124 | *@ingroup Containers | 126 | *@ingroup Containers |
diff --git a/src/server.cpp b/src/server.cpp index 51c056a..e701a69 100644 --- a/src/server.cpp +++ b/src/server.cpp | |||
@@ -8,9 +8,9 @@ | |||
8 | #include "bu/server.h" | 8 | #include "bu/server.h" |
9 | #include <errno.h> | 9 | #include <errno.h> |
10 | #include <unistd.h> | 10 | #include <unistd.h> |
11 | #include "bu/serversocket.h" | 11 | #include "bu/tcpserversocket.h" |
12 | #include "bu/client.h" | 12 | #include "bu/client.h" |
13 | #include "bu/socket.h" | 13 | #include "bu/tcpsocket.h" |
14 | #include "bu/config.h" | 14 | #include "bu/config.h" |
15 | 15 | ||
16 | Bu::Server::Server() : | 16 | Bu::Server::Server() : |
@@ -28,7 +28,7 @@ Bu::Server::~Server() | |||
28 | 28 | ||
29 | void Bu::Server::addPort( int nPort, int nPoolSize ) | 29 | void Bu::Server::addPort( int nPort, int nPoolSize ) |
30 | { | 30 | { |
31 | ServerSocket *s = new ServerSocket( nPort, nPoolSize ); | 31 | TcpServerSocket *s = new TcpServerSocket( nPort, nPoolSize ); |
32 | int nSocket = s->getSocket(); | 32 | int nSocket = s->getSocket(); |
33 | FD_SET( nSocket, &fdActive ); | 33 | FD_SET( nSocket, &fdActive ); |
34 | hServers.insert( nSocket, s ); | 34 | hServers.insert( nSocket, s ); |
@@ -36,7 +36,7 @@ void Bu::Server::addPort( int nPort, int nPoolSize ) | |||
36 | 36 | ||
37 | void Bu::Server::addPort( const FString &sAddr, int nPort, int nPoolSize ) | 37 | void Bu::Server::addPort( const FString &sAddr, int nPort, int nPoolSize ) |
38 | { | 38 | { |
39 | ServerSocket *s = new ServerSocket( sAddr, nPort, nPoolSize ); | 39 | TcpServerSocket *s = new TcpServerSocket( sAddr, nPort, nPoolSize ); |
40 | int nSocket = s->getSocket(); | 40 | int nSocket = s->getSocket(); |
41 | FD_SET( nSocket, &fdActive ); | 41 | FD_SET( nSocket, &fdActive ); |
42 | hServers.insert( nSocket, s ); | 42 | hServers.insert( nSocket, s ); |
@@ -75,7 +75,7 @@ void Bu::Server::scan() | |||
75 | { | 75 | { |
76 | if( hServers.has( j ) ) | 76 | if( hServers.has( j ) ) |
77 | { | 77 | { |
78 | ServerSocket *pSrv = hServers.get( j ); | 78 | TcpServerSocket *pSrv = hServers.get( j ); |
79 | addClient( pSrv->accept(), pSrv->getPort() ); | 79 | addClient( pSrv->accept(), pSrv->getPort() ); |
80 | } | 80 | } |
81 | else | 81 | else |
@@ -97,7 +97,7 @@ void Bu::Server::scan() | |||
97 | { | 97 | { |
98 | pClient->processOutput(); | 98 | pClient->processOutput(); |
99 | } | 99 | } |
100 | catch( Bu::SocketException &e ) | 100 | catch( Bu::TcpSocketException &e ) |
101 | { | 101 | { |
102 | closeClient( j ); | 102 | closeClient( j ); |
103 | } | 103 | } |
@@ -136,7 +136,7 @@ void Bu::Server::addClient( int nSocket, int nPort ) | |||
136 | FD_SET( nSocket, &fdActive ); | 136 | FD_SET( nSocket, &fdActive ); |
137 | 137 | ||
138 | Client *c = new Client( | 138 | Client *c = new Client( |
139 | new Bu::Socket( nSocket ), | 139 | new Bu::TcpSocket( nSocket ), |
140 | new SrvClientLinkFactory() | 140 | new SrvClientLinkFactory() |
141 | ); | 141 | ); |
142 | hClients.insert( nSocket, c ); | 142 | hClients.insert( nSocket, c ); |
diff --git a/src/server.h b/src/server.h index 74ee99a..d6726fd 100644 --- a/src/server.h +++ b/src/server.h | |||
@@ -25,8 +25,8 @@ | |||
25 | 25 | ||
26 | namespace Bu | 26 | namespace Bu |
27 | { | 27 | { |
28 | class ServerSocket; | 28 | class TcpServerSocket; |
29 | class Socket; | 29 | class TcpSocket; |
30 | class Client; | 30 | class Client; |
31 | 31 | ||
32 | /** | 32 | /** |
@@ -97,7 +97,7 @@ namespace Bu | |||
97 | int nTimeoutSec; | 97 | int nTimeoutSec; |
98 | int nTimeoutUSec; | 98 | int nTimeoutUSec; |
99 | fd_set fdActive; | 99 | fd_set fdActive; |
100 | typedef Hash<int,ServerSocket *> SrvHash; | 100 | typedef Hash<int,TcpServerSocket *> SrvHash; |
101 | SrvHash hServers; | 101 | SrvHash hServers; |
102 | typedef Hash<int,Client *> ClientHash; | 102 | typedef Hash<int,Client *> ClientHash; |
103 | ClientHash hClients; | 103 | ClientHash hClients; |
diff --git a/src/sharedcore.h b/src/sharedcore.h index ac36606..1887ca2 100644 --- a/src/sharedcore.h +++ b/src/sharedcore.h | |||
@@ -15,6 +15,53 @@ | |||
15 | 15 | ||
16 | namespace Bu | 16 | namespace Bu |
17 | { | 17 | { |
18 | /** | ||
19 | * A mechanism for creating classes that perform lazy copies. The concept | ||
20 | * behind this is that instead of copying a large object when it is assigned | ||
21 | * or passed into a copy constructor we simply copy a pointer internally. | ||
22 | * The assumption is that many times when an object is passed by value we | ||
23 | * don't really want to keep the object around, we want the recipient to | ||
24 | * take ownership without allocating a new object. This allows that to | ||
25 | * happen. | ||
26 | * | ||
27 | * When used properly this makes object copying essentially free (O(1), | ||
28 | * that is) and performs the actual copy when a user tries to modify the | ||
29 | * object. | ||
30 | * | ||
31 | * For example, lets look at something like the getKeys function in | ||
32 | * Bu::Hash. When this function is called it creates a Bu::List of | ||
33 | * appropriate type, fills it with keys, and returns it. This is a good | ||
34 | * way for this function to behave, there may be additional issues if the | ||
35 | * List object were allocated with new and not on the stack. However, | ||
36 | * returning the List at the end of the function could potentially take | ||
37 | * a very long time depending on the size of the list and the type of the | ||
38 | * key. In this case the getKeys function doesn't want ownership of the | ||
39 | * List object, and when it returns it, it's local copy will be destroyed. | ||
40 | * | ||
41 | * However, List inherits from SharedCore, which means that when it is | ||
42 | * returned all we do is copy a pointer to the "core" of the list, which | ||
43 | * is a very fast operatorion. For a brief moment, before anyone can do | ||
44 | * anything else, there are two objects referencing the core of that single | ||
45 | * list. However, the getKeys() function will destroy it's local copy | ||
46 | * before the calling function can use it's new copy. That means that by | ||
47 | * the time the calling function can use it's new List of keys it is the | ||
48 | * only one with a reference to the core, and no copy will need to happen. | ||
49 | * | ||
50 | * Using SharedCore on your own classes is fairly straight forward. There | ||
51 | * are only a couple of steps. First, break the class into two classes. | ||
52 | * Move every variable from the original class (generally everything that's | ||
53 | * private) into the new class. Then make the original class inherit from | ||
54 | * SharedCore. The SharedCore template takes 2 parameters, first is the | ||
55 | * class it's inheriting from, second is the new core class. Now, in your | ||
56 | * original class you will have one class variable, a pointer named core. | ||
57 | * All of your original variables will be accessable through core. The next | ||
58 | * step is to access everything you used to through core, and to find | ||
59 | * every function that may change data in the core. At the top of every | ||
60 | * function that may change data you want to call _hardCopy(). | ||
61 | * | ||
62 | * That's more or less it. A more detailed guide will be written soon. | ||
63 | * @todo Write a guide for this. | ||
64 | */ | ||
18 | template<typename Shell, typename Core> | 65 | template<typename Shell, typename Core> |
19 | class SharedCore | 66 | class SharedCore |
20 | { | 67 | { |
diff --git a/src/serversocket.cpp b/src/tcpserversocket.cpp index 87d0035..7d7f6e4 100644 --- a/src/serversocket.cpp +++ b/src/tcpserversocket.cpp | |||
@@ -21,13 +21,13 @@ | |||
21 | #include <sys/types.h> | 21 | #include <sys/types.h> |
22 | //#include <termios.h> | 22 | //#include <termios.h> |
23 | #include <fcntl.h> | 23 | #include <fcntl.h> |
24 | #include "bu/serversocket.h" | 24 | #include "bu/tcpserversocket.h" |
25 | 25 | ||
26 | #include "bu/config.h" | 26 | #include "bu/config.h" |
27 | 27 | ||
28 | namespace Bu { subExceptionDef( ServerSocketException ) } | 28 | namespace Bu { subExceptionDef( TcpServerSocketException ) } |
29 | 29 | ||
30 | Bu::ServerSocket::ServerSocket( int nPort, int nPoolSize ) : | 30 | Bu::TcpServerSocket::TcpServerSocket( int nPort, int nPoolSize ) : |
31 | nPort( nPort ) | 31 | nPort( nPort ) |
32 | { | 32 | { |
33 | #ifdef WIN32 | 33 | #ifdef WIN32 |
@@ -48,7 +48,7 @@ Bu::ServerSocket::ServerSocket( int nPort, int nPoolSize ) : | |||
48 | startServer( name, nPoolSize ); | 48 | startServer( name, nPoolSize ); |
49 | } | 49 | } |
50 | 50 | ||
51 | Bu::ServerSocket::ServerSocket(const FString &sAddr,int nPort, int nPoolSize) : | 51 | Bu::TcpServerSocket::TcpServerSocket(const FString &sAddr,int nPort, int nPoolSize) : |
52 | nPort( nPort ) | 52 | nPort( nPort ) |
53 | { | 53 | { |
54 | #ifdef WIN32 | 54 | #ifdef WIN32 |
@@ -72,7 +72,7 @@ Bu::ServerSocket::ServerSocket(const FString &sAddr,int nPort, int nPoolSize) : | |||
72 | startServer( name, nPoolSize ); | 72 | startServer( name, nPoolSize ); |
73 | } | 73 | } |
74 | 74 | ||
75 | Bu::ServerSocket::ServerSocket( int nServer, bool bInit, int nPoolSize ) : | 75 | Bu::TcpServerSocket::TcpServerSocket( int nServer, bool bInit, int nPoolSize ) : |
76 | nServer( nServer ), | 76 | nServer( nServer ), |
77 | nPort( 0 ) | 77 | nPort( 0 ) |
78 | { | 78 | { |
@@ -95,7 +95,7 @@ Bu::ServerSocket::ServerSocket( int nServer, bool bInit, int nPoolSize ) : | |||
95 | } | 95 | } |
96 | } | 96 | } |
97 | 97 | ||
98 | Bu::ServerSocket::ServerSocket( const ServerSocket &rSrc ) | 98 | Bu::TcpServerSocket::TcpServerSocket( const TcpServerSocket &rSrc ) |
99 | { | 99 | { |
100 | #ifdef WIN32 | 100 | #ifdef WIN32 |
101 | Bu::Winsock2::getInstance(); | 101 | Bu::Winsock2::getInstance(); |
@@ -107,20 +107,20 @@ Bu::ServerSocket::ServerSocket( const ServerSocket &rSrc ) | |||
107 | FD_SET( nServer, &fdActive ); | 107 | FD_SET( nServer, &fdActive ); |
108 | } | 108 | } |
109 | 109 | ||
110 | Bu::ServerSocket::~ServerSocket() | 110 | Bu::TcpServerSocket::~TcpServerSocket() |
111 | { | 111 | { |
112 | if( nServer > -1 ) | 112 | if( nServer > -1 ) |
113 | ::close( nServer ); | 113 | ::close( nServer ); |
114 | } | 114 | } |
115 | 115 | ||
116 | void Bu::ServerSocket::startServer( struct sockaddr_in &name, int nPoolSize ) | 116 | void Bu::TcpServerSocket::startServer( struct sockaddr_in &name, int nPoolSize ) |
117 | { | 117 | { |
118 | /* Create the socket. */ | 118 | /* Create the socket. */ |
119 | nServer = bu_socket( PF_INET, SOCK_STREAM, 0 ); | 119 | nServer = bu_socket( PF_INET, SOCK_STREAM, 0 ); |
120 | 120 | ||
121 | if( nServer < 0 ) | 121 | if( nServer < 0 ) |
122 | { | 122 | { |
123 | throw Bu::ServerSocketException("Couldn't create a listen socket."); | 123 | throw Bu::TcpServerSocketException("Couldn't create a listen socket."); |
124 | } | 124 | } |
125 | 125 | ||
126 | int opt = 1; | 126 | int opt = 1; |
@@ -135,16 +135,16 @@ void Bu::ServerSocket::startServer( struct sockaddr_in &name, int nPoolSize ) | |||
135 | initServer( name, nPoolSize ); | 135 | initServer( name, nPoolSize ); |
136 | } | 136 | } |
137 | 137 | ||
138 | void Bu::ServerSocket::initServer( struct sockaddr_in &name, int nPoolSize ) | 138 | void Bu::TcpServerSocket::initServer( struct sockaddr_in &name, int nPoolSize ) |
139 | { | 139 | { |
140 | if( bu_bind( nServer, (struct sockaddr *) &name, sizeof(name) ) < 0 ) | 140 | if( bu_bind( nServer, (struct sockaddr *) &name, sizeof(name) ) < 0 ) |
141 | { | 141 | { |
142 | throw Bu::ServerSocketException("Couldn't bind to the listen socket."); | 142 | throw Bu::TcpServerSocketException("Couldn't bind to the listen socket."); |
143 | } | 143 | } |
144 | 144 | ||
145 | if( bu_listen( nServer, nPoolSize ) < 0 ) | 145 | if( bu_listen( nServer, nPoolSize ) < 0 ) |
146 | { | 146 | { |
147 | throw Bu::ServerSocketException( | 147 | throw Bu::TcpServerSocketException( |
148 | "Couldn't begin listening to the server socket." | 148 | "Couldn't begin listening to the server socket." |
149 | ); | 149 | ); |
150 | } | 150 | } |
@@ -154,12 +154,12 @@ void Bu::ServerSocket::initServer( struct sockaddr_in &name, int nPoolSize ) | |||
154 | FD_SET( nServer, &fdActive ); | 154 | FD_SET( nServer, &fdActive ); |
155 | } | 155 | } |
156 | 156 | ||
157 | int Bu::ServerSocket::getSocket() | 157 | int Bu::TcpServerSocket::getSocket() |
158 | { | 158 | { |
159 | return nServer; | 159 | return nServer; |
160 | } | 160 | } |
161 | 161 | ||
162 | int Bu::ServerSocket::accept( int nTimeoutSec, int nTimeoutUSec ) | 162 | int Bu::TcpServerSocket::accept( int nTimeoutSec, int nTimeoutUSec ) |
163 | { | 163 | { |
164 | fd_set fdRead = fdActive; | 164 | fd_set fdRead = fdActive; |
165 | 165 | ||
@@ -171,7 +171,7 @@ int Bu::ServerSocket::accept( int nTimeoutSec, int nTimeoutUSec ) | |||
171 | if( TEMP_FAILURE_RETRY( | 171 | if( TEMP_FAILURE_RETRY( |
172 | bu_select( nServer+1, &fdRead, NULL, NULL, &xT )) < 0 ) | 172 | bu_select( nServer+1, &fdRead, NULL, NULL, &xT )) < 0 ) |
173 | { | 173 | { |
174 | throw Bu::ServerSocketException( | 174 | throw Bu::TcpServerSocketException( |
175 | "Error scanning for new connections: %s", strerror( errno ) | 175 | "Error scanning for new connections: %s", strerror( errno ) |
176 | ); | 176 | ); |
177 | } | 177 | } |
@@ -200,7 +200,7 @@ int Bu::ServerSocket::accept( int nTimeoutSec, int nTimeoutUSec ) | |||
200 | #endif /* WIN32 */ | 200 | #endif /* WIN32 */ |
201 | if( nClient < 0 ) | 201 | if( nClient < 0 ) |
202 | { | 202 | { |
203 | throw Bu::ServerSocketException( | 203 | throw Bu::TcpServerSocketException( |
204 | "Error accepting a new connection: %s", strerror( errno ) | 204 | "Error accepting a new connection: %s", strerror( errno ) |
205 | ); | 205 | ); |
206 | } | 206 | } |
@@ -219,7 +219,7 @@ int Bu::ServerSocket::accept( int nTimeoutSec, int nTimeoutUSec ) | |||
219 | flags |= O_NONBLOCK; | 219 | flags |= O_NONBLOCK; |
220 | if( fcntl( nClient, F_SETFL, flags ) < 0) | 220 | if( fcntl( nClient, F_SETFL, flags ) < 0) |
221 | { | 221 | { |
222 | throw Bu::ServerSocketException( | 222 | throw Bu::TcpServerSocketException( |
223 | "Error setting option on client socket: %s", | 223 | "Error setting option on client socket: %s", |
224 | strerror( errno ) | 224 | strerror( errno ) |
225 | ); | 225 | ); |
@@ -242,7 +242,7 @@ int Bu::ServerSocket::accept( int nTimeoutSec, int nTimeoutUSec ) | |||
242 | return -1; | 242 | return -1; |
243 | } | 243 | } |
244 | 244 | ||
245 | int Bu::ServerSocket::getPort() | 245 | int Bu::TcpServerSocket::getPort() |
246 | { | 246 | { |
247 | return nPort; | 247 | return nPort; |
248 | } | 248 | } |
diff --git a/src/serversocket.h b/src/tcpserversocket.h index ee357a4..b1d7e02 100644 --- a/src/serversocket.h +++ b/src/tcpserversocket.h | |||
@@ -5,8 +5,8 @@ | |||
5 | * terms of the license contained in the file LICENSE. | 5 | * terms of the license contained in the file LICENSE. |
6 | */ | 6 | */ |
7 | 7 | ||
8 | #ifndef BU_SERVER_SOCKET_H | 8 | #ifndef BU_TCP_SERVER_SOCKET_H |
9 | #define BU_SERVER_SOCKET_H | 9 | #define BU_TCP_SERVER_SOCKET_H |
10 | 10 | ||
11 | #include <stdint.h> | 11 | #include <stdint.h> |
12 | #include "bu/fstring.h" | 12 | #include "bu/fstring.h" |
@@ -20,7 +20,7 @@ | |||
20 | 20 | ||
21 | namespace Bu | 21 | namespace Bu |
22 | { | 22 | { |
23 | subExceptionDecl( ServerSocketException ); | 23 | subExceptionDecl( TcpServerSocketException ); |
24 | 24 | ||
25 | /** | 25 | /** |
26 | * A single tcp/ip server socket. When created the server socket will bind | 26 | * A single tcp/ip server socket. When created the server socket will bind |
@@ -34,14 +34,14 @@ namespace Bu | |||
34 | * | 34 | * |
35 | *@ingroup Serving | 35 | *@ingroup Serving |
36 | */ | 36 | */ |
37 | class ServerSocket | 37 | class TcpServerSocket |
38 | { | 38 | { |
39 | public: | 39 | public: |
40 | ServerSocket( int nPort, int nPoolSize=40 ); | 40 | TcpServerSocket( int nPort, int nPoolSize=40 ); |
41 | ServerSocket( const FString &sAddr, int nPort, int nPoolSize=40 ); | 41 | TcpServerSocket( const FString &sAddr, int nPort, int nPoolSize=40 ); |
42 | ServerSocket( int nSocket, bool bInit, int nPoolSize=40 ); | 42 | TcpServerSocket( int nSocket, bool bInit, int nPoolSize=40 ); |
43 | ServerSocket( const ServerSocket &rSrc ); | 43 | TcpServerSocket( const TcpServerSocket &rSrc ); |
44 | virtual ~ServerSocket(); | 44 | virtual ~TcpServerSocket(); |
45 | 45 | ||
46 | int accept( int nTimeoutSec=0, int nTimeoutUSec=0 ); | 46 | int accept( int nTimeoutSec=0, int nTimeoutUSec=0 ); |
47 | int getSocket(); | 47 | int getSocket(); |
diff --git a/src/socket.cpp b/src/tcpsocket.cpp index baf3be3..bbd9cf5 100644 --- a/src/socket.cpp +++ b/src/tcpsocket.cpp | |||
@@ -14,7 +14,7 @@ | |||
14 | #include <sys/time.h> | 14 | #include <sys/time.h> |
15 | #include <errno.h> | 15 | #include <errno.h> |
16 | #include <fcntl.h> | 16 | #include <fcntl.h> |
17 | #include "bu/socket.h" | 17 | #include "bu/tcpsocket.h" |
18 | 18 | ||
19 | #include "bu/config.h" | 19 | #include "bu/config.h" |
20 | 20 | ||
@@ -29,10 +29,10 @@ | |||
29 | 29 | ||
30 | #define RBS (1024*2) | 30 | #define RBS (1024*2) |
31 | 31 | ||
32 | namespace Bu { subExceptionDef( SocketException ) } | 32 | namespace Bu { subExceptionDef( TcpSocketException ) } |
33 | 33 | ||
34 | Bu::Socket::Socket( int nSocket ) : | 34 | Bu::TcpSocket::TcpSocket( int nTcpSocket ) : |
35 | nSocket( nSocket ), | 35 | nTcpSocket( nTcpSocket ), |
36 | bActive( true ), | 36 | bActive( true ), |
37 | bBlocking( true ) | 37 | bBlocking( true ) |
38 | { | 38 | { |
@@ -42,8 +42,9 @@ Bu::Socket::Socket( int nSocket ) : | |||
42 | setAddress(); | 42 | setAddress(); |
43 | } | 43 | } |
44 | 44 | ||
45 | Bu::Socket::Socket( const Bu::FString &sAddr, int nPort, int nTimeout ) : | 45 | Bu::TcpSocket::TcpSocket( const Bu::FString &sAddr, int nPort, int nTimeout, |
46 | nSocket( 0 ), | 46 | bool bBlocking ) : |
47 | nTcpSocket( 0 ), | ||
47 | bActive( false ), | 48 | bActive( false ), |
48 | bBlocking( true ) | 49 | bBlocking( true ) |
49 | { | 50 | { |
@@ -52,9 +53,9 @@ Bu::Socket::Socket( const Bu::FString &sAddr, int nPort, int nTimeout ) : | |||
52 | #endif | 53 | #endif |
53 | 54 | ||
54 | /* Create the socket. */ | 55 | /* Create the socket. */ |
55 | nSocket = bu_socket( PF_INET, SOCK_STREAM, 0 ); | 56 | nTcpSocket = bu_socket( PF_INET, SOCK_STREAM, 0 ); |
56 | 57 | ||
57 | if( nSocket < 0 ) | 58 | if( nTcpSocket < 0 ) |
58 | { | 59 | { |
59 | throw ExceptionBase("Couldn't create socket.\n"); | 60 | throw ExceptionBase("Couldn't create socket.\n"); |
60 | } | 61 | } |
@@ -78,12 +79,12 @@ Bu::Socket::Socket( const Bu::FString &sAddr, int nPort, int nTimeout ) : | |||
78 | sAddr.getStr(), ibuf, &aiHints, &pAddr )) != 0 ) | 79 | sAddr.getStr(), ibuf, &aiHints, &pAddr )) != 0 ) |
79 | { | 80 | { |
80 | close(); | 81 | close(); |
81 | throw Bu::SocketException("Couldn't resolve hostname %s (%s).\n", | 82 | throw Bu::TcpSocketException("Couldn't resolve hostname %s (%s).\n", |
82 | sAddr.getStr(), bu_gai_strerror(ret)); | 83 | sAddr.getStr(), bu_gai_strerror(ret)); |
83 | } | 84 | } |
84 | 85 | ||
85 | bu_connect( | 86 | bu_connect( |
86 | nSocket, | 87 | nTcpSocket, |
87 | pAddr->ai_addr, | 88 | pAddr->ai_addr, |
88 | pAddr->ai_addrlen | 89 | pAddr->ai_addrlen |
89 | ); | 90 | ); |
@@ -101,17 +102,17 @@ Bu::Socket::Socket( const Bu::FString &sAddr, int nPort, int nTimeout ) : | |||
101 | int retval; | 102 | int retval; |
102 | 103 | ||
103 | FD_ZERO(&rfds); | 104 | FD_ZERO(&rfds); |
104 | FD_SET(nSocket, &rfds); | 105 | FD_SET(nTcpSocket, &rfds); |
105 | FD_ZERO(&wfds); | 106 | FD_ZERO(&wfds); |
106 | FD_SET(nSocket, &wfds); | 107 | FD_SET(nTcpSocket, &wfds); |
107 | FD_ZERO(&efds); | 108 | FD_ZERO(&efds); |
108 | FD_SET(nSocket, &efds); | 109 | FD_SET(nTcpSocket, &efds); |
109 | 110 | ||
110 | struct timeval tv; | 111 | struct timeval tv; |
111 | tv.tv_sec = nTimeout; | 112 | tv.tv_sec = nTimeout; |
112 | tv.tv_usec = 0; | 113 | tv.tv_usec = 0; |
113 | 114 | ||
114 | retval = bu_select( nSocket+1, &rfds, &wfds, &efds, &tv ); | 115 | retval = bu_select( nTcpSocket+1, &rfds, &wfds, &efds, &tv ); |
115 | 116 | ||
116 | if( retval == 0 ) | 117 | if( retval == 0 ) |
117 | { | 118 | { |
@@ -120,51 +121,54 @@ Bu::Socket::Socket( const Bu::FString &sAddr, int nPort, int nTimeout ) : | |||
120 | } | 121 | } |
121 | read( NULL, 0 ); // See if we can get any errors out of the way early. | 122 | read( NULL, 0 ); // See if we can get any errors out of the way early. |
122 | } | 123 | } |
124 | |||
125 | if( bBlocking ) | ||
126 | setBlocking( bBlocking ); | ||
123 | } | 127 | } |
124 | 128 | ||
125 | Bu::Socket::~Socket() | 129 | Bu::TcpSocket::~TcpSocket() |
126 | { | 130 | { |
127 | close(); | 131 | close(); |
128 | } | 132 | } |
129 | 133 | ||
130 | void Bu::Socket::close() | 134 | void Bu::TcpSocket::close() |
131 | { | 135 | { |
132 | if( bActive ) | 136 | if( bActive ) |
133 | { | 137 | { |
134 | #ifndef WIN32 | 138 | #ifndef WIN32 |
135 | fsync( nSocket ); | 139 | fsync( nTcpSocket ); |
136 | #endif | 140 | #endif |
137 | #ifdef WIN32 | 141 | #ifdef WIN32 |
138 | #ifndef SHUT_RDWR | 142 | #ifndef SHUT_RDWR |
139 | #define SHUT_RDWR (SD_BOTH) | 143 | #define SHUT_RDWR (SD_BOTH) |
140 | #endif | 144 | #endif |
141 | #endif | 145 | #endif |
142 | bu_shutdown( nSocket, SHUT_RDWR ); | 146 | bu_shutdown( nTcpSocket, SHUT_RDWR ); |
143 | ::close( nSocket ); | 147 | ::close( nTcpSocket ); |
144 | } | 148 | } |
145 | bActive = false; | 149 | bActive = false; |
146 | } | 150 | } |
147 | 151 | ||
148 | size_t Bu::Socket::read( void *pBuf, size_t nBytes ) | 152 | size_t Bu::TcpSocket::read( void *pBuf, size_t nBytes ) |
149 | { | 153 | { |
150 | fd_set rfds; | 154 | fd_set rfds; |
151 | FD_ZERO(&rfds); | 155 | FD_ZERO(&rfds); |
152 | FD_SET(nSocket, &rfds); | 156 | FD_SET(nTcpSocket, &rfds); |
153 | struct timeval tv = {0, 0}; | 157 | struct timeval tv = {0, 0}; |
154 | if( bu_select( nSocket+1, &rfds, NULL, NULL, &tv ) < 0 ) | 158 | if( bu_select( nTcpSocket+1, &rfds, NULL, NULL, &tv ) < 0 ) |
155 | { | 159 | { |
156 | int iErr = errno; | 160 | int iErr = errno; |
157 | close(); | 161 | close(); |
158 | throw SocketException( SocketException::cRead, strerror(iErr) ); | 162 | throw TcpSocketException( TcpSocketException::cRead, strerror(iErr) ); |
159 | } | 163 | } |
160 | if( FD_ISSET( nSocket, &rfds ) || bBlocking ) | 164 | if( FD_ISSET( nTcpSocket, &rfds ) || bBlocking ) |
161 | { | 165 | { |
162 | int nRead = TEMP_FAILURE_RETRY( | 166 | int nRead = TEMP_FAILURE_RETRY( |
163 | bu_recv( nSocket, (char *) pBuf, nBytes, 0 ) ); | 167 | bu_recv( nTcpSocket, (char *) pBuf, nBytes, 0 ) ); |
164 | if( nRead == 0 ) | 168 | if( nRead == 0 ) |
165 | { | 169 | { |
166 | close(); | 170 | close(); |
167 | throw SocketException( SocketException::cClosed, "Socket closed."); | 171 | throw TcpSocketException( TcpSocketException::cClosed, "TcpSocket closed."); |
168 | } | 172 | } |
169 | if( nRead < 0 ) | 173 | if( nRead < 0 ) |
170 | { | 174 | { |
@@ -176,14 +180,14 @@ size_t Bu::Socket::read( void *pBuf, size_t nBytes ) | |||
176 | if( errno == ENETRESET || errno == ECONNRESET ) | 180 | if( errno == ENETRESET || errno == ECONNRESET ) |
177 | { | 181 | { |
178 | close(); | 182 | close(); |
179 | throw SocketException( SocketException::cClosed, | 183 | throw TcpSocketException( TcpSocketException::cClosed, |
180 | strerror(errno) ); | 184 | strerror(errno) ); |
181 | } | 185 | } |
182 | if( errno == EAGAIN ) | 186 | if( errno == EAGAIN ) |
183 | return 0; | 187 | return 0; |
184 | int iErr = errno; | 188 | int iErr = errno; |
185 | close(); | 189 | close(); |
186 | throw SocketException( SocketException::cRead, strerror(iErr) ); | 190 | throw TcpSocketException( TcpSocketException::cRead, strerror(iErr) ); |
187 | #endif | 191 | #endif |
188 | } | 192 | } |
189 | return nRead; | 193 | return nRead; |
@@ -191,7 +195,7 @@ size_t Bu::Socket::read( void *pBuf, size_t nBytes ) | |||
191 | return 0; | 195 | return 0; |
192 | } | 196 | } |
193 | 197 | ||
194 | size_t Bu::Socket::read( void *pBuf, size_t nBytes, | 198 | size_t Bu::TcpSocket::read( void *pBuf, size_t nBytes, |
195 | uint32_t nSec, uint32_t nUSec ) | 199 | uint32_t nSec, uint32_t nUSec ) |
196 | { | 200 | { |
197 | struct timeval tv; | 201 | struct timeval tv; |
@@ -199,7 +203,7 @@ size_t Bu::Socket::read( void *pBuf, size_t nBytes, | |||
199 | 203 | ||
200 | fd_set rfds; | 204 | fd_set rfds; |
201 | FD_ZERO(&rfds); | 205 | FD_ZERO(&rfds); |
202 | FD_SET(nSocket, &rfds); | 206 | FD_SET(nTcpSocket, &rfds); |
203 | 207 | ||
204 | #ifdef WIN32 | 208 | #ifdef WIN32 |
205 | DWORD dwStart = GetTickCount(); | 209 | DWORD dwStart = GetTickCount(); |
@@ -216,7 +220,7 @@ size_t Bu::Socket::read( void *pBuf, size_t nBytes, | |||
216 | { | 220 | { |
217 | tv.tv_sec = nSec; | 221 | tv.tv_sec = nSec; |
218 | tv.tv_usec = nUSec; | 222 | tv.tv_usec = nUSec; |
219 | bu_select( nSocket+1, &rfds, NULL, NULL, &tv ); | 223 | bu_select( nTcpSocket+1, &rfds, NULL, NULL, &tv ); |
220 | nRead += read( ((char *)pBuf)+nRead, nBytes-nRead ); | 224 | nRead += read( ((char *)pBuf)+nRead, nBytes-nRead ); |
221 | if( nRead >= nBytes ) | 225 | if( nRead >= nBytes ) |
222 | break; | 226 | break; |
@@ -235,13 +239,13 @@ size_t Bu::Socket::read( void *pBuf, size_t nBytes, | |||
235 | return nRead; | 239 | return nRead; |
236 | } | 240 | } |
237 | 241 | ||
238 | size_t Bu::Socket::write( const void *pBuf, size_t nBytes ) | 242 | size_t Bu::TcpSocket::write( const void *pBuf, size_t nBytes ) |
239 | { | 243 | { |
240 | //#ifdef WIN32 | 244 | //#ifdef WIN32 |
241 | int nWrote = TEMP_FAILURE_RETRY( | 245 | int nWrote = TEMP_FAILURE_RETRY( |
242 | bu_send( nSocket, (const char *) pBuf, nBytes, 0 ) ); | 246 | bu_send( nTcpSocket, (const char *) pBuf, nBytes, 0 ) ); |
243 | //#else | 247 | //#else |
244 | // int nWrote = TEMP_FAILURE_RETRY( ::write( nSocket, pBuf, nBytes ) ); | 248 | // int nWrote = TEMP_FAILURE_RETRY( ::write( nTcpSocket, pBuf, nBytes ) ); |
245 | //#endif | 249 | //#endif |
246 | if( nWrote < 0 ) | 250 | if( nWrote < 0 ) |
247 | { | 251 | { |
@@ -252,19 +256,19 @@ size_t Bu::Socket::write( const void *pBuf, size_t nBytes ) | |||
252 | #else | 256 | #else |
253 | if( errno == EAGAIN ) return 0; | 257 | if( errno == EAGAIN ) return 0; |
254 | #endif | 258 | #endif |
255 | throw SocketException( SocketException::cWrite, strerror(errno) ); | 259 | throw TcpSocketException( TcpSocketException::cWrite, strerror(errno) ); |
256 | } | 260 | } |
257 | return nWrote; | 261 | return nWrote; |
258 | } | 262 | } |
259 | 263 | ||
260 | size_t Bu::Socket::write( const void *pBuf, size_t nBytes, uint32_t nSec, uint32_t nUSec ) | 264 | size_t Bu::TcpSocket::write( const void *pBuf, size_t nBytes, uint32_t nSec, uint32_t nUSec ) |
261 | { | 265 | { |
262 | struct timeval tv; | 266 | struct timeval tv; |
263 | size_t nWrote = 0; | 267 | size_t nWrote = 0; |
264 | 268 | ||
265 | fd_set wfds; | 269 | fd_set wfds; |
266 | FD_ZERO(&wfds); | 270 | FD_ZERO(&wfds); |
267 | FD_SET(nSocket, &wfds); | 271 | FD_SET(nTcpSocket, &wfds); |
268 | 272 | ||
269 | #ifdef WIN32 | 273 | #ifdef WIN32 |
270 | DWORD dwStart = GetTickCount(); | 274 | DWORD dwStart = GetTickCount(); |
@@ -281,7 +285,7 @@ size_t Bu::Socket::write( const void *pBuf, size_t nBytes, uint32_t nSec, uint32 | |||
281 | { | 285 | { |
282 | tv.tv_sec = nSec; | 286 | tv.tv_sec = nSec; |
283 | tv.tv_usec = nUSec; | 287 | tv.tv_usec = nUSec; |
284 | bu_select( nSocket+1, NULL, &wfds, NULL, &tv ); | 288 | bu_select( nTcpSocket+1, NULL, &wfds, NULL, &tv ); |
285 | nWrote += write( ((char *)pBuf)+nWrote, nBytes-nWrote ); | 289 | nWrote += write( ((char *)pBuf)+nWrote, nBytes-nWrote ); |
286 | if( nWrote >= nBytes ) | 290 | if( nWrote >= nBytes ) |
287 | break; | 291 | break; |
@@ -300,101 +304,101 @@ size_t Bu::Socket::write( const void *pBuf, size_t nBytes, uint32_t nSec, uint32 | |||
300 | return nWrote; | 304 | return nWrote; |
301 | } | 305 | } |
302 | 306 | ||
303 | long Bu::Socket::tell() | 307 | long Bu::TcpSocket::tell() |
304 | { | 308 | { |
305 | throw UnsupportedException(); | 309 | throw UnsupportedException(); |
306 | } | 310 | } |
307 | 311 | ||
308 | void Bu::Socket::seek( long ) | 312 | void Bu::TcpSocket::seek( long ) |
309 | { | 313 | { |
310 | throw UnsupportedException(); | 314 | throw UnsupportedException(); |
311 | } | 315 | } |
312 | 316 | ||
313 | void Bu::Socket::setPos( long ) | 317 | void Bu::TcpSocket::setPos( long ) |
314 | { | 318 | { |
315 | throw UnsupportedException(); | 319 | throw UnsupportedException(); |
316 | } | 320 | } |
317 | 321 | ||
318 | void Bu::Socket::setPosEnd( long ) | 322 | void Bu::TcpSocket::setPosEnd( long ) |
319 | { | 323 | { |
320 | throw UnsupportedException(); | 324 | throw UnsupportedException(); |
321 | } | 325 | } |
322 | 326 | ||
323 | bool Bu::Socket::isEos() | 327 | bool Bu::TcpSocket::isEos() |
324 | { | 328 | { |
325 | return !bActive; | 329 | return !bActive; |
326 | } | 330 | } |
327 | 331 | ||
328 | bool Bu::Socket::canRead() | 332 | bool Bu::TcpSocket::canRead() |
329 | { | 333 | { |
330 | fd_set rfds; | 334 | fd_set rfds; |
331 | FD_ZERO(&rfds); | 335 | FD_ZERO(&rfds); |
332 | FD_SET(nSocket, &rfds); | 336 | FD_SET(nTcpSocket, &rfds); |
333 | struct timeval tv = { 0, 0 }; | 337 | struct timeval tv = { 0, 0 }; |
334 | int retval = bu_select( nSocket+1, &rfds, NULL, NULL, &tv ); | 338 | int retval = bu_select( nTcpSocket+1, &rfds, NULL, NULL, &tv ); |
335 | if( retval == -1 ) | 339 | if( retval == -1 ) |
336 | throw SocketException( | 340 | throw TcpSocketException( |
337 | SocketException::cBadRead, | 341 | TcpSocketException::cBadRead, |
338 | "Bad Read error" | 342 | "Bad Read error" |
339 | ); | 343 | ); |
340 | 344 | ||
341 | if( !FD_ISSET( nSocket, &rfds ) ) | 345 | if( !FD_ISSET( nTcpSocket, &rfds ) ) |
342 | return false; | 346 | return false; |
343 | return true; | 347 | return true; |
344 | } | 348 | } |
345 | 349 | ||
346 | bool Bu::Socket::canWrite() | 350 | bool Bu::TcpSocket::canWrite() |
347 | { | 351 | { |
348 | fd_set wfds; | 352 | fd_set wfds; |
349 | FD_ZERO(&wfds); | 353 | FD_ZERO(&wfds); |
350 | FD_SET(nSocket, &wfds); | 354 | FD_SET(nTcpSocket, &wfds); |
351 | struct timeval tv = { 0, 0 }; | 355 | struct timeval tv = { 0, 0 }; |
352 | int retval = bu_select( nSocket+1, NULL, &wfds, NULL, &tv ); | 356 | int retval = bu_select( nTcpSocket+1, NULL, &wfds, NULL, &tv ); |
353 | if( retval == -1 ) | 357 | if( retval == -1 ) |
354 | throw SocketException( | 358 | throw TcpSocketException( |
355 | SocketException::cBadRead, | 359 | TcpSocketException::cBadRead, |
356 | "Bad Read error" | 360 | "Bad Read error" |
357 | ); | 361 | ); |
358 | if( !FD_ISSET( nSocket, &wfds ) ) | 362 | if( !FD_ISSET( nTcpSocket, &wfds ) ) |
359 | return false; | 363 | return false; |
360 | return true; | 364 | return true; |
361 | } | 365 | } |
362 | 366 | ||
363 | bool Bu::Socket::isReadable() | 367 | bool Bu::TcpSocket::isReadable() |
364 | { | 368 | { |
365 | return true; | 369 | return true; |
366 | } | 370 | } |
367 | 371 | ||
368 | bool Bu::Socket::isWritable() | 372 | bool Bu::TcpSocket::isWritable() |
369 | { | 373 | { |
370 | return true; | 374 | return true; |
371 | } | 375 | } |
372 | 376 | ||
373 | bool Bu::Socket::isSeekable() | 377 | bool Bu::TcpSocket::isSeekable() |
374 | { | 378 | { |
375 | return false; | 379 | return false; |
376 | } | 380 | } |
377 | 381 | ||
378 | bool Bu::Socket::isBlocking() | 382 | bool Bu::TcpSocket::isBlocking() |
379 | { | 383 | { |
380 | #ifndef WIN32 | 384 | #ifndef WIN32 |
381 | return ((fcntl( nSocket, F_GETFL, 0 ) & O_NONBLOCK) != O_NONBLOCK); | 385 | return ((fcntl( nTcpSocket, F_GETFL, 0 ) & O_NONBLOCK) != O_NONBLOCK); |
382 | #else | 386 | #else |
383 | return false; | 387 | return false; |
384 | #endif | 388 | #endif |
385 | } | 389 | } |
386 | 390 | ||
387 | void Bu::Socket::setBlocking( bool bBlocking ) | 391 | void Bu::TcpSocket::setBlocking( bool bBlocking ) |
388 | { | 392 | { |
389 | this->bBlocking = bBlocking; | 393 | this->bBlocking = bBlocking; |
390 | #ifndef WIN32 | 394 | #ifndef WIN32 |
391 | if( bBlocking ) | 395 | if( bBlocking ) |
392 | { | 396 | { |
393 | fcntl( nSocket, F_SETFL, fcntl( nSocket, F_GETFL, 0 ) & (~O_NONBLOCK) ); | 397 | fcntl( nTcpSocket, F_SETFL, fcntl( nTcpSocket, F_GETFL, 0 ) & (~O_NONBLOCK) ); |
394 | } | 398 | } |
395 | else | 399 | else |
396 | { | 400 | { |
397 | fcntl( nSocket, F_SETFL, fcntl( nSocket, F_GETFL, 0 ) | O_NONBLOCK ); | 401 | fcntl( nTcpSocket, F_SETFL, fcntl( nTcpSocket, F_GETFL, 0 ) | O_NONBLOCK ); |
398 | } | 402 | } |
399 | #else | 403 | #else |
400 | u_long iMode; | 404 | u_long iMode; |
@@ -408,39 +412,39 @@ void Bu::Socket::setBlocking( bool bBlocking ) | |||
408 | // socket based on the numerical value of iMode. | 412 | // socket based on the numerical value of iMode. |
409 | // If iMode = 0, blocking is enabled; | 413 | // If iMode = 0, blocking is enabled; |
410 | // If iMode != 0, non-blocking mode is enabled. | 414 | // If iMode != 0, non-blocking mode is enabled. |
411 | bu_ioctlsocket(nSocket, FIONBIO, &iMode); | 415 | bu_ioctlsocket(nTcpSocket, FIONBIO, &iMode); |
412 | #endif | 416 | #endif |
413 | } | 417 | } |
414 | 418 | ||
415 | void Bu::Socket::setSize( long ) | 419 | void Bu::TcpSocket::setSize( long ) |
416 | { | 420 | { |
417 | } | 421 | } |
418 | 422 | ||
419 | void Bu::Socket::flush() | 423 | void Bu::TcpSocket::flush() |
420 | { | 424 | { |
421 | } | 425 | } |
422 | 426 | ||
423 | bool Bu::Socket::isOpen() | 427 | bool Bu::TcpSocket::isOpen() |
424 | { | 428 | { |
425 | return bActive; | 429 | return bActive; |
426 | } | 430 | } |
427 | 431 | ||
428 | void Bu::Socket::setAddress() | 432 | void Bu::TcpSocket::setAddress() |
429 | { | 433 | { |
430 | struct sockaddr_in addr; | 434 | struct sockaddr_in addr; |
431 | socklen_t len = sizeof(addr); | 435 | socklen_t len = sizeof(addr); |
432 | addr.sin_family = AF_INET; | 436 | addr.sin_family = AF_INET; |
433 | bu_getpeername( nSocket, (sockaddr *)(&addr), &len ); | 437 | bu_getpeername( nTcpSocket, (sockaddr *)(&addr), &len ); |
434 | sAddress = bu_inet_ntoa( addr.sin_addr ); | 438 | sAddress = bu_inet_ntoa( addr.sin_addr ); |
435 | } | 439 | } |
436 | 440 | ||
437 | Bu::FString Bu::Socket::getAddress() const | 441 | Bu::FString Bu::TcpSocket::getAddress() const |
438 | { | 442 | { |
439 | return sAddress; | 443 | return sAddress; |
440 | } | 444 | } |
441 | 445 | ||
442 | Bu::Socket::operator int() const | 446 | Bu::TcpSocket::operator int() const |
443 | { | 447 | { |
444 | return nSocket; | 448 | return nTcpSocket; |
445 | } | 449 | } |
446 | 450 | ||
diff --git a/src/socket.h b/src/tcpsocket.h index c8f78f0..3361e84 100644 --- a/src/socket.h +++ b/src/tcpsocket.h | |||
@@ -5,8 +5,8 @@ | |||
5 | * terms of the license contained in the file LICENSE. | 5 | * terms of the license contained in the file LICENSE. |
6 | */ | 6 | */ |
7 | 7 | ||
8 | #ifndef BU_SOCKET_H | 8 | #ifndef BU_TCP_SOCKET_H |
9 | #define BU_SOCKET_H | 9 | #define BU_TCP_SOCKET_H |
10 | 10 | ||
11 | #include <stdint.h> | 11 | #include <stdint.h> |
12 | 12 | ||
@@ -16,7 +16,7 @@ | |||
16 | 16 | ||
17 | namespace Bu | 17 | namespace Bu |
18 | { | 18 | { |
19 | subExceptionDeclBegin( SocketException ); | 19 | subExceptionDeclBegin( TcpSocketException ); |
20 | enum { | 20 | enum { |
21 | cRead, | 21 | cRead, |
22 | cWrite, | 22 | cWrite, |
@@ -40,28 +40,29 @@ namespace Bu | |||
40 | * Please note that there is a condition that will occur eventually (at | 40 | * Please note that there is a condition that will occur eventually (at |
41 | * least on *nix systems) that will trigger a SIGPIPE condition. This | 41 | * least on *nix systems) that will trigger a SIGPIPE condition. This |
42 | * will terminate your program immediately unless handled properly. Most | 42 | * will terminate your program immediately unless handled properly. Most |
43 | * people doing any connections with Socket will want to put this in their | 43 | * people doing any connections with TcpSocket will want to put this in |
44 | * program somewhere before they use it: | 44 | * their program somewhere before they use it: |
45 | *@code | 45 | *@code |
46 | #include <signal.h> | 46 | #include <signal.h> |
47 | ... | 47 | ... |
48 | ... | 48 | ... |
49 | ... | 49 | ... |
50 | sigset( SIGPIPE, SIG_IGN ); // do this before you use a Bu::Socket | 50 | sigset( SIGPIPE, SIG_IGN ); // do this before you use a Bu::TcpSocket |
51 | @endcode | 51 | @endcode |
52 | * When this is done, Bu::Socket will simply throw a broken pipe exception | 52 | * When this is done, Bu::TcpSocket will simply throw a broken pipe |
53 | * just like every other error condition, allowing your program to handle | 53 | * exception just like every other error condition, allowing your program |
54 | * it sanely. | 54 | * to handle it sanely. |
55 | * | 55 | * |
56 | *@ingroup Serving | 56 | *@ingroup Serving |
57 | *@ingroup Streams | 57 | *@ingroup Streams |
58 | */ | 58 | */ |
59 | class Socket : public Stream | 59 | class TcpSocket : public Stream |
60 | { | 60 | { |
61 | public: | 61 | public: |
62 | Socket( int nSocket ); | 62 | TcpSocket( int nTcpSocket ); |
63 | Socket( const FString &sAddr, int nPort, int nTimeout=30 ); | 63 | TcpSocket( const FString &sAddr, int nPort, int nTimeout=30, |
64 | virtual ~Socket(); | 64 | bool bBlocking=true ); |
65 | virtual ~TcpSocket(); | ||
65 | 66 | ||
66 | virtual void close(); | 67 | virtual void close(); |
67 | //virtual void read(); | 68 | //virtual void read(); |
@@ -101,9 +102,9 @@ namespace Bu | |||
101 | void setAddress(); | 102 | void setAddress(); |
102 | 103 | ||
103 | #ifdef WIN32 | 104 | #ifdef WIN32 |
104 | unsigned int nSocket; | 105 | unsigned int nTcpSocket; |
105 | #else | 106 | #else |
106 | int nSocket; | 107 | int nTcpSocket; |
107 | #endif | 108 | #endif |
108 | bool bActive; | 109 | bool bActive; |
109 | bool bBlocking; | 110 | bool bBlocking; |
diff --git a/src/tests/socketblock.cpp b/src/tests/socketblock.cpp index a1ea18d..793ef96 100644 --- a/src/tests/socketblock.cpp +++ b/src/tests/socketblock.cpp | |||
@@ -6,8 +6,8 @@ | |||
6 | */ | 6 | */ |
7 | 7 | ||
8 | #include "bu/ito.h" | 8 | #include "bu/ito.h" |
9 | #include "bu/socket.h" | 9 | #include "bu/tcpsocket.h" |
10 | #include "bu/serversocket.h" | 10 | #include "bu/tcpserversocket.h" |
11 | #include <stdio.h> | 11 | #include <stdio.h> |
12 | #include <unistd.h> | 12 | #include <unistd.h> |
13 | 13 | ||
@@ -21,7 +21,7 @@ public: | |||
21 | 21 | ||
22 | virtual void run() | 22 | virtual void run() |
23 | { | 23 | { |
24 | Bu::Socket c = s.accept( 45, 0 ); | 24 | Bu::TcpSocket c = s.accept( 45, 0 ); |
25 | printf("TstServer: Accetped connection.\n"); fflush( stdout ); | 25 | printf("TstServer: Accetped connection.\n"); fflush( stdout ); |
26 | 26 | ||
27 | sleep( 1 ); | 27 | sleep( 1 ); |
@@ -35,7 +35,7 @@ public: | |||
35 | c.close(); | 35 | c.close(); |
36 | } | 36 | } |
37 | 37 | ||
38 | Bu::ServerSocket s; | 38 | Bu::TcpServerSocket s; |
39 | }; | 39 | }; |
40 | 40 | ||
41 | int main() | 41 | int main() |
@@ -45,7 +45,7 @@ int main() | |||
45 | ts.start(); | 45 | ts.start(); |
46 | 46 | ||
47 | printf("main: Connecting to server.\n"); fflush( stdout ); | 47 | printf("main: Connecting to server.\n"); fflush( stdout ); |
48 | Bu::Socket s( "localhost", 55678 ); | 48 | Bu::TcpSocket s( "localhost", 55678 ); |
49 | 49 | ||
50 | printf("main: Sending 4 bytes.\n"); fflush( stdout ); | 50 | printf("main: Sending 4 bytes.\n"); fflush( stdout ); |
51 | s.write( "aoeu", 4 ); | 51 | s.write( "aoeu", 4 ); |
diff --git a/src/tests/socketbreak.cpp b/src/tests/socketbreak.cpp index 8339630..7d3c71a 100644 --- a/src/tests/socketbreak.cpp +++ b/src/tests/socketbreak.cpp | |||
@@ -5,17 +5,17 @@ | |||
5 | * terms of the license contained in the file LICENSE. | 5 | * terms of the license contained in the file LICENSE. |
6 | */ | 6 | */ |
7 | 7 | ||
8 | #include "bu/serversocket.h" | 8 | #include "bu/tcpserversocket.h" |
9 | #include "bu/socket.h" | 9 | #include "bu/tcpsocket.h" |
10 | #include <unistd.h> | 10 | #include <unistd.h> |
11 | 11 | ||
12 | int main() | 12 | int main() |
13 | { | 13 | { |
14 | Bu::ServerSocket sSrv( 9987 ); | 14 | Bu::TcpServerSocket sSrv( 9987 ); |
15 | 15 | ||
16 | Bu::Socket sSend("localhost", 9987 ); | 16 | Bu::TcpSocket sSend("localhost", 9987 ); |
17 | 17 | ||
18 | Bu::Socket sRecv( sSrv.accept() ); | 18 | Bu::TcpSocket sRecv( sSrv.accept() ); |
19 | 19 | ||
20 | printf("Connected sockets.\n"); | 20 | printf("Connected sockets.\n"); |
21 | 21 | ||
diff --git a/src/tests/socket.cpp b/src/tests/tcpsocket.cpp index ba4e9b9..30dd22f 100644 --- a/src/tests/socket.cpp +++ b/src/tests/tcpsocket.cpp | |||
@@ -5,7 +5,7 @@ | |||
5 | * terms of the license contained in the file LICENSE. | 5 | * terms of the license contained in the file LICENSE. |
6 | */ | 6 | */ |
7 | 7 | ||
8 | #include <bu/socket.h> | 8 | #include <bu/tcpsocket.h> |
9 | #include <bu/sio.h> | 9 | #include <bu/sio.h> |
10 | 10 | ||
11 | #include <sys/time.h> | 11 | #include <sys/time.h> |
@@ -17,7 +17,7 @@ bool isUp() | |||
17 | { | 17 | { |
18 | try | 18 | try |
19 | { | 19 | { |
20 | Socket s("xagasoft.com", 9898, 1 ); | 20 | TcpSocket s("xagasoft.com", 9898, 1 ); |
21 | 21 | ||
22 | char buf[5]; | 22 | char buf[5]; |
23 | buf[s.read(buf, 2, 1, 0)] = '\0'; | 23 | buf[s.read(buf, 2, 1, 0)] = '\0'; |
diff --git a/src/variant.h b/src/variant.h index 5482ee3..9819f2c 100644 --- a/src/variant.h +++ b/src/variant.h | |||
@@ -17,6 +17,7 @@ namespace Bu | |||
17 | { | 17 | { |
18 | class Formatter; | 18 | class Formatter; |
19 | class Variant; | 19 | class Variant; |
20 | /** @cond DEVEL */ | ||
20 | template<class t> class VariantType; | 21 | template<class t> class VariantType; |
21 | 22 | ||
22 | class VariantTypeRoot | 23 | class VariantTypeRoot |
@@ -92,7 +93,22 @@ namespace Bu | |||
92 | private: | 93 | private: |
93 | t data; | 94 | t data; |
94 | }; | 95 | }; |
95 | 96 | /** @endcond */ | |
97 | |||
98 | /** | ||
99 | * Store any data type and access it safely. Variant gives you a way to | ||
100 | * pass arbitrary data types around without having to worry about what | ||
101 | * type a variable is. It allows code to be easily extended and to manage | ||
102 | * data without having to know what type it is ahead of time. | ||
103 | * | ||
104 | * Because of the generic method that this class was implemented it may seem | ||
105 | * to have some drawbacks compared to other Variant classes you may have | ||
106 | * seen, however it is fairly easy to get it to do just about anything you | ||
107 | * may need. It is also very low overhead. On most compilers the class | ||
108 | * itself has only 3 words of overhead + the size of the variable you store | ||
109 | * in it. And, since many parts of it are templatized they can often be | ||
110 | * optimized quite a bit. | ||
111 | */ | ||
96 | class Variant | 112 | class Variant |
97 | { | 113 | { |
98 | public: | 114 | public: |