diff options
author | Kenny Root <kenny@the-b.org> | 2009-06-24 19:18:35 +0000 |
---|---|---|
committer | Kenny Root <kenny@the-b.org> | 2009-06-24 19:18:35 +0000 |
commit | 9c24eddf62f97f354c9715388e18859492f13e40 (patch) | |
tree | 8ba6d7048226655bae8964e469f43683f3047fb5 /src | |
parent | 77440a7c3f4b9b2aa4918d290e0b2f37370a131c (diff) | |
download | connectbot-9c24eddf62f97f354c9715388e18859492f13e40.tar.gz connectbot-9c24eddf62f97f354c9715388e18859492f13e40.tar.bz2 connectbot-9c24eddf62f97f354c9715388e18859492f13e40.zip |
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
Diffstat (limited to 'src')
-rw-r--r-- | src/de/mud/telnet/TelnetProtocolHandler.java | 31 | ||||
-rw-r--r-- | src/org/connectbot/service/Relay.java | 4 | ||||
-rw-r--r-- | src/org/connectbot/service/TerminalBridge.java | 8 | ||||
-rw-r--r-- | src/org/connectbot/transport/Telnet.java | 10 |
4 files changed, 53 insertions, 0 deletions
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 @@ -92,6 +92,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 * @see #write(byte[] b) @@ -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; @@ -304,6 +305,13 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener { } /** + * @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. * @param encoding the canonical name of the character encoding 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 ""; + } }; } |