// // Copyright (C) 2012 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #ifndef SHILL_PROPERTY_STORE_H_ #define SHILL_PROPERTY_STORE_H_ #include #include #include #include #include #include #include #include "shill/accessor_interface.h" #include "shill/property_iterator.h" namespace shill { class Error; class PropertyStore { public: typedef base::Callback PropertyChangeCallback; PropertyStore(); explicit PropertyStore(PropertyChangeCallback property_change_callback); virtual ~PropertyStore(); virtual bool Contains(const std::string& property) const; // Setting properties using brillo::Any variant type. bool SetAnyProperty(const std::string& name, const brillo::Any& value, Error* error); bool SetProperties(const brillo::VariantDictionary& in, Error* error); // Retrieve all properties and store them in a brillo::VariantDictionary // (std::map). bool GetProperties(brillo::VariantDictionary* out, Error* error) const; // Methods to allow the getting of properties stored in the referenced // |store_| by name. Upon success, these methods return true and return the // property value in |value|. Upon failure, they return false and // leave |value| untouched. bool GetBoolProperty(const std::string& name, bool* value, Error* error) const; bool GetInt16Property(const std::string& name, int16_t* value, Error* error) const; bool GetInt32Property(const std::string& name, int32_t* value, Error* error) const; bool GetKeyValueStoreProperty(const std::string& name, KeyValueStore* value, Error* error) const; bool GetStringProperty(const std::string& name, std::string* value, Error* error) const; bool GetStringmapProperty(const std::string& name, Stringmap* values, Error* error) const; bool GetStringmapsProperty(const std::string& name, Stringmaps* values, Error* error) const; bool GetStringsProperty(const std::string& name, Strings* values, Error* error) const; bool GetUint8Property(const std::string& name, uint8_t* value, Error* error) const; bool GetByteArrayProperty(const std::string& name, ByteArray* value, Error *error) const; bool GetUint16Property(const std::string& name, uint16_t* value, Error* error) const; bool GetUint16sProperty(const std::string& name, Uint16s* value, Error* error) const; bool GetUint32Property(const std::string& name, uint32_t* value, Error* error) const; bool GetUint64Property(const std::string& name, uint64_t* value, Error* error) const; bool GetRpcIdentifierProperty(const std::string& name, RpcIdentifier* value, Error* error) const; // Methods to allow the setting, by name, of properties stored in this object. // The property names are declared in chromeos/dbus/service_constants.h, // so that they may be shared with libcros. // If the property is successfully changed, these methods return true, // and leave |error| untouched. // If the property is unchanged because it already has the desired value, // these methods return false, and leave |error| untouched. // If the property change fails, these methods return false, and update // |error|. However, updating |error| is skipped if |error| is NULL. virtual bool SetBoolProperty(const std::string& name, bool value, Error* error); virtual bool SetInt16Property(const std::string& name, int16_t value, Error* error); virtual bool SetInt32Property(const std::string& name, int32_t value, Error* error); virtual bool SetKeyValueStoreProperty(const std::string& name, const KeyValueStore& value, Error* error); virtual bool SetStringProperty(const std::string& name, const std::string& value, Error* error); virtual bool SetStringmapProperty( const std::string& name, const std::map& values, Error* error); virtual bool SetStringmapsProperty( const std::string& name, const std::vector>& values, Error* error); virtual bool SetStringsProperty(const std::string& name, const std::vector& values, Error* error); virtual bool SetUint8Property(const std::string& name, uint8_t value, Error* error); virtual bool SetByteArrayProperty(const std::string &name, const ByteArray& value, Error *error); virtual bool SetUint16Property(const std::string& name, uint16_t value, Error* error); virtual bool SetUint16sProperty(const std::string& name, const std::vector& value, Error* error); virtual bool SetUint32Property(const std::string& name, uint32_t value, Error* error); virtual bool SetUint64Property(const std::string& name, uint64_t value, Error* error); virtual bool SetRpcIdentifierProperty(const std::string& name, const RpcIdentifier& value, Error* error); // Clearing a property resets it to its "factory" value. This value // is generally the value that it (the property) had when it was // registered with PropertyStore. // // The exception to this rule is write-only derived properties. For // such properties, the property owner explicitly provides a // "factory" value at registration time. This is necessary because // PropertyStore can't read the current value at registration time. // // |name| is the key used to access the property. If the property // cannot be cleared, |error| is set, and the method returns false. // Otherwise, |error| is unchanged, and the method returns true. virtual bool ClearProperty(const std::string& name, Error* error); // Accessors for iterators over property maps. Useful for dumping all // properties. ReadablePropertyConstIterator GetBoolPropertiesIter() const; ReadablePropertyConstIterator GetInt16PropertiesIter() const; ReadablePropertyConstIterator GetInt32PropertiesIter() const; ReadablePropertyConstIterator GetKeyValueStorePropertiesIter() const; ReadablePropertyConstIterator GetRpcIdentifierPropertiesIter() const; ReadablePropertyConstIterator GetRpcIdentifiersPropertiesIter() const; ReadablePropertyConstIterator GetStringPropertiesIter() const; ReadablePropertyConstIterator GetStringmapPropertiesIter() const; ReadablePropertyConstIterator GetStringmapsPropertiesIter() const; ReadablePropertyConstIterator GetStringsPropertiesIter() const; ReadablePropertyConstIterator GetUint8PropertiesIter() const; ReadablePropertyConstIterator GetByteArrayPropertiesIter() const; ReadablePropertyConstIterator GetUint16PropertiesIter() const; ReadablePropertyConstIterator GetUint16sPropertiesIter() const; ReadablePropertyConstIterator GetUint32PropertiesIter() const; ReadablePropertyConstIterator GetUint64PropertiesIter() const; // Methods for registering a property. // // It is permitted to re-register a property (in which case the old // binding is forgotten). However, the newly bound object must be of // the same type. // // Note that types do not encode read-write permission. Hence, it // is possible to change permissions by rebinding a property to the // same object. // // (Corollary of the rebinding-to-same-type restriction: a // PropertyStore cannot hold two properties of the same name, but // differing types.) void RegisterBool(const std::string& name, bool* prop); void RegisterConstBool(const std::string& name, const bool* prop); void RegisterWriteOnlyBool(const std::string& name, bool* prop); void RegisterInt16(const std::string& name, int16_t* prop); void RegisterConstInt16(const std::string& name, const int16_t* prop); void RegisterWriteOnlyInt16(const std::string& name, int16_t* prop); void RegisterInt32(const std::string& name, int32_t* prop); void RegisterConstInt32(const std::string& name, const int32_t* prop); void RegisterWriteOnlyInt32(const std::string& name, int32_t* prop); void RegisterUint32(const std::string& name, uint32_t* prop); void RegisterConstUint32(const std::string& name, const uint32_t* prop); void RegisterString(const std::string& name, std::string* prop); void RegisterConstString(const std::string& name, const std::string* prop); void RegisterWriteOnlyString(const std::string& name, std::string* prop); void RegisterStringmap(const std::string& name, Stringmap* prop); void RegisterConstStringmap(const std::string& name, const Stringmap* prop); void RegisterWriteOnlyStringmap(const std::string& name, Stringmap* prop); void RegisterStringmaps(const std::string& name, Stringmaps* prop); void RegisterConstStringmaps(const std::string& name, const Stringmaps* prop); void RegisterWriteOnlyStringmaps(const std::string& name, Stringmaps* prop); void RegisterStrings(const std::string& name, Strings* prop); void RegisterConstStrings(const std::string& name, const Strings* prop); void RegisterWriteOnlyStrings(const std::string& name, Strings* prop); void RegisterUint8(const std::string& name, uint8_t* prop); void RegisterConstUint8(const std::string& name, const uint8_t* prop); void RegisterWriteOnlyUint8(const std::string& name, uint8_t* prop); void RegisterUint16(const std::string& name, uint16_t* prop); void RegisterUint16s(const std::string& name, Uint16s* prop); void RegisterConstUint16(const std::string& name, const uint16_t* prop); void RegisterConstUint16s(const std::string& name, const Uint16s* prop); void RegisterWriteOnlyUint16(const std::string& name, uint16_t* prop); void RegisterByteArray(const std::string& name, ByteArray* prop); void RegisterConstByteArray(const std::string& name, const ByteArray* prop); void RegisterWriteOnlyByteArray(const std::string& name, ByteArray* prop); void RegisterDerivedBool(const std::string& name, const BoolAccessor& accessor); void RegisterDerivedInt32(const std::string& name, const Int32Accessor& accessor); void RegisterDerivedKeyValueStore(const std::string& name, const KeyValueStoreAccessor& accessor); void RegisterDerivedRpcIdentifier(const std::string& name, const RpcIdentifierAccessor& acc); void RegisterDerivedRpcIdentifiers(const std::string& name, const RpcIdentifiersAccessor& accessor); void RegisterDerivedString(const std::string& name, const StringAccessor& accessor); void RegisterDerivedStringmap(const std::string& name, const StringmapAccessor& accessor); void RegisterDerivedStringmaps(const std::string& name, const StringmapsAccessor& accessor); void RegisterDerivedStrings(const std::string& name, const StringsAccessor& accessor); void RegisterDerivedUint16(const std::string& name, const Uint16Accessor& accessor); void RegisterDerivedUint64(const std::string& name, const Uint64Accessor& accessor); void RegisterDerivedByteArray(const std::string& name, const ByteArrayAccessor& accessor); private: template bool GetProperty( const std::string& name, V* value, Error* error, const std::map>>& collection, const std::string& value_type_english) const; template bool SetProperty( const std::string& name, const V& value, Error* error, std::map>>* collection, const std::string& value_type_english); // These are std::maps instead of something cooler because the common // operation is iterating through them and returning all properties. std::map bool_properties_; std::map int16_properties_; std::map int32_properties_; std::map key_value_store_properties_; std::map rpc_identifier_properties_; std::map rpc_identifiers_properties_; std::map string_properties_; std::map stringmap_properties_; std::map stringmaps_properties_; std::map strings_properties_; std::map uint8_properties_; std::map bytearray_properties_; std::map uint16_properties_; std::map uint16s_properties_; std::map uint32_properties_; std::map uint64_properties_; PropertyChangeCallback property_changed_callback_; DISALLOW_COPY_AND_ASSIGN(PropertyStore); }; } // namespace shill #endif // SHILL_PROPERTY_STORE_H_