X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Console%2FServer.cc;h=ac9f034c693a644d01ded11c9141dbc4163cb7aa;hb=489be2bbd4d03259a17df14e4962a4524cd5b654;hp=13820cffbbc0fd5a4902805cf276b7404ced6840;hpb=6e417a227d417cef20d55af94e2474fbe9c280b8;p=senf.git diff --git a/Console/Server.cc b/Console/Server.cc index 13820cf..ac9f034 100644 --- a/Console/Server.cc +++ b/Console/Server.cc @@ -27,7 +27,6 @@ #include "Server.ih" // Custom includes -#include #include #include #include @@ -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().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::policy > v4Socket; + if( senf::check_socket_cast( client.handle())) { + os<( client.handle()).peer(); + } + else if( senf::check_socket_cast( client.handle())) { + os<( 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"