// Custom includes
#include <boost/bind.hpp>
+#include "../../Utils/membind.hh"
#include "../../Scheduler/Scheduler.hh"
#include "../Logger.hh"
#include "../../Socket/Protocols/INet.hh"
///////////////////////////////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<senf::TCPSocketProtocol>().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;
}
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"));
+ }
}
}