File indexing completed on 2024-04-28 16:49:43

0001 /*
0002  * SPDX-FileCopyrightText: 2014 Daniel Vratil <dvratil@redhat.com>
0003  *
0004  * SPDX-License-Identifier: LGPL-2.1-or-later
0005  *
0006  */
0007 
0008 #include "backenddbuswrapper.h"
0009 #include "backendadaptor.h"
0010 #include "kscreen_backendLauncher_debug.h"
0011 
0012 #include "abstractbackend.h"
0013 #include "config.h"
0014 #include "configserializer_p.h"
0015 
0016 #include <QDBusConnection>
0017 #include <QDBusError>
0018 
0019 BackendDBusWrapper::BackendDBusWrapper(KScreen::AbstractBackend *backend)
0020     : QObject()
0021     , mBackend(backend)
0022 {
0023     connect(mBackend, &KScreen::AbstractBackend::configChanged, this, &BackendDBusWrapper::backendConfigChanged);
0024 
0025     mChangeCollector.setSingleShot(true);
0026     mChangeCollector.setInterval(200); // wait for 200 msecs without any change
0027                                        // before actually emitting configChanged
0028     connect(&mChangeCollector, &QTimer::timeout, this, &BackendDBusWrapper::doEmitConfigChanged);
0029 }
0030 
0031 BackendDBusWrapper::~BackendDBusWrapper()
0032 {
0033 }
0034 
0035 bool BackendDBusWrapper::init()
0036 {
0037     QDBusConnection dbus = QDBusConnection::sessionBus();
0038     new BackendAdaptor(this);
0039     if (!dbus.registerObject(QStringLiteral("/backend"), this, QDBusConnection::ExportAdaptors)) {
0040         qCWarning(KSCREEN_BACKEND_LAUNCHER) << "Failed to export backend to DBus: another launcher already running?";
0041         qCWarning(KSCREEN_BACKEND_LAUNCHER) << dbus.lastError().message();
0042         return false;
0043     }
0044 
0045     return true;
0046 }
0047 
0048 QVariantMap BackendDBusWrapper::getConfig() const
0049 {
0050     const KScreen::ConfigPtr config = mBackend->config();
0051     Q_ASSERT(!config.isNull());
0052     if (!config) {
0053         qCWarning(KSCREEN_BACKEND_LAUNCHER) << "Backend provided an empty config!";
0054         return QVariantMap();
0055     }
0056 
0057     const QJsonObject obj = KScreen::ConfigSerializer::serializeConfig(mBackend->config());
0058     Q_ASSERT(!obj.isEmpty());
0059     return obj.toVariantMap();
0060 }
0061 
0062 QVariantMap BackendDBusWrapper::setConfig(const QVariantMap &configMap)
0063 {
0064     if (configMap.isEmpty()) {
0065         qCWarning(KSCREEN_BACKEND_LAUNCHER) << "Received an empty config map";
0066         return QVariantMap();
0067     }
0068 
0069     const KScreen::ConfigPtr config = KScreen::ConfigSerializer::deserializeConfig(configMap);
0070     mBackend->setConfig(config);
0071 
0072     mCurrentConfig = mBackend->config();
0073     QMetaObject::invokeMethod(this, "doEmitConfigChanged", Qt::QueuedConnection);
0074 
0075     // TODO: setConfig should return adjusted config that was actually applied
0076     const QJsonObject obj = KScreen::ConfigSerializer::serializeConfig(mCurrentConfig);
0077     Q_ASSERT(!obj.isEmpty());
0078     return obj.toVariantMap();
0079 }
0080 
0081 QByteArray BackendDBusWrapper::getEdid(int output) const
0082 {
0083     const QByteArray edidData = mBackend->edid(output);
0084     if (edidData.isEmpty()) {
0085         return QByteArray();
0086     }
0087 
0088     return edidData;
0089 }
0090 
0091 void BackendDBusWrapper::backendConfigChanged(const KScreen::ConfigPtr &config)
0092 {
0093     Q_ASSERT(!config.isNull());
0094     if (!config) {
0095         qCWarning(KSCREEN_BACKEND_LAUNCHER) << "Backend provided an empty config!";
0096         return;
0097     }
0098 
0099     mCurrentConfig = config;
0100     mChangeCollector.start();
0101 }
0102 
0103 void BackendDBusWrapper::doEmitConfigChanged()
0104 {
0105     Q_ASSERT(!mCurrentConfig.isNull());
0106     if (mCurrentConfig.isNull()) {
0107         return;
0108     }
0109 
0110     const QJsonObject obj = KScreen::ConfigSerializer::serializeConfig(mCurrentConfig);
0111     Q_EMIT configChanged(obj.toVariantMap());
0112 
0113     mCurrentConfig.clear();
0114     mChangeCollector.stop();
0115 }