00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef ARCENTRALMANAGER
00027 #define ARCENTRALMANAGER
00028
00029 #include "Aria.h"
00030 #include "ArServerBase.h"
00031 #include "ArCentralForwarder.h"
00032
00033 class ArCentralManager : public ArASyncTask
00034 {
00035 public:
00037 AREXPORT ArCentralManager(ArServerBase *robotServer, ArServerBase *clientServer);
00039 AREXPORT virtual ~ArCentralManager();
00041 AREXPORT void addForwarderAddedCallback(
00042 ArFunctor1<ArCentralForwarder *> *functor, int priority = 0);
00044 AREXPORT void remForwarderAddedCallback(
00045 ArFunctor1<ArCentralForwarder *> *functor);
00047 AREXPORT void addForwarderRemovedCallback(
00048 ArFunctor1<ArCentralForwarder *> *functor, int priority = 0);
00050 AREXPORT void remForwarderRemovedCallback(
00051 ArFunctor1<ArCentralForwarder *> *functor);
00053 AREXPORT void netClientList(ArServerClient *client, ArNetPacket *packet);
00055 AREXPORT void netServerSwitch(ArServerClient *client, ArNetPacket *packet);
00056 AREXPORT virtual void *runThread(void *arg);
00057 protected:
00058 void close(void);
00059 ArServerBase *myRobotServer;
00060 ArServerBase *myClientServer;
00061 double myHeartbeatTimeout;
00062 std::list<ArSocket *> myClientSockets;
00063 std::list<std::string> myClientNames;
00064 std::list<ArCentralForwarder *> myForwarders;
00065 std::set<int> myUsedPorts;
00066 ArMutex myCallbackMutex;
00067 std::multimap<int,
00068 ArFunctor1<ArCentralForwarder *> *> myForwarderAddedCBList;
00069 std::multimap<int,
00070 ArFunctor1<ArCentralForwarder *> *> myForwarderRemovedCBList;
00071 ArMutex myDataMutex;
00072 int myOnSocket;
00073 ArFunctor2C<ArCentralManager, ArServerClient *,
00074 ArNetPacket *> myNetSwitchCB;
00075 ArFunctor2C<ArCentralManager, ArServerClient *,
00076 ArNetPacket *> myNetClientListCB;
00077 ArFunctorC<ArCentralManager> myAriaExitCB;
00078 };
00079
00080
00081 #endif // ARSERVERSWITCHMANAGER