diff --git a/src/org/fbreader/encoding/ZLEncodingCollection.java b/src/org/fbreader/encoding/ZLEncodingCollection.java new file mode 100644 index 000000000..68c562399 --- /dev/null +++ b/src/org/fbreader/encoding/ZLEncodingCollection.java @@ -0,0 +1,82 @@ +package org.fbreader.encoding; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; + +import org.zlibrary.core.config.ZLConfigManager; +import org.zlibrary.core.library.ZLibrary; +import org.zlibrary.core.options.ZLBooleanOption; +import org.zlibrary.core.options.ZLOption; + +public class ZLEncodingCollection { + private static ZLEncodingCollection ourInstance; + private static ZLBooleanOption ourUseWindows1252HackOption; + + public static ZLEncodingCollection instance() { + if (ourInstance == null) { + ourInstance = new ZLEncodingCollection(); + } + return ourInstance; + } + public static String encodingDescriptionPath() { + return ZLibrary.JAR_DATA_PREFIX + "zlibrary" + File.separator + "encodings"; + } + + public static ZLBooleanOption useWindows1252HackOption() { + if (ourUseWindows1252HackOption == null) { + ourUseWindows1252HackOption = + new ZLBooleanOption(ZLOption.CONFIG_CATEGORY, "Encoding", "UseWindows1252Hack", true); + } + return ourUseWindows1252HackOption; + } + + public static boolean useWindows1252Hack() { + return ZLConfigManager.getInstance() != null/*.isInitialised()*/ && useWindows1252HackOption().getValue(); + } + + + public ArrayList sets() { + init(); + return mySets; + } + public ZLEncodingConverterInfo info(String name) { + init(); + String lowerCaseName = name.toLowerCase(); + if (useWindows1252Hack() && (lowerCaseName == "iso-8859-1")) { + lowerCaseName = "windows-1252"; + } + return (ZLEncodingConverterInfo)myInfosByName.get(lowerCaseName); + } + + public ZLEncodingConverterInfo info(int code) { + String name = "" + code; + return info(name); + } + + public ZLEncodingConverter defaultConverter() { + return null;//DummyEncodingConverterProvider().createConverter(); + } + public void registerProvider(ZLEncodingConverterProvider provider) { + myProviders.add(provider); + } + + private void addInfo(ZLEncodingConverterInfo info) { + + } + ArrayList/**/ providers() { + return myProviders; + } + + private ArrayList/**/ mySets; + private HashMap/**/ myInfosByName; + private ArrayList/**/ myProviders; + + //private ZLEncodingCollection(); + private void init() { + if (mySets.isEmpty()) { + String prefix = encodingDescriptionPath() + File.separator; + //new ZLEncodingCollectionReader(this).readDocument(prefix + "Encodings.xml"); + } + } +} diff --git a/src/org/fbreader/encoding/ZLEncodingConverter.java b/src/org/fbreader/encoding/ZLEncodingConverter.java new file mode 100644 index 000000000..00daa8672 --- /dev/null +++ b/src/org/fbreader/encoding/ZLEncodingConverter.java @@ -0,0 +1,15 @@ +package org.fbreader.encoding; + +public abstract class ZLEncodingConverter { + protected ZLEncodingConverter() {} + + //abstract public void convert(String dst, const char *srcStart, const char *srcEnd); + public void convert(String dst, String src) { + //convert(dst, src.toCharArray(), src.data() + src.length()); + } + public abstract void reset(); + public abstract boolean fillTable(int[] map); + + //private ZLEncodingConverter(ZLEncodingConverter zl); + //private ZLEncodingConverter &operator=(ZLEncodingConverter zl); +} diff --git a/src/org/fbreader/encoding/ZLEncodingConverterInfo.java b/src/org/fbreader/encoding/ZLEncodingConverterInfo.java new file mode 100644 index 000000000..6792525e1 --- /dev/null +++ b/src/org/fbreader/encoding/ZLEncodingConverterInfo.java @@ -0,0 +1,60 @@ +package org.fbreader.encoding; + +import java.util.ArrayList; +import java.util.Iterator; + +public class ZLEncodingConverterInfo { + public ZLEncodingConverterInfo(String name, String region) { + myName = name; + myVisibleName = region + " (" + name + ")"; + addAlias(myName); + } + + public void addAlias(String alias) { + myAliases.add(alias); + } + + public String name() { + return myName; + } + + public String visibleName() { + return myVisibleName; + } + + public ZLEncodingConverter createConverter() { + ZLEncodingCollection collection = ZLEncodingCollection.instance(); + ArrayList providers = collection.providers(); + for (Iterator it = providers.iterator(); it.hasNext(); ) { + for (Iterator jt = myAliases.iterator(); jt.hasNext(); ) { + ZLEncodingConverterProvider itp = (ZLEncodingConverterProvider)it.next(); + String str = (String)jt.next(); + if (itp.providesConverter(str)) { + return itp.createConverter(str); + } + } + } + + return ZLEncodingCollection.instance().defaultConverter(); + } + + public boolean canCreateConverter() { + ZLEncodingCollection collection = ZLEncodingCollection.instance(); + ArrayList providers = collection.providers(); + for (Iterator it = providers.iterator(); it.hasNext();) { + for (Iterator jt = myAliases.iterator(); jt.hasNext(); ) { + if (((ZLEncodingConverterProvider)it.next()).providesConverter((String)jt.next())) { + return true; + } + } + } + return false; + } + + private String myName = ""; + private String myVisibleName = ""; + private ArrayList myAliases = new ArrayList(); + + //private ZLEncodingConverterInfo(const ZLEncodingConverterInfo&); + //private ZLEncodingConverterInfo &operator=(const ZLEncodingConverterInfo&); +} diff --git a/src/org/fbreader/encoding/ZLEncodingConverterProvider.java b/src/org/fbreader/encoding/ZLEncodingConverterProvider.java new file mode 100644 index 000000000..52cae9fdd --- /dev/null +++ b/src/org/fbreader/encoding/ZLEncodingConverterProvider.java @@ -0,0 +1,9 @@ +package org.fbreader.encoding; + +public abstract class ZLEncodingConverterProvider { + protected ZLEncodingConverterProvider() {} + + public abstract boolean providesConverter(String encoding); + public abstract ZLEncodingConverter createConverter(String encoding); + +} diff --git a/src/org/fbreader/encoding/ZLEncodingSet.java b/src/org/fbreader/encoding/ZLEncodingSet.java new file mode 100644 index 000000000..f48fde15c --- /dev/null +++ b/src/org/fbreader/encoding/ZLEncodingSet.java @@ -0,0 +1,23 @@ +package org.fbreader.encoding; + +import java.util.ArrayList; + +public class ZLEncodingSet { + public ZLEncodingSet(String name) { + + } + public void addInfo(ZLEncodingConverterInfo info) { + myInfos.add(info); + } + + public String name() { + return myName; + } + + public ArrayList/**/ infos() { + return myInfos; + } + + private String myName = ""; + private ArrayList/**/ myInfos = new ArrayList(); +}