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 }