2025-02-11 23:15:24 -08:00
|
|
|
mod dbus;
|
|
|
|
|
mod daemon;
|
|
|
|
|
|
|
|
|
|
use std::future;
|
2025-04-25 21:42:29 -07:00
|
|
|
use std::sync::mpsc;
|
2025-02-11 23:15:24 -08:00
|
|
|
use log::LevelFilter;
|
2025-02-12 00:32:44 -08:00
|
|
|
|
2025-04-25 21:42:29 -07:00
|
|
|
use std::sync::Arc;
|
|
|
|
|
use tokio::sync::Mutex;
|
|
|
|
|
|
2025-02-12 00:32:44 -08:00
|
|
|
use daemon::Daemon;
|
|
|
|
|
use dbus::endpoint::Endpoint as DbusEndpoint;
|
2025-04-25 18:02:54 -07:00
|
|
|
use dbus::interface;
|
|
|
|
|
use dbus::server_impl::ServerImpl;
|
2025-02-12 00:32:44 -08:00
|
|
|
|
2025-02-11 23:15:24 -08:00
|
|
|
fn initialize_logging() {
|
|
|
|
|
env_logger::Builder::from_default_env()
|
|
|
|
|
.filter_level(LevelFilter::Info)
|
|
|
|
|
.format_timestamp_secs()
|
|
|
|
|
.init();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[tokio::main]
|
|
|
|
|
async fn main() {
|
|
|
|
|
initialize_logging();
|
|
|
|
|
|
2025-04-25 21:42:29 -07:00
|
|
|
let (sender, receiver) = mpsc::channel::<daemon::Event>();
|
|
|
|
|
|
2025-04-25 16:54:37 -07:00
|
|
|
// Create the daemon
|
2025-04-25 18:02:54 -07:00
|
|
|
let daemon = Arc::new(
|
|
|
|
|
Mutex::new(
|
|
|
|
|
Daemon::new()
|
|
|
|
|
.map_err(|e| {
|
|
|
|
|
log::error!("Failed to start daemon: {}", e);
|
|
|
|
|
std::process::exit(1);
|
|
|
|
|
})
|
|
|
|
|
.unwrap()
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// Create the server implementation
|
2025-04-25 21:42:29 -07:00
|
|
|
let server = ServerImpl::new(daemon.clone(), sender);
|
2025-04-25 18:02:54 -07:00
|
|
|
|
|
|
|
|
// Register DBus interfaces with endpoint
|
|
|
|
|
let endpoint = DbusEndpoint::new(server.clone());
|
|
|
|
|
endpoint.register(
|
|
|
|
|
interface::NAME,
|
|
|
|
|
interface::OBJECT_PATH,
|
|
|
|
|
|cr| {
|
|
|
|
|
vec![
|
|
|
|
|
interface::register_net_buzzert_kordophone_repository(cr),
|
|
|
|
|
interface::register_net_buzzert_kordophone_settings(cr)
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
).await;
|
2025-02-11 23:15:24 -08:00
|
|
|
|
2025-04-25 21:42:29 -07:00
|
|
|
tokio::spawn(async move {
|
|
|
|
|
for event in receiver {
|
|
|
|
|
// Important! Only lock the daemon when handling events.
|
|
|
|
|
daemon.lock().await.handle_event(event).await;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
2025-02-11 23:15:24 -08:00
|
|
|
future::pending::<()>().await;
|
|
|
|
|
unreachable!()
|
|
|
|
|
}
|