10ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi/*
20ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi * Copyright (C) 2013, The Android Open Source Project
30ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi *
40ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi * Licensed under the Apache License, Version 2.0 (the "License");
50ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi * you may not use this file except in compliance with the License.
60ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi * You may obtain a copy of the License at
70ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi *
80ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi *     http://www.apache.org/licenses/LICENSE-2.0
90ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi *
100ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi * Unless required by applicable law or agreed to in writing, software
110ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi * distributed under the License is distributed on an "AS IS" BASIS,
120ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi * See the License for the specific language governing permissions and
140ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi * limitations under the License.
150ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi */
160ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi
1790619ae02b1861e644db6a0d72d0e5f9c195ef3eKeisuke Kuroyanagi#ifndef LATINIME_FORMAT_UTILS_H
1890619ae02b1861e644db6a0d72d0e5f9c195ef3eKeisuke Kuroyanagi#define LATINIME_FORMAT_UTILS_H
190ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi
20cafab169cdb21244c82b99c09983c98066113d87Ken Wakasa#include <cstdint>
210ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi
220ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi#include "defines.h"
234fbb2148ee149ef647f3f43c615911455228f3afKeisuke Kuroyanagi#include "utils/byte_array_view.h"
240ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi
250ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanaginamespace latinime {
260ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi
270ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi/**
280ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi * Methods to handle binary dictionary format version.
290ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi */
3090619ae02b1861e644db6a0d72d0e5f9c195ef3eKeisuke Kuroyanagiclass FormatUtils {
310ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi public:
320ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi    enum FORMAT_VERSION {
332fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa        // These MUST have the same values as the relevant constants in FormatSpec.java.
347c87859d4c16c9cf19b095b865d7000ebc3cdaa9Adrian Velicu        // TODO: Remove VERSION_2 and VERSION_201 when we:
357c87859d4c16c9cf19b095b865d7000ebc3cdaa9Adrian Velicu        // * Confirm that old versions of LatinIME download old-format dictionaries
367c87859d4c16c9cf19b095b865d7000ebc3cdaa9Adrian Velicu        // * We no longer need the corresponding constants on the Java side for dicttool
372fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa        VERSION_2 = 2,
38fb2bde5a688d93aa946e3dd923aa1e99588777fcAkifumi Yoshimoto        VERSION_201 = 201,
397c87859d4c16c9cf19b095b865d7000ebc3cdaa9Adrian Velicu        VERSION_202 = 202,
40455dc84cf2c6526329b535f30000ea45b7d4d4d7Keisuke Kuroyanagi        VERSION_4_ONLY_FOR_TESTING = 399,
41ea468cc9de468b6574f98b3a7614decfcb7e456eKeisuke Kuroyanagi        VERSION_402 = 402,
42ea468cc9de468b6574f98b3a7614decfcb7e456eKeisuke Kuroyanagi        VERSION_403 = 403,
432fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa        UNKNOWN_VERSION = -1
440ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi    };
450ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi
46484fa7b59cb0659ac18fa68da5c7b641d9255be8Keisuke Kuroyanagi    // 32 bit magic number is stored at the beginning of the dictionary header to reject
47484fa7b59cb0659ac18fa68da5c7b641d9255be8Keisuke Kuroyanagi    // unsupported or obsolete dictionary formats.
48484fa7b59cb0659ac18fa68da5c7b641d9255be8Keisuke Kuroyanagi    static const uint32_t MAGIC_NUMBER;
49484fa7b59cb0659ac18fa68da5c7b641d9255be8Keisuke Kuroyanagi
50455dc84cf2c6526329b535f30000ea45b7d4d4d7Keisuke Kuroyanagi    static FORMAT_VERSION getFormatVersion(const int formatVersion);
514fbb2148ee149ef647f3f43c615911455228f3afKeisuke Kuroyanagi    static FORMAT_VERSION detectFormatVersion(const ReadOnlyByteArrayView dictBuffer);
520ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi
530ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi private:
5490619ae02b1861e644db6a0d72d0e5f9c195ef3eKeisuke Kuroyanagi    DISALLOW_IMPLICIT_CONSTRUCTORS(FormatUtils);
550ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi
564fbb2148ee149ef647f3f43c615911455228f3afKeisuke Kuroyanagi    static const size_t DICTIONARY_MINIMUM_SIZE;
570ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi};
580ecfb9424754341d7ee41557fc1f913cb6ca79c2Keisuke Kuroyanagi} // namespace latinime
5990619ae02b1861e644db6a0d72d0e5f9c195ef3eKeisuke Kuroyanagi#endif /* LATINIME_FORMAT_UTILS_H */
60