File indexing completed on 2024-05-12 05:36:52

0001 /*
0002  * SPDX-FileCopyrightText: 2018-2019 Daniel Vrátil <dvratil@kde.org>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005  */
0006 
0007 #include <KLocalizedString>
0008 #include <KPluginFactory>
0009 #include <KQuickConfigModule>
0010 
0011 #include "device.h"
0012 #include "devicemodel.h"
0013 #include "enum.h"
0014 #include "manager.h"
0015 
0016 #include <QDebug>
0017 
0018 class QMLHelper : public QObject
0019 {
0020     Q_OBJECT
0021 public:
0022     explicit QMLHelper(QObject *parent = nullptr)
0023         : QObject(parent)
0024     {
0025     }
0026 
0027 public Q_SLOTS:
0028     void authorizeDevice(Bolt::Device *device, Bolt::AuthFlags authFlags, QJSValue successCb = {}, QJSValue errorCb = {})
0029     {
0030         device->authorize(authFlags, invoke(successCb), invoke<QString>(errorCb));
0031     }
0032 
0033     void
0034     enrollDevice(Bolt::Manager *manager, const QString &uid, Bolt::Policy policy, Bolt::AuthFlags authFlags, QJSValue successCb = {}, QJSValue errorCb = {})
0035     {
0036         manager->enrollDevice(uid, policy, authFlags, invoke(successCb), invoke<QString>(errorCb));
0037     }
0038 
0039     void forgetDevice(Bolt::Manager *manager, const QString &uid, QJSValue successCb, QJSValue errorCb)
0040     {
0041         manager->forgetDevice(uid, invoke(successCb), invoke<QString>(errorCb));
0042     }
0043 
0044 private:
0045     template<typename... Args>
0046     std::function<void(Args...)> invoke(QJSValue cb_)
0047     {
0048         return [cb = std::move(cb_)](Args &&...args) mutable {
0049             Q_ASSERT(cb.isCallable());
0050             cb.call({std::forward<Args>(args)...});
0051         };
0052     }
0053 };
0054 
0055 class KCMBolt : public KQuickConfigModule
0056 {
0057     Q_OBJECT
0058 
0059 public:
0060     explicit KCMBolt(QObject *parent, const KPluginMetaData &metaData)
0061         : KQuickConfigModule(parent, metaData)
0062     {
0063         qmlRegisterType<Bolt::DeviceModel>("org.kde.bolt", 0, 1, "DeviceModel");
0064         qmlRegisterType<Bolt::Manager>("org.kde.bolt", 0, 1, "Manager");
0065         qmlRegisterUncreatableType<Bolt::Device>("org.kde.bolt", 0, 1, "Device", QStringLiteral("Use DeviceModel"));
0066         qmlRegisterUncreatableMetaObject(Bolt::staticMetaObject, "org.kde.bolt", 0, 1, "Bolt", QStringLiteral("For enums and flags only"));
0067         qmlRegisterSingletonType<QMLHelper>("org.kde.bolt", 0, 1, "QMLHelper", [](auto, auto) -> QObject * {
0068             return new QMLHelper();
0069         });
0070     }
0071 };
0072 
0073 K_PLUGIN_CLASS_WITH_JSON(KCMBolt, "kcm_bolt.json")
0074 
0075 #include "kcm_bolt.moc"