From f3f48901a1bc21bb9badc4174e2db7c96b8656ff Mon Sep 17 00:00:00 2001 From: =?utf8?q?Reimar=20D=C3=B6ffinger?= Date: Sat, 2 Sep 2017 19:50:05 +0200 Subject: [PATCH] Fix HtmlEntry for v6 dictionaries. --- Util | 2 +- .../android/dictionary/engine/Dictionary.java | 4 +-- .../android/dictionary/engine/HtmlEntry.java | 28 +++++++++++-------- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/Util b/Util index a7bfc9e..25459d3 160000 --- a/Util +++ b/Util @@ -1 +1 @@ -Subproject commit a7bfc9e9fe94486a358662b650078c5a2b9d73ea +Subproject commit 25459d31490c08a67141ac56d9bf5d6b9c1d4d97 diff --git a/src/com/hughes/android/dictionary/engine/Dictionary.java b/src/com/hughes/android/dictionary/engine/Dictionary.java index 151bad6..3abe61e 100644 --- a/src/com/hughes/android/dictionary/engine/Dictionary.java +++ b/src/com/hughes/android/dictionary/engine/Dictionary.java @@ -94,7 +94,7 @@ public class Dictionary implements RAFSerializable { CACHE_SIZE); if (dictFileVersion >= 5) { htmlEntries = CachingList.create( - RAFList.create(ch, new HtmlEntry.Serializer(this), ch.position(), dictFileVersion, dictInfo + " html: "), + RAFList.create(ch, new HtmlEntry.Serializer(this, ch), ch.position(), dictFileVersion, dictInfo + " html: "), CACHE_SIZE); } else { htmlEntries = Collections.emptyList(); @@ -130,7 +130,7 @@ public class Dictionary implements RAFSerializable { System.out.println("text start: " + raf.getFilePointer()); RAFList.write(raf, textEntries, new TextEntry.Serializer(this)); System.out.println("html index start: " + raf.getFilePointer()); - RAFList.write(raf, htmlEntries, new HtmlEntry.Serializer(this), 64, true); + RAFList.write(raf, htmlEntries, new HtmlEntry.Serializer(this, null), 64, true); System.out.println("html data start: " + raf.getFilePointer()); assert htmlData == null; RAFList.write(raf, htmlEntries, new HtmlEntry.DataSerializer(), 128, true); diff --git a/src/com/hughes/android/dictionary/engine/HtmlEntry.java b/src/com/hughes/android/dictionary/engine/HtmlEntry.java index ca153a7..ce57e11 100644 --- a/src/com/hughes/android/dictionary/engine/HtmlEntry.java +++ b/src/com/hughes/android/dictionary/engine/HtmlEntry.java @@ -12,6 +12,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 +29,11 @@ public class HtmlEntry extends AbstractEntry implements Comparable { lazyHtmlLoader = null; } - public HtmlEntry(Dictionary dictionary, DataInput raf, final int index) + 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; } @@ -73,14 +74,16 @@ public class HtmlEntry extends AbstractEntry implements Comparable { static final class Serializer implements RAFListSerializer { 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 @@ -210,7 +213,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 +224,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; + raf = inp; + this.ch = ch; numBytes = raf.readInt(); numZipBytes = raf.readInt(); - offset = raf.getFilePointer(); + offset = ch.position(); raf.skipBytes(numZipBytes); } @@ -254,10 +260,10 @@ public class HtmlEntry extends AbstractEntry implements Comparable { System.out.println("Loading Html: numBytes=" + numBytes + ", 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); } -- 2.43.0