From e80b62240a15cad49f8b8286c16e9ca43d7040ca Mon Sep 17 00:00:00 2001 From: Anna Dushistova Date: Wed, 22 Apr 2009 20:56:21 +0000 Subject: [PATCH] [267474] added window size option handling. --- .../META-INF/MANIFEST.MF | 2 +- .../telnet/terminal/TelnetTerminalShell.java | 31 ++++++++++++++----- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/rse/plugins/org.eclipse.rse.services.telnet/META-INF/MANIFEST.MF b/rse/plugins/org.eclipse.rse.services.telnet/META-INF/MANIFEST.MF index 537e38291ae..e77028e22d5 100644 --- a/rse/plugins/org.eclipse.rse.services.telnet/META-INF/MANIFEST.MF +++ b/rse/plugins/org.eclipse.rse.services.telnet/META-INF/MANIFEST.MF @@ -7,7 +7,7 @@ Bundle-Activator: org.eclipse.rse.internal.services.telnet.Activator Bundle-Localization: plugin Require-Bundle: org.eclipse.core.runtime, org.eclipse.rse.services;bundle-version="[3.1.0,4.0.0)", - org.apache.commons.net;bundle-version="[1.4.1,3.0.0)" + org.apache.commons.net;bundle-version="[2.0.0,3.0.0)" Export-Package: org.eclipse.rse.internal.services.telnet;x-friends:="org.eclipse.rse.connectorservice.telnet,org.eclipse.rse.subsystems.shells.telnet", org.eclipse.rse.internal.services.telnet.terminal;x-friends:="org.eclipse.rse.subsystems.shells.telnet" Bundle-ActivationPolicy: lazy diff --git a/rse/plugins/org.eclipse.rse.services.telnet/src/org/eclipse/rse/internal/services/telnet/terminal/TelnetTerminalShell.java b/rse/plugins/org.eclipse.rse.services.telnet/src/org/eclipse/rse/internal/services/telnet/terminal/TelnetTerminalShell.java index 2cf42c98814..455b392feee 100644 --- a/rse/plugins/org.eclipse.rse.services.telnet/src/org/eclipse/rse/internal/services/telnet/terminal/TelnetTerminalShell.java +++ b/rse/plugins/org.eclipse.rse.services.telnet/src/org/eclipse/rse/internal/services/telnet/terminal/TelnetTerminalShell.java @@ -11,6 +11,7 @@ * Martin Oberhuber (Wind River) - [227320] Fix endless loop in TelnetTerminalShell * Anna Dushistova (MontaVista) - [240523] [rseterminals] Provide a generic adapter factory that adapts any ITerminalService to an IShellService * Martin Oberhuber (Wind River) - [267402] [telnet] "launch shell" takes forever + * Anna Dushistova (MontaVista) - [267474] [rseterminal][telnet] Notify the remote when terminal window size changes *******************************************************************************/ package org.eclipse.rse.internal.services.telnet.terminal; @@ -25,6 +26,8 @@ import java.io.Writer; import org.apache.commons.net.io.ToNetASCIIInputStream; import org.apache.commons.net.telnet.EchoOptionHandler; +import org.apache.commons.net.telnet.InvalidTelnetOptionException; +import org.apache.commons.net.telnet.WindowSizeOptionHandler; import org.apache.commons.net.telnet.SuppressGAOptionHandler; import org.apache.commons.net.telnet.TelnetClient; import org.apache.commons.net.telnet.TelnetOption; @@ -39,7 +42,7 @@ import org.eclipse.rse.services.terminals.ITerminalService; /** * A remote shell connection supporting Streams for I/O. - * + * * @since 2.0 */ public class TelnetTerminalShell extends AbstractTerminalShell { @@ -57,9 +60,9 @@ public class TelnetTerminalShell extends AbstractTerminalShell { /** * Construct a new Terminal connection. - * + * * The SSH channel is immediately connected in the Constructor. - * + * * @param sessionProvider * SSH session provider * @param ptyType @@ -96,13 +99,16 @@ public class TelnetTerminalShell extends AbstractTerminalShell { fTelnetClient = new TelnetClient(); } else { fTelnetClient = new TelnetClient(ptyType); - fTelnetClient.addOptionHandler(new TerminalTypeOptionHandler(ptyType, true, true, true, true)); + fTelnetClient.addOptionHandler(new TerminalTypeOptionHandler( + ptyType, true, true, true, true)); } // request remote echo, but accept local if desired fTelnetClient.addOptionHandler(new EchoOptionHandler(false, true, true, true)); fTelnetClient.addOptionHandler(new SuppressGAOptionHandler(true, true, true, true)); + fTelnetClient.addOptionHandler(new WindowSizeOptionHandler(fWidth, + fHeight, true, true, true, true)); fTelnetClient = fSessionProvider.loginTelnetClient(fTelnetClient, new NullProgressMonitor()); fOutputStream = fTelnetClient.getOutputStream(); @@ -147,7 +153,7 @@ public class TelnetTerminalShell extends AbstractTerminalShell { /** * Encode String with requested user encoding, in case it differs from * Platform default encoding. - * + * * @param s * String to encode * @param encoding @@ -171,7 +177,7 @@ public class TelnetTerminalShell extends AbstractTerminalShell { /* * (non-Javadoc) - * + * * @see ITerminalHostShell#getInputStream(Object) */ public InputStream getInputStream() { @@ -180,7 +186,7 @@ public class TelnetTerminalShell extends AbstractTerminalShell { /* * (non-Javadoc) - * + * * @see ITerminalHostShell#getOutputStream(Object) */ public OutputStream getOutputStream() { @@ -191,7 +197,7 @@ public class TelnetTerminalShell extends AbstractTerminalShell { * Write a command to the shell, honoring specified Encoding. Can only be * done before an outputStream is obtained, since these commands would * interfere with the outputStream. - * + * * @param command * Command String to send, or "#break" to send a Ctrl+C command. */ @@ -270,6 +276,15 @@ public class TelnetTerminalShell extends AbstractTerminalShell { && (newWidth != fWidth || newHeight != fHeight)) { // avoid excessive communications due to change size requests by // caching previous size + synchronized (fTelnetClient) { + try { + fTelnetClient.deleteOptionHandler(TelnetOption.WINDOW_SIZE); + fTelnetClient.addOptionHandler(new WindowSizeOptionHandler( + newWidth, newHeight, true, true, true, true)); + } catch (InvalidTelnetOptionException e) { + e.printStackTrace(); + } + } fWidth = newWidth; fHeight = newHeight; }