16688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown/* 26688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * Copyright (C) 2010 The Android Open Source Project 36688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * 46688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 56688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * you may not use this file except in compliance with the License. 66688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * You may obtain a copy of the License at 76688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * 86688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * http://www.apache.org/licenses/LICENSE-2.0 96688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * 106688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * Unless required by applicable law or agreed to in writing, software 116688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 126688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * See the License for the specific language governing permissions and 146688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * limitations under the License. 156688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown */ 166688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown 176688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown#ifndef _UTILS_PROPERTY_MAP_H 186688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown#define _UTILS_PROPERTY_MAP_H 196688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown 206688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown#include <utils/KeyedVector.h> 216688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown#include <utils/String8.h> 226688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown#include <utils/Errors.h> 236688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown#include <utils/Tokenizer.h> 246688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown 256688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brownnamespace android { 266688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown 276688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown/* 286688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * Provides a mechanism for passing around string-based property key / value pairs 296688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * and loading them from property files. 306688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * 316688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * The property files have the following simple structure: 326688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * 336688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * # Comment 346688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * key = value 356688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * 366688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * Keys and values are any sequence of printable ASCII characters. 376688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * The '=' separates the key from the value. 386688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * The key and value may not contain whitespace. 396688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * 406688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * The '\' character is reserved for escape sequences and is not currently supported. 416688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * The '"" character is reserved for quoting and is not currently supported. 426688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * Files that contain the '\' or '"' character will fail to parse. 436688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * 446688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * The file must not contain duplicate keys. 456688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * 466688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * TODO Support escape sequences and quoted values when needed. 476688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown */ 486688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brownclass PropertyMap { 496688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brownpublic: 506688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown /* Creates an empty property map. */ 516688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown PropertyMap(); 526688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown ~PropertyMap(); 536688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown 546688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown /* Clears the property map. */ 556688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown void clear(); 566688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown 576688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown /* Adds a property. 586688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * Replaces the property with the same key if it is already present. 596688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown */ 606688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown void addProperty(const String8& key, const String8& value); 616688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown 626688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown /* Returns true if the property map contains the specified key. */ 636688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown bool hasProperty(const String8& key) const; 646688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown 656688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown /* Gets the value of a property and parses it. 666688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * Returns true and sets outValue if the key was found and its value was parsed successfully. 676688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown * Otherwise returns false and does not modify outValue. (Also logs a warning.) 686688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown */ 696688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown bool tryGetProperty(const String8& key, String8& outValue) const; 706688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown bool tryGetProperty(const String8& key, bool& outValue) const; 716688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown bool tryGetProperty(const String8& key, int32_t& outValue) const; 726688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown bool tryGetProperty(const String8& key, float& outValue) const; 736688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown 744c501a42173bfc0c7c9ee32312db392c59b67e13Jeff Brown /* Adds all values from the specified property map. */ 754c501a42173bfc0c7c9ee32312db392c59b67e13Jeff Brown void addAll(const PropertyMap* map); 764c501a42173bfc0c7c9ee32312db392c59b67e13Jeff Brown 774c501a42173bfc0c7c9ee32312db392c59b67e13Jeff Brown /* Gets the underlying property map. */ 784c501a42173bfc0c7c9ee32312db392c59b67e13Jeff Brown inline const KeyedVector<String8, String8>& getProperties() const { return mProperties; } 794c501a42173bfc0c7c9ee32312db392c59b67e13Jeff Brown 806688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown /* Loads a property map from a file. */ 816688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown static status_t load(const String8& filename, PropertyMap** outMap); 826688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown 836688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brownprivate: 846688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown class Parser { 856688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown PropertyMap* mMap; 866688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown Tokenizer* mTokenizer; 876688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown 886688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown public: 896688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown Parser(PropertyMap* map, Tokenizer* tokenizer); 906688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown ~Parser(); 916688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown status_t parse(); 926688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown 936688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown private: 946688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown status_t parseType(); 956688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown status_t parseKey(); 966688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown status_t parseKeyProperty(); 976688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown status_t parseModifier(const String8& token, int32_t* outMetaState); 986688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown status_t parseCharacterLiteral(char16_t* outCharacter); 996688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown }; 1006688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown 1016688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown KeyedVector<String8, String8> mProperties; 1026688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown}; 1036688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown 1046688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown} // namespace android 1056688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown 1066688837ff6a959b4f59d9a4249aac1504f590a4bJeff Brown#endif // _UTILS_PROPERTY_MAP_H 107