From 62ed9011002817cc78f3a1de39a1171cb136176a Mon Sep 17 00:00:00 2001 From: Yuichiro Hanada Date: Thu, 30 Aug 2012 13:03:31 +0900 Subject: [PATCH] add readHeader. Change-Id: I5be5d62a63ca897e36fe93200ffdca6befb363aa --- .../latin/makedict/BinaryDictInputOutput.java | 65 +++++++++++++------ 1 file changed, 45 insertions(+), 20 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java b/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java index 99fef3493..d4f7cab5c 100644 --- a/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java +++ b/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java @@ -1380,6 +1380,48 @@ public class BinaryDictInputOutput { return NOT_A_VERSION_NUMBER; } + /** + * Helper function to get and validate the binary format version. + * @throws UnsupportedFormatException + * @throws IOException + */ + private static int checkFormatVersion(final FusionDictionaryBufferInterface buffer) + throws IOException, UnsupportedFormatException { + final int version = getFormatVersion(buffer); + if (version < MINIMUM_SUPPORTED_VERSION || version > MAXIMUM_SUPPORTED_VERSION) { + throw new UnsupportedFormatException("This file has version " + version + + ", but this implementation does not support versions above " + + MAXIMUM_SUPPORTED_VERSION); + } + return version; + } + + /** + * Reads a header from a buffer. + * @throws IOException + * @throws UnsupportedFormatException + */ + private static int readHeader(final FusionDictionaryBufferInterface buffer, + final HashMap options, + final int version) + throws IOException, UnsupportedFormatException { + + final int headerSize; + if (version < FIRST_VERSION_WITH_HEADER_SIZE) { + headerSize = buffer.position(); + } else { + headerSize = buffer.readInt(); + populateOptions(buffer, headerSize, options); + buffer.position(headerSize); + } + + if (headerSize < 0) { + throw new UnsupportedFormatException("header size can't be negative."); + } + + return headerSize; + } + /** * Reads options from a buffer and populate a map with their contents. * @@ -1414,33 +1456,16 @@ public class BinaryDictInputOutput { public static FusionDictionary readDictionaryBinary( final FusionDictionaryBufferInterface buffer, final FusionDictionary dict) throws IOException, UnsupportedFormatException { - // Check file version - final int version = getFormatVersion(buffer); - if (version < MINIMUM_SUPPORTED_VERSION || version > MAXIMUM_SUPPORTED_VERSION) { - throw new UnsupportedFormatException("This file has version " + version - + ", but this implementation does not support versions above " - + MAXIMUM_SUPPORTED_VERSION); - } // clear cache wordCache.clear(); - // Read options + // Read header + final int version = checkFormatVersion(buffer); final int optionsFlags = buffer.readUnsignedShort(); - final int headerSize; final HashMap options = new HashMap(); - if (version < FIRST_VERSION_WITH_HEADER_SIZE) { - headerSize = buffer.position(); - } else { - headerSize = buffer.readInt(); - populateOptions(buffer, headerSize, options); - buffer.position(headerSize); - } - - if (headerSize < 0) { - throw new UnsupportedFormatException("header size can't be negative."); - } + final int headerSize = readHeader(buffer, options, version); Map reverseNodeMapping = new TreeMap(); Map reverseGroupMapping = new TreeMap();