X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=src%2Fcom%2Fhughes%2Fandroid%2Fdictionary%2Fengine%2FHtmlEntry.java;h=937c88295e585f98dc850679b0718a4753f33683;hb=83d497f704ad1f8ba85190255d46a3fbe0e3c353;hp=6e65a684e0045462fc94bbba2fd16f31eaa56ef2;hpb=b674aa184932eb6d2797786e454706d6f0ed7562;p=Dictionary.git diff --git a/src/com/hughes/android/dictionary/engine/HtmlEntry.java b/src/com/hughes/android/dictionary/engine/HtmlEntry.java index 6e65a68..937c882 100644 --- a/src/com/hughes/android/dictionary/engine/HtmlEntry.java +++ b/src/com/hughes/android/dictionary/engine/HtmlEntry.java @@ -1,21 +1,23 @@ package com.hughes.android.dictionary.engine; -import com.hughes.android.dictionary.C; import com.hughes.util.StringUtil; import com.hughes.util.raf.RAFListSerializer; -import com.hughes.util.raf.RAFSerializable; +import com.hughes.util.raf.RAFListSerializerSkippable; import com.ibm.icu.text.Transliterator; +import java.io.DataInput; +import java.io.DataOutput; import java.io.IOException; 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; -public class HtmlEntry extends AbstractEntry implements RAFSerializable, - Comparable { +public class HtmlEntry extends AbstractEntry implements Comparable { // Title is not HTML escaped. public final String title; @@ -28,24 +30,30 @@ public class HtmlEntry extends AbstractEntry implements RAFSerializable { + 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, 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); } + } + + static final class DataSerializer implements RAFListSerializer { + @Override + public HtmlEntry read(DataInput raf, final int index) { + assert false; + return null; + } + + @Override + public void write(DataOutput raf, HtmlEntry t) throws IOException { + t.writeData(raf); + } + } + static final class DataDeserializer implements RAFListSerializer { @Override - public HtmlEntry read(RandomAccessFile raf, final int index) throws IOException { - return new HtmlEntry(dictionary, raf, index); + public byte[] read(DataInput raf, final int index) throws IOException { + return HtmlEntry.readData(raf); } @Override - public void write(RandomAccessFile raf, HtmlEntry t) throws IOException { - t.write(raf); + public void write(DataOutput raf, byte[] t) { + assert false; } - }; + } public String getRawText(final boolean compact) { return title + ":\n" + getHtml(); @@ -106,13 +155,13 @@ public class HtmlEntry extends AbstractEntry implements RAFSerializable 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; @@ -160,8 +209,8 @@ public class HtmlEntry extends AbstractEntry implements RAFSerializable%s\n

%s\n", - formatQuickdicUrl(indexShortName, htmlEntry.title), titleEscaped, - htmlEntry.getHtml())); + formatQuickdicUrl(indexShortName, htmlEntry.title), titleEscaped, + htmlEntry.getHtml())); } return result.toString(); } @@ -179,19 +228,33 @@ public class HtmlEntry extends AbstractEntry implements RAFSerializable data; + final int index; // Not sure this volatile is right, but oh well. volatile SoftReference htmlRef = new SoftReference(null); - private LazyHtmlLoader(final RandomAccessFile raf) throws IOException { - this.raf = raf; - numBytes = raf.readInt(); - numZipBytes = raf.readInt(); - offset = raf.getFilePointer(); + 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 = 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); } @@ -200,23 +263,31 @@ public class HtmlEntry extends AbstractEntry implements RAFSerializable(html); + return html; + } System.out.println("Loading Html: numBytes=" + numBytes + ", numZipBytes=" - + numZipBytes); - final byte[] bytes = new byte[numBytes]; + + 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(e); + throw new RuntimeException("Failed to read HTML data from dictionary", e); } } try { - StringUtil.unzipFully(zipBytes, bytes); + final byte[] bytes = StringUtil.unzipFully(zipBytes, numBytes); html = new String(bytes, "UTF-8"); } catch (IOException e) { - throw new RuntimeException(e); + throw new RuntimeException("Dictionary HTML data corrupted", e); } htmlRef = new SoftReference(html); return html;