//#include "TelnetTerminal.ih"
// Custom includes
-#include <senf/Utils/membind.hh>
//#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<senf::term::KeyParser::keycode_t, std::string::size_type> 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////////////////////////////////////////