tauri_plugin_network_manager/
models.rs1use std::collections::HashMap;
2use serde::{Deserialize, Serialize};
3use tauri::{AppHandle, Runtime};
4use zbus::{names::InterfaceName, zvariant::{OwnedValue, Value}};
5
6pub trait WirelessDeviceProxy {
7 fn get_access_points(&self) -> zbus::Result<Vec<zbus::zvariant::OwnedObjectPath>>;
8}
9
10pub trait DeviceProxy {
11 fn connection(&self) -> &zbus::blocking::Connection;
12 fn destination(&self) -> &str;
13 fn path(&self) -> &str;
14 fn device_type(&self) -> zbus::Result<u32>;
15 fn get_access_points(&self) -> zbus::Result<Vec<zbus::zvariant::OwnedObjectPath>> {
16 let properties_proxy = zbus::blocking::fdo::PropertiesProxy::builder(self.connection())
17 .destination(self.destination())?
18 .path(self.path())?
19 .interface("org.freedesktop.NetworkManager.Device.Wireless")?
20 .build()?;
21
22 let aps_variant: OwnedValue = properties_proxy.get(InterfaceName::from_static_str_unchecked("org.freedesktop.NetworkManager.Device.Wireless"), "AccessPoints")?.try_into()?;
23
24 match aps_variant.downcast_ref() {
25 Some(Value::Array(arr)) => Ok(arr.into_iter()
26 .filter_map(|v| match v {
27 zbus::zvariant::Value::ObjectPath(path) => Some(zbus::zvariant::OwnedObjectPath::from(path.to_owned())),
28 _ => None,
29 })
30 .collect()),
31 _ => Err(zbus::Error::Failure("Failed to parse access points".into())),
32 }
33 }
34}
35
36pub trait AccessPointProxy {
37 fn ssid(&self) -> zbus::Result<Vec<u8>>;
38 fn strength(&self) -> zbus::Result<u8>;
39 fn security_type(&self) -> zbus::Result<WiFiSecurityType>;
40}
41
42pub trait ConnectionProxy {
43 fn add_connection(&self, settings: &HashMap<String, HashMap<String, String>>) -> zbus::Result<zbus::zvariant::OwnedObjectPath>;
44 fn call_add_connection(&self, settings: &HashMap<String, HashMap<String, String>>) -> zbus::Result<zbus::zvariant::OwnedObjectPath>;
45}
46
47#[derive(Debug, Clone, Serialize, Deserialize)]
48pub struct NetworkInfo {
49 pub name: String,
50 pub ssid: String,
51 pub connection_type: String,
52 pub icon: String,
53 pub ip_address: String,
54 pub mac_address: String,
55 pub signal_strength: u8,
56 pub security_type: WiFiSecurityType,
57 pub is_connected: bool,
58}
59
60impl Default for NetworkInfo {
61 fn default() -> Self {
62 Self {
63 name: String::from("Unknown"),
64 ssid: String::from("Unknown"),
65 connection_type: String::from("Unknown"),
66 icon: String::from("network-offline-symbolic"), ip_address: String::from("0.0.0.0"),
68 mac_address: String::from("00:00:00:00:00:00"),
69 signal_strength: 0,
70 security_type: WiFiSecurityType::None,
71 is_connected: false,
72 }
73 }
74}
75
76#[derive(Serialize, Deserialize, Debug, Clone, Default)]
77pub enum WiFiSecurityType {
78 #[default]
79 None,
80 Wep,
81 WpaPsk,
82 WpaEap,
83 Wpa2Psk,
84 Wpa3Psk,
85}
86
87#[derive(Serialize, Deserialize, Debug, Clone, Default)]
88pub struct WiFiNetwork {
89 pub ssid: String,
90 pub signal_strength: u8,
91 pub icon: String,
92}
93
94#[derive(Serialize, Deserialize, Debug)]
95pub struct WiFiConnectionConfig {
96 pub ssid: String,
97 pub password: Option<String>,
98 pub security_type: WiFiSecurityType,
99 pub username: Option<String>,
100}
101
102#[derive(Clone, Debug)]
105pub struct VSKNetworkManager<'a, R: Runtime> {
106 pub connection: zbus::blocking::Connection,
107 pub proxy: zbus::blocking::fdo::PropertiesProxy<'a>,
108 pub app: AppHandle<R>,
109}