| // Copyright 2014 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef LIBCHROMEOS_BRILLO_DBUS_DBUS_PROPERTY_H_ |
| #define LIBCHROMEOS_BRILLO_DBUS_DBUS_PROPERTY_H_ |
| |
| #include <brillo/dbus/data_serialization.h> |
| #include <dbus/property.h> |
| |
| namespace brillo { |
| namespace dbus_utils { |
| |
| // Re-implementation of dbus::Property<T> that can handle any type supported by |
| // D-Bus data serialization layer, such as vectors, maps, tuples, etc. |
| // This class is pretty much a copy of dbus::Property<T> from dbus/property.h |
| // except that it provides the implementations for PopValueFromReader and |
| // AppendSetValueToWriter. |
| template<class T> |
| class Property : public dbus::PropertyBase { |
| public: |
| Property() = default; |
| |
| // Retrieves the cached value. |
| const T& value() const { return value_; } |
| |
| // Requests an updated value from the remote object incurring a |
| // round-trip. |callback| will be called when the new value is available. |
| // This may not be implemented by some interfaces. |
| void Get(dbus::PropertySet::GetCallback callback) { |
| property_set()->Get(this, callback); |
| } |
| |
| // Synchronous vesion of Get(). |
| bool GetAndBlock() { |
| return property_set()->GetAndBlock(this); |
| } |
| |
| // Requests that the remote object change the property value to |value|, |
| // |callback| will be called to indicate the success or failure of the |
| // request, however the new value may not be available depending on the |
| // remote object. |
| void Set(const T& value, dbus::PropertySet::SetCallback callback) { |
| set_value_ = value; |
| property_set()->Set(this, callback); |
| } |
| |
| // Synchronous version of Set(). |
| bool SetAndBlock(const T& value) { |
| set_value_ = value; |
| return property_set()->SetAndBlock(this); |
| } |
| |
| // Method used by PropertySet to retrieve the value from a MessageReader, |
| // no knowledge of the contained type is required, this method returns |
| // true if its expected type was found, false if not. |
| bool PopValueFromReader(dbus::MessageReader* reader) override { |
| return PopVariantValueFromReader(reader, &value_); |
| } |
| |
| // Method used by PropertySet to append the set value to a MessageWriter, |
| // no knowledge of the contained type is required. |
| // Implementation provided by specialization. |
| void AppendSetValueToWriter(dbus::MessageWriter* writer) override { |
| AppendValueToWriterAsVariant(writer, set_value_); |
| } |
| |
| // Method used by test and stub implementations of dbus::PropertySet::Set |
| // to replace the property value with the set value without using a |
| // dbus::MessageReader. |
| void ReplaceValueWithSetValue() override { |
| value_ = set_value_; |
| property_set()->NotifyPropertyChanged(name()); |
| } |
| |
| // Method used by test and stub implementations to directly set the |
| // value of a property. |
| void ReplaceValue(const T& value) { |
| value_ = value; |
| property_set()->NotifyPropertyChanged(name()); |
| } |
| |
| private: |
| // Current cached value of the property. |
| T value_; |
| |
| // Replacement value of the property. |
| T set_value_; |
| }; |
| |
| } // namespace dbus_utils |
| } // namespace brillo |
| |
| #endif // LIBCHROMEOS_BRILLO_DBUS_DBUS_PROPERTY_H_ |