aboutsummaryrefslogtreecommitdiffstats
path: root/tools/dicttool/src
diff options
context:
space:
mode:
authorJean Chalard <jchalard@google.com>2012-10-23 17:14:12 +0900
committerJean Chalard <jchalard@google.com>2012-10-25 16:40:15 +0900
commitb3c98901c5fc1460b54cdf27d74405f27c88e74b (patch)
tree4b076617d541c97b05249c337b1aeb79980f0182 /tools/dicttool/src
parent77fe603a3d82f5fc28816520bac479ff48bf15e5 (diff)
downloadlatinime-b3c98901c5fc1460b54cdf27d74405f27c88e74b.tar.gz
latinime-b3c98901c5fc1460b54cdf27d74405f27c88e74b.tar.xz
latinime-b3c98901c5fc1460b54cdf27d74405f27c88e74b.zip
Add auto detection and decoding of dictionary files. (A2)
Bug: 7388852 Change-Id: I25e755fc15f5b383acc046f668e9681efa4f0c2f
Diffstat (limited to 'tools/dicttool/src')
-rw-r--r--tools/dicttool/src/com/android/inputmethod/latin/dicttool/BinaryDictOffdeviceUtils.java82
-rw-r--r--tools/dicttool/src/com/android/inputmethod/latin/dicttool/Compress.java14
2 files changed, 84 insertions, 12 deletions
diff --git a/tools/dicttool/src/com/android/inputmethod/latin/dicttool/BinaryDictOffdeviceUtils.java b/tools/dicttool/src/com/android/inputmethod/latin/dicttool/BinaryDictOffdeviceUtils.java
index 83c5d9ac6..9dcd7eb42 100644
--- a/tools/dicttool/src/com/android/inputmethod/latin/dicttool/BinaryDictOffdeviceUtils.java
+++ b/tools/dicttool/src/com/android/inputmethod/latin/dicttool/BinaryDictOffdeviceUtils.java
@@ -16,19 +16,42 @@
package com.android.inputmethod.latin.dicttool;
+import com.android.inputmethod.latin.makedict.BinaryDictInputOutput;
+
+import java.io.File;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
import java.io.IOException;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
+import java.util.ArrayList;
/**
-* Class grouping utilities for offline dictionary making.
-*
-* Those should not be used on-device, essentially because they are quite
-* liberal about I/O and performance.
-*/
-public class BinaryDictOffdeviceUtils {
+ * Class grouping utilities for offline dictionary making.
+ *
+ * Those should not be used on-device, essentially because they are quite
+ * liberal about I/O and performance.
+ */
+public final class BinaryDictOffdeviceUtils {
+ // Prefix and suffix are arbitrary, the values do not really matter
+ private final static String PREFIX = "dicttool";
+ private final static String SUFFIX = ".tmp";
+
+ public final static String COMPRESSION = "compression";
+
+ public static class DecoderChainSpec {
+ ArrayList<String> mDecoderSpec = new ArrayList<String>();
+ File mFile;
+ public DecoderChainSpec addStep(final String stepDescription) {
+ mDecoderSpec.add(stepDescription);
+ return this;
+ }
+ }
+
public static void copy(final InputStream input, final OutputStream output) throws IOException {
final byte[] buffer = new byte[1000];
final BufferedInputStream in = new BufferedInputStream(input);
@@ -38,4 +61,51 @@ public class BinaryDictOffdeviceUtils {
in.close();
out.close();
}
+
+ /**
+ * Returns a decrypted/uncompressed binary dictionary.
+ *
+ * This will decrypt/uncompress any number of times as necessary until it finds the binary
+ * dictionary signature, and copy the decoded file to a temporary place.
+ * If this is not a binary dictionary, the method returns null.
+ */
+ public static DecoderChainSpec getRawBinaryDictionaryOrNull(final File src) {
+ return getRawBinaryDictionaryOrNullInternal(new DecoderChainSpec(), src);
+ }
+
+ private static DecoderChainSpec getRawBinaryDictionaryOrNullInternal(
+ final DecoderChainSpec spec, final File src) {
+ // TODO: arrange for the intermediary files to be deleted
+ if (BinaryDictInputOutput.isBinaryDictionary(src)) {
+ spec.mFile = src;
+ return spec;
+ }
+ // It's not a raw dictionary - try to see if it's compressed.
+ final File uncompressedFile = tryGetUncompressedFile(src);
+ if (null != uncompressedFile) {
+ final DecoderChainSpec newSpec =
+ getRawBinaryDictionaryOrNullInternal(spec, uncompressedFile);
+ if (null == newSpec) return null;
+ return newSpec.addStep(COMPRESSION);
+ }
+ return null;
+ }
+
+ /* Try to uncompress the file passed as an argument.
+ *
+ * If the file can be uncompressed, the uncompressed version is returned. Otherwise, null
+ * is returned.
+ */
+ private static File tryGetUncompressedFile(final File src) {
+ try {
+ final File dst = File.createTempFile(PREFIX, SUFFIX);
+ final FileOutputStream dstStream = new FileOutputStream(dst);
+ copy(Compress.getUncompressedStream(new BufferedInputStream(new FileInputStream(src))),
+ new BufferedOutputStream(dstStream)); // #copy() closes the streams
+ return dst;
+ } catch (IOException e) {
+ // Could not uncompress the file: presumably the file is simply not a compressed file
+ return null;
+ }
+ }
}
diff --git a/tools/dicttool/src/com/android/inputmethod/latin/dicttool/Compress.java b/tools/dicttool/src/com/android/inputmethod/latin/dicttool/Compress.java
index 49e90ada2..072de5c01 100644
--- a/tools/dicttool/src/com/android/inputmethod/latin/dicttool/Compress.java
+++ b/tools/dicttool/src/com/android/inputmethod/latin/dicttool/Compress.java
@@ -16,6 +16,8 @@
package com.android.inputmethod.latin.dicttool;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
@@ -27,12 +29,12 @@ import java.util.zip.GZIPOutputStream;
public class Compress {
- private static OutputStream getCompressedStream(final OutputStream out)
+ public static OutputStream getCompressedStream(final OutputStream out)
throws java.io.IOException {
return new GZIPOutputStream(out);
}
- private static InputStream getUncompressedStream(final InputStream in) throws IOException {
+ public static InputStream getUncompressedStream(final InputStream in) throws IOException {
return new GZIPInputStream(in);
}
@@ -55,9 +57,9 @@ public class Compress {
final String inFilename = mArgs.length >= 1 ? mArgs[0] : STDIN_OR_STDOUT;
final String outFilename = mArgs.length >= 2 ? mArgs[1] : STDIN_OR_STDOUT;
final InputStream input = inFilename.equals(STDIN_OR_STDOUT) ? System.in
- : new FileInputStream(new File(inFilename));
+ : new BufferedInputStream(new FileInputStream(new File(inFilename)));
final OutputStream output = outFilename.equals(STDIN_OR_STDOUT) ? System.out
- : new FileOutputStream(new File(outFilename));
+ : new BufferedOutputStream(new FileOutputStream(new File(outFilename)));
BinaryDictOffdeviceUtils.copy(input, new GZIPOutputStream(output));
}
}
@@ -81,9 +83,9 @@ public class Compress {
final String inFilename = mArgs.length >= 1 ? mArgs[0] : STDIN_OR_STDOUT;
final String outFilename = mArgs.length >= 2 ? mArgs[1] : STDIN_OR_STDOUT;
final InputStream input = inFilename.equals(STDIN_OR_STDOUT) ? System.in
- : new FileInputStream(new File(inFilename));
+ : new BufferedInputStream(new FileInputStream(new File(inFilename)));
final OutputStream output = outFilename.equals(STDIN_OR_STDOUT) ? System.out
- : new FileOutputStream(new File(outFilename));
+ : new BufferedOutputStream(new FileOutputStream(new File(outFilename)));
BinaryDictOffdeviceUtils.copy(new GZIPInputStream(input), output);
}
}