Skip to content

Quickshell.Network NetworkManager backend #96

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 26 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ boption(SERVICE_GREETD "Greetd" ON)
boption(SERVICE_UPOWER "UPower" ON)
boption(SERVICE_NOTIFICATIONS "Notifications" ON)
boption(BLUETOOTH "Bluetooth" ON)
boption(NETWORK "Network" ON)

include(cmake/install-qml-module.cmake)
include(cmake/util.cmake)
Expand Down Expand Up @@ -117,7 +118,7 @@ if (WAYLAND)
list(APPEND QT_FPDEPS WaylandClient)
endif()

if (SERVICE_STATUS_NOTIFIER OR SERVICE_MPRIS OR SERVICE_UPOWER OR SERVICE_NOTIFICATIONS OR BLUETOOTH)
if (SERVICE_STATUS_NOTIFIER OR SERVICE_MPRIS OR SERVICE_UPOWER OR SERVICE_NOTIFICATIONS OR BLUETOOTH OR NETWORK)
set(DBUS ON)
endif()

Expand Down
4 changes: 4 additions & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,7 @@ add_subdirectory(services)
if (BLUETOOTH)
add_subdirectory(bluetooth)
endif()

if (NETWORK)
add_subdirectory(network)
endif()
67 changes: 67 additions & 0 deletions src/network/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# NetworkManager DBus
set_source_files_properties(org.freedesktop.NetworkManager.xml PROPERTIES
CLASSNAME DBusNetworkManagerProxy
NO_NAMESPACE TRUE
)

qt_add_dbus_interface(NM_DBUS_INTERFACES
org.freedesktop.NetworkManager.xml
dbus_nm_backend
)

set_source_files_properties(org.freedesktop.NetworkManager.Device.xml PROPERTIES
CLASSNAME DBusNMDeviceProxy
NO_NAMESPACE TRUE
)

qt_add_dbus_interface(NM_DBUS_INTERFACES
org.freedesktop.NetworkManager.Device.xml
dbus_nm_device
)

set_source_files_properties(org.freedesktop.NetworkManager.Device.Wireless.xml PROPERTIES
CLASSNAME DBusNMWirelessProxy
NO_NAMESPACE TRUE
)

qt_add_dbus_interface(NM_DBUS_INTERFACES
org.freedesktop.NetworkManager.Device.Wireless.xml
dbus_nm_wireless
)

set_source_files_properties(org.freedesktop.NetworkManager.AccessPoint.xml PROPERTIES
CLASSNAME DBusNMAccessPointProxy
NO_NAMESPACE TRUE
)

qt_add_dbus_interface(NM_DBUS_INTERFACES
org.freedesktop.NetworkManager.AccessPoint.xml
dbus_nm_accesspoint
)

qt_add_library(quickshell-network STATIC
api.cpp
nm_backend.cpp
nm_adapters.cpp
${NM_DBUS_INTERFACES}
)

# dbus headers
target_include_directories(quickshell-network PRIVATE
${CMAKE_CURRENT_BINARY_DIR}
)

qt_add_qml_module(quickshell-network
URI Quickshell.Network
VERSION 0.1
DEPENDENCIES QtQml
)

qs_add_module_deps_light(quickshell-network Quickshell)
install_qml_module(quickshell-network)

target_link_libraries(quickshell-network PRIVATE Qt::Qml Qt::DBus)
qs_add_link_dependencies(quickshell-network quickshell-dbus)
target_link_libraries(quickshell PRIVATE quickshell-networkplugin)

qs_module_pch(quickshell-network SET dbus)
152 changes: 152 additions & 0 deletions src/network/api.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
#include "api.hpp"

#include <qdbusconnection.h>
#include <qdbusconnectioninterface.h>
#include <qdbusextratypes.h>
#include <qdbuspendingcall.h>
#include <qdbuspendingreply.h>
#include <qdbusservicewatcher.h>
#include <qlogging.h>

#include "nm_backend.hpp"

