314 lines
15 KiB
C++
314 lines
15 KiB
C++
//
|
|
// 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 <map>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include <base/callback.h>
|
|
#include <base/macros.h>
|
|
#include <brillo/any.h>
|
|
#include <brillo/variant_dictionary.h>
|
|
|
|
#include "shill/accessor_interface.h"
|
|
#include "shill/property_iterator.h"
|
|
|
|
namespace shill {
|
|
|
|
class Error;
|
|
|
|
class PropertyStore {
|
|
public:
|
|
typedef base::Callback<void(const std::string&)> 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<std::string, brillo::Any>).
|
|
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<std::string, std::string>& values,
|
|
Error* error);
|
|
|
|
virtual bool SetStringmapsProperty(
|
|
const std::string& name,
|
|
const std::vector<std::map<std::string, std::string>>& values,
|
|
Error* error);
|
|
|
|
virtual bool SetStringsProperty(const std::string& name,
|
|
const std::vector<std::string>& 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<uint16_t>& 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<bool> GetBoolPropertiesIter() const;
|
|
ReadablePropertyConstIterator<int16_t> GetInt16PropertiesIter() const;
|
|
ReadablePropertyConstIterator<int32_t> GetInt32PropertiesIter() const;
|
|
ReadablePropertyConstIterator<KeyValueStore>
|
|
GetKeyValueStorePropertiesIter() const;
|
|
ReadablePropertyConstIterator<RpcIdentifier>
|
|
GetRpcIdentifierPropertiesIter() const;
|
|
ReadablePropertyConstIterator<RpcIdentifiers>
|
|
GetRpcIdentifiersPropertiesIter() const;
|
|
ReadablePropertyConstIterator<std::string> GetStringPropertiesIter() const;
|
|
ReadablePropertyConstIterator<Stringmap> GetStringmapPropertiesIter() const;
|
|
ReadablePropertyConstIterator<Stringmaps> GetStringmapsPropertiesIter() const;
|
|
ReadablePropertyConstIterator<Strings> GetStringsPropertiesIter() const;
|
|
ReadablePropertyConstIterator<uint8_t> GetUint8PropertiesIter() const;
|
|
ReadablePropertyConstIterator<ByteArray> GetByteArrayPropertiesIter() const;
|
|
ReadablePropertyConstIterator<uint16_t> GetUint16PropertiesIter() const;
|
|
ReadablePropertyConstIterator<Uint16s> GetUint16sPropertiesIter() const;
|
|
ReadablePropertyConstIterator<uint32_t> GetUint32PropertiesIter() const;
|
|
ReadablePropertyConstIterator<uint64_t> 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 <class V>
|
|
bool GetProperty(
|
|
const std::string& name,
|
|
V* value,
|
|
Error* error,
|
|
const std::map<std::string,
|
|
std::shared_ptr<AccessorInterface<V>>>& collection,
|
|
const std::string& value_type_english) const;
|
|
|
|
template <class V>
|
|
bool SetProperty(
|
|
const std::string& name,
|
|
const V& value,
|
|
Error* error,
|
|
std::map<std::string, std::shared_ptr<AccessorInterface<V>>>* 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<std::string, BoolAccessor> bool_properties_;
|
|
std::map<std::string, Int16Accessor> int16_properties_;
|
|
std::map<std::string, Int32Accessor> int32_properties_;
|
|
std::map<std::string, KeyValueStoreAccessor> key_value_store_properties_;
|
|
std::map<std::string, RpcIdentifierAccessor> rpc_identifier_properties_;
|
|
std::map<std::string, RpcIdentifiersAccessor> rpc_identifiers_properties_;
|
|
std::map<std::string, StringAccessor> string_properties_;
|
|
std::map<std::string, StringmapAccessor> stringmap_properties_;
|
|
std::map<std::string, StringmapsAccessor> stringmaps_properties_;
|
|
std::map<std::string, StringsAccessor> strings_properties_;
|
|
std::map<std::string, Uint8Accessor> uint8_properties_;
|
|
std::map<std::string, ByteArrayAccessor> bytearray_properties_;
|
|
std::map<std::string, Uint16Accessor> uint16_properties_;
|
|
std::map<std::string, Uint16sAccessor> uint16s_properties_;
|
|
std::map<std::string, Uint32Accessor> uint32_properties_;
|
|
std::map<std::string, Uint64Accessor> uint64_properties_;
|
|
|
|
PropertyChangeCallback property_changed_callback_;
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(PropertyStore);
|
|
};
|
|
|
|
} // namespace shill
|
|
|
|
#endif // SHILL_PROPERTY_STORE_H_
|