From b1f8f94ff046f59958bb5af0534aab81d1d8d9d4 Mon Sep 17 00:00:00 2001 From: Kenny Root Date: Fri, 23 Jan 2009 14:19:46 +0000 Subject: Comply with RFC 4254 on window-change packet * Always send false for "want reply" * We don't need to wait since a reply should not be sent. * Allow the sending of (informational) pixel dimensions. --- lib/src/main/java/com/trilead/ssh2/Session.java | 23 ++++++++++++++++++++-- .../com/trilead/ssh2/channel/ChannelManager.java | 14 ++++--------- .../ssh2/packets/PacketSessionPtyResize.java | 14 +++++++------ 3 files changed, 33 insertions(+), 18 deletions(-) diff --git a/lib/src/main/java/com/trilead/ssh2/Session.java b/lib/src/main/java/com/trilead/ssh2/Session.java index c41d837..30efa6f 100644 --- a/lib/src/main/java/com/trilead/ssh2/Session.java +++ b/lib/src/main/java/com/trilead/ssh2/Session.java @@ -130,7 +130,26 @@ public class Session terminal_modes); } - public void resizePTY(int width, int height) throws IOException { + /** + * Inform other side of connection that our PTY has resized. + *

+ * Zero dimension parameters are ignored. The character/row dimensions + * override the pixel dimensions (when nonzero). Pixel dimensions refer to + * the drawable area of the window. The dimension parameters are only + * informational. + * + * @param term_width_characters + * terminal width, characters (e.g., 80) + * @param term_height_characters + * terminal height, rows (e.g., 24) + * @param term_width_pixels + * terminal width, pixels (e.g., 640) + * @param term_height_pixels + * terminal height, pixels (e.g., 480) + * @throws IOException + */ + public void resizePTY(int term_width_characters, int term_height_characters, int term_width_pixels, + int term_height_pixels) throws IOException { synchronized (this) { /* The following is just a nicer error, we would catch it anyway later in the channel code */ @@ -138,7 +157,7 @@ public class Session throw new IOException("This session is closed."); } - cm.resizePTY(cn, width, height); + cm.resizePTY(cn, term_width_characters, term_height_characters, term_width_pixels, term_height_pixels); } /** diff --git a/lib/src/main/java/com/trilead/ssh2/channel/ChannelManager.java b/lib/src/main/java/com/trilead/ssh2/channel/ChannelManager.java index e582a52..fb4beae 100644 --- a/lib/src/main/java/com/trilead/ssh2/channel/ChannelManager.java +++ b/lib/src/main/java/com/trilead/ssh2/channel/ChannelManager.java @@ -678,7 +678,8 @@ public class ChannelManager implements MessageHandler } - public void resizePTY(Channel c, int width, int height) throws IOException { + public void resizePTY(Channel c, int term_width_characters, int term_height_characters, + int term_width_pixels, int term_height_pixels) throws IOException { PacketSessionPtyResize spr; synchronized (c) { @@ -686,7 +687,8 @@ public class ChannelManager implements MessageHandler throw new IOException("Cannot request PTY on this channel (" + c.getReasonClosed() + ")"); - spr = new PacketSessionPtyResize(c.remoteID, true, width, height); + spr = new PacketSessionPtyResize(c.remoteID, term_width_characters, term_height_characters, + term_width_pixels, term_height_pixels); c.successCounter = c.failedCounter = 0; } @@ -696,14 +698,6 @@ public class ChannelManager implements MessageHandler + c.getReasonClosed() + ")"); tm.sendMessage(spr.getPayload()); } - - try { - //waitForChannelSuccessOrFailure(c); - this.waitForChannelRequestResult(c); - } catch (IOException e) { - throw (IOException) new IOException("PTY request failed") - .initCause(e); - } } diff --git a/lib/src/main/java/com/trilead/ssh2/packets/PacketSessionPtyResize.java b/lib/src/main/java/com/trilead/ssh2/packets/PacketSessionPtyResize.java index 27b5f00..1e3b558 100644 --- a/lib/src/main/java/com/trilead/ssh2/packets/PacketSessionPtyResize.java +++ b/lib/src/main/java/com/trilead/ssh2/packets/PacketSessionPtyResize.java @@ -4,15 +4,17 @@ public class PacketSessionPtyResize { byte[] payload; public int recipientChannelID; - public boolean wantReply; public int width; public int height; + public int pixelWidth; + public int pixelHeight; - public PacketSessionPtyResize(int recipientChannelID, boolean wantReply, int width, int height) { + public PacketSessionPtyResize(int recipientChannelID, int width, int height, int pixelWidth, int pixelHeight) { this.recipientChannelID = recipientChannelID; - this.wantReply = wantReply; this.width = width; this.height = height; + this.pixelWidth = pixelWidth; + this.pixelHeight = pixelHeight; } public byte[] getPayload() @@ -23,11 +25,11 @@ public class PacketSessionPtyResize { tw.writeByte(Packets.SSH_MSG_CHANNEL_REQUEST); tw.writeUINT32(recipientChannelID); tw.writeString("window-change"); - tw.writeBoolean(wantReply); + tw.writeBoolean(false); tw.writeUINT32(width); tw.writeUINT32(height); - tw.writeUINT32(0); - tw.writeUINT32(0); + tw.writeUINT32(pixelWidth); + tw.writeUINT32(pixelHeight); payload = tw.getBytes(); } -- cgit v1.2.3