X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=src%2Fcom%2Fhughes%2Fandroid%2Fdictionary%2Fengine%2FHtmlEntry.java;h=937c88295e585f98dc850679b0718a4753f33683;hb=83d497f704ad1f8ba85190255d46a3fbe0e3c353;hp=f5ea520992e5521e1e810f781432a2edbc677514;hpb=d7f9aa76c451cbcf75cb507a566b9de719214360;p=Dictionary.git diff --git a/src/com/hughes/android/dictionary/engine/HtmlEntry.java b/src/com/hughes/android/dictionary/engine/HtmlEntry.java index f5ea520..937c882 100644 --- a/src/com/hughes/android/dictionary/engine/HtmlEntry.java +++ b/src/com/hughes/android/dictionary/engine/HtmlEntry.java @@ -3,6 +3,7 @@ package com.hughes.android.dictionary.engine; import com.hughes.util.StringUtil; import com.hughes.util.raf.RAFListSerializer; +import com.hughes.util.raf.RAFListSerializerSkippable; import com.ibm.icu.text.Transliterator; import java.io.DataInput; @@ -12,6 +13,7 @@ import java.io.PrintStream; import java.io.RandomAccessFile; import java.io.UnsupportedEncodingException; import java.lang.ref.SoftReference; +import java.nio.channels.FileChannel; import java.util.List; import java.util.regex.Pattern; @@ -28,11 +30,11 @@ public class HtmlEntry extends AbstractEntry implements Comparable { lazyHtmlLoader = null; } - public HtmlEntry(Dictionary dictionary, DataInput raf, final int index) - throws IOException { + public HtmlEntry(Dictionary dictionary, FileChannel ch, DataInput raf, final int index) + throws IOException { super(dictionary, raf, index); title = raf.readUTF(); - lazyHtmlLoader = new LazyHtmlLoader(raf, dictionary.htmlData, index); + lazyHtmlLoader = new LazyHtmlLoader(ch, raf, dictionary.htmlData, index); html = null; } @@ -49,7 +51,7 @@ public class HtmlEntry extends AbstractEntry implements Comparable { public static byte[] readData(DataInput raf) throws IOException { int len = StringUtil.readVarInt(raf); - final byte[] bytes = new byte[len]; + final byte[] bytes = new byte[Math.min(len, 20 * 1024 * 1024)]; raf.readFully(bytes); return bytes; } @@ -70,19 +72,35 @@ public class HtmlEntry extends AbstractEntry implements Comparable { return new Row(this.index, rowIndex, dictionaryIndex); } - static final class Serializer implements RAFListSerializer { + static final class Serializer implements RAFListSerializerSkippable { final Dictionary dictionary; + final FileChannel ch; - Serializer(Dictionary dictionary) { + Serializer(Dictionary dictionary, FileChannel ch) { this.dictionary = dictionary; + this.ch = ch; } @Override public HtmlEntry read(DataInput raf, final int index) throws IOException { - return new HtmlEntry(dictionary, raf, index); + return new HtmlEntry(dictionary, ch, raf, index); } + @Override + public void skip(DataInput raf, final int index) throws IOException { + if (dictionary.dictFileVersion >= 7) + { + StringUtil.readVarInt(raf); + } + else + { + raf.skipBytes(2); + } + int l = raf.readUnsignedShort(); + raf.skipBytes(l); + } + @Override public void write(DataOutput raf, HtmlEntry t) throws IOException { t.writeBase(raf); @@ -91,7 +109,7 @@ public class HtmlEntry extends AbstractEntry implements Comparable { static final class DataSerializer implements RAFListSerializer { @Override - public HtmlEntry read(DataInput raf, final int index) throws IOException { + public HtmlEntry read(DataInput raf, final int index) { assert false; return null; } @@ -109,7 +127,7 @@ public class HtmlEntry extends AbstractEntry implements Comparable { } @Override - public void write(DataOutput raf, byte[] t) throws IOException { + public void write(DataOutput raf, byte[] t) { assert false; } } @@ -138,12 +156,12 @@ public class HtmlEntry extends AbstractEntry implements Comparable { boolean isExpanded = false; Row(final DataInput raf, final int thisRowIndex, - final Index index, int extra) throws IOException { + final Index index, int extra) throws IOException { super(raf, thisRowIndex, index, extra); } Row(final int referenceIndex, final int thisRowIndex, - final Index index) { + final Index index) { super(referenceIndex, thisRowIndex, index); } @@ -170,8 +188,8 @@ public class HtmlEntry extends AbstractEntry implements Comparable { @Override public RowMatchType matches(final List searchTokens, - final Pattern orderedMatchPattern, final Transliterator normalizer, - final boolean swapPairEntries) { + final Pattern orderedMatchPattern, final Transliterator normalizer, + final boolean swapPairEntries) { final String text = normalizer.transform(getRawText(false)); if (orderedMatchPattern.matcher(text).find()) { return RowMatchType.ORDERED_MATCH; @@ -191,8 +209,8 @@ public class HtmlEntry extends AbstractEntry implements Comparable { for (final HtmlEntry htmlEntry : htmlEntries) { final String titleEscaped = StringUtil.escapeUnicodeToPureHtml(htmlEntry.title); result.append(String.format("

%s

\n

%s\n", - formatQuickdicUrl(indexShortName, htmlEntry.title), titleEscaped, - htmlEntry.getHtml())); + formatQuickdicUrl(indexShortName, htmlEntry.title), titleEscaped, + htmlEntry.getHtml())); } return result.toString(); } @@ -210,7 +228,8 @@ public class HtmlEntry extends AbstractEntry implements Comparable { // -------------------------------------------------------------------- public static final class LazyHtmlLoader { - final RandomAccessFile raf; + final DataInput raf; + final FileChannel ch; final long offset; final int numBytes; final int numZipBytes; @@ -220,20 +239,22 @@ public class HtmlEntry extends AbstractEntry implements Comparable { // Not sure this volatile is right, but oh well. volatile SoftReference htmlRef = new SoftReference(null); - private LazyHtmlLoader(final DataInput inp, List data, int index) throws IOException { + private LazyHtmlLoader(FileChannel ch, 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; this.numBytes = -1; this.numZipBytes = -1; return; } - raf = (RandomAccessFile)inp; - numBytes = raf.readInt(); - numZipBytes = raf.readInt(); - offset = raf.getFilePointer(); + 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); } @@ -252,12 +273,12 @@ public class HtmlEntry extends AbstractEntry implements Comparable { return html; } System.out.println("Loading Html: numBytes=" + numBytes + ", numZipBytes=" - + numZipBytes); + + numZipBytes); final byte[] zipBytes = new byte[numZipBytes]; - synchronized (raf) { + synchronized (ch) { try { - raf.seek(offset); - raf.read(zipBytes); + ch.position(offset); + raf.readFully(zipBytes); } catch (IOException e) { throw new RuntimeException("Failed to read HTML data from dictionary", e); }