From 49583e178d3673fd1cade2f306d97303ffbd4a0a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Reimar=20D=C3=B6ffinger?= Date: Sun, 20 Aug 2017 14:38:49 +0200 Subject: [PATCH] Support opening .quickdic files from file manager. --- AndroidManifest.xml | 18 ++++ Util | 2 +- .../dictionary/DictionaryActivity.java | 87 +++++++++++++------ .../android/dictionary/engine/Dictionary.java | 38 +++++--- .../android/dictionary/engine/Index.java | 28 +++--- 5 files changed, 122 insertions(+), 51 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index a94fcfe..945d192 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -87,6 +87,24 @@ + + + + + + + + { indices = new ArrayList(); } - public Dictionary(final RandomAccessFile raf) throws IOException { + public Dictionary(final FileChannel ch) throws IOException { + DataInput raf = new DataInputStream(Channels.newInputStream(ch)); dictFileVersion = raf.readInt(); if (dictFileVersion < 0 || dictFileVersion > CURRENT_DICT_VERSION) { throw new IOException("Invalid dictionary version: " + dictFileVersion); @@ -77,31 +81,31 @@ public class Dictionary implements RAFSerializable { // Load the sources, then seek past them, because reading them later // disrupts the offset. try { - final RAFList rafSources = RAFList.create(raf, new EntrySource.Serializer( - this), raf.getFilePointer(), dictFileVersion, dictInfo + " sources: "); + final RAFList rafSources = RAFList.create(ch, new EntrySource.Serializer( + this), ch.position(), dictFileVersion, dictInfo + " sources: "); sources = new ArrayList(rafSources); - raf.seek(rafSources.getEndOffset()); + ch.position(rafSources.getEndOffset()); pairEntries = CachingList.create( - RAFList.create(raf, new PairEntry.Serializer(this), raf.getFilePointer(), dictFileVersion, dictInfo + " pairs: "), + RAFList.create(ch, new PairEntry.Serializer(this), ch.position(), dictFileVersion, dictInfo + " pairs: "), CACHE_SIZE); textEntries = CachingList.create( - RAFList.create(raf, new TextEntry.Serializer(this), raf.getFilePointer(), dictFileVersion, dictInfo + " text: "), + RAFList.create(ch, new TextEntry.Serializer(this), ch.position(), dictFileVersion, dictInfo + " text: "), CACHE_SIZE); if (dictFileVersion >= 5) { htmlEntries = CachingList.create( - RAFList.create(raf, new HtmlEntry.Serializer(this), raf.getFilePointer(), dictFileVersion, dictInfo + " html: "), + RAFList.create(ch, new HtmlEntry.Serializer(this), ch.position(), dictFileVersion, dictInfo + " html: "), CACHE_SIZE); } else { htmlEntries = Collections.emptyList(); } if (dictFileVersion >= 7) { - htmlData = RAFList.create(raf, new HtmlEntry.DataDeserializer(), raf.getFilePointer(), dictFileVersion, dictInfo + " html: "); + htmlData = RAFList.create(ch, new HtmlEntry.DataDeserializer(), ch.position(), dictFileVersion, dictInfo + " html: "); } else { htmlData = null; } - indices = CachingList.createFullyCached(RAFList.create(raf, indexSerializer, - raf.getFilePointer(), dictFileVersion, dictInfo + " index: ")); + indices = CachingList.createFullyCached(RAFList.create(ch, new IndexSerializer(ch), + ch.position(), dictFileVersion, dictInfo + " index: ")); } catch (RuntimeException e) { final IOException ioe = new IOException("RuntimeException loading dictionary"); ioe.initCause(e); @@ -131,15 +135,21 @@ public class Dictionary implements RAFSerializable { assert htmlData == null; RAFList.write(raf, htmlEntries, new HtmlEntry.DataSerializer(), 128, true); System.out.println("indices start: " + raf.getFilePointer()); - RAFList.write(raf, indices, indexSerializer); + RAFList.write(raf, indices, new IndexSerializer(null)); System.out.println("end: " + raf.getFilePointer()); raf.writeUTF(END_OF_DICTIONARY); } - private final RAFListSerializer indexSerializer = new RAFListSerializer() { + private final class IndexSerializer implements RAFListSerializer { + private final FileChannel ch; + + public IndexSerializer(FileChannel ch) { + this.ch = ch; + } + @Override public Index read(DataInput raf, final int readIndex) throws IOException { - return new Index(Dictionary.this, raf); + return new Index(Dictionary.this, ch, raf); } @Override @@ -187,7 +197,7 @@ public class Dictionary implements RAFSerializable { RandomAccessFile raf = null; try { raf = new RandomAccessFile(file, "r"); - final Dictionary dict = new Dictionary(raf); + final Dictionary dict = new Dictionary(raf.getChannel()); final DictionaryInfo dictionaryInfo = dict.getDictionaryInfo(); dictionaryInfo.uncompressedFilename = file.getName(); dictionaryInfo.uncompressedBytes = file.length(); diff --git a/src/com/hughes/android/dictionary/engine/Index.java b/src/com/hughes/android/dictionary/engine/Index.java index 04691ff..c254d30 100644 --- a/src/com/hughes/android/dictionary/engine/Index.java +++ b/src/com/hughes/android/dictionary/engine/Index.java @@ -32,10 +32,13 @@ import com.hughes.util.raf.UniformRAFList; import com.ibm.icu.text.Transliterator; import java.io.DataInput; +import java.io.DataInputStream; import java.io.DataOutput; import java.io.IOException; import java.io.PrintStream; import java.io.RandomAccessFile; +import java.nio.channels.Channels; +import java.nio.channels.FileChannel; import java.util.AbstractList; import java.util.ArrayList; import java.util.Collection; @@ -117,9 +120,8 @@ public final class Index implements RAFSerializable { return new NormalizeComparator(normalizer(), sortLanguage.getCollator(), dict.dictFileVersion); } - public Index(final Dictionary dict, final DataInput inp) throws IOException { + public Index(final Dictionary dict, final FileChannel inp, final DataInput raf) throws IOException { this.dict = dict; - RandomAccessFile raf = (RandomAccessFile)inp; shortName = raf.readUTF(); longName = raf.readUTF(); final String languageCode = raf.readUTF(); @@ -133,7 +135,7 @@ public final class Index implements RAFSerializable { mainTokenCount = raf.readInt(); } sortedIndexEntries = CachingList.create( - RAFList.create(raf, indexEntrySerializer, raf.getFilePointer(), + RAFList.create(inp, new IndexEntrySerializer(dict.dictFileVersion == 6 ? inp : null), inp.position(), dict.dictFileVersion, dict.dictInfo + " idx " + languageCode + ": "), CACHE_SIZE); if (dict.dictFileVersion >= 7) { int count = StringUtil.readVarInt(raf); @@ -147,7 +149,7 @@ public final class Index implements RAFSerializable { stoplist = Collections.emptySet(); } rows = CachingList.create( - UniformRAFList.create(raf, new RowBase.Serializer(this), raf.getFilePointer()), + UniformRAFList.create(inp, new RowBase.Serializer(this), inp.position()), CACHE_SIZE); } @@ -162,7 +164,7 @@ public final class Index implements RAFSerializable { if (dict.dictFileVersion >= 2) { raf.writeInt(mainTokenCount); } - RAFList.write(raf, sortedIndexEntries, indexEntrySerializer, 32, true); + RAFList.write(raf, sortedIndexEntries, new IndexEntrySerializer(null), 32, true); StringUtil.writeVarInt(raf, stoplist.size()); for (String i : stoplist) { raf.writeUTF(i); @@ -176,10 +178,16 @@ public final class Index implements RAFSerializable { } } - private final RAFSerializer indexEntrySerializer = new RAFSerializer() { + private final class IndexEntrySerializer implements RAFSerializer { + private final FileChannel ch; + + public IndexEntrySerializer(FileChannel ch) { + this.ch = ch; + } + @Override public IndexEntry read(DataInput raf) throws IOException { - return new IndexEntry(Index.this, raf); + return new IndexEntry(Index.this, ch, raf); } @Override @@ -206,7 +214,7 @@ public final class Index implements RAFSerializable { this.htmlEntries = new ArrayList(); } - public IndexEntry(final Index index, final DataInput raf) throws IOException { + public IndexEntry(final Index index, final FileChannel ch, final DataInput raf) throws IOException { token = raf.readUTF(); if (index.dict.dictFileVersion >= 7) { startRow = StringUtil.readVarInt(raf); @@ -239,8 +247,8 @@ public final class Index implements RAFSerializable { } } else if (index.dict.dictFileVersion >= 6) { this.htmlEntries = CachingList.create( - RAFList.create((RandomAccessFile)raf, index.dict.htmlEntryIndexSerializer, - ((RandomAccessFile)raf).getFilePointer(), index.dict.dictFileVersion, + RAFList.create(ch, index.dict.htmlEntryIndexSerializer, + ch.position(), index.dict.dictFileVersion, index.dict.dictInfo + " htmlEntries: "), 1); } else { this.htmlEntries = Collections.emptyList(); -- 2.43.0