From 9c24eddf62f97f354c9715388e18859492f13e40 Mon Sep 17 00:00:00 2001 From: Kenny Root Date: Wed, 24 Jun 2009 19:18:35 +0000 Subject: Add in CHARSET (RFC 2066) support to Telnet transport git-svn-id: https://connectbot.googlecode.com/svn/trunk/connectbot@329 df292f66-193f-0410-a5fc-6d59da041ff2 --- src/de/mud/telnet/TelnetProtocolHandler.java | 31 ++++++++++++++++++++++++++ src/org/connectbot/service/Relay.java | 4 ++++ src/org/connectbot/service/TerminalBridge.java | 8 +++++++ src/org/connectbot/transport/Telnet.java | 10 +++++++++ 4 files changed, 53 insertions(+) (limited to 'src') diff --git a/src/de/mud/telnet/TelnetProtocolHandler.java b/src/de/mud/telnet/TelnetProtocolHandler.java index fd4d034..74f08bb 100644 --- a/src/de/mud/telnet/TelnetProtocolHandler.java +++ b/src/de/mud/telnet/TelnetProtocolHandler.java @@ -91,6 +91,11 @@ public abstract class TelnetProtocolHandler { */ protected abstract void write(byte[] b) throws IOException; + /** + * Read the charset name from terminal. + */ + protected abstract String getCharsetName(); + /** * Send one byte to the remote host. * @param b the byte to be sent @@ -167,6 +172,8 @@ public abstract class TelnetProtocolHandler { private final static byte TELOPT_NAWS = (byte)31; /* NA-WindowSize*/ /** Telnet option: Terminal Type */ private final static byte TELOPT_TTYPE = (byte)24; /* terminal type */ + /** Telnet option: CHARSET */ + private final static byte TELOPT_CHARSET= (byte)42; /* charset */ private final static byte[] IACWILL = { IAC, WILL }; private final static byte[] IACWONT = { IAC, WONT }; @@ -175,6 +182,9 @@ public abstract class TelnetProtocolHandler { private final static byte[] IACSB = { IAC, SB }; private final static byte[] IACSE = { IAC, SE }; + private final static byte CHARSET_ACCEPTED = (byte)2; + private final static byte CHARSET_REJECTED = (byte)3; + /** Telnet option qualifier 'IS' */ private final static byte TELQUAL_IS = (byte)0; /** Telnet option qualifier 'SEND' */ @@ -242,7 +252,28 @@ public abstract class TelnetProtocolHandler { write(ttype.getBytes()); write(IACSE); } + break; + case TELOPT_CHARSET: + System.out.println("Got SB CHARSET"); + String charsetStr = new String(sbdata, "US-ASCII"); + if (charsetStr.startsWith("TTABLE ")) { + charsetStr = charsetStr.substring(7); + } + String[] charsets = charsetStr.split(charsetStr.substring(0,0)); + String myCharset = getCharsetName(); + for (String charset : charsets) { + if (charset.equals(myCharset)) { + write(IACSB);write(TELOPT_CHARSET);write(CHARSET_ACCEPTED); + write(charset.getBytes()); + write(IACSE); + System.out.println("Sent our charset!"); + return; + } + } + write(IACSB);write(TELOPT_CHARSET);write(CHARSET_REJECTED); + write(IACSE); + break; } } diff --git a/src/org/connectbot/service/Relay.java b/src/org/connectbot/service/Relay.java index 8cf9bf9..746a915 100644 --- a/src/org/connectbot/service/Relay.java +++ b/src/org/connectbot/service/Relay.java @@ -84,6 +84,10 @@ public class Relay implements Runnable { } } + public Charset getCharset() { + return currentCharset; + } + public void run() { byteBuffer = ByteBuffer.allocate(BUFFER_SIZE); charBuffer = CharBuffer.allocate(BUFFER_SIZE); diff --git a/src/org/connectbot/service/TerminalBridge.java b/src/org/connectbot/service/TerminalBridge.java index 28fd821..b0d4dbe 100644 --- a/src/org/connectbot/service/TerminalBridge.java +++ b/src/org/connectbot/service/TerminalBridge.java @@ -19,6 +19,7 @@ package org.connectbot.service; import java.io.IOException; +import java.nio.charset.Charset; import java.util.LinkedList; import java.util.List; @@ -303,6 +304,13 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener { return responses; } + /** + * @return charset in use by bridge + */ + public Charset getCharset() { + return relay.getCharset(); + } + /** * Sets the encoding used by the terminal. If the connection is live, * then the character set is changed for the next read. diff --git a/src/org/connectbot/transport/Telnet.java b/src/org/connectbot/transport/Telnet.java index 681da45..05f31b6 100644 --- a/src/org/connectbot/transport/Telnet.java +++ b/src/org/connectbot/transport/Telnet.java @@ -24,6 +24,7 @@ import java.io.OutputStream; import java.net.Socket; import java.net.SocketException; import java.net.UnknownHostException; +import java.nio.charset.Charset; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -98,6 +99,15 @@ public class Telnet extends AbsTransport { @Override public void notifyEndOfRecord() { } + + @Override + protected String getCharsetName() { + Charset charset = bridge.getCharset(); + if (charset != null) + return charset.name(); + else + return ""; + } }; } -- cgit v1.2.3