X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Console%2FServer.hh;h=e21eea6d176baac916be918f7f3820ddf5e24855;hb=412cf8e222086fb5d89b15cb11556799e131f390;hp=09bfbaf224f811f3a45c8093f58517ef52ff10e6;hpb=24ccc14a000ffeceb9e5b6d02f54d2e971a3aee8;p=senf.git diff --git a/Console/Server.hh b/Console/Server.hh index 09bfbaf..e21eea6 100644 --- a/Console/Server.hh +++ b/Console/Server.hh @@ -27,6 +27,19 @@ #define HH_Server_ 1 // Custom includes +#include +#include +#include +#include +#include +#include +#include "../Utils/intrusive_refcount.hh" +#include "../Socket/Protocols/INet/TCPSocketHandle.hh" +#include "../Socket/ServerSocketHandle.hh" +#include "../Scheduler/Scheduler.hh" +#include "../Scheduler/ReadHelper.hh" +#include "Parse.hh" +#include "Executor.hh" #include "../Socket/Protocols/INet/INetAddressing.hh" //#include "Server.mpp" @@ -35,13 +48,88 @@ namespace senf { namespace console { - void start(senf::INet4SocketAddress const & address); - void start(senf::INet6SocketAddress const & address); + class Client; + + /** \brief + */ + class Server + : boost::noncopyable + { + SENF_LOG_CLASS_AREA(); + SENF_LOG_DEFAULT_LEVEL( senf::log::NOTICE ); + public: + /////////////////////////////////////////////////////////////////////////// + // Types + + typedef senf::ServerSocketHandle< + senf::MakeSocketPolicy< senf::TCPv4SocketProtocol::Policy, + senf::UnspecifiedAddressingPolicy>::policy > ServerHandle; + + ~Server(); + + static Server & start(senf::INet4SocketAddress const & address); + static Server & start(senf::INet6SocketAddress const & address); + + void name(std::string const & name); + + protected: + + private: + Server(ServerHandle handle); + + static void start(ServerHandle handle); + + void newClient(Scheduler::EventId event); + void removeClient(Client & client); + + ServerHandle handle_; + + typedef std::set< boost::intrusive_ptr > Clients; + Clients clients_; + std::string name_; + + static boost::scoped_ptr instance_; + + friend class Client; + }; + + /** \brief + */ + class Client + : public senf::intrusive_refcount + { + SENF_LOG_CLASS_AREA(); + SENF_LOG_DEFAULT_LEVEL( senf::log::NOTICE ); + public: + typedef Server::ServerHandle::ClientSocketHandle ClientHandle; + + ~Client(); + + void stopClient(); + + protected: + + private: + Client(ClientHandle handle, std::string const & name); + + void clientData(ReadHelper::ptr helper); + + ClientHandle handle_; + std::string tail_; + SingleCommandParser parser_; + Executor executor_; + std::string name_; + + typedef boost::iostreams::stream fdostream; + fdostream out_; + + friend class Server; + }; }} ///////////////////////////////hh.e//////////////////////////////////////// -//#include "Server.cci" +#include "Server.cci" //#include "Server.ct" //#include "Server.cti" #endif