2007-09-22 17:00:33 UTC
previous
next
#ifndef NETWORK_H_
#define NETWORK_H_
#include <boost/thread.hpp>
#include <boost/utility.hpp>
#include <boost/asio.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <list>
namespace Network
{
class Connection;
class Manager : private boost::noncopyable
{
public: // Public methods, called from outside the thread
~Manager();
void start_listener();
void end_connection(
boost::shared_ptr<Connection> connection);
private: // Private methods, called from outside the thread
Manager(); // Constructor is private to control who can create objects
private: // Private methods, called from inside the thread
void start();
void start_listener_int();
void end_connection_int(
boost::shared_ptr<Connection> connection);
private: // Private data
boost::scoped_ptr<boost::thread> _thread;
boost::asio::io_service _io_service;
boost::scoped_ptr<boost::asio::io_service::work> _io_service_work;
std::list<boost::shared_ptr<Connection> > _connections;
static boost::scoped_ptr<Manager> _instance;
public:
friend Manager& manager();
friend int main (int argc, char *argv[]); // To initialize the instance
static void create()
{
_instance.reset(new Manager());
}
static void destroy()
{
_instance.reset();
}
};
Manager& manager();
class Connection : private boost::noncopyable,
public boost::enable_shared_from_this<Connection>
{
public:
Connection(Manager& manager);
~Connection();
void start_listening();
void accept_connection(
const boost::asio::error& error);
void receive_data(
const boost::asio::error& error,
std::size_t bytes_transferred);
private:
boost::scoped_ptr<boost::thread> _thread;
boost::asio::io_service _io_service;
boost::scoped_ptr<boost::asio::io_service::work> _io_service_work;
boost::asio::ip::tcp::socket _socket;
boost::scoped_ptr<boost::asio::ip::tcp::acceptor> _acceptor;
boost::array<unsigned char, 2048> _buffer;
Manager& _manager;
};
//extern boost::scoped_ptr<Manager> manager;
}
#endif /*NETWORK_H_*/