X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Utils%2FTermlib%2FtelnetServer.cc;h=c9aeb7f4e4bfa2be74115a48ae5e26f7bfecb5dd;hb=a726ae0cb14d0ce37e5aab3c4e07121bbbd3b31c;hp=da4c15a3f4c299c7f7c4314cd2fcf990708a5d76;hpb=4004cfae8ca0e03a40385560e14bba730a801464;p=senf.git diff --git a/Utils/Termlib/telnetServer.cc b/Utils/Termlib/telnetServer.cc index da4c15a..c9aeb7f 100644 --- a/Utils/Termlib/telnetServer.cc +++ b/Utils/Termlib/telnetServer.cc @@ -28,26 +28,50 @@ // Custom includes #include -#include "TelnetTerminal.hh" +#include "../../Utils/membind.hh" #include "../../Scheduler/Scheduler.hh" #include "../Logger.hh" #include "../../Socket/Protocols/INet.hh" +#include "TelnetTerminal.hh" +#include "Editor.hh" //#include "telnetServer.mpp" #define prefix_ ///////////////////////////////cc.p//////////////////////////////////////// namespace { - - class MyTelnet : public senf::term::TelnetTerminal + + class MyTelnet + : public senf::term::TelnetTerminal { public: - explicit MyTelnet(Handle handle) : senf::term::BaseTelnetProtocol(handle) {} - - private: - virtual void v_keyReceived(keycode_t key) + 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)); + } + + void deleteCharOrExit(senf::term::LineEditor & editor) + { + if (editor.text().empty()) { + exit(); + } + else + senf::term::bindings::deleteChar(editor); + } + + void exit() { - SENF_LOG(("Key " << senf::term::KeyParser::describe(key))); + handle().facet().shutdown(senf::TCPSocketProtocol::ShutRD); + } + + virtual void v_setupFailed() + { + SENF_LOG(("Terminal setup failed")); + exit(); } virtual void v_eof() @@ -56,17 +80,14 @@ namespace { delete this; } - virtual void v_setupComplete() + void executeLine(std::string const & text) { - TelnetTerminal::v_setupComplete(); - SENF_LOG(("Terminal type is '" << terminalType() << "', window size is " - << width() << "x" << height())); + SENF_LOG(("Execute line: " << text)); + editor_.show(); } - virtual void v_windowSizeChanged() - { - SENF_LOG(("New window size: " << width() << "x" << height())); - } + private: + senf::term::LineEditor editor_; }; typedef senf::TCPv4ServerSocketHandle ServerHandle; @@ -80,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")); + } } }