header_read_write_utils.cpp revision 5754817a5e2e804f5ced54e601d4c08087d75b44
1bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi/*
2bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi * Copyright (C) 2013, The Android Open Source Project
3bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi *
4bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi * Licensed under the Apache License, Version 2.0 (the "License");
5bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi * you may not use this file except in compliance with the License.
6bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi * You may obtain a copy of the License at
7bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi *
8bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi *     http://www.apache.org/licenses/LICENSE-2.0
9bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi *
10bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi * Unless required by applicable law or agreed to in writing, software
11bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi * distributed under the License is distributed on an "AS IS" BASIS,
12bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi * See the License for the specific language governing permissions and
14bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi * limitations under the License.
15bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi */
16bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi
1723d3ed962f150578d98da7b9c61c0466d5697d93Keisuke Kuroyanagi#include "suggest/policyimpl/dictionary/header/header_reading_utils.h"
18bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi
195754817a5e2e804f5ced54e601d4c08087d75b44Keisuke Kuroyanagi#include <vector>
20bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi
21bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi#include "defines.h"
2290619ae02b1861e644db6a0d72d0e5f9c195ef3eKeisuke Kuroyanagi#include "suggest/policyimpl/dictionary/utils/byte_array_utils.h"
23bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi
24bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynaginamespace latinime {
25bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi
265754817a5e2e804f5ced54e601d4c08087d75b44Keisuke Kuroyanagiconst int HeaderReadingUtils::MAX_ATTRIBUTE_KEY_LENGTH = 256;
275754817a5e2e804f5ced54e601d4c08087d75b44Keisuke Kuroyanagiconst int HeaderReadingUtils::MAX_ATTRIBUTE_VALUE_LENGTH = 256;
28bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi
2976e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagiconst int HeaderReadingUtils::HEADER_MAGIC_NUMBER_SIZE = 4;
3076e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagiconst int HeaderReadingUtils::HEADER_DICTIONARY_VERSION_SIZE = 2;
3176e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagiconst int HeaderReadingUtils::HEADER_FLAG_SIZE = 2;
3276e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagiconst int HeaderReadingUtils::HEADER_SIZE_FIELD_SIZE = 4;
3376e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi
345754817a5e2e804f5ced54e601d4c08087d75b44Keisuke Kuroyanagiconst HeaderReadingUtils::DictionaryFlags HeaderReadingUtils::NO_FLAGS = 0;
35bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi// Flags for special processing
3646ebaa49e9d2ee0ee00d1b82c23c47b8982f7ecaYuichiro Hanada// Those *must* match the flags in makedict (FormatSpec#*_PROCESSING_FLAG) or
37bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi// something very bad (like, the apocalypse) will happen. Please update both at the same time.
3876e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagiconst HeaderReadingUtils::DictionaryFlags
3976e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi        HeaderReadingUtils::GERMAN_UMLAUT_PROCESSING_FLAG = 0x1;
4076e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagiconst HeaderReadingUtils::DictionaryFlags
4176e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi        HeaderReadingUtils::SUPPORTS_DYNAMIC_UPDATE_FLAG = 0x2;
4276e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagiconst HeaderReadingUtils::DictionaryFlags
4376e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi        HeaderReadingUtils::FRENCH_LIGATURE_PROCESSING_FLAG = 0x4;
44bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi
4576e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi/* static */ int HeaderReadingUtils::getHeaderSize(const uint8_t *const dictBuf) {
4699007de979e006b6b08bf381f2d394377264de85Keisuke Kuroyanagi    // See the format of the header in the comment in
4799007de979e006b6b08bf381f2d394377264de85Keisuke Kuroyanagi    // BinaryDictionaryFormatUtils::detectFormatVersion()
4876e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi    return ByteArrayUtils::readUint32(dictBuf, HEADER_MAGIC_NUMBER_SIZE
4976e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi            + HEADER_DICTIONARY_VERSION_SIZE + HEADER_FLAG_SIZE);
50bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi}
51bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi
5276e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi/* static */ HeaderReadingUtils::DictionaryFlags
5376e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi        HeaderReadingUtils::getFlags(const uint8_t *const dictBuf) {
5476e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi    return ByteArrayUtils::readUint16(dictBuf,
5576e579c7caf2ef04f440be21c27377fe0b4150ffKeisuke Kuroyanagi            HEADER_MAGIC_NUMBER_SIZE + HEADER_DICTIONARY_VERSION_SIZE);
56bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi}
57bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi
585754817a5e2e804f5ced54e601d4c08087d75b44Keisuke Kuroyanagi/* static */ void HeaderReadingUtils::fetchAllHeaderAttributes(const uint8_t *const dictBuf,
595754817a5e2e804f5ced54e601d4c08087d75b44Keisuke Kuroyanagi        AttributeMap *const headerAttributes) {
6099007de979e006b6b08bf381f2d394377264de85Keisuke Kuroyanagi    const int headerSize = getHeaderSize(dictBuf);
6199007de979e006b6b08bf381f2d394377264de85Keisuke Kuroyanagi    int pos = getHeaderOptionsPosition();
625ae8722bd52b0f70ab7cd3bd888585422bef9563Keisuke Kuroynagi    if (pos == NOT_A_DICT_POS) {
635ae8722bd52b0f70ab7cd3bd888585422bef9563Keisuke Kuroynagi        // The header doesn't have header options.
645754817a5e2e804f5ced54e601d4c08087d75b44Keisuke Kuroyanagi        return;
655ae8722bd52b0f70ab7cd3bd888585422bef9563Keisuke Kuroynagi    }
665754817a5e2e804f5ced54e601d4c08087d75b44Keisuke Kuroyanagi    int keyBuffer[MAX_ATTRIBUTE_KEY_LENGTH];
675754817a5e2e804f5ced54e601d4c08087d75b44Keisuke Kuroyanagi    int valueBuffer[MAX_ATTRIBUTE_VALUE_LENGTH];
68bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi    while (pos < headerSize) {
695754817a5e2e804f5ced54e601d4c08087d75b44Keisuke Kuroyanagi        const int keyLength = ByteArrayUtils::readStringAndAdvancePosition(dictBuf,
705754817a5e2e804f5ced54e601d4c08087d75b44Keisuke Kuroyanagi                MAX_ATTRIBUTE_KEY_LENGTH, keyBuffer, &pos);
715754817a5e2e804f5ced54e601d4c08087d75b44Keisuke Kuroyanagi        std::vector<int> key;
725754817a5e2e804f5ced54e601d4c08087d75b44Keisuke Kuroyanagi        key.insert(key.end(), keyBuffer, keyBuffer + keyLength);
735754817a5e2e804f5ced54e601d4c08087d75b44Keisuke Kuroyanagi        const int valueLength = ByteArrayUtils::readStringAndAdvancePosition(dictBuf,
745754817a5e2e804f5ced54e601d4c08087d75b44Keisuke Kuroyanagi                MAX_ATTRIBUTE_VALUE_LENGTH, valueBuffer, &pos);
755754817a5e2e804f5ced54e601d4c08087d75b44Keisuke Kuroyanagi        std::vector<int> value;
765754817a5e2e804f5ced54e601d4c08087d75b44Keisuke Kuroyanagi        value.insert(value.end(), valueBuffer, valueBuffer + valueLength);
775754817a5e2e804f5ced54e601d4c08087d75b44Keisuke Kuroyanagi        headerAttributes->insert(AttributeMap::value_type(key, value));
78bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi    }
79bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi}
80bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi
81bd0d1afdb28a28e2ddac1409208c59ba64350399Keisuke Kuroynagi} // namespace latinime
82