X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Utils%2FTermlib%2FtelnetServer.cc;h=c9aeb7f4e4bfa2be74115a48ae5e26f7bfecb5dd;hb=c45c112ae88196ea8da9c5a9efb0e167196744d2;hp=a02711f75bc648c65a3102dabe263e0791f1feb6;hpb=844c117cb04bc73a5b920c2c49efbf14515da3e2;p=senf.git diff --git a/Utils/Termlib/telnetServer.cc b/Utils/Termlib/telnetServer.cc index a02711f..c9aeb7f 100644 --- a/Utils/Termlib/telnetServer.cc +++ b/Utils/Termlib/telnetServer.cc @@ -28,6 +28,7 @@ // Custom includes #include +#include "../../Utils/membind.hh" #include "../../Scheduler/Scheduler.hh" #include "../Logger.hh" #include "../../Socket/Protocols/INet.hh" @@ -39,65 +40,54 @@ ///////////////////////////////cc.p//////////////////////////////////////// namespace { - - class MyEditor - : public senf::term::BaseEditor + + class MyTelnet + : public senf::term::TelnetTerminal { public: - MyEditor(senf::term::AbstractTerminal & terminal) - : BaseEditor(terminal) {} + explicit MyTelnet(Handle handle) + : senf::term::BaseTelnetProtocol (handle), + editor_ (*this, senf::membind(&MyTelnet::executeLine, this)) + { + editor_.prompt("myTelnet-with-an-endlesssly-long-prompt$"); + editor_.defineKey(senf::term::KeyParser::Ctrl('D'), + senf::membind(&MyTelnet::deleteCharOrExit, this)); + } - private: - virtual void v_keyReceived(keycode_t key) + void deleteCharOrExit(senf::term::LineEditor & editor) { - SENF_LOG(("Key " << senf::term::KeyParser::describe(key))); - if (key >= ' ' && key < 256) - insertChar(key); + if (editor.text().empty()) { + exit(); + } else - switch (key) { - case '\r': - newline(); - break; - case senf::term::KeyParser::Left: - { - unsigned c (currentColumn()); - if (c > 0) - toColumn(c-1); - break; - } - case senf::term::KeyParser::Backspace: - { - unsigned c (currentColumn()); - if (c > 0) { - toColumn(c-1); - deleteChar(); - } - break; - } - case senf::term::KeyParser::Delete: - deleteChar(); - break; - } + senf::term::bindings::deleteChar(editor); } - }; + void exit() + { + handle().facet().shutdown(senf::TCPSocketProtocol::ShutRD); + } + + virtual void v_setupFailed() + { + SENF_LOG(("Terminal setup failed")); + exit(); + } - class MyTelnet - : public senf::term::TelnetTerminal - { - public: - explicit MyTelnet(Handle handle) - : senf::term::BaseTelnetProtocol(handle), - editor_(*this) {} - virtual void v_eof() { SENF_LOG(("EOF")); delete this; } + void executeLine(std::string const & text) + { + SENF_LOG(("Execute line: " << text)); + editor_.show(); + } + private: - MyEditor editor_; + senf::term::LineEditor editor_; }; typedef senf::TCPv4ServerSocketHandle ServerHandle; @@ -111,7 +101,15 @@ namespace { } ClientHandle client (handle.accept()); SENF_LOG(("new client ...")); - new MyTelnet (client); + try { + new MyTelnet (client); + } + catch (std::exception & ex) { + SENF_LOG(("Client open failed: " << ex.what())); + } + catch (...) { + SENF_LOG(("Client open failed: unknown exception")); + } } }