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