aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/client.cpp9
-rw-r--r--src/client.h23
-rw-r--r--src/file.cpp10
-rw-r--r--src/file.h3
-rw-r--r--src/list.h5
-rw-r--r--src/old/singleton.h59
-rw-r--r--src/server.cpp73
-rw-r--r--src/server.h49
-rw-r--r--src/serversocket.cpp5
-rw-r--r--src/serversocket.h3
-rw-r--r--src/singleton.h62
-rw-r--r--src/socket.cpp9
-rw-r--r--src/socket.h3
-rw-r--r--src/stream.h3
-rw-r--r--src/tests/hash.cpp24
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
3Bu::Client::Client()
4{
5}
6
7Bu::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
7namespace 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
101bool Bu::File::isBlocking()
102{
103 return true;
104}
105
106void Bu::File::setBlocking( bool bBlocking )
107{
108 return;
109}
110
diff --git a/src/file.h b/src/file.h
index bbc620c..ee3fdb3 100644
--- a/src/file.h
+++ b/src/file.h
@@ -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
diff --git a/src/list.h b/src/list.h
index 4d16872..6081ea5 100644
--- a/src/list.h
+++ b/src/list.h
@@ -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 */
29template <class T>
30class Singleton
31{
32protected:
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
40private:
41 /**
42 * Copy constructor, defined so that you could write your own as well.
43 */
44 Singleton( const Singleton& );
45
46public:
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
4Bu::Server::Server() :
5 nTimeoutSec( 0 ),
6 nTimeoutUSec( 0 )
7{
8 FD_ZERO( &fdActive );
9}
10
11Bu::Server::~Server()
12{
13}
14
15void 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
23void 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
31void Bu::Server::setTimeout( int nTimeoutSec, int nTimeoutUSec )
32{
33 this->nTimeoutSec = nTimeoutSec;
34 this->nTimeoutUSec = nTimeoutUSec;
35}
36
37void 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
66void 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
9namespace 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
88int Bu::ServerSocket::getSocket()
89{
90 return nServer;
91}
92
88int Bu::ServerSocket::accept( int nTimeoutSec, int nTimeoutUSec ) 93int 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
6namespace 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
234bool Bu::Socket::isBlocking()
235{
236 return false;
237}
238
239void 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
4typedef struct Bob
5{
6 int nID;
7} Bob;
8
9int 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