// 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 LIBBRILLO_BRILLO_DBUS_DBUS_PROPERTY_H_
#define LIBBRILLO_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 // LIBBRILLO_BRILLO_DBUS_DBUS_PROPERTY_H_