Remove the code and comments about version 1 format.
Change-Id: I827052f234eeaa4dbcfd37da69a99866896a158bmain
parent
4571b0f682
commit
7ec9db2c34
|
@ -235,7 +235,7 @@ final public class BinaryDictionaryGetter {
|
||||||
new BinaryDictInputOutput.ByteBufferWrapper(inStream.getChannel().map(
|
new BinaryDictInputOutput.ByteBufferWrapper(inStream.getChannel().map(
|
||||||
FileChannel.MapMode.READ_ONLY, 0, f.length()));
|
FileChannel.MapMode.READ_ONLY, 0, f.length()));
|
||||||
final int magic = buffer.readInt();
|
final int magic = buffer.readInt();
|
||||||
if (magic != FormatSpec.VERSION_2_MAGIC_NUMBER) {
|
if (magic != FormatSpec.MAGIC_NUMBER) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
final int formatVersion = buffer.readInt();
|
final int formatVersion = buffer.readInt();
|
||||||
|
|
|
@ -1210,49 +1210,38 @@ public final class BinaryDictInputOutput {
|
||||||
ByteArrayOutputStream headerBuffer = new ByteArrayOutputStream(256);
|
ByteArrayOutputStream headerBuffer = new ByteArrayOutputStream(256);
|
||||||
|
|
||||||
// The magic number in big-endian order.
|
// The magic number in big-endian order.
|
||||||
if (version >= FormatSpec.FIRST_VERSION_WITH_HEADER_SIZE) {
|
// Magic number for all versions.
|
||||||
// Magic number for version 2+.
|
headerBuffer.write((byte) (0xFF & (FormatSpec.MAGIC_NUMBER >> 24)));
|
||||||
headerBuffer.write((byte) (0xFF & (FormatSpec.VERSION_2_MAGIC_NUMBER >> 24)));
|
headerBuffer.write((byte) (0xFF & (FormatSpec.MAGIC_NUMBER >> 16)));
|
||||||
headerBuffer.write((byte) (0xFF & (FormatSpec.VERSION_2_MAGIC_NUMBER >> 16)));
|
headerBuffer.write((byte) (0xFF & (FormatSpec.MAGIC_NUMBER >> 8)));
|
||||||
headerBuffer.write((byte) (0xFF & (FormatSpec.VERSION_2_MAGIC_NUMBER >> 8)));
|
headerBuffer.write((byte) (0xFF & FormatSpec.MAGIC_NUMBER));
|
||||||
headerBuffer.write((byte) (0xFF & FormatSpec.VERSION_2_MAGIC_NUMBER));
|
// Dictionary version.
|
||||||
// Dictionary version.
|
headerBuffer.write((byte) (0xFF & (version >> 8)));
|
||||||
headerBuffer.write((byte) (0xFF & (version >> 8)));
|
headerBuffer.write((byte) (0xFF & version));
|
||||||
headerBuffer.write((byte) (0xFF & version));
|
|
||||||
} else {
|
|
||||||
// Magic number for version 1.
|
|
||||||
headerBuffer.write((byte) (0xFF & (FormatSpec.VERSION_1_MAGIC_NUMBER >> 8)));
|
|
||||||
headerBuffer.write((byte) (0xFF & FormatSpec.VERSION_1_MAGIC_NUMBER));
|
|
||||||
// Dictionary version.
|
|
||||||
headerBuffer.write((byte) (0xFF & version));
|
|
||||||
}
|
|
||||||
// Options flags
|
// Options flags
|
||||||
final int options = makeOptionsValue(dict, formatOptions);
|
final int options = makeOptionsValue(dict, formatOptions);
|
||||||
headerBuffer.write((byte) (0xFF & (options >> 8)));
|
headerBuffer.write((byte) (0xFF & (options >> 8)));
|
||||||
headerBuffer.write((byte) (0xFF & options));
|
headerBuffer.write((byte) (0xFF & options));
|
||||||
if (version >= FormatSpec.FIRST_VERSION_WITH_HEADER_SIZE) {
|
final int headerSizeOffset = headerBuffer.size();
|
||||||
final int headerSizeOffset = headerBuffer.size();
|
// Placeholder to be written later with header size.
|
||||||
// Placeholder to be written later with header size.
|
for (int i = 0; i < 4; ++i) {
|
||||||
for (int i = 0; i < 4; ++i) {
|
headerBuffer.write(0);
|
||||||
headerBuffer.write(0);
|
|
||||||
}
|
|
||||||
// Write out the options.
|
|
||||||
for (final String key : dict.mOptions.mAttributes.keySet()) {
|
|
||||||
final String value = dict.mOptions.mAttributes.get(key);
|
|
||||||
CharEncoding.writeString(headerBuffer, key);
|
|
||||||
CharEncoding.writeString(headerBuffer, value);
|
|
||||||
}
|
|
||||||
final int size = headerBuffer.size();
|
|
||||||
final byte[] bytes = headerBuffer.toByteArray();
|
|
||||||
// Write out the header size.
|
|
||||||
bytes[headerSizeOffset] = (byte) (0xFF & (size >> 24));
|
|
||||||
bytes[headerSizeOffset + 1] = (byte) (0xFF & (size >> 16));
|
|
||||||
bytes[headerSizeOffset + 2] = (byte) (0xFF & (size >> 8));
|
|
||||||
bytes[headerSizeOffset + 3] = (byte) (0xFF & (size >> 0));
|
|
||||||
destination.write(bytes);
|
|
||||||
} else {
|
|
||||||
headerBuffer.writeTo(destination);
|
|
||||||
}
|
}
|
||||||
|
// Write out the options.
|
||||||
|
for (final String key : dict.mOptions.mAttributes.keySet()) {
|
||||||
|
final String value = dict.mOptions.mAttributes.get(key);
|
||||||
|
CharEncoding.writeString(headerBuffer, key);
|
||||||
|
CharEncoding.writeString(headerBuffer, value);
|
||||||
|
}
|
||||||
|
final int size = headerBuffer.size();
|
||||||
|
final byte[] bytes = headerBuffer.toByteArray();
|
||||||
|
// Write out the header size.
|
||||||
|
bytes[headerSizeOffset] = (byte) (0xFF & (size >> 24));
|
||||||
|
bytes[headerSizeOffset + 1] = (byte) (0xFF & (size >> 16));
|
||||||
|
bytes[headerSizeOffset + 2] = (byte) (0xFF & (size >> 8));
|
||||||
|
bytes[headerSizeOffset + 3] = (byte) (0xFF & (size >> 0));
|
||||||
|
destination.write(bytes);
|
||||||
|
|
||||||
headerBuffer.close();
|
headerBuffer.close();
|
||||||
|
|
||||||
|
@ -1658,10 +1647,8 @@ public final class BinaryDictInputOutput {
|
||||||
*/
|
*/
|
||||||
private static int getFormatVersion(final FusionDictionaryBufferInterface buffer)
|
private static int getFormatVersion(final FusionDictionaryBufferInterface buffer)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
final int magic_v1 = buffer.readUnsignedShort();
|
final int magic = buffer.readInt();
|
||||||
if (FormatSpec.VERSION_1_MAGIC_NUMBER == magic_v1) return buffer.readUnsignedByte();
|
if (FormatSpec.MAGIC_NUMBER == magic) return buffer.readUnsignedShort();
|
||||||
final int magic_v2 = (magic_v1 << 16) + buffer.readUnsignedShort();
|
|
||||||
if (FormatSpec.VERSION_2_MAGIC_NUMBER == magic_v2) return buffer.readUnsignedShort();
|
|
||||||
return FormatSpec.NOT_A_VERSION_NUMBER;
|
return FormatSpec.NOT_A_VERSION_NUMBER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1695,13 +1682,9 @@ public final class BinaryDictInputOutput {
|
||||||
|
|
||||||
final HashMap<String, String> attributes = new HashMap<String, String>();
|
final HashMap<String, String> attributes = new HashMap<String, String>();
|
||||||
final int headerSize;
|
final int headerSize;
|
||||||
if (version < FormatSpec.FIRST_VERSION_WITH_HEADER_SIZE) {
|
headerSize = buffer.readInt();
|
||||||
headerSize = buffer.position();
|
populateOptions(buffer, headerSize, attributes);
|
||||||
} else {
|
buffer.position(headerSize);
|
||||||
headerSize = buffer.readInt();
|
|
||||||
populateOptions(buffer, headerSize, attributes);
|
|
||||||
buffer.position(headerSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (headerSize < 0) {
|
if (headerSize < 0) {
|
||||||
throw new UnsupportedFormatException("header size can't be negative.");
|
throw new UnsupportedFormatException("header size can't be negative.");
|
||||||
|
|
|
@ -25,6 +25,40 @@ import com.android.inputmethod.latin.makedict.FusionDictionary.DictionaryOptions
|
||||||
*/
|
*/
|
||||||
public final class FormatSpec {
|
public final class FormatSpec {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* File header layout is as follows:
|
||||||
|
*
|
||||||
|
* v |
|
||||||
|
* e | MAGIC_NUMBER + version of the file format, 2 bytes.
|
||||||
|
* r |
|
||||||
|
* sion
|
||||||
|
*
|
||||||
|
* o |
|
||||||
|
* p | not used 4 bits
|
||||||
|
* t | has bigrams ? 1 bit, 1 = yes, 0 = no : CONTAINS_BIGRAMS_FLAG
|
||||||
|
* i | FRENCH_LIGATURE_PROCESSING_FLAG
|
||||||
|
* o | supports dynamic updates ? 1 bit, 1 = yes, 0 = no : SUPPORTS_DYNAMIC_UPDATE
|
||||||
|
* n | GERMAN_UMLAUT_PROCESSING_FLAG
|
||||||
|
* f |
|
||||||
|
* lags
|
||||||
|
*
|
||||||
|
* h |
|
||||||
|
* e | size of the file header, 4bytes
|
||||||
|
* a | including the size of the magic number, the option flags and the header size
|
||||||
|
* d |
|
||||||
|
* ersize
|
||||||
|
*
|
||||||
|
* | attributes list
|
||||||
|
*
|
||||||
|
* attributes list is:
|
||||||
|
* <key> = | string of characters at the char format described below, with the terminator used
|
||||||
|
* | to signal the end of the string.
|
||||||
|
* <value> = | string of characters at the char format described below, with the terminator used
|
||||||
|
* | to signal the end of the string.
|
||||||
|
* if the size of already read < headersize, goto key.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Array of Node(FusionDictionary.Node) layout is as follows:
|
* Array of Node(FusionDictionary.Node) layout is as follows:
|
||||||
*
|
*
|
||||||
|
@ -151,12 +185,10 @@ public final class FormatSpec {
|
||||||
* if (FLAG_ATTRIBUTE_HAS_NEXT goto flags
|
* if (FLAG_ATTRIBUTE_HAS_NEXT goto flags
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static final int VERSION_1_MAGIC_NUMBER = 0x78B1;
|
public static final int MAGIC_NUMBER = 0x9BC13AFE;
|
||||||
public static final int VERSION_2_MAGIC_NUMBER = 0x9BC13AFE;
|
static final int MINIMUM_SUPPORTED_VERSION = 2;
|
||||||
static final int MINIMUM_SUPPORTED_VERSION = 1;
|
|
||||||
static final int MAXIMUM_SUPPORTED_VERSION = 3;
|
static final int MAXIMUM_SUPPORTED_VERSION = 3;
|
||||||
static final int NOT_A_VERSION_NUMBER = -1;
|
static final int NOT_A_VERSION_NUMBER = -1;
|
||||||
static final int FIRST_VERSION_WITH_HEADER_SIZE = 2;
|
|
||||||
static final int FIRST_VERSION_WITH_DYNAMIC_UPDATE = 3;
|
static final int FIRST_VERSION_WITH_DYNAMIC_UPDATE = 3;
|
||||||
|
|
||||||
// These options need to be the same numeric values as the one in the native reading code.
|
// These options need to be the same numeric values as the one in the native reading code.
|
||||||
|
|
Loading…
Reference in New Issue