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"