Master.hh
00001 #ifndef MASTER_HH
00002 #define MASTER_HH
00003 
00004 #include <string>
00005 #include <list>
00006 #include <deque>
00007 #include <boost/shared_ptr.hpp>
00008 
00009 #include "msgs/msgs.h"
00010 #include "transport/Connection.hh"
00011 
00012 namespace gazebo
00013 {
00014 
00015   class Master
00016   {
00018     public: Master();
00019 
00021     public: virtual ~Master();
00022 
00025     public: void Init(unsigned short _port);
00026 
00027     public: void Run();
00028 
00030     public: void RunThread();
00031 
00033     public: void RunOnce();
00034 
00036     public: void Stop();
00037 
00039     public: void Fini();
00040 
00045     private: void ProcessMessage(const unsigned int _connectionIndex,
00046                                  const std::string &_data);
00047 
00052     private: void OnRead(const unsigned int _connectionIndex,
00053                          const std::string &_data);
00054 
00057     private: void OnAccept(const transport::ConnectionPtr &_newConnection);
00058 
00062     private: msgs::Publish GetPublisher( const std::string &_topic );
00063 
00068     private: transport::ConnectionPtr FindConnection(const std::string &_host, 
00069                                                      unsigned short _port);
00070 
00071 
00072     private: void RemoveConnection(unsigned int _index);
00073     private: void RemovePublisher(const msgs::Publish _pub);
00074     private: void RemoveSubscriber(const msgs::Subscribe _sub);
00075 
00076     typedef std::map<unsigned int, transport::ConnectionPtr> Connection_M;
00077     typedef std::list< std::pair<msgs::Publish, transport::ConnectionPtr> > PubList;
00078     typedef std::list< std::pair<msgs::Subscribe, transport::ConnectionPtr> > SubList;
00079     private: PubList publishers;
00080     private: SubList subscribers;
00081 
00082     private: Connection_M connections;
00083     private: std::list< std::string > worldNames;
00084     private: std::list< std::pair<unsigned int, std::string> > msgs;
00085 
00086     private: transport::Connection *connection;
00087     private: boost::thread *runThread;
00088     private: bool stop;
00089 
00090     private: boost::recursive_mutex *connectionMutex, *msgsMutex;
00091   };
00092 }
00093 
00094 #endif