diff options
author | Kenny Root <kenny@the-b.org> | 2009-06-12 09:35:15 +0000 |
---|---|---|
committer | Kenny Root <kenny@the-b.org> | 2009-06-12 09:35:15 +0000 |
commit | ec2a6fca2efac964efbcb302913fb8af68e60294 (patch) | |
tree | 9e3788ea80c0af5c1ff6d1fb1ed8e23c10a9ff99 /src | |
parent | f930b37c7aaf4a6f2571ab632e271a208f95404a (diff) | |
download | connectbot-ec2a6fca2efac964efbcb302913fb8af68e60294.tar.gz connectbot-ec2a6fca2efac964efbcb302913fb8af68e60294.tar.bz2 connectbot-ec2a6fca2efac964efbcb302913fb8af68e60294.zip |
Add CP437 support
git-svn-id: https://connectbot.googlecode.com/svn/trunk/connectbot@284 df292f66-193f-0410-a5fc-6d59da041ff2
Diffstat (limited to 'src')
-rw-r--r-- | src/gnu/java/nio/charset/ByteCharset.java | 188 | ||||
-rw-r--r-- | src/gnu/java/nio/charset/Cp437.java | 90 | ||||
-rw-r--r-- | src/org/connectbot/HostEditorActivity.java | 6 | ||||
-rw-r--r-- | src/org/connectbot/service/Relay.java | 8 |
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); |