X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Utils%2FTermlib%2FTelnetTerminal.cc;h=2699f9caf583019a48fb7b7404168b8281e4d88c;hb=8d0f36a502bf65b88b5225ffaba25e5d4488df4d;hp=1c244ba3f705d5d7f09bdfe56994aad8f0b5f153;hpb=4004cfae8ca0e03a40385560e14bba730a801464;p=senf.git diff --git a/Utils/Termlib/TelnetTerminal.cc b/Utils/Termlib/TelnetTerminal.cc index 1c244ba..2699f9c 100644 --- a/Utils/Termlib/TelnetTerminal.cc +++ b/Utils/Termlib/TelnetTerminal.cc @@ -27,55 +27,95 @@ //#include "TelnetTerminal.ih" // Custom includes -#include //#include "TelnetTerminal.mpp" #define prefix_ ///////////////////////////////cc.p//////////////////////////////////////// prefix_ senf::term::TelnetTerminal::TelnetTerminal() - : keyTimeout_ (senf::ClockService::milliseconds(DEFAULT_KEY_TIMEOUT_MS)), - timer_ ("senf::term::TelnetTerminal::keySequenceTimeout", - senf::membind(&TelnetTerminal::keySequenceTimeout, this)) + : setupFailed_ (false) { requestPeerOption(telnetopt::SUPPRESS_GO_AHEAD); requestLocalOption(telnetopt::SUPPRESS_GO_AHEAD); requestLocalOption(telnetopt::ECHO); } -prefix_ void senf::term::TelnetTerminal::v_setupComplete() +prefix_ void senf::term::TelnetTerminal::setCallbacks(AbstractTerminal::Callbacks & cb) +{ + callbacks_ = &cb; +} + +prefix_ std::string senf::term::TelnetTerminal::terminalType() +{ + return telnethandler::TerminalType::terminalType(); +} + +prefix_ unsigned senf::term::TelnetTerminal::width() +{ + return telnethandler::NAWS::width(); +} + +prefix_ unsigned senf::term::TelnetTerminal::height() { - tifo_.load(terminalType()); - keyParser_.load(tifo_); + return telnethandler::NAWS::height(); } -prefix_ void senf::term::TelnetTerminal::v_charReceived(char c) +prefix_ void senf::term::TelnetTerminal::write(char ch) { - inputBuffer_ += c; - timer_.timeout(senf::scheduler::eventTime() + keyTimeout_); - processKeys(); + BaseTelnetProtocol::write(ch); } -prefix_ void senf::term::TelnetTerminal::keySequenceTimeout() +prefix_ void senf::term::TelnetTerminal::v_setupComplete() { - while (!inputBuffer_.empty()) { - processKeys(); - v_keyReceived(keycode_t(inputBuffer_[0])); - inputBuffer_.erase(0, 1); + bool init (true); + + if (setupFailed_) + v_setupFailed(); + else if (! (width() > 0 + && ! terminalType().empty() + && localOption(telnetopt::SUPPRESS_GO_AHEAD) + && peerOption(telnetopt::SUPPRESS_GO_AHEAD) + && localOption(telnetopt::ECHO) + && (init = callbacks_->cb_init()))) { + + SENF_LOG_BLOCK((senf::log::NOTICE)({ + log << "TelnetTerminal setup failed:\n"; + if (width() <= 0) + log << " missing telnet client NAWS support\n"; + if (terminalType().empty()) + log << " missing telnet client TERMINAL_TYPE support\n"; + if (! localOption(telnetopt::SUPPRESS_GO_AHEAD) || + ! peerOption(telnetopt::SUPPRESS_GO_AHEAD)) + log << " missing telnet clinet SGO support\n"; + if (! localOption(telnetopt::ECHO)) + log << " missing telnet client ECHO support\n"; + if (! init) + log << " terminal initialization (cb_init) failed\n"; + })); + + setupFailed_ = true; + requestPeerOption(telnetopt::SUPPRESS_GO_AHEAD, false); + requestLocalOption(telnetopt::SUPPRESS_GO_AHEAD, false); + requestLocalOption(telnetopt::ECHO, false); + requestPeerOption(telnetopt::TERMINAL_TYPE, false); + requestPeerOption(telnetopt::NAWS, false); + if (! requestsPending()) + v_setupFailed(); } + else + SENF_LOG((senf::log::NOTICE)( + "Initialized TelnetTerminal: TERM=" << terminalType() + << ", size=" << width() << "x" << height())); +} + +prefix_ void senf::term::TelnetTerminal::v_charReceived(char ch) +{ + callbacks_->cb_charReceived(ch); } -prefix_ void senf::term::TelnetTerminal::processKeys() +prefix_ void senf::term::TelnetTerminal::v_windowSizeChanged() { - do { - std::pair result - (keyParser_.lookup(inputBuffer_)); - if (result.first == senf::term::KeyParser::Incomplete) - return; - v_keyReceived(result.first); - inputBuffer_.erase(0, result.second); - } while (! inputBuffer_.empty()); - timer_.disable(); + callbacks_->cb_windowSizeChanged(); } ///////////////////////////////cc.e////////////////////////////////////////