Server logs client address
[senf.git] / Console / Server.cc
index 13820cf..ac9f034 100644 (file)
@@ -27,7 +27,6 @@
 #include "Server.ih"
 
 // Custom includes
-#include <unistd.h>
 #include <iostream>
 #include <boost/algorithm/string/trim.hpp>
 #include <boost/iostreams/device/file_descriptor.hpp>
@@ -36,6 +35,7 @@
 #include "../Utils/senfassert.hh"
 #include "../Utils/membind.hh"
 #include "../Utils/Logger/SenfLog.hh"
+#include "Readline.hh"
 
 //#include "Server.mpp"
 #define prefix_
@@ -48,8 +48,11 @@ prefix_ std::streamsize senf::console::detail::NonblockingSocketSink::write(cons
                                                                             std::streamsize n)
 {
     try {
-        if (handle_.writeable()) 
-            handle_.write(s, s+n);
+        if (client_.handle().writeable()) {
+            std::string data (s, n);
+            client_.translate(data);
+            client_.handle().write( data );
+        }
     }
     catch (SystemException & ex) {
         ;
@@ -163,7 +166,8 @@ prefix_ void senf::console::detail::DumbClientReader::showPrompt()
 {
     std::string prompt (promptString());
 
-    stream() << prompt << std::flush;
+    stream() << std::flush;
+    handle().write(prompt);
     promptLen_ = prompt.size();
     promptActive_ = true;
 }
@@ -182,25 +186,25 @@ prefix_ void senf::console::detail::DumbClientReader::v_enablePrompt()
         showPrompt();
 }
 
+prefix_ void senf::console::detail::DumbClientReader::v_translate(std::string & data)
+{}
+
 ///////////////////////////////////////////////////////////////////////////
 // senf::console::Client
 
 prefix_ senf::console::Client::Client(Server & server, ClientHandle handle,
                                       std::string const & name)
-    : out_t(handle), senf::log::IOStreamTarget(out_t::member), server_ (server),
-      handle_ (handle), name_ (name), reader_ (0)
+    : out_t(boost::ref(*this)), senf::log::IOStreamTarget(out_t::member), server_ (server),
+      handle_ (handle), name_ (name), reader_ (new detail::SafeReadlineClientReader (*this))
 {
-    reader_.reset( new detail::DumbClientReader (*this) );
-    route< senf::SenfLog, senf::log::NOTICE >();
+    executor_.autocd(true).autocomplete(true);
+    handle_.facet<senf::TCPSocketProtocol>().nodelay();
+    // route< senf::SenfLog, senf::log::NOTICE >();
 }
 
-prefix_ senf::console::Client::~Client()
-{}
-
-prefix_ void senf::console::Client::stop()
+prefix_ void senf::console::Client::translate(std::string & data)
 {
-    // THIS COMMITS SUICIDE. THE INSTANCE IS GONE AFTER removeClient RETURNS
-    server_.removeClient(*this);
+    reader_->translate(data);
 }
 
 prefix_ void senf::console::Client::handleInput(std::string data)
@@ -239,9 +243,28 @@ prefix_ void senf::console::Client::v_write(boost::posix_time::ptime timestamp,
 {
     reader_->disablePrompt();
     IOStreamTarget::v_write(timestamp, stream, area, level, message);
+    out_t::member << std::flush;
     reader_->enablePrompt();
 }
 
+prefix_ std::ostream & senf::console::operator<<(std::ostream & os, Client const & client)
+{
+    //    typedef senf::ClientSocketHandle<MakeSocketPolicy<INet4AddressingPolicy>::policy > v4Socket;
+    if( senf::check_socket_cast<TCPv4ServerSocketHandle::ClientSocketHandle>( client.handle())) {
+        os<<senf::dynamic_socket_cast<TCPv4ServerSocketHandle::ClientSocketHandle>( client.handle()).peer();
+    }
+    else if( senf::check_socket_cast<TCPv6ServerSocketHandle::ClientSocketHandle>( client.handle())) {
+        os<<senf::dynamic_socket_cast<TCPv6ServerSocketHandle::ClientSocketHandle>( client.handle()).peer();
+    }
+    else{
+        os<<((void *)&client);
+    }
+    return os;
+}
+prefix_ std::ostream & senf::console::operator<<(std::ostream & os, Client * client)
+{
+    return os<<*client;
+}
 ///////////////////////////////cc.e////////////////////////////////////////
 #undef prefix_
 //#include "Server.mpp"