tauri_plugin_network_manager/
models.rs

1use 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"), // icono por defecto
67            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// Removed duplicate init function
103
104#[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}