aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKenny Root <kenny@the-b.org>2009-06-24 19:18:35 +0000
committerKenny Root <kenny@the-b.org>2009-06-24 19:18:35 +0000
commit9c24eddf62f97f354c9715388e18859492f13e40 (patch)
tree8ba6d7048226655bae8964e469f43683f3047fb5 /src
parent77440a7c3f4b9b2aa4918d290e0b2f37370a131c (diff)
downloadconnectbot-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.java31
-rw-r--r--src/org/connectbot/service/Relay.java4
-rw-r--r--src/org/connectbot/service/TerminalBridge.java8
-rw-r--r--src/org/connectbot/transport/Telnet.java10
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 "";
+ }
};
}