#ifndef STAR_UNIVERSE_CONTROLLER_HPP #define STAR_UNIVERSE_CONTROLLER_HPP #include #include "StarConfig.hpp" #include "StarUniverseServer.hpp" #include "StarTcp.hpp" #include "StarThread.hpp" namespace Star { using namespace std; class UniverseControllerSet; class UniverseController : public Thread, public enable_shared_from_this { public: UniverseController(TcpSocketPtr socket); void stop(); bool isClosed(); void bind(UniverseControllerSet* parent); void receiveResponse(Variant const&response); virtual void run(); private: TcpSocketPtr m_socket; UniverseControllerSet* m_parent; bool m_stop; bool m_closed; Mutex m_lock; ConditionVariable m_condition; List m_responses; }; typedef shared_ptr UniverseControllerPtr; class ControllerCommand; typedef shared_ptr ControllerCommandPtr; class UniverseControllerSet : public Thread { public: UniverseControllerSet(UniverseServer* universeServer); void addNewConnection(UniverseControllerPtr controller); void commandReceived(ControllerCommandPtr command); virtual void run(); void stop(); void notify(); private: UniverseServer* m_universeServer; bool m_stop; Mutex m_lock; bool m_active; ConditionVariable m_condition; Set m_controllers; List m_commandQueue; void commandTypeHelpForMoreInfo(ControllerCommandPtr command); void commandCounters(ControllerCommandPtr command); void commandUnknown(ControllerCommandPtr command); }; typedef shared_ptr UniverseControllerSetPtr; class ControllerCommand { public: ControllerCommand(weak_ptr controller, VariantList request); String const& command(); VariantList& request(); void respond(VariantList const& response); void popOuterCommand(int innerIndex); private: weak_ptr m_controller; String m_command; VariantList m_request; }; } #endif