X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Utils%2FTermlib%2FTelnetTerminal.cc;h=5e08938e99af4d45606ac7f57765658454b85e9e;hb=50175e39d2cbad018fe9761c9ed483d2a73c0352;hp=1c244ba3f705d5d7f09bdfe56994aad8f0b5f153;hpb=4004cfae8ca0e03a40385560e14bba730a801464;p=senf.git diff --git a/Utils/Termlib/TelnetTerminal.cc b/Utils/Termlib/TelnetTerminal.cc index 1c244ba..5e08938 100644 --- a/Utils/Termlib/TelnetTerminal.cc +++ b/Utils/Termlib/TelnetTerminal.cc @@ -27,55 +27,73 @@ //#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() { - tifo_.load(terminalType()); - keyParser_.load(tifo_); + return telnethandler::NAWS::width(); } -prefix_ void senf::term::TelnetTerminal::v_charReceived(char c) +prefix_ unsigned senf::term::TelnetTerminal::height() { - inputBuffer_ += c; - timer_.timeout(senf::scheduler::eventTime() + keyTimeout_); - processKeys(); + return telnethandler::NAWS::height(); } -prefix_ void senf::term::TelnetTerminal::keySequenceTimeout() +prefix_ void senf::term::TelnetTerminal::write(char ch) { - while (!inputBuffer_.empty()) { - processKeys(); - v_keyReceived(keycode_t(inputBuffer_[0])); - inputBuffer_.erase(0, 1); + BaseTelnetProtocol::write(ch); +} + +prefix_ void senf::term::TelnetTerminal::v_setupComplete() +{ + if (setupFailed_) + v_setupFailed(); + else if (! (width() > 0 + && ! terminalType().empty() + && localOption(telnetopt::SUPPRESS_GO_AHEAD) + && peerOption(telnetopt::SUPPRESS_GO_AHEAD) + && localOption(telnetopt::ECHO) + && callbacks_->cb_init())) { + 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(); } } -prefix_ void senf::term::TelnetTerminal::processKeys() +prefix_ void senf::term::TelnetTerminal::v_charReceived(char ch) +{ + callbacks_->cb_charReceived(ch); +} + +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////////////////////////////////////////