aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gnu/java/nio/charset/ByteCharset.java188
-rw-r--r--src/gnu/java/nio/charset/Cp437.java90
-rw-r--r--src/org/connectbot/HostEditorActivity.java6
-rw-r--r--src/org/connectbot/service/Relay.java8
4 files changed, 291 insertions, 1 deletions
diff --git a/src/gnu/java/nio/charset/ByteCharset.java b/src/gnu/java/nio/charset/ByteCharset.java
new file mode 100644
index 0000000..a7de91c
--- /dev/null
+++ b/src/gnu/java/nio/charset/ByteCharset.java
@@ -0,0 +1,188 @@
+/* ByteCharset.java -- Abstract class for generic 1-byte encodings.
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.java.nio.charset;
+
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
+import java.nio.charset.CharsetEncoder;
+import java.nio.charset.CoderResult;
+
+/**
+ * A generic encoding framework for single-byte encodings,
+ * utilizing a look-up table.
+ *
+ * This replaces the gnu.java.io.EncoderEightBitLookup class,
+ * created by Aron Renn.
+ *
+ * @author Sven de Marothy
+ */
+abstract class ByteCharset extends Charset
+{
+ protected char[] lookupTable;
+ /**
+ * Char to signify the character in the table is undefined
+ */
+ protected static final char NONE = (char)0xFFFD;
+
+ ByteCharset (String canonicalName, String[] aliases)
+ {
+ super (canonicalName, aliases);
+ }
+
+ /**
+ * Most western charsets include ASCII, but this should
+ * be overloaded for others.
+ */
+ public boolean contains (Charset cs)
+ {
+// return cs instanceof US_ASCII || (cs.getClass() == getClass());
+ return cs.getClass() == cs.getClass();
+ }
+
+ char[] getLookupTable()
+ {
+ return lookupTable;
+ }
+
+ public CharsetDecoder newDecoder ()
+ {
+ return new Decoder (this);
+ }
+
+ public CharsetEncoder newEncoder ()
+ {
+ return new Encoder (this);
+ }
+
+ private static final class Decoder extends CharsetDecoder
+ {
+ private char[] lookup;
+
+ // Package-private to avoid a trampoline constructor.
+ Decoder (ByteCharset cs)
+ {
+ super (cs, 1.0f, 1.0f);
+ lookup = cs.getLookupTable();
+ }
+
+ protected CoderResult decodeLoop (ByteBuffer in, CharBuffer out)
+ {
+ // TODO: Optimize this in the case in.hasArray() / out.hasArray()
+ while (in.hasRemaining ())
+ {
+ byte b = in.get ();
+ char c;
+
+ if (!out.hasRemaining ())
+ {
+ in.position (in.position () - 1);
+ return CoderResult.OVERFLOW;
+ }
+
+ if((c = lookup[(int) (b & 0xFF)]) == NONE);
+ // return CoderResult.unmappableForLength (1);
+ out.put (c);
+ }
+
+ return CoderResult.UNDERFLOW;
+ }
+ }
+
+ private static final class Encoder extends CharsetEncoder
+ {
+ private byte[] lookup;
+
+ // Package-private to avoid a trampoline constructor.
+ Encoder (ByteCharset cs)
+ {
+ super (cs, 1.0f, 1.0f);
+
+ char[] lookup_table = cs.getLookupTable();
+
+ // Create the inverse look-up table.
+ // determine required size of encoding_table:
+ int max = 0;
+ for (int i = 0; i < lookup_table.length; i++)
+ {
+ int c = (int)lookup_table[i];
+ max = (c > max && c < NONE) ? c : max;
+ }
+
+ lookup = new byte[max+1];
+
+ for (int i = 0; i < lookup_table.length; i++)
+ {
+ int c = (int)lookup_table[i];
+ if (c != 0 && c < NONE)
+ {
+ lookup[c] = (byte)i;
+ }
+ }
+ }
+
+ protected CoderResult encodeLoop (CharBuffer in, ByteBuffer out)
+ {
+ // TODO: Optimize this in the case in.hasArray() / out.hasArray()
+ while (in.hasRemaining ())
+ {
+ int c = (int)in.get ();
+
+ if (!out.hasRemaining ())
+ {
+ in.position (in.position () - 1);
+ return CoderResult.OVERFLOW;
+ }
+
+ // lookup byte encoding
+ byte b = (c < lookup.length) ? lookup[c] : (byte)0;
+
+ if ((int)b != 0 || (int)c == 0)
+ {
+ out.put (b);
+ } else {
+ in.position (in.position () - 1);
+ return CoderResult.unmappableForLength (1);
+ }
+ }
+
+ return CoderResult.UNDERFLOW;
+ }
+ }
+}
diff --git a/src/gnu/java/nio/charset/Cp437.java b/src/gnu/java/nio/charset/Cp437.java
new file mode 100644
index 0000000..a2e8bbe
--- /dev/null
+++ b/src/gnu/java/nio/charset/Cp437.java
@@ -0,0 +1,90 @@
+/* Cp437.java -- Charset implementation for the Cp437 character set.
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.java.nio.charset;
+
+public class Cp437 extends ByteCharset
+{
+ public static final String NAME = "CP437";
+
+ /**
+ * This is the lookup table for this encoding
+ */
+ private static final char[] lookup =
+ {
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
+ 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
+ 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7,
+ 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5,
+ 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9,
+ 0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192,
+ 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA,
+ 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB,
+ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556,
+ 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510,
+ 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F,
+ 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567,
+ 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B,
+ 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,
+ 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4,
+ 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229,
+ 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248,
+ 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0
+ };
+
+ public Cp437()
+ {
+ super("Cp437", new String[] {
+ });
+ lookupTable = lookup;
+ }
+
+} // class Cp437
diff --git a/src/org/connectbot/HostEditorActivity.java b/src/org/connectbot/HostEditorActivity.java
index dcebbf8..9f38ecc 100644
--- a/src/org/connectbot/HostEditorActivity.java
+++ b/src/org/connectbot/HostEditorActivity.java
@@ -252,6 +252,12 @@ public class HostEditorActivity extends PreferenceActivity implements OnSharedPr
for (Entry<String, Charset> entry : Charset.availableCharsets().entrySet()) {
Charset c = entry.getValue();
if (c.canEncode() && c.isRegistered()) {
+ String key = entry.getKey();
+ if (key.startsWith("cp")) {
+ // Custom CP437 charset changes
+ charsetIds.add("CP437");
+ charsetNames.add("CP437");
+ }
charsetIds.add(entry.getKey());
charsetNames.add(c.displayName());
}
diff --git a/src/org/connectbot/service/Relay.java b/src/org/connectbot/service/Relay.java
index f713210..942de88 100644
--- a/src/org/connectbot/service/Relay.java
+++ b/src/org/connectbot/service/Relay.java
@@ -18,6 +18,8 @@
package org.connectbot.service;
+import gnu.java.nio.charset.Cp437;
+
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
@@ -76,7 +78,11 @@ public class Relay implements Runnable {
}
public void setCharset(String encoding) {
- Charset charset = Charset.forName(encoding);
+ Charset charset;
+ if (encoding.equals(Cp437.NAME))
+ charset = new Cp437();
+ else
+ charset = Charset.forName(encoding);
CharsetDecoder newCd = charset.newDecoder();
newCd.onUnmappableCharacter(CodingErrorAction.REPLACE);