File indexing completed on 2024-04-28 05:49:32

0001 /*
0002     SPDX-FileCopyrightText: 2009 Joseph Wenninger <jowenn@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "katerunninginstanceinfo.h"
0008 
0009 #include <QCoreApplication>
0010 #include <QDBusConnectionInterface>
0011 #include <QDBusReply>
0012 #include <QFileInfo>
0013 #include <QRegularExpression>
0014 #include <QStringList>
0015 
0016 KateRunningInstanceInfo::KateRunningInstanceInfo(const QString &serviceName_)
0017     : serviceName(serviceName_)
0018     , dbus_if(new QDBusInterface(serviceName_,
0019                                  QStringLiteral("/MainApplication"),
0020                                  QString(), // I don't know why it does not work if I specify org.kde.Kate.Application here
0021                                  QDBusConnection::sessionBus()))
0022 {
0023     // get the last used timestamp, if that is not valid, we can ignore the rest
0024     const QVariant a_l = dbus_if->property("lastActivationChange");
0025     if (!a_l.isValid()) {
0026         return;
0027     }
0028     lastActivationChange = a_l.toLongLong();
0029 
0030     // get the active session
0031     const QVariant a_s = dbus_if->property("activeSession");
0032     if (a_s.isValid()) {
0033         sessionName = a_s.toString();
0034     }
0035 }
0036 
0037 std::vector<KateRunningInstanceInfo> fillinRunningKateAppInstances()
0038 {
0039     // if we have no dbus, nothing to do
0040     std::vector<KateRunningInstanceInfo> instances;
0041     auto i = QDBusConnection::sessionBus().interface();
0042     if (!i) {
0043         return instances;
0044     }
0045 
0046     // get all instances
0047     const QDBusReply<QStringList> servicesReply = i->registeredServiceNames();
0048     if (!servicesReply.isValid()) {
0049         return instances;
0050     }
0051 
0052     // try to filter out the current instance
0053     const bool inSandbox = QFileInfo::exists(QStringLiteral("/flatpak-info"));
0054     const QString my_pid = inSandbox ? QDBusConnection::sessionBus().baseService().replace(QRegularExpression(QStringLiteral("[\\.:]")), QStringLiteral("_"))
0055                                      : QString::number(QCoreApplication::applicationPid());
0056     for (const QString &s : servicesReply.value()) {
0057         if (s.startsWith(QLatin1String("org.kde.kate")) && !s.endsWith(my_pid)) {
0058             // ignore instancer we not even can query the lastActivationChange
0059             KateRunningInstanceInfo instance(s);
0060             if (instance.lastActivationChange > 0) {
0061                 instances.push_back(std::move(instance));
0062             }
0063         }
0064     }
0065     return instances;
0066 }