namespace qs::network {

namespace {
Q_LOGGING_CATEGORY(logNetworkDevice, "quickshell.network.device", QtWarningMsg);
Q_LOGGING_CATEGORY(logNetwork, "quickshell.network", QtWarningMsg);
} // namespace

// NetworkDevice

NetworkDevice::NetworkDevice(QObject* parent): QObject(parent) {};

QString NetworkDeviceState::toString(NetworkDeviceState::Enum state) {
switch (state) {
case NetworkDeviceState::Unknown: return QStringLiteral("Unknown");
case NetworkDeviceState::Disconnected: return QStringLiteral("Disconnected");
case NetworkDeviceState::Connecting: return QStringLiteral("Connecting");
case NetworkDeviceState::Connected: return QStringLiteral("Connected");
case NetworkDeviceState::Disconnecting: return QStringLiteral("Disconnecting");
default: return QStringLiteral("Unknown");
}
}

QString NetworkDeviceType::toString(NetworkDeviceType::Enum type) {
switch (type) {
case NetworkDeviceType::Other: return QStringLiteral("Other");
case NetworkDeviceType::Wireless: return QStringLiteral("Wireless");
case NetworkDeviceType::Ethernet: return QStringLiteral("Ethernet");
default: return QStringLiteral("Unknown");
}
}

void NetworkDevice::setName(const QString& name) {
if (name != this->bName) {
this->bName = name;
}
}

void NetworkDevice::setAddress(const QString& address) {
if (address != this->bAddress) {
this->bAddress = address;
}
}

void NetworkDevice::setState(NetworkDeviceState::Enum state) {
if (state != this->bState) {
this->bState = state;
}
}

void NetworkDevice::disconnect() {
if (this->bState == NetworkDeviceState::Disconnected) {
qCCritical(logNetworkDevice) << "Device" << this << "is already disconnected";
return;
}

if (this->bState == NetworkDeviceState::Disconnecting) {
qCCritical(logNetworkDevice) << "Device" << this << "is already disconnecting";
return;
}

qCDebug(logNetworkDevice) << "Disconnecting from device" << this;

signalDisconnect();
}

// WirelessNetworkDevice

WirelessNetworkDevice::WirelessNetworkDevice(QObject* parent): NetworkDevice(parent) {};

void WirelessNetworkDevice::scanComplete(qint64 lastScan) {
this->bLastScan = lastScan;
emit this->lastScanChanged();

if (this->bScanning) {
this->bScanning = false;
emit this->scanningChanged();
}
}

void WirelessNetworkDevice::scan() {
if (this->bScanning) {
qCCritical(logNetworkDevice) << "Wireless device" << this << "is already scanning";
return;
}

qCDebug(logNetworkDevice) << "Requesting scan on wireless device" << this;
this->bScanning = true;
signalScan();
}

void WirelessNetworkDevice::addAccessPoint(NetworkAccessPoint* ap) {
mAccessPoints.insertObject(ap);
}

void WirelessNetworkDevice::removeAccessPoint(NetworkAccessPoint* ap) {
mAccessPoints.removeObject(ap);
}

// NetworkAccessPoint

NetworkAccessPoint::NetworkAccessPoint(QObject* parent): QObject(parent) {};

void NetworkAccessPoint::setSsid(const QString& ssid) {
if (this->bSsid != ssid) {
this->bSsid = ssid;
emit ssidChanged();
}
}

void NetworkAccessPoint::setSignal(quint8 signal) {
if (this->bSignal != signal) {
this->bSignal = signal;
emit signalChanged();
}
}

// Network

Network::Network(QObject* parent): QObject(parent) {
// Try each backend

// NetworkManager
auto* nm = new NetworkManager();
if (nm->isAvailable()) {
QObject::connect(nm, &NetworkManager::deviceAdded, this, &Network::addDevice);
QObject::connect(nm, &NetworkManager::deviceRemoved, this, &Network::removeDevice);
this->backend = nm;
return;
}

// None found
this->backend = nullptr;
qCCritical(logNetwork) << "Network will not work. Could not find an available backend.";
}

void Network::addDevice(NetworkDevice* device) { this->mDevices.insertObject(device); }

void Network::removeDevice(NetworkDevice* device) { this->mDevices.removeObject(device); }

} // namespace qs::network
Loading