1544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen/* 2544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen * Copyright (C) 2013 The Android Open Source Project 3544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen * 4544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen * Licensed under the Apache License, Version 2.0 (the "License"); 5544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen * you may not use this file except in compliance with the License. 6544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen * You may obtain a copy of the License at 7544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen * 8544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen * http://www.apache.org/licenses/LICENSE-2.0 9544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen * 10544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen * Unless required by applicable law or agreed to in writing, software 11544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen * distributed under the License is distributed on an "AS IS" BASIS, 12544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen * See the License for the specific language governing permissions and 14544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen * limitations under the License. 15544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen */ 16544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen 17544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen#ifndef _CHARACTER_ENCODING_DETECTOR_H 18544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen#define _CHARACTER_ENCODING_DETECTOR_H 19544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen 20544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen#include <media/mediascanner.h> 21544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen 22544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen#include "StringArray.h" 23544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen 24544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen#include "unicode/ucnv.h" 25544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen#include "unicode/ucsdet.h" 26544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen#include "unicode/ustring.h" 27544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen 28544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissennamespace android { 29544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen 30544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissenclass CharacterEncodingDetector { 31544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen 32544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen public: 33544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen CharacterEncodingDetector(); 34544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen ~CharacterEncodingDetector(); 35544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen 36544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen void addTag(const char *name, const char *value); 37544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen size_t size(); 38544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen 39544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen void detectAndConvert(); 40544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen status_t getTag(int index, const char **name, const char**value); 41544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen 42544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen private: 43544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen const UCharsetMatch *getPreferred( 44bfd55f243feb3f04e26ad07aae035475768ada8aMarco Nelissen const char *input, size_t len, 45bfd55f243feb3f04e26ad07aae035475768ada8aMarco Nelissen const UCharsetMatch** ucma, size_t matches, 4634581f44cde67960fbac3ba1f191a2c063ea5145Marco Nelissen bool *goodmatch, int *highestmatch); 47544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen 48544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen bool isFrequent(const uint16_t *values, uint32_t c); 49544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen 50544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen // cached name and value strings, for native encoding support. 51544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen // TODO: replace these with byte blob arrays that don't require the data to be 52544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen // singlenullbyte-terminated 53544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen StringArray mNames; 54544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen StringArray mValues; 55544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen 56544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen UConverter* mUtf8Conv; 57544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen}; 58544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen 59544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen 60544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen 61544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen}; // namespace android 62544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen 63544ad2be674423238c47650d2c8588ba7dfc9ed2Marco Nelissen#endif 64