dbus/properties: allow removing to/from wire transforms

Useful when properties are only read/written in one direction.
This commit is contained in:
outfoxxed 2024-11-21 19:14:06 -08:00
parent ac50767873
commit 0e9e593078
Signed by: outfoxxed
GPG key ID: 4C88A185FB89301E
3 changed files with 23 additions and 21 deletions

View file

@ -143,9 +143,6 @@ template <typename T>
struct DBusDataTransform {
using Wire = T;
using Data = T;
static DBusResult<Data> fromWire(Wire&& wire) { return DBusResult<T>(std::move(wire)); }
static Wire toWire(const Data& value) { return value; }
};
namespace bindable_p {
@ -166,6 +163,20 @@ struct BindableType {
using Type = Meta::Type;
};
template <typename T, typename = void>
struct HasFromWire: std::false_type {};
template <typename T>
struct HasFromWire<T, std::void_t<decltype(T::fromWire(std::declval<typename T::Wire>()))>>
: std::true_type {};
template <typename T, typename = void>
struct HasToWire: std::false_type {};
template <typename T>
struct HasToWire<T, std::void_t<decltype(T::toWire(std::declval<typename T::Data>()))>>
: std::true_type {};
} // namespace bindable_p
template <
@ -206,12 +217,14 @@ protected:
QDBusError store(const QVariant& variant) override {
DBusResult<DataType> result;
if constexpr (std::is_same_v<WireType, BaseType>) {
result = demarshallVariant<DataType>(variant);
} else {
if constexpr (bindable_p::HasFromWire<Transform>::value) {
auto wireResult = demarshallVariant<WireType>(variant);
if (!wireResult.isValid()) return wireResult.error;
result = Transform::fromWire(std::move(wireResult.value));
} else if constexpr (std::is_same_v<WireType, BaseType>) {
result = demarshallVariant<DataType>(variant);
} else {
return QDBusError(QDBusError::NotSupported, "This property cannot be deserialized");
}
if (!result.isValid()) return result.error;
@ -225,10 +238,12 @@ protected:
}
QVariant serialize() override {
if constexpr (std::is_same_v<WireType, BaseType>) {
if constexpr (bindable_p::HasToWire<Transform>::value) {
return QVariant::fromValue(Transform::toWire(this->bindable()->value()));
} else if constexpr (std::is_same_v<WireType, BaseType>) {
return QVariant::fromValue(this->bindable()->value());
} else {
return QVariant::fromValue(Transform::toWire(this->bindable()->value()));
return QVariant();
}
}

View file

@ -105,8 +105,6 @@ DBusResult<qreal> DBusDataTransform<PowerPercentage>::fromWire(qreal wire) {
return DBusResult(wire * 0.01);
}
qreal DBusDataTransform<PowerPercentage>::toWire(const qreal& value) { return value * 100; }
DBusResult<UPowerDeviceState::Enum>
DBusDataTransform<UPowerDeviceState::Enum>::fromWire(quint32 wire) {
if (wire != UPowerDeviceType::Battery && wire >= UPowerDeviceState::Unknown
@ -120,10 +118,6 @@ DBusDataTransform<UPowerDeviceState::Enum>::fromWire(quint32 wire) {
);
}
quint32 DBusDataTransform<UPowerDeviceState::Enum>::toWire(const UPowerDeviceState::Enum& value) {
return static_cast<quint32>(value);
}
DBusResult<UPowerDeviceType::Enum> DBusDataTransform<UPowerDeviceType::Enum>::fromWire(quint32 wire
) {
if (wire >= UPowerDeviceType::Unknown && wire <= UPowerDeviceType::BluetoothGeneric) {
@ -135,8 +129,4 @@ DBusResult<UPowerDeviceType::Enum> DBusDataTransform<UPowerDeviceType::Enum>::fr
);
}
quint32 DBusDataTransform<UPowerDeviceType::Enum>::toWire(const UPowerDeviceType::Enum& value) {
return static_cast<quint32>(value);
}
} // namespace qs::dbus

View file

@ -91,7 +91,6 @@ struct DBusDataTransform<qs::service::upower::UPowerDeviceState::Enum> {
using Wire = quint32;
using Data = qs::service::upower::UPowerDeviceState::Enum;
static DBusResult<Data> fromWire(Wire wire);
static Wire toWire(const Data& value);
};
template <>
@ -99,7 +98,6 @@ struct DBusDataTransform<qs::service::upower::UPowerDeviceType::Enum> {
using Wire = quint32;
using Data = qs::service::upower::UPowerDeviceType::Enum;
static DBusResult<Data> fromWire(Wire wire);
static Wire toWire(const Data& value);
};
template <>
@ -107,7 +105,6 @@ struct DBusDataTransform<qs::service::upower::PowerPercentage> {
using Wire = qreal;
using Data = qreal;
static DBusResult<Data> fromWire(Wire wire);
static Wire toWire(const Data& value);
};
} // namespace qs::dbus