/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package org.albite.io.decoders; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; /** * * @author albus */ abstract class AlbiteCharacterDecoder { public static final int DECODING_DONE = -1; /** * Used as a substitute, if there is a char that couldn't be read * right. */ public static final char SUBSTITUTE_CHAR = '?'; public abstract int decode(InputStream in) throws IOException; public static AlbiteCharacterDecoder getDecoder(final String encoding) throws UnsupportedEncodingException { //#if !(TinyMode || TinyModeExport) /* * ASCII */ if (match(encoding, Encodings.ASCII_ALIASES)) { return DecoderASCII.getInstance(); } //#endif /* * UTF-8 */ if (match(encoding, Encodings.UTF_8_ALIASES)) { return DecoderUTF_8.getInstance(); } /* * ISO-8859-X */ if (match(encoding, Encodings.ISO_8859_1_ALIASES)) { return DecoderISO_8859_1.getInstance(); } //#if !(TinyMode || TinyModeExport) if (match(encoding, Encodings.ISO_8859_2_ALIASES)) { return DecoderISO_8859_2.getInstance(); } if (match(encoding, Encodings.ISO_8859_3_ALIASES)) { return DecoderISO_8859_3.getInstance(); } if (match(encoding, Encodings.ISO_8859_4_ALIASES)) { return DecoderISO_8859_4.getInstance(); } if (match(encoding, Encodings.ISO_8859_5_ALIASES)) { return DecoderISO_8859_5.getInstance(); } if (match(encoding, Encodings.ISO_8859_7_ALIASES)) { return DecoderISO_8859_7.getInstance(); } if (match(encoding, Encodings.ISO_8859_9_ALIASES)) { return DecoderISO_8859_9.getInstance(); } if (match(encoding, Encodings.ISO_8859_10_ALIASES)) { return DecoderISO_8859_10.getInstance(); } if (match(encoding, Encodings.ISO_8859_13_ALIASES)) { return DecoderISO_8859_13.getInstance(); } if (match(encoding, Encodings.ISO_8859_14_ALIASES)) { return DecoderISO_8859_14.getInstance(); } if (match(encoding, Encodings.ISO_8859_15_ALIASES)) { return DecoderISO_8859_15.getInstance(); } if (match(encoding, Encodings.ISO_8859_16_ALIASES)) { return DecoderISO_8859_16.getInstance(); } //#endif /* * Windows */ if (match(encoding, Encodings.WINDOWS_1250_ALIASES)) { return DecoderWindows_1250.getInstance(); } //#if !(TinyMode || TinyModeExport) if (match(encoding, Encodings.WINDOWS_1251_ALIASES)) { return DecoderWindows_1251.getInstance(); } if (match(encoding, Encodings.WINDOWS_1252_ALIASES)) { return DecoderWindows_1252.getInstance(); } if (match(encoding, Encodings.WINDOWS_1253_ALIASES)) { return DecoderWindows_1253.getInstance(); } if (match(encoding, Encodings.WINDOWS_1254_ALIASES)) { return DecoderWindows_1254.getInstance(); } if (match(encoding, Encodings.WINDOWS_1257_ALIASES)) { return DecoderWindows_1257.getInstance(); } /* * KOI8 */ if (match(encoding, Encodings.KOI8_R_ALIASES)) { return DecoderKOI8_R.getInstance(); } if (match(encoding, Encodings.KOI8_RU_ALIASES)) { return DecoderKOI8_RU.getInstance(); } if (match(encoding, Encodings.KOI8_U_ALIASES)) { return DecoderKOI8_U.getInstance(); } //#endif throw new UnsupportedEncodingException(); } private static boolean match(final String name, final String[] aliases) { for (int i = 0; i < aliases.length; i++) { if (aliases[i].equalsIgnoreCase(name)) { return true; } } return false; } public static boolean decoderAvailable(final String encoding) { for (int i = 0; i < Encodings.ALIASES.length; i++) { if (match(encoding, Encodings.ALIASES[i])) { return true; } } return false; } public abstract String getEncoding(); }