Socket/Protocols/INet: Add 'shutdown' member to TCPSocketProtocol
[senf.git] / Console / Server.hh
index 3b7a93e..7a8b831 100644 (file)
@@ -63,6 +63,10 @@ namespace console {
             our own little host-name cache. When the name is not found, we ask the resolver to
             resolve it and call 'resume' when the name is found. Since it is in the cache now, the
             command will now complete.
+        
+        \implementation We do \e not provide an \c instance() member so we can easily later extend
+            the server to allow registering more than one instance, e.g. with each instance on a
+            differently firewalled port and with different security restrictions.
       */
     class Server
         : boost::noncopyable
@@ -72,10 +76,8 @@ namespace console {
     public:
         ///////////////////////////////////////////////////////////////////////////
         // Types
-
-        typedef senf::ServerSocketHandle<
-            senf::MakeSocketPolicy< senf::TCPv4SocketProtocol::Policy, 
-                                    senf::UnspecifiedAddressingPolicy>::policy > ServerHandle;
+        
+        typedef detail::ServerHandle ServerHandle;
 
         ~Server();
 
@@ -83,8 +85,6 @@ namespace console {
                                         ///< Start server on given IPv4 address/port
         static Server & start(senf::INet6SocketAddress const & address);
                                         ///< Start server on given IPv6 address/port
-        static Server & instance();
-
         void name(std::string const & name); ///< Set server name
                                         /**< This information is used in the prompt string. */
 
@@ -93,7 +93,7 @@ namespace console {
     private:
         Server(ServerHandle handle);
 
-        static void start(ServerHandle handle);
+        static Server & start(ServerHandle handle);
         static boost::scoped_ptr<Server> & instancePtr();
 
         void newClient(Scheduler::EventId event);
@@ -126,35 +126,40 @@ namespace console {
 
         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. */
 
     protected:
         
     private:
-        Client(ClientHandle handle, std::string const & name);
+        Client(Server & server, ClientHandle handle, std::string const & name);
+
+        std::string promptString() const;
+        ClientHandle handle() const;
+        detail::NonblockingSocketOStream & stream();
 
-        void clientData(ReadHelper<ClientHandle>::ptr helper);
-        void showPrompt();
+        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;
     };
 
 }}