diff options
| -rw-r--r-- | src/client.cpp | 9 | ||||
| -rw-r--r-- | src/client.h | 23 | ||||
| -rw-r--r-- | src/file.cpp | 10 | ||||
| -rw-r--r-- | src/file.h | 3 | ||||
| -rw-r--r-- | src/list.h | 5 | ||||
| -rw-r--r-- | src/old/singleton.h | 59 | ||||
| -rw-r--r-- | src/server.cpp | 73 | ||||
| -rw-r--r-- | src/server.h | 49 | ||||
| -rw-r--r-- | src/serversocket.cpp | 5 | ||||
| -rw-r--r-- | src/serversocket.h | 3 | ||||
| -rw-r--r-- | src/singleton.h | 62 | ||||
| -rw-r--r-- | src/socket.cpp | 9 | ||||
| -rw-r--r-- | src/socket.h | 3 | ||||
| -rw-r--r-- | src/stream.h | 3 | ||||
| -rw-r--r-- | src/tests/hash.cpp | 24 |
15 files changed, 279 insertions, 61 deletions
diff --git a/src/client.cpp b/src/client.cpp new file mode 100644 index 0000000..a048ca3 --- /dev/null +++ b/src/client.cpp | |||
| @@ -0,0 +1,9 @@ | |||
| 1 | #include "client.h" | ||
| 2 | |||
| 3 | Bu::Client::Client() | ||
| 4 | { | ||
| 5 | } | ||
| 6 | |||
| 7 | Bu::Client::~Client() | ||
| 8 | { | ||
| 9 | } | ||
diff --git a/src/client.h b/src/client.h new file mode 100644 index 0000000..27fbad4 --- /dev/null +++ b/src/client.h | |||
| @@ -0,0 +1,23 @@ | |||
| 1 | #ifndef CLIENT_H | ||
| 2 | #define CLIENT_H | ||
| 3 | |||
| 4 | #include <stdint.h> | ||
| 5 | #include "bu/socket.h" | ||
| 6 | |||
| 7 | namespace Bu | ||
| 8 | { | ||
| 9 | /** | ||
| 10 | * | ||
| 11 | */ | ||
| 12 | class Client | ||
| 13 | { | ||
| 14 | public: | ||
| 15 | Client(); | ||
| 16 | virtual ~Client(); | ||
| 17 | |||
| 18 | private: | ||
| 19 | |||
| 20 | }; | ||
| 21 | } | ||
| 22 | |||
| 23 | #endif | ||
diff --git a/src/file.cpp b/src/file.cpp index 5de5f6c..26986a5 100644 --- a/src/file.cpp +++ b/src/file.cpp | |||
| @@ -98,3 +98,13 @@ bool Bu::File::canSeek() | |||
| 98 | return true; | 98 | return true; |
| 99 | } | 99 | } |
| 100 | 100 | ||
| 101 | bool Bu::File::isBlocking() | ||
| 102 | { | ||
| 103 | return true; | ||
| 104 | } | ||
| 105 | |||
| 106 | void Bu::File::setBlocking( bool bBlocking ) | ||
| 107 | { | ||
| 108 | return; | ||
| 109 | } | ||
| 110 | |||
| @@ -27,6 +27,9 @@ namespace Bu | |||
| 27 | virtual bool canWrite(); | 27 | virtual bool canWrite(); |
| 28 | virtual bool canSeek(); | 28 | virtual bool canSeek(); |
| 29 | 29 | ||
| 30 | virtual bool isBlocking(); | ||
| 31 | virtual void setBlocking( bool bBlocking=true ); | ||
| 32 | |||
| 30 | private: | 33 | private: |
| 31 | FILE *fh; | 34 | FILE *fh; |
| 32 | 35 | ||
| @@ -217,6 +217,11 @@ namespace Bu | |||
| 217 | { | 217 | { |
| 218 | } | 218 | } |
| 219 | 219 | ||
| 220 | const_iterator( const iterator &i ) : | ||
| 221 | pLink( i.pLink ) | ||
| 222 | { | ||
| 223 | } | ||
| 224 | |||
| 220 | public: | 225 | public: |
| 221 | bool operator==( const const_iterator &oth ) const | 226 | bool operator==( const const_iterator &oth ) const |
| 222 | { | 227 | { |
diff --git a/src/old/singleton.h b/src/old/singleton.h deleted file mode 100644 index 47adbd5..0000000 --- a/src/old/singleton.h +++ /dev/null | |||
| @@ -1,59 +0,0 @@ | |||
| 1 | #ifndef SINGLETON_H | ||
| 2 | #define SINGLETON_H | ||
| 3 | |||
| 4 | #include <stdio.h> | ||
| 5 | |||
| 6 | /** | ||
| 7 | * Provides singleton functionality in a modular sort of way. Make this the | ||
| 8 | * base class of any other class and you immediately gain singleton | ||
| 9 | * functionality. Be sure to make your constructor and various functions use | ||
| 10 | * intellegent scoping. Cleanup and instantiation are performed automatically | ||
| 11 | * for you at first use and program exit. There are two things that you must | ||
| 12 | * do when using this template, first is to inherit from it with the name of | ||
| 13 | * your class filling in for T and then make this class a friend of your class. | ||
| 14 | *@code | ||
| 15 | * // Making the Single Singleton: | ||
| 16 | * class Single : public Singleton<Single> | ||
| 17 | * { | ||
| 18 | * friend class Singleton<Single>; | ||
| 19 | * protected: | ||
| 20 | * Single(); | ||
| 21 | * ... | ||
| 22 | * }; | ||
| 23 | @endcode | ||
| 24 | * You can still add public functions and variables to your new Singleton child | ||
| 25 | * class, but your constructor should be protected (hence the need for the | ||
| 26 | * friend decleration). | ||
| 27 | *@author Mike Buland | ||
| 28 | */ | ||
| 29 | template <class T> | ||
| 30 | class Singleton | ||
| 31 | { | ||
| 32 | protected: | ||
| 33 | /** | ||
| 34 | * Private constructor. This constructor is empty but has a body so that | ||
| 35 | * you can make your own override of it. Be sure that you're override is | ||
| 36 | * also protected. | ||
| 37 | */ | ||
| 38 | Singleton() {}; | ||
| 39 | |||
| 40 | private: | ||
| 41 | /** | ||
| 42 | * Copy constructor, defined so that you could write your own as well. | ||
| 43 | */ | ||
| 44 | Singleton( const Singleton& ); | ||
| 45 | |||
| 46 | public: | ||
| 47 | /** | ||
| 48 | * Get a handle to the contained instance of the contained class. It is | ||
| 49 | * a reference. | ||
| 50 | *@returns A reference to the contained object. | ||
| 51 | */ | ||
| 52 | static T &getInstance() | ||
| 53 | { | ||
| 54 | static T i; | ||
| 55 | return i; | ||
| 56 | } | ||
| 57 | }; | ||
| 58 | |||
| 59 | #endif | ||
diff --git a/src/server.cpp b/src/server.cpp new file mode 100644 index 0000000..f93238c --- /dev/null +++ b/src/server.cpp | |||
| @@ -0,0 +1,73 @@ | |||
| 1 | #include "server.h" | ||
| 2 | #include <errno.h> | ||
| 3 | |||
| 4 | Bu::Server::Server() : | ||
| 5 | nTimeoutSec( 0 ), | ||
| 6 | nTimeoutUSec( 0 ) | ||
| 7 | { | ||
| 8 | FD_ZERO( &fdActive ); | ||
| 9 | } | ||
| 10 | |||
| 11 | Bu::Server::~Server() | ||
| 12 | { | ||
| 13 | } | ||
| 14 | |||
| 15 | void Bu::Server::addPort( int nPort, int nPoolSize ) | ||
| 16 | { | ||
| 17 | ServerSocket *s = new ServerSocket( nPort, nPoolSize ); | ||
| 18 | int nSocket = s->getSocket(); | ||
| 19 | FD_SET( nSocket, &fdActive ); | ||
| 20 | hServers.insert( nSocket, s ); | ||
| 21 | } | ||
| 22 | |||
| 23 | void Bu::Server::addPort( const FString &sAddr, int nPort, int nPoolSize ) | ||
| 24 | { | ||
| 25 | ServerSocket *s = new ServerSocket( sAddr, nPort, nPoolSize ); | ||
| 26 | int nSocket = s->getSocket(); | ||
| 27 | FD_SET( nSocket, &fdActive ); | ||
| 28 | hServers.insert( nSocket, s ); | ||
| 29 | } | ||
| 30 | |||
| 31 | void Bu::Server::setTimeout( int nTimeoutSec, int nTimeoutUSec ) | ||
| 32 | { | ||
| 33 | this->nTimeoutSec = nTimeoutSec; | ||
| 34 | this->nTimeoutUSec = nTimeoutUSec; | ||
| 35 | } | ||
| 36 | |||
| 37 | void Bu::Server::scan() | ||
| 38 | { | ||
| 39 | struct timeval xTimeout = { nTimeoutSec, nTimeoutUSec }; | ||
| 40 | |||
| 41 | fd_set fdRead = fdActive; | ||
| 42 | fd_set fdWrite = fdActive; | ||
| 43 | fd_set fdException = fdActive; | ||
| 44 | |||
| 45 | if( TEMP_FAILURE_RETRY( select( FD_SETSIZE, &fdRead, NULL, &fdException, &xTimeout ) ) < 0 ) | ||
| 46 | { | ||
| 47 | throw ExceptionBase("Error attempting to scan open connections."); | ||
| 48 | } | ||
| 49 | |||
| 50 | for( int j = 0; j < FD_SETSIZE; j++ ) | ||
| 51 | { | ||
| 52 | if( FD_ISSET( j, &fdRead ) ) | ||
| 53 | { | ||
| 54 | if( hServers.has( j ) ) | ||
| 55 | { | ||
| 56 | addClient( hServers.get( j )->accept() ); | ||
| 57 | } | ||
| 58 | else | ||
| 59 | { | ||
| 60 | |||
| 61 | } | ||
| 62 | } | ||
| 63 | } | ||
| 64 | } | ||
| 65 | |||
| 66 | void Bu::Server::addClient( int nSocket ) | ||
| 67 | { | ||
| 68 | FD_SET( nSocket, &fdActive ); | ||
| 69 | |||
| 70 | Client *c = new Client(); | ||
| 71 | hClients.insert( nSocket, c ); | ||
| 72 | } | ||
| 73 | |||
diff --git a/src/server.h b/src/server.h new file mode 100644 index 0000000..9f4f459 --- /dev/null +++ b/src/server.h | |||
| @@ -0,0 +1,49 @@ | |||
| 1 | #ifndef SERVER_H | ||
| 2 | #define SERVER_H | ||
| 3 | |||
| 4 | #include <stdint.h> | ||
| 5 | #include "bu/serversocket.h" | ||
| 6 | #include "bu/list.h" | ||
| 7 | #include "bu/client.h" | ||
| 8 | |||
| 9 | namespace Bu | ||
| 10 | { | ||
| 11 | /** | ||
| 12 | * 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 | ||
| 14 | * manage a pool of both ServerSockets and connected Sockets along with | ||
| 15 | * their protocols and buffers. | ||
| 16 | * | ||
| 17 | * To start serving on a new port, use the addPort functions. Each call to | ||
| 18 | * addPort creates a new ServerSocket, starts it listening, and adds it to | ||
| 19 | * the server pool. | ||
| 20 | * | ||
| 21 | * All of the real work is done by scan, which will wait for up | ||
| 22 | * to the timeout set by setTimeout before returning if there is no data | ||
| 23 | * pending. scan should probably be called in some sort of tight | ||
| 24 | * loop, possibly in it's own thread, or in the main control loop. | ||
| 25 | */ | ||
| 26 | class Server | ||
| 27 | { | ||
| 28 | public: | ||
| 29 | Server(); | ||
| 30 | virtual ~Server(); | ||
| 31 | |||
| 32 | void addPort( int nPort, int nPoolSize=40 ); | ||
| 33 | void addPort( const FString &sAddr, int nPort, int nPoolSize=40 ); | ||
| 34 | |||
| 35 | void scan(); | ||
| 36 | void setTimeout( int nTimeoutSec, int nTimeoutUSec=0 ); | ||
| 37 | |||
| 38 | void addClient( int nSocket ); | ||
| 39 | |||
| 40 | private: | ||
| 41 | int nTimeoutSec; | ||
| 42 | int nTimeoutUSec; | ||
| 43 | fd_set fdActive; | ||
| 44 | Hash<int,ServerSocket *> hServers; | ||
| 45 | Hash<int,Client *> hClients; | ||
| 46 | }; | ||
| 47 | } | ||
| 48 | |||
| 49 | #endif | ||
diff --git a/src/serversocket.cpp b/src/serversocket.cpp index c53c80d..9c8f743 100644 --- a/src/serversocket.cpp +++ b/src/serversocket.cpp | |||
| @@ -85,6 +85,11 @@ void Bu::ServerSocket::startServer( struct sockaddr_in &name, int nPoolSize ) | |||
| 85 | FD_SET( nServer, &fdActive ); | 85 | FD_SET( nServer, &fdActive ); |
| 86 | } | 86 | } |
| 87 | 87 | ||
| 88 | int Bu::ServerSocket::getSocket() | ||
| 89 | { | ||
| 90 | return nServer; | ||
| 91 | } | ||
| 92 | |||
| 88 | int Bu::ServerSocket::accept( int nTimeoutSec, int nTimeoutUSec ) | 93 | int Bu::ServerSocket::accept( int nTimeoutSec, int nTimeoutUSec ) |
| 89 | { | 94 | { |
| 90 | fd_set fdRead = fdActive; | 95 | fd_set fdRead = fdActive; |
diff --git a/src/serversocket.h b/src/serversocket.h index f146d91..d2601e4 100644 --- a/src/serversocket.h +++ b/src/serversocket.h | |||
| @@ -23,7 +23,8 @@ namespace Bu | |||
| 23 | ServerSocket( const FString &sAddr, int nPort, int nPoolSize=40 ); | 23 | ServerSocket( const FString &sAddr, int nPort, int nPoolSize=40 ); |
| 24 | virtual ~ServerSocket(); | 24 | virtual ~ServerSocket(); |
| 25 | 25 | ||
| 26 | int accept( int nTimeoutSec, int nTimeoutUSec ); | 26 | int accept( int nTimeoutSec=0, int nTimeoutUSec=0 ); |
| 27 | int getSocket(); | ||
| 27 | 28 | ||
| 28 | private: | 29 | private: |
| 29 | void startServer( struct sockaddr_in &name, int nPoolSize ); | 30 | void startServer( struct sockaddr_in &name, int nPoolSize ); |
diff --git a/src/singleton.h b/src/singleton.h new file mode 100644 index 0000000..4976a61 --- /dev/null +++ b/src/singleton.h | |||
| @@ -0,0 +1,62 @@ | |||
| 1 | #ifndef SINGLETON_H | ||
| 2 | #define SINGLETON_H | ||
| 3 | |||
| 4 | #include <stdio.h> | ||
| 5 | |||
| 6 | namespace Bu | ||
| 7 | { | ||
| 8 | /** | ||
| 9 | * Provides singleton functionality in a modular sort of way. Make this the | ||
| 10 | * base class of any other class and you immediately gain singleton | ||
| 11 | * functionality. Be sure to make your constructor and various functions use | ||
| 12 | * intellegent scoping. Cleanup and instantiation are performed automatically | ||
| 13 | * for you at first use and program exit. There are two things that you must | ||
| 14 | * do when using this template, first is to inherit from it with the name of | ||
| 15 | * your class filling in for T and then make this class a friend of your class. | ||
| 16 | *@code | ||
| 17 | * // Making the Single Singleton: | ||
| 18 | * class Single : public Singleton<Single> | ||
| 19 | * { | ||
| 20 | * friend class Singleton<Single>; | ||
| 21 | * protected: | ||
| 22 | * Single(); | ||
| 23 | * ... | ||
| 24 | * }; | ||
| 25 | @endcode | ||
| 26 | * You can still add public functions and variables to your new Singleton child | ||
| 27 | * class, but your constructor should be protected (hence the need for the | ||
| 28 | * friend decleration). | ||
| 29 | *@author Mike Buland | ||
| 30 | */ | ||
| 31 | template <class T> | ||
| 32 | class Singleton | ||
| 33 | { | ||
| 34 | protected: | ||
| 35 | /** | ||
| 36 | * Private constructor. This constructor is empty but has a body so that | ||
| 37 | * you can make your own override of it. Be sure that you're override is | ||
| 38 | * also protected. | ||
| 39 | */ | ||
| 40 | Singleton() {}; | ||
| 41 | |||
| 42 | private: | ||
| 43 | /** | ||
| 44 | * Copy constructor, defined so that you could write your own as well. | ||
| 45 | */ | ||
| 46 | Singleton( const Singleton& ); | ||
| 47 | |||
| 48 | public: | ||
| 49 | /** | ||
| 50 | * Get a handle to the contained instance of the contained class. It is | ||
| 51 | * a reference. | ||
| 52 | *@returns A reference to the contained object. | ||
| 53 | */ | ||
| 54 | static T &getInstance() | ||
| 55 | { | ||
| 56 | static T i; | ||
| 57 | return i; | ||
| 58 | } | ||
| 59 | }; | ||
| 60 | } | ||
| 61 | |||
| 62 | #endif | ||
diff --git a/src/socket.cpp b/src/socket.cpp index 455b5c8..441678a 100644 --- a/src/socket.cpp +++ b/src/socket.cpp | |||
| @@ -231,3 +231,12 @@ bool Bu::Socket::canSeek() | |||
| 231 | return false; | 231 | return false; |
| 232 | } | 232 | } |
| 233 | 233 | ||
| 234 | bool Bu::Socket::isBlocking() | ||
| 235 | { | ||
| 236 | return false; | ||
| 237 | } | ||
| 238 | |||
| 239 | void Bu::Socket::setBlocking( bool bBlocking ) | ||
| 240 | { | ||
| 241 | } | ||
| 242 | |||
diff --git a/src/socket.h b/src/socket.h index 568cad6..e65eb74 100644 --- a/src/socket.h +++ b/src/socket.h | |||
| @@ -33,7 +33,8 @@ namespace Bu | |||
| 33 | virtual bool canWrite(); | 33 | virtual bool canWrite(); |
| 34 | virtual bool canSeek(); | 34 | virtual bool canSeek(); |
| 35 | 35 | ||
| 36 | 36 | virtual bool isBlocking(); | |
| 37 | virtual void setBlocking( bool bBlocking=true ); | ||
| 37 | 38 | ||
| 38 | private: | 39 | private: |
| 39 | int nSocket; | 40 | int nSocket; |
diff --git a/src/stream.h b/src/stream.h index e640959..5f586e6 100644 --- a/src/stream.h +++ b/src/stream.h | |||
| @@ -36,6 +36,9 @@ namespace Bu | |||
| 36 | virtual bool canWrite() = 0; | 36 | virtual bool canWrite() = 0; |
| 37 | virtual bool canSeek() = 0; | 37 | virtual bool canSeek() = 0; |
| 38 | 38 | ||
| 39 | virtual bool isBlocking() = 0; | ||
| 40 | virtual void setBlocking( bool bBlocking=true ) = 0; | ||
| 41 | |||
| 39 | private: | 42 | private: |
| 40 | 43 | ||
| 41 | }; | 44 | }; |
diff --git a/src/tests/hash.cpp b/src/tests/hash.cpp new file mode 100644 index 0000000..73cfb27 --- /dev/null +++ b/src/tests/hash.cpp | |||
| @@ -0,0 +1,24 @@ | |||
| 1 | #include "bu/hash.h" | ||
| 2 | #include "bu/sptr.h" | ||
| 3 | |||
| 4 | typedef struct Bob | ||
| 5 | { | ||
| 6 | int nID; | ||
| 7 | } Bob; | ||
| 8 | |||
| 9 | int main() | ||
| 10 | { | ||
| 11 | Bu::Hash<int, Bu::SPtr<const Bob> > lb; | ||
| 12 | for( int j = 0; j < 10; j++ ) | ||
| 13 | { | ||
| 14 | Bob *b = new Bob; | ||
| 15 | b->nID = j; | ||
| 16 | lb.insert( j, b ); | ||
| 17 | } | ||
| 18 | |||
| 19 | for( int j = 0; j < 10; j++ ) | ||
| 20 | { | ||
| 21 | printf("%d\n", lb[j].value()->nID ); | ||
| 22 | } | ||
| 23 | } | ||
| 24 | |||
