X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=src%2Fcom%2Fhughes%2Fandroid%2Fdictionary%2Fengine%2FHtmlEntry.java;h=fc15c788b41ef31f23cb9ac631cb8dbc9ad1cc26;hb=96dd589699bcbe61a13bf68a1a673c8ad4d6690e;hp=59ed59b3c54c08004308a7b8559f2298aca820fc;hpb=8674b09eae371994e01e0af541b546fced86c366;p=Dictionary.git diff --git a/src/com/hughes/android/dictionary/engine/HtmlEntry.java b/src/com/hughes/android/dictionary/engine/HtmlEntry.java index 59ed59b..fc15c78 100644 --- a/src/com/hughes/android/dictionary/engine/HtmlEntry.java +++ b/src/com/hughes/android/dictionary/engine/HtmlEntry.java @@ -6,11 +6,11 @@ import java.io.DataOutput; import java.io.IOException; import java.io.PrintStream; import java.lang.ref.SoftReference; -import java.nio.channels.FileChannel; import java.nio.charset.StandardCharsets; import java.util.List; import java.util.regex.Pattern; +import com.hughes.util.DataInputBuffer; import com.hughes.util.StringUtil; import com.hughes.util.raf.RAFListSerializer; import com.hughes.util.raf.RAFListSerializerSkippable; @@ -30,11 +30,11 @@ public class HtmlEntry extends AbstractEntry implements Comparable { lazyHtmlLoader = null; } - public HtmlEntry(Dictionary dictionary, FileChannel ch, DataInput raf, final int index) + public HtmlEntry(Dictionary dictionary, DataInput raf, final int index) throws IOException { super(dictionary, raf, index); title = raf.readUTF(); - lazyHtmlLoader = new LazyHtmlLoader(ch, raf, dictionary.htmlData, index); + lazyHtmlLoader = new LazyHtmlLoader(raf, dictionary.htmlData, index); html = null; } @@ -49,11 +49,9 @@ public class HtmlEntry extends AbstractEntry implements Comparable { raf.write(bytes); } - private static byte[] readData(DataInput raf) throws IOException { + private static DataInputBuffer readData(DataInput raf) throws IOException { int len = StringUtil.readVarInt(raf); - final byte[] bytes = new byte[Math.min(len, 20 * 1024 * 1024)]; - raf.readFully(bytes); - return bytes; + return ((DataInputBuffer)raf).slice(len); } String getHtml() { @@ -75,16 +73,14 @@ public class HtmlEntry extends AbstractEntry implements Comparable { static final class Serializer implements RAFListSerializerSkippable { final Dictionary dictionary; - final FileChannel ch; - Serializer(Dictionary dictionary, FileChannel ch) { + Serializer(Dictionary dictionary) { this.dictionary = dictionary; - this.ch = ch; } @Override public HtmlEntry read(DataInput raf, final int index) throws IOException { - return new HtmlEntry(dictionary, ch, raf, index); + return new HtmlEntry(dictionary, raf, index); } @Override @@ -120,14 +116,14 @@ public class HtmlEntry extends AbstractEntry implements Comparable { } } - static final class DataDeserializer implements RAFListSerializer { + static final class DataDeserializer implements RAFListSerializer { @Override - public byte[] read(DataInput raf, final int index) throws IOException { - return HtmlEntry.readData(raf); + public DataInputBuffer read(DataInput raf, final int index) throws IOException { + return readData(raf); } @Override - public void write(DataOutput raf, byte[] t) { + public void write(DataOutput raf, DataInputBuffer t) { assert false; } } @@ -217,7 +213,11 @@ public class HtmlEntry extends AbstractEntry implements Comparable { public static String formatQuickdicUrl(final String indexShortName, final String text) { assert !indexShortName.contains(":"); assert text.length() > 0; - return String.format("q://d?%s&%s", indexShortName, StringUtil.encodeForUrl(text)); + StringBuilder s = new StringBuilder("q://d?"); + s.append(indexShortName); + s.append("&"); + s.append(StringUtil.encodeForUrl(text)); + return s.toString(); } public static boolean isQuickdicUrl(String url) { @@ -228,34 +228,26 @@ public class HtmlEntry extends AbstractEntry implements Comparable { @SuppressWarnings("WeakerAccess") public static final class LazyHtmlLoader { - final DataInput raf; - final FileChannel ch; - final long offset; + final DataInputBuffer buf; final int numBytes; - final int numZipBytes; - final List data; + final List data; final int index; // Not sure this volatile is right, but oh well. volatile SoftReference htmlRef = new SoftReference<>(null); - private LazyHtmlLoader(FileChannel ch, final DataInput inp, List data, int index) throws IOException { + private LazyHtmlLoader(final DataInput inp, List data, int index) throws IOException { this.data = data; this.index = index; if (data != null) { - this.raf = null; - this.ch = null; - this.offset = 0; + buf = null; this.numBytes = -1; - this.numZipBytes = -1; return; } - raf = inp; - this.ch = ch; - numBytes = Math.min(raf.readInt(), 20 * 1024 * 1024); - numZipBytes = Math.min(raf.readInt(), 20 * 1024 * 1024); - offset = ch.position(); - raf.skipBytes(numZipBytes); + numBytes = Math.min(inp.readInt(), 20 * 1024 * 1024); + int numZipBytes = Math.min(inp.readInt(), 20 * 1024 * 1024); + DataInputBuffer b = (DataInputBuffer)inp; + buf = b.slice(numZipBytes); } String getHtml() { @@ -264,21 +256,15 @@ public class HtmlEntry extends AbstractEntry implements Comparable { return html; } if (data != null) { - html = new String(data.get(index), StandardCharsets.UTF_8); + html = data.get(index).asString(); htmlRef = new SoftReference<>(html); return html; } System.out.println("Loading Html: numBytes=" + numBytes + ", numZipBytes=" - + numZipBytes); - final byte[] zipBytes = new byte[numZipBytes]; - synchronized (ch) { - try { - ch.position(offset); - raf.readFully(zipBytes); - } catch (IOException e) { - throw new RuntimeException("Failed to read HTML data from dictionary", e); - } - } + + buf.limit()); + final byte[] zipBytes = new byte[buf.limit()]; + buf.rewind(); + buf.readFully(zipBytes); try { final byte[] bytes = StringUtil.unzipFully(zipBytes, numBytes); html = new String(bytes, StandardCharsets.UTF_8);