X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Console%2FServer.hh;h=7bca747032fa68d39656411f8868b5d61cfeb4b5;hb=2d5a1fd2cef2d84e16226a7336948f524fbb71c6;hp=bfce3039a3e33ca5317357de77b7599d0c5a7fc1;hpb=5e9e6057a4e5c1241ff3f1b75b0f797eb570725d;p=senf.git diff --git a/Console/Server.hh b/Console/Server.hh index bfce303..7bca747 100644 --- a/Console/Server.hh +++ b/Console/Server.hh @@ -31,8 +31,6 @@ #include #include #include -#include -#include #include "../Utils/intrusive_refcount.hh" #include "../Socket/Protocols/INet/TCPSocketHandle.hh" #include "../Socket/ServerSocketHandle.hh" @@ -41,8 +39,10 @@ #include "Parse.hh" #include "Executor.hh" #include "../Socket/Protocols/INet/INetAddressing.hh" +#include "../Utils/Logger.hh" //#include "Server.mpp" +#include "Server.ih" ///////////////////////////////hh.p//////////////////////////////////////// namespace senf { @@ -50,7 +50,12 @@ namespace console { class Client; - /** \brief + /** \brief Interactive console server + + This class provides an interactive console TCP server. + + \todo Add readline support + \todo Add interactivity detection using timeout */ class Server : boost::noncopyable @@ -68,9 +73,12 @@ namespace console { ~Server(); static Server & start(senf::INet4SocketAddress const & address); + ///< Start server on given IPv4 address/port static Server & start(senf::INet6SocketAddress const & address); + ///< Start server on given IPv6 address/port - void name(std::string const & name); + void name(std::string const & name); ///< Set server name + /**< This information is used in the prompt string. */ protected: @@ -93,11 +101,24 @@ namespace console { friend class Client; }; - /** \brief + /** \brief Server client instance + + Whenever a new client connects, a new instance of this class is created. This class shows a + command prompt, receives the commands, parses them and then passes (using a CommandParser) + and passes the commands to an Executor instance. + + \fixme Fix Client::clientData implementation + \fixme Don't register a new ReadHelper every round + \fixme Ensure, that output errors (or any errors) in the console don't terminate the + application */ class Client - : public senf::intrusive_refcount + : public senf::intrusive_refcount, + private boost::base_from_member< detail::NonblockingSocketOStream >, + public senf::log::IOStreamTarget { + typedef boost::base_from_member< detail::NonblockingSocketOStream > out_t; + SENF_LOG_CLASS_AREA(); SENF_LOG_DEFAULT_LEVEL( senf::log::NOTICE ); public: @@ -105,7 +126,8 @@ namespace console { ~Client(); - void stopClient(); + void stopClient(); ///< Stop the client + /**< This will close the client socket. */ protected: @@ -114,15 +136,18 @@ namespace console { void clientData(ReadHelper::ptr helper); void showPrompt(); + + virtual void v_write(boost::posix_time::ptime timestamp, std::string const & stream, + std::string const & area, unsigned level, + std::string const & message); ClientHandle handle_; std::string tail_; CommandParser parser_; Executor executor_; std::string name_; - - typedef boost::iostreams::stream fdostream; - fdostream out_; + unsigned promptLen_; + std::string lastCommand_; friend class Server; };