#ifndef _H_NETMANAGER
#define _H_NETMANAGER
#include <Security/ip++.h>
#include <Security/timeflow.h>
#include <Security/tqueue.h>
#include "xfercore.h"
#include "connectionpool.h"
#include "target.h"
#include "parameters.h"
#include "observer.h"
#include <set>
#include <map>
using namespace IPPlusPlus;
namespace Security {
namespace Network {
class Protocol;
class Transfer;
class Connection;
class Manager : public ParameterPointer {
public:
Manager();
virtual ~Manager();
public:
void add(Transfer *xfer);
void remove(Transfer *xfer);
void start(Transfer *xfer);
void abort(Transfer *xfer);
Observer *observer() const { return mObserver; }
void observer(Observer *ob) { mObserver = ob; }
public: void done(Transfer *xfer);
void addIO(TransferEngine::Client *client);
void removeIO(TransferEngine::Client *client);
public: template <class ProtoConnection>
ProtoConnection *findConnection(const HostTarget &host)
{ return safe_cast<ProtoConnection *>(pickConnection(host)); }
void retainConnection(Connection *connection);
void closeConnection(Connection *connection);
public:
void step(); void run(); void run(Time::Absolute upTo);
public:
bool reuseConnections() const { return mRetainConnections; }
void reuseConnections(bool retain); void flushConnections();
public:
class Timer : private ScheduleQueue<Time::Absolute>::Event {
friend class Manager;
protected:
virtual ~Timer() { }
Time::Absolute when() const { return Event::when(); }
bool scheduled() const { return Event::scheduled(); }
public:
virtual void action() = 0;
};
virtual void setTimer(Timer *timer, Time::Absolute when);
void setTimer(Timer *timer, Time::Interval offset)
{ setTimer(timer, Time::now() + offset); }
virtual void clearTimer(Timer *timer);
protected:
virtual void runTimers(); virtual void prepare();
private:
void doStep(); Connection *pickConnection(const HostTarget &host);
private:
typedef map<string, Protocol *> ProtoMap;
ProtoMap mProtocols;
private:
typedef set<Transfer *> TransferSet;
TransferSet mTransfers; uint32 mActiveTransfers;
private:
TransferEngine mEngine; ConnectionPool mConnections; set<Connection *> mMorgue; bool mRetainConnections; Observer *mObserver;
ScheduleQueue<Time::Absolute> mTimers; };
} }
#endif _H_NETMANAGER