mirror of
https://github.com/Lurkki14/tuxclocker.git
synced 2025-02-25 18:55:24 -06:00
daemon: implement some adaptors
This commit is contained in:
parent
c1dedcb20e
commit
f20702f11e
@ -3,31 +3,34 @@
|
|||||||
#include "Adaptors.hpp"
|
#include "Adaptors.hpp"
|
||||||
#include <DBusTypes.hpp>
|
#include <DBusTypes.hpp>
|
||||||
#include <Device.hpp>
|
#include <Device.hpp>
|
||||||
|
#include <Tree.hpp>
|
||||||
|
|
||||||
#include <patterns.hpp>
|
#include <patterns.hpp>
|
||||||
#include <QDBusAbstractAdaptor>
|
#include <QDBusAbstractAdaptor>
|
||||||
#include <QDBusArgument>
|
#include <QDBusArgument>
|
||||||
#include <QDBusVariant>
|
#include <QDBusVariant>
|
||||||
#include <QDBusMetaType>
|
#include <QDBusMetaType>
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
using namespace TuxClocker::Device;
|
using namespace TuxClocker::Device;
|
||||||
|
using namespace TuxClocker;
|
||||||
using namespace mpark::patterns;
|
using namespace mpark::patterns;
|
||||||
|
|
||||||
namespace TCDBus = TuxClocker::DBus;
|
namespace TCDBus = TuxClocker::DBus;
|
||||||
|
|
||||||
Q_DECLARE_METATYPE(TCDBus::ReadResult)
|
Q_DECLARE_METATYPE(TCDBus::Result<QDBusVariant>)
|
||||||
|
|
||||||
class DynamicReadableAdaptor : public QDBusAbstractAdaptor {
|
class DynamicReadableAdaptor : public QDBusAbstractAdaptor {
|
||||||
public:
|
public:
|
||||||
explicit DynamicReadableAdaptor(QObject *obj, DynamicReadable dr) : QDBusAbstractAdaptor(obj) {
|
explicit DynamicReadableAdaptor(QObject *obj, DynamicReadable dr) : QDBusAbstractAdaptor(obj) {
|
||||||
// Ideally this should be moved somewhere else but QMetaType does not handle namespaces well
|
// Ideally this should be moved somewhere else but QMetaType does not handle namespaces well
|
||||||
qDBusRegisterMetaType<TCDBus::ReadResult>();
|
qDBusRegisterMetaType<TCDBus::Result<QDBusVariant>>();
|
||||||
m_dynamicReadable = dr;
|
m_dynamicReadable = dr;
|
||||||
}
|
}
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
TCDBus::ReadResult value() {
|
TCDBus::Result<QDBusVariant> value() {
|
||||||
QVariant v;
|
QVariant v;
|
||||||
TCDBus::ReadResult res{.error = false};
|
TCDBus::Result<QDBusVariant> res{.error = false};
|
||||||
/* We have to unwrap the value here, another option would be to convert the std::variant
|
/* We have to unwrap the value here, another option would be to convert the std::variant
|
||||||
* to char*, but that comes with its own issues */
|
* to char*, but that comes with its own issues */
|
||||||
match(m_dynamicReadable.read())
|
match(m_dynamicReadable.read())
|
||||||
@ -43,7 +46,7 @@ public Q_SLOTS:
|
|||||||
pattern(as<ReadError>(arg)) = [&](auto err) {
|
pattern(as<ReadError>(arg)) = [&](auto err) {
|
||||||
v.setValue(static_cast<int>(err));
|
v.setValue(static_cast<int>(err));
|
||||||
res.error = true;
|
res.error = true;
|
||||||
});
|
});
|
||||||
res.value = QDBusVariant(v);
|
res.value = QDBusVariant(v);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@ -53,3 +56,115 @@ private:
|
|||||||
|
|
||||||
DynamicReadable m_dynamicReadable;
|
DynamicReadable m_dynamicReadable;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Q_DECLARE_METATYPE(TCDBus::Range)
|
||||||
|
Q_DECLARE_METATYPE(TCDBus::Enumeration)
|
||||||
|
Q_DECLARE_METATYPE(TCDBus::Result<int>)
|
||||||
|
|
||||||
|
class AssignableAdaptor : public QDBusAbstractAdaptor {
|
||||||
|
public:
|
||||||
|
explicit AssignableAdaptor(QObject *obj, Assignable a) : QDBusAbstractAdaptor(obj),
|
||||||
|
m_assignable(a) {
|
||||||
|
qDBusRegisterMetaType<TCDBus::Range>();
|
||||||
|
qDBusRegisterMetaType<TCDBus::Enumeration>();
|
||||||
|
qDBusRegisterMetaType<QVector<TCDBus::Enumeration>>();
|
||||||
|
qDBusRegisterMetaType<TCDBus::Result<int>>();
|
||||||
|
QVariant a_info;
|
||||||
|
// Unwrap AssignableInfo :(
|
||||||
|
match(a.assignableInfo())
|
||||||
|
(pattern(as<RangeInfo>(arg)) = [&](auto r_info) {
|
||||||
|
match(r_info)
|
||||||
|
(pattern(as<Range<double>>(arg)) = [&](auto dr) {
|
||||||
|
TCDBus::Range r{
|
||||||
|
.min = QDBusVariant(QVariant(dr.min)),
|
||||||
|
.max = QDBusVariant(QVariant(dr.max))
|
||||||
|
};
|
||||||
|
a_info.setValue(r);
|
||||||
|
},
|
||||||
|
pattern(as<Range<int>>(arg)) = [&](auto ir) {
|
||||||
|
TCDBus::Range r{
|
||||||
|
.min = QDBusVariant(QVariant(ir.min)),
|
||||||
|
.max = QDBusVariant(QVariant(ir.max))
|
||||||
|
};
|
||||||
|
a_info.setValue(r);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
pattern(as<EnumerationVec>(arg)) = [&](auto enums) {
|
||||||
|
QVector<TCDBus::Enumeration> entries;
|
||||||
|
for (const auto &e : enums)
|
||||||
|
entries.append({e.key, QString::fromStdString(e.name)});
|
||||||
|
a_info.setValue(entries);
|
||||||
|
});
|
||||||
|
|
||||||
|
m_dbusAssignableInfo = QDBusVariant(a_info);
|
||||||
|
}
|
||||||
|
QDBusVariant assignableInfo_() {return m_dbusAssignableInfo;}
|
||||||
|
public Q_SLOTS:
|
||||||
|
TCDBus::Result<int> assign(QDBusVariant arg_) {
|
||||||
|
auto v = arg_.variant();
|
||||||
|
|
||||||
|
std::optional<AssignmentError> retval;
|
||||||
|
|
||||||
|
match(m_assignable.assignableInfo())
|
||||||
|
(pattern(as<RangeInfo>(arg)) = [&](auto ri) {
|
||||||
|
match(ri)
|
||||||
|
(pattern(as<Range<double>>(_)) = [&] {
|
||||||
|
retval = m_assignable.assign(v.value<double>());
|
||||||
|
},
|
||||||
|
pattern(as<Range<int>>(_)) = [&] {
|
||||||
|
retval = m_assignable.assign(v.value<int>());
|
||||||
|
});
|
||||||
|
},
|
||||||
|
pattern(as<EnumerationVec>(_)) = [&] {
|
||||||
|
retval = m_assignable.assign(v.value<uint>());
|
||||||
|
});
|
||||||
|
|
||||||
|
TCDBus::Result<int> res{.error = false, 0};
|
||||||
|
// Check if optional contains error
|
||||||
|
if (retval.has_value()) {
|
||||||
|
res.error = true;
|
||||||
|
res.value = static_cast<int>(retval.value());
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
Q_OBJECT
|
||||||
|
Q_CLASSINFO("D-Bus Interface", "org.tuxclocker.Assignable")
|
||||||
|
Q_PROPERTY(QDBusVariant assignableInfo READ assignableInfo_)
|
||||||
|
|
||||||
|
Assignable m_assignable;
|
||||||
|
QDBusVariant m_dbusAssignableInfo;
|
||||||
|
};
|
||||||
|
|
||||||
|
Q_DECLARE_METATYPE(TCDBus::DeviceNode)
|
||||||
|
Q_DECLARE_METATYPE(TCDBus::FlatTreeNode<TCDBus::DeviceNode>)
|
||||||
|
|
||||||
|
// Holds the main tree and returns it as a list (because parsing XML sucks)
|
||||||
|
class MainAdaptor : public QDBusAbstractAdaptor {
|
||||||
|
public:
|
||||||
|
explicit MainAdaptor(QObject *obj, TreeNode<TCDBus::DeviceNode> node) : QDBusAbstractAdaptor(obj) {
|
||||||
|
qDBusRegisterMetaType<TCDBus::DeviceNode>();
|
||||||
|
qDBusRegisterMetaType<TCDBus::FlatTreeNode<TCDBus::DeviceNode>>();
|
||||||
|
qDBusRegisterMetaType<QVector<TCDBus::FlatTreeNode<TCDBus::DeviceNode>>>();
|
||||||
|
|
||||||
|
for (const auto &f_node : node.toFlatTree().nodes) {
|
||||||
|
// Copy child indices
|
||||||
|
QVector<int> childIndices;
|
||||||
|
for (const auto &i : f_node.childIndices)
|
||||||
|
childIndices.append(i);
|
||||||
|
|
||||||
|
TCDBus::FlatTreeNode<TCDBus::DeviceNode> fn{f_node.value, childIndices};
|
||||||
|
qDebug("Hello");
|
||||||
|
m_flatTree.append(fn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public Q_SLOTS:
|
||||||
|
QVector<TCDBus::FlatTreeNode<TCDBus::DeviceNode>> flatDeviceTree() {return m_flatTree;}
|
||||||
|
private:
|
||||||
|
Q_OBJECT
|
||||||
|
Q_CLASSINFO("D-Bus Interface", "org.tuxclocker")
|
||||||
|
|
||||||
|
TreeNode<TCDBus::DeviceNode> m_rootNode;
|
||||||
|
QVector<TCDBus::FlatTreeNode<TCDBus::DeviceNode>> m_flatTree;
|
||||||
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user