Fix Build-Depends in debian/control
[senf.git] / Utils / Termlib / TelnetTerminal.cc
index 6b28a4f..3445d5c 100644 (file)
@@ -33,6 +33,7 @@
 ///////////////////////////////cc.p////////////////////////////////////////
 
 prefix_ senf::term::TelnetTerminal::TelnetTerminal()
+    : setupFailed_ (false)
 {
     requestPeerOption(telnetopt::SUPPRESS_GO_AHEAD);
     requestLocalOption(telnetopt::SUPPRESS_GO_AHEAD);
@@ -66,7 +67,49 @@ prefix_ void senf::term::TelnetTerminal::write(char ch)
 
 prefix_ void senf::term::TelnetTerminal::v_setupComplete()
 {
-    callbacks_->cb_init();
+    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";
+            else
+                log << "    size=" << width() << "x" << height() << "\n";
+            if (terminalType().empty())
+                log << "    missing telnet client TERMINAL_TYPE support\n";
+            else
+                log << "    TERM=" << terminalType() << "\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)