File indexing completed on 2024-05-05 04:34:53
0001 /* SPDX-FileCopyrightText: 2023 Noah Davis <noahadvs@gmail.com> 0002 * SPDX-License-Identifier: LGPL-2.0-or-later 0003 */ 0004 0005 #include "PlasmaVersion.h" 0006 0007 #include <QDBusConnection> 0008 #include <QDBusConnectionInterface> 0009 #include <QDBusMessage> 0010 #include <QDBusVariant> 0011 #include <QDebug> 0012 0013 using namespace Qt::StringLiterals; 0014 0015 static quint32 s_plasmaVersion = 0; 0016 static const auto s_plasmashellService = u"org.kde.plasmashell"_s; 0017 0018 quint32 PlasmaVersion::get() 0019 { 0020 if (!QDBusConnection::sessionBus().interface()->isServiceRegistered(s_plasmashellService)) { 0021 s_plasmaVersion = 0; 0022 } else if (s_plasmaVersion == 0) { 0023 auto message = QDBusMessage::createMethodCall(s_plasmashellService, 0024 u"/MainApplication"_s, 0025 u"org.freedesktop.DBus.Properties"_s, 0026 u"Get"_s); 0027 0028 message.setArguments({u"org.qtproject.Qt.QCoreApplication"_s, u"applicationVersion"_s}); 0029 0030 const auto resultMessage = QDBusConnection::sessionBus().call(message); 0031 if (resultMessage.type() != QDBusMessage::ReplyMessage) { 0032 qWarning() << "Error querying plasma version" << resultMessage.errorName() << resultMessage.errorMessage(); 0033 return s_plasmaVersion; 0034 } 0035 QDBusVariant val = resultMessage.arguments().at(0).value<QDBusVariant>(); 0036 0037 const QString rawVersion = val.variant().value<QString>(); 0038 const QList<QStringView> splitted = QStringView(rawVersion).split(u'.'); 0039 if (splitted.size() != 3) { 0040 qWarning() << "error parsing plasma version"; 0041 return s_plasmaVersion; 0042 } 0043 bool ok; 0044 auto major = splitted[0].toShort(&ok); 0045 if (!ok) { 0046 qWarning() << "error parsing plasma major version"; 0047 return s_plasmaVersion; 0048 } 0049 auto minor = splitted[1].toShort(&ok); 0050 if (!ok) { 0051 qWarning() << "error parsing plasma minor version"; 0052 return s_plasmaVersion; 0053 } 0054 auto patch = splitted[2].toShort(&ok); 0055 if (!ok) { 0056 qWarning() << "error parsing plasma patch version"; 0057 return s_plasmaVersion; 0058 } 0059 s_plasmaVersion = check(major, minor, patch); 0060 } 0061 return s_plasmaVersion; 0062 } 0063 0064 quint32 PlasmaVersion::check(quint8 major, quint8 minor, quint8 patch) 0065 { 0066 return (major << 16) | (minor << 8) | patch; 0067 }