Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e9a10ff0 authored by Yuichiro Hanada's avatar Yuichiro Hanada
Browse files

Add DictDecoder.readDictionaryBinary.

Bug: 10434720
Change-Id: I14690a6e0f922ed1bab3a4b6c9a457ae84d4c1a4
parent b64157bf
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -229,8 +229,6 @@ final public class BinaryDictionaryGetter {
        try {
            // Read the version of the file
            final Ver3DictDecoder dictDecoder = new Ver3DictDecoder(f);
            dictDecoder.openDictBuffer(
                    new Ver3DictDecoder.DictionaryBufferFromReadOnlyByteBufferFactory());
            final FileHeader header = dictDecoder.readHeader();

            final String version = header.mDictionaryOptions.mAttributes.get(VERSION_KEY);
+1 −9
Original line number Diff line number Diff line
@@ -559,17 +559,9 @@ public final class BinaryDictDecoderUtils {
     * @return the created (or merged) dictionary.
     */
    @UsedForTesting
    public static FusionDictionary readDictionaryBinary(final Ver3DictDecoder dictDecoder,
    /* package */ static FusionDictionary readDictionaryBinary(final Ver3DictDecoder dictDecoder,
            final FusionDictionary dict) throws FileNotFoundException, IOException,
            UnsupportedFormatException {

        // if the buffer has not been opened, open the buffer with bytebuffer.
        if (dictDecoder.getDictBuffer() == null) dictDecoder.openDictBuffer(
                new Ver3DictDecoder.DictionaryBufferFromReadOnlyByteBufferFactory());
        if (dictDecoder.getDictBuffer() == null) {
            MakedictLog.e("Cannot open the buffer");
        }

        // Read header
        final FileHeader fileHeader = dictDecoder.readHeader();

+14 −13
Original line number Diff line number Diff line
@@ -521,8 +521,8 @@ public final class BinaryDictIOUtils {
            final File file, final long offset, final long length)
            throws FileNotFoundException, IOException, UnsupportedFormatException {
        final byte[] buffer = new byte[HEADER_READING_BUFFER_SIZE];
        final Ver3DictDecoder dictDecoder = new Ver3DictDecoder(file);
        dictDecoder.openDictBuffer(new DictDecoder.DictionaryBufferFactory() {
        final Ver3DictDecoder dictDecoder = new Ver3DictDecoder(file,
                new DictDecoder.DictionaryBufferFactory() {
                    @Override
                    public DictBuffer getDictionaryBuffer(File file)
                            throws FileNotFoundException, IOException {
@@ -534,7 +534,8 @@ public final class BinaryDictIOUtils {
                            inStream.close();
                        }
                    }
        });
                }
        );
        return dictDecoder.readHeader();
    }

+20 −0
Original line number Diff line number Diff line
@@ -44,6 +44,26 @@ public interface DictDecoder {
     */
    public CharGroupInfo readPtNode(final int ptNodePos, final FormatOptions formatOptions);

    /**
     * Reads a buffer and returns the memory representation of the dictionary.
     *
     * This high-level method takes a buffer and reads its contents, populating a
     * FusionDictionary structure. The optional dict argument is an existing dictionary to
     * which words from the buffer should be added. If it is null, a new dictionary is created.
     *
     * @param dict an optional dictionary to add words to, or null.
     * @return the created (or merged) dictionary.
     */
    @UsedForTesting
    public FusionDictionary readDictionaryBinary(final FusionDictionary dict)
            throws FileNotFoundException, IOException, UnsupportedFormatException;

    // Flags for DictionaryBufferFactory.
    public static final int USE_READONLY_BYTEBUFFER = 0x01000000;
    public static final int USE_BYTEARRAY = 0x02000000;
    public static final int USE_WRITABLE_BYTEBUFFER = 0x04000000;
    public static final int MASK_DICTBUFFER = 0x0F000000;

    public interface DictionaryBufferFactory {
        public DictBuffer getDictionaryBuffer(final File file)
                throws FileNotFoundException, IOException;
+38 −7
Original line number Diff line number Diff line
@@ -165,31 +165,53 @@ public class Ver3DictDecoder implements DictDecoder {
    }

    private final File mDictionaryBinaryFile;
    private final DictionaryBufferFactory mBufferFactory;
    private DictBuffer mDictBuffer;

    public Ver3DictDecoder(final File file) {
        this(file, USE_READONLY_BYTEBUFFER);
    }

    public Ver3DictDecoder(final File file, final int factoryFlag) {
        mDictionaryBinaryFile = file;
        mDictBuffer = null;

        if ((factoryFlag & MASK_DICTBUFFER) == USE_READONLY_BYTEBUFFER) {
            mBufferFactory = new DictionaryBufferFromReadOnlyByteBufferFactory();
        } else if ((factoryFlag  & MASK_DICTBUFFER) == USE_BYTEARRAY) {
            mBufferFactory = new DictionaryBufferFromByteArrayFactory();
        } else if ((factoryFlag & MASK_DICTBUFFER) == USE_WRITABLE_BYTEBUFFER) {
            mBufferFactory = new DictionaryBufferFromWritableByteBufferFactory();
        } else {
            mBufferFactory = new DictionaryBufferFromReadOnlyByteBufferFactory();
        }
    }

    public Ver3DictDecoder(final File file, final DictionaryBufferFactory factory) {
        mDictionaryBinaryFile = file;
        mBufferFactory = factory;
    }

    public void openDictBuffer(final DictDecoder.DictionaryBufferFactory factory)
            throws FileNotFoundException, IOException {
        mDictBuffer = factory.getDictionaryBuffer(mDictionaryBinaryFile);
    public void openDictBuffer() throws FileNotFoundException, IOException {
        mDictBuffer = mBufferFactory.getDictionaryBuffer(mDictionaryBinaryFile);
    }

    public DictBuffer getDictBuffer() {
    /* package */ DictBuffer getDictBuffer() {
        return mDictBuffer;
    }

    @UsedForTesting
    public DictBuffer openAndGetDictBuffer(final DictDecoder.DictionaryBufferFactory factory)
                    throws FileNotFoundException, IOException {
        openDictBuffer(factory);
    /* package */ DictBuffer openAndGetDictBuffer() throws FileNotFoundException, IOException {
        openDictBuffer();
        return getDictBuffer();
    }

    @Override
    public FileHeader readHeader() throws IOException, UnsupportedFormatException {
        if (mDictBuffer == null) {
            openDictBuffer();
        }

        final int version = HeaderReader.readVersion(mDictBuffer);
        final int optionsFlags = HeaderReader.readOptionFlags(mDictBuffer);

@@ -278,4 +300,13 @@ public class Ver3DictDecoder implements DictDecoder {
        return new CharGroupInfo(ptNodePos, addressPointer, flags, characters, frequency,
                parentAddress, childrenAddress, shortcutTargets, bigrams);
    }

    @Override
    public FusionDictionary readDictionaryBinary(final FusionDictionary dict)
            throws FileNotFoundException, IOException, UnsupportedFormatException {
        if (mDictBuffer == null) {
            openDictBuffer();
        }
        return BinaryDictDecoderUtils.readDictionaryBinary(this, dict);
    }
}
Loading