Utils/Console: Fix singleton instantiation order (ServerManager / Scheduler)
[senf.git] / Console / Server.cci
index 573773d..81aaf6d 100644 (file)
 ///////////////////////////////cci.p///////////////////////////////////////
 
 ///////////////////////////////////////////////////////////////////////////
-// senf::console::detail::NonblockingSocketSink
-
-prefix_ senf::console::detail::NonblockingSocketSink::NonblockingSocketSink(Client & client)
-    : client_ (client)
-{}
+// senf::console::detail::ServerManager
 
-prefix_ senf::console::Client & senf::console::detail::NonblockingSocketSink::client()
-    const
+prefix_ void senf::console::detail::ServerManager::add(ptr server)
 {
-    return client_;
+    instance().servers_.insert(server);
 }
 
-///////////////////////////////////////////////////////////////////////////
-// senf::console::Server
+prefix_ void senf::console::detail::ServerManager::remove(ptr server)
+{
+    instance().servers_.erase(instance().servers_.find(server));
+}
 
-prefix_ void senf::console::Server::name(std::string const & name)
+prefix_ senf::console::detail::ServerManager & senf::console::detail::ServerManager::instance()
 {
-    name_ = name;
+    static ServerManager manager;
+    return manager;
 }
 
 ///////////////////////////////////////////////////////////////////////////
-// senf::console::detail::ClientReader
+// senf::console::detail::NonblockingSocketSink
 
-prefix_ senf::console::detail::ClientReader::~ClientReader()
+prefix_ senf::console::detail::NonblockingSocketSink::NonblockingSocketSink(Client & client)
+    : client_ (client)
 {}
 
-prefix_ senf::console::Client & senf::console::detail::ClientReader::client()
+prefix_ senf::console::Client & senf::console::detail::NonblockingSocketSink::client()
     const
 {
     return client_;
 }
 
-prefix_ std::string senf::console::detail::ClientReader::promptString()
-    const
-{
-    return client().promptString();
-}
+///////////////////////////////////////////////////////////////////////////
+// senf::console::Server
 
-prefix_ senf::console::detail::ClientReader::ClientHandle senf::console::detail::ClientReader::handle()
-    const
+prefix_ senf::console::Server & senf::console::Server::name(std::string const & name)
 {
-    return client().handle();
+    name_ = name;
+    return *this;
 }
 
-prefix_ std::ostream & senf::console::detail::ClientReader::stream()
+prefix_ std::string const & senf::console::Server::name()
     const
 {
-    return client().stream();
+    return name_;
 }
 
-prefix_ void senf::console::detail::ClientReader::stopClient()
+prefix_ senf::console::DirectoryNode & senf::console::Server::root()
+    const
 {
-    client().stop();
+    return *root_;
 }
 
-prefix_ void senf::console::detail::ClientReader::handleInput(std::string const & input)
-    const
+prefix_ senf::console::Server & senf::console::Server::root(DirectoryNode & root)
 {
-    client().handleInput(input);
+    root_ = root.thisptr();
+    return *this;
 }
 
-prefix_ void senf::console::detail::ClientReader::disablePrompt()
+prefix_ senf::console::Server & senf::console::Server::mode(Mode m)
 {
-    v_disablePrompt();
+    mode_ = m;
+    return *this;
 }
 
-prefix_ void senf::console::detail::ClientReader::enablePrompt()
+prefix_ senf::console::Server::Mode senf::console::Server::mode()
+    const
 {
-    v_enablePrompt();
+    return mode_;
 }
 
-prefix_ void senf::console::detail::ClientReader::translate(std::string & data)
+prefix_ void senf::console::Server::stop()
 {
-    v_translate(data);
+    // commit suicide
+    detail::ServerManager::remove(boost::intrusive_ptr<Server>(this));
 }
 
-prefix_ senf::console::detail::ClientReader::ClientReader(Client & client)
-    : client_ (client)
-{}
-
 ///////////////////////////////////////////////////////////////////////////
 // senf::console::Client
 
 prefix_ senf::console::Client::~Client()
-{}
+{
+    stream() << std::flush;
+}
 
 prefix_ void senf::console::Client::stop()
 {
@@ -132,7 +130,19 @@ prefix_ std::string const & senf::console::Client::name()
 prefix_ std::string senf::console::Client::promptString()
     const
 {
-    return name_ + ":" + executor_.cwd().path() + "$ ";
+    return name_ + ":" + executor_.cwdPath() + "$ ";
+}
+
+prefix_ senf::console::DirectoryNode & senf::console::Client::root()
+    const
+{
+    return server_.root();
+}
+
+prefix_ senf::console::Server::Mode senf::console::Client::mode()
+    const
+{
+    return mode_;
 }
 
 prefix_ senf::console::Client & senf::console::Client::get(std::ostream & os)
@@ -151,6 +161,67 @@ prefix_ std::ostream & senf::console::Client::stream()
     return out_t::member;
 }
 
+///////////////////////////////////////////////////////////////////////////
+// senf::console::detail::ClientReader
+
+prefix_ senf::console::detail::ClientReader::~ClientReader()
+{}
+
+prefix_ senf::console::Client & senf::console::detail::ClientReader::client()
+    const
+{
+    return client_;
+}
+
+prefix_ std::string senf::console::detail::ClientReader::promptString()
+    const
+{
+    return client().promptString();
+}
+
+prefix_ senf::console::detail::ClientReader::ClientHandle senf::console::detail::ClientReader::handle()
+    const
+{
+    return client().handle();
+}
+
+prefix_ std::ostream & senf::console::detail::ClientReader::stream()
+    const
+{
+    return client().stream();
+}
+
+prefix_ void senf::console::detail::ClientReader::stopClient()
+{
+    client().stop();
+}
+
+prefix_ std::string::size_type
+senf::console::detail::ClientReader::handleInput(std::string const & input, bool incremental)
+    const
+{
+    return client().handleInput(input, incremental);
+}
+
+prefix_ void senf::console::detail::ClientReader::disablePrompt()
+{
+    v_disablePrompt();
+}
+
+prefix_ void senf::console::detail::ClientReader::enablePrompt()
+{
+    v_enablePrompt();
+}
+
+prefix_ void senf::console::detail::ClientReader::translate(std::string & data)
+{
+    v_translate(data);
+}
+
+prefix_ senf::console::detail::ClientReader::ClientReader(Client & client)
+    : client_ (client)
+{}
+
 ///////////////////////////////cci.e///////////////////////////////////////
 #undef prefix_