public:
///////////////////////////////////////////////////////////////////////////
// Types
-
- typedef senf::ServerSocketHandle<
- senf::MakeSocketPolicy< senf::TCPv4SocketProtocol::Policy,
- senf::UnspecifiedAddressingPolicy>::policy > ServerHandle;
+
+ typedef detail::ServerHandle ServerHandle;
~Server();
///< 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); ///< Set server name
+ Server & name(std::string const & name); ///< Set server name
/**< This information is used in the prompt string. */
-
+
+ void stop(); ///< Stop the server
+ /**< All clients will be closed */
+
protected:
private:
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
*/
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(); ///< Stop the client
+ void stop(); ///< Stop the client
/**< This will close the client socket. */
+ std::string const & name() const;
+ ClientHandle handle() const;
+ std::ostream & stream();
+ std::string promptString() const;
+
+ static Client & get(std::ostream & os);
+
protected:
private:
Client(Server & server, ClientHandle handle, std::string const & name);
- void clientData(ReadHelper<ClientHandle>::ptr helper);
- void showPrompt();
-
+ void translate(std::string & data);
+ void handleInput(std::string input);
virtual void v_write(boost::posix_time::ptime timestamp, std::string const & stream,
std::string const & area, unsigned level,
std::string const & message);
Server & server_;
ClientHandle handle_;
- std::string tail_;
CommandParser parser_;
Executor executor_;
std::string name_;
- unsigned promptLen_;
std::string lastCommand_;
+ boost::scoped_ptr<detail::ClientReader> reader_;
friend class Server;
+ friend class detail::ClientReader;
+ friend class detail::NonblockingSocketSink;
};
}}