From 3cea94b72dbfdd2077a59fc52a7460e200b6061e Mon Sep 17 00:00:00 2001 From: littleblack111 Date: Fri, 18 Sep 2026 15:13:01 +0800 Subject: refactor: qml_plugin --- qml_plugin/src/services/network.rs | 66 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 qml_plugin/src/services/network.rs (limited to 'qml_plugin/src/services') diff --git a/qml_plugin/src/services/network.rs b/qml_plugin/src/services/network.rs new file mode 100644 index 0000000..4883dba --- /dev/null +++ b/qml_plugin/src/services/network.rs @@ -0,0 +1,66 @@ +use zbus::{Connection, proxy, zvariant::OwnedObjectPath}; + +#[derive(Debug, thiserror::Error)] +pub enum Error { + #[error("The connection is not active.")] + InactiveConnection, + #[error("Device doesn't exist")] + DeviceNotFound, + #[error("Failed to communicate with NetworkManager: {0}")] + Zbus(#[from] zbus::Error), +} + +#[proxy( + interface = "org.freedesktop.NetworkManager", + default_service = "org.freedesktop.NetworkManager", + default_path = "/org/freedesktop/NetworkManager" +)] +trait NetworkManager { + #[zbus(property)] + fn primary_connection(&self) -> zbus::Result; +} + +#[proxy( + interface = "org.freedesktop.NetworkManager.Connection.Active", + default_service = "org.freedesktop.NetworkManager" +)] +trait ActiveConnection { + #[zbus(property)] + fn id(&self) -> zbus::Result; + + #[zbus( + property, + name = "Type" + )] + fn type_(&self) -> zbus::Result; + + #[zbus(property)] + fn devices(&self) -> zbus::Result>; +} + +#[proxy( + interface = "org.freedesktop.NetworkManager.Device", + default_service = "org.freedesktop.NetworkManager" +)] +trait Device { + #[zbus(property)] + fn interface(&self) -> zbus::Result; +} + +pub async fn get() -> Result { + let conn = Connection::system().await?; + + let nm_conn = NetworkManagerProxy::new(&conn).await?.primary_connection().await?; + + if nm_conn.as_str() == "/" { + return Err(Error::InactiveConnection); + } + + if let Some(device_path) = + ActiveConnectionProxy::builder(&conn).path(nm_conn)?.build().await?.devices().await?.first() + { + Ok(DeviceProxy::builder(&conn).path(device_path)?.build().await?.interface().await?) + } else { + Err(Error::DeviceNotFound) + } +} -- cgit v1.2.3