chore(bluetooth): handle DBus service unknown error
This commit is contained in:
parent
4ad35b70a6
commit
a1436eb637
2 changed files with 33 additions and 7 deletions
|
|
@ -47,6 +47,8 @@ pub struct Page {
|
||||||
selected_adapter: Option<OwnedObjectPath>,
|
selected_adapter: Option<OwnedObjectPath>,
|
||||||
heading: String,
|
heading: String,
|
||||||
devices: HashMap<OwnedObjectPath, Device>,
|
devices: HashMap<OwnedObjectPath, Device>,
|
||||||
|
// Set to true when the org.bluez dbus service is unknown.
|
||||||
|
bluez_service_unknown: bool,
|
||||||
popup_setting: bool,
|
popup_setting: bool,
|
||||||
popup_device: Option<OwnedObjectPath>,
|
popup_device: Option<OwnedObjectPath>,
|
||||||
subscription: Option<tokio::sync::oneshot::Sender<()>>,
|
subscription: Option<tokio::sync::oneshot::Sender<()>>,
|
||||||
|
|
@ -157,6 +159,7 @@ pub enum Message {
|
||||||
tokio::sync::mpsc::Sender<crate::pages::Message>,
|
tokio::sync::mpsc::Sender<crate::pages::Message>,
|
||||||
),
|
),
|
||||||
DBusError(String),
|
DBusError(String),
|
||||||
|
DBusServiceUnknown,
|
||||||
DeviceFailed(OwnedObjectPath),
|
DeviceFailed(OwnedObjectPath),
|
||||||
DisconnectDevice(OwnedObjectPath),
|
DisconnectDevice(OwnedObjectPath),
|
||||||
ForgetDevice(OwnedObjectPath),
|
ForgetDevice(OwnedObjectPath),
|
||||||
|
|
@ -491,6 +494,9 @@ impl Page {
|
||||||
Message::DBusError(why) => {
|
Message::DBusError(why) => {
|
||||||
tracing::error!("dbus connection failed. {why}");
|
tracing::error!("dbus connection failed. {why}");
|
||||||
}
|
}
|
||||||
|
Message::DBusServiceUnknown => {
|
||||||
|
self.bluez_service_unknown = true;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
cosmic::Task::none()
|
cosmic::Task::none()
|
||||||
}
|
}
|
||||||
|
|
@ -575,6 +581,14 @@ fn status() -> Section<crate::pages::Message> {
|
||||||
.show_while::<Page>(|page| !page.adapters.is_empty())
|
.show_while::<Page>(|page| !page.adapters.is_empty())
|
||||||
.view::<Page>(move |_binder, page, section| {
|
.view::<Page>(move |_binder, page, section| {
|
||||||
let descriptions = §ion.descriptions;
|
let descriptions = §ion.descriptions;
|
||||||
|
|
||||||
|
if page.bluez_service_unknown {
|
||||||
|
return widget::text::body(
|
||||||
|
"The org.bluez DBus service could not be activated. Is bluez installed?",
|
||||||
|
)
|
||||||
|
.apply(Element::from);
|
||||||
|
}
|
||||||
|
|
||||||
let status = page
|
let status = page
|
||||||
.get_selected_adapter()
|
.get_selected_adapter()
|
||||||
.map_or(page.active, |(_, adapter)| adapter.enabled);
|
.map_or(page.active, |(_, adapter)| adapter.enabled);
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ use std::pin::Pin;
|
||||||
use bluez_zbus::BluetoothDevice;
|
use bluez_zbus::BluetoothDevice;
|
||||||
use cosmic::iced::futures::{SinkExt, StreamExt};
|
use cosmic::iced::futures::{SinkExt, StreamExt};
|
||||||
use futures::{channel::mpsc, stream::FusedStream};
|
use futures::{channel::mpsc, stream::FusedStream};
|
||||||
use zbus::zvariant::OwnedObjectPath;
|
use zbus::{fdo, zvariant::OwnedObjectPath};
|
||||||
|
|
||||||
enum DevicePropertyWatcherTask {
|
enum DevicePropertyWatcherTask {
|
||||||
Add(OwnedObjectPath),
|
Add(OwnedObjectPath),
|
||||||
|
|
@ -201,14 +201,26 @@ pub async fn watch(
|
||||||
}.await;
|
}.await;
|
||||||
|
|
||||||
if let Err(why) = result {
|
if let Err(why) = result {
|
||||||
tracing::error!("failed to watch bluetooth event: {why}");
|
_ = tx
|
||||||
if let Err(why) = tx
|
|
||||||
.send(bluetooth::Message::DBusError(why.to_string()))
|
.send(bluetooth::Message::DBusError(why.to_string()))
|
||||||
.await
|
.await;
|
||||||
{
|
|
||||||
tracing::error!("failed to communicate error to app: {why}");
|
tracing::error!("failed to watch bluetooth event: {why}.");
|
||||||
|
|
||||||
|
// Exit if the dbus service is not found.
|
||||||
|
if let zbus::Error::FDO(fdo_error) = why {
|
||||||
|
match *fdo_error {
|
||||||
|
fdo::Error::ServiceUnknown(_) => {
|
||||||
|
tracing::error!(
|
||||||
|
"The org.bluez dbus service is unknown. Is the bluez service installed and activatable?"
|
||||||
|
);
|
||||||
|
_ = tx.send(bluetooth::Message::DBusServiceUnknown).await;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_ => (),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
tracing::error!("failed to watch bluetooth event: {why}. Restarting...");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue