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 }