File indexing completed on 2024-05-19 05:30:20

0001 /*
0002     SPDX-FileCopyrightText: 2020 Arjen Hiemstra <ahiemstra@heimr.nl>
0003 
0004     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005 */
0006 
0007 #include "NetworkPlugin.h"
0008 
0009 #include <QDebug>
0010 
0011 #include <KLocalizedString>
0012 #include <KPluginFactory>
0013 
0014 #include <systemstats/SensorContainer.h>
0015 
0016 #include "NetworkDevice.h"
0017 #include "NetworkBackend.h"
0018 #include "AllDevicesObject.h"
0019 
0020 #ifdef NETWORKMANAGER_FOUND
0021 #include "NetworkManagerBackend.h"
0022 #endif
0023 #ifdef Q_OS_LINUX
0024 #include "RtNetlinkBackend.h"
0025 #endif
0026 
0027 class NetworkPrivate
0028 {
0029 public:
0030     KSysGuard::SensorContainer *container = nullptr;
0031 
0032     AllDevicesObject *allDevices = nullptr;
0033 
0034     NetworkBackend *backend = nullptr;
0035 
0036     QList<NetworkDevice *> devices;
0037 };
0038 
0039 NetworkPlugin::NetworkPlugin(QObject *parent, const QVariantList &args)
0040     : SensorPlugin(parent, args)
0041     , d(std::make_unique<NetworkPrivate>())
0042 {
0043     d->container = new KSysGuard::SensorContainer(QStringLiteral("network"), i18nc("@title", "Network Devices"), this);
0044 
0045     d->allDevices = new AllDevicesObject(d->container);
0046 
0047     using creationFunction = std::add_pointer_t<NetworkBackend *(NetworkPlugin *parent)>;
0048     std::vector<creationFunction> backendFunctions;
0049 #ifdef NETWORKMANAGER_FOUND
0050     backendFunctions.emplace_back([](NetworkPlugin *parent) -> NetworkBackend* {return new NetworkManagerBackend(parent);});
0051 #endif
0052 #ifdef Q_OS_LINUX
0053     backendFunctions.emplace_back([](NetworkPlugin *parent) -> NetworkBackend* {return new RtNetlinkBackend(parent);});
0054 #endif
0055     for (auto func : backendFunctions) {
0056         auto backend = func(this);
0057         if (backend->isSupported()) {
0058             d->backend = backend;
0059             break;
0060         }
0061         delete backend;
0062     }
0063     if (!d->backend) {
0064         qWarning() << "Unable to start backend, network information not available.";
0065         return;
0066     }
0067 
0068     connect(d->backend, &NetworkBackend::deviceAdded, this, &NetworkPlugin::onDeviceAdded);
0069     connect(d->backend, &NetworkBackend::deviceRemoved, this, &NetworkPlugin::onDeviceRemoved);
0070 
0071     d->backend->start();
0072 }
0073 
0074 void NetworkPlugin::onDeviceAdded(NetworkDevice *device)
0075 {
0076     d->container->addObject(device);
0077 }
0078 
0079 void NetworkPlugin::onDeviceRemoved(NetworkDevice *device)
0080 {
0081     d->container->removeObject(device);
0082 }
0083 
0084 void NetworkPlugin::update()
0085 {
0086     if (d->backend) {
0087         d->backend->update();
0088     }
0089 }
0090 
0091 NetworkPlugin::~NetworkPlugin() = default;
0092 
0093 K_PLUGIN_CLASS_WITH_JSON(NetworkPlugin, "metadata.json")
0094 
0095 #include "NetworkPlugin.moc"
0096 
0097 #include "moc_NetworkPlugin.cpp"