diff --git a/kordophoned/Cargo.toml b/kordophoned/Cargo.toml index e32e7ee..a596c66 100644 --- a/kordophoned/Cargo.toml +++ b/kordophoned/Cargo.toml @@ -7,10 +7,6 @@ edition = "2021" anyhow = "1.0.98" async-trait = "0.1.88" chrono = "0.4.38" -dbus = { version = "0.9.7", features = ["futures"] } -dbus-crossroads = "0.5.2" -dbus-tokio = "0.7.6" -dbus-tree = "0.9.2" directories = "6.0.0" env_logger = "0.11.6" futures-util = "0.3.31" @@ -25,6 +21,14 @@ tokio-condvar = "0.3.0" uuid = "1.16.0" once_cell = "1.19.0" -[build-dependencies] +[target.'cfg(target_os = "linux")'.dependencies] +# D-Bus dependencies only on Linux +dbus = { version = "0.9.7", features = ["futures"] } +dbus-crossroads = "0.5.2" +dbus-tokio = "0.7.6" +dbus-tree = "0.9.2" + +[target.'cfg(target_os = "linux")'.build-dependencies] +# D-Bus codegen only on Linux dbus-codegen = "0.10.0" dbus-crossroads = "0.5.1" diff --git a/kordophoned/build.rs b/kordophoned/build.rs index a674f93..921915b 100644 --- a/kordophoned/build.rs +++ b/kordophoned/build.rs @@ -1,5 +1,11 @@ const KORDOPHONE_XML: &str = "include/net.buzzert.kordophonecd.Server.xml"; +#[cfg(not(target_os = "linux"))] +fn main() { + // No D-Bus code generation on non-Linux platforms +} + +#[cfg(target_os = "linux")] fn main() { // Generate D-Bus code let out_dir = std::env::var("OUT_DIR").unwrap(); @@ -14,8 +20,8 @@ fn main() { let xml = std::fs::read_to_string(KORDOPHONE_XML).expect("Error reading server dbus interface"); - let output = - dbus_codegen::generate(&xml, &opts).expect("Error generating server dbus interface"); + let output = dbus_codegen::generate(&xml, &opts) + .expect("Error generating server dbus interface"); std::fs::write(out_path, output).expect("Error writing server dbus code"); diff --git a/kordophoned/src/daemon/auth_store.rs b/kordophoned/src/daemon/auth_store.rs index 35a789a..077e502 100644 --- a/kordophoned/src/daemon/auth_store.rs +++ b/kordophoned/src/daemon/auth_store.rs @@ -21,6 +21,7 @@ impl DatabaseAuthenticationStore { #[async_trait] impl AuthenticationStore for DatabaseAuthenticationStore { + #[cfg(target_os = "linux")] async fn get_credentials(&mut self) -> Option { use keyring::secret_service::SsCredential; @@ -61,6 +62,11 @@ impl AuthenticationStore for DatabaseAuthenticationStore { .await } + #[cfg(not(target_os = "linux"))] + async fn get_credentials(&mut self) -> Option { + None + } + async fn get_token(&mut self) -> Option { self.database .lock() diff --git a/kordophoned/src/daemon/contact_resolver/generic.rs b/kordophoned/src/daemon/contact_resolver/generic.rs new file mode 100644 index 0000000..d3a3604 --- /dev/null +++ b/kordophoned/src/daemon/contact_resolver/generic.rs @@ -0,0 +1,16 @@ +use super::ContactResolverBackend; + +#[derive(Clone, Default)] +pub struct GenericContactResolverBackend; + +impl ContactResolverBackend for GenericContactResolverBackend { + type ContactID = String; + + fn resolve_contact_id(&self, address: &str) -> Option { + None + } + + fn get_contact_display_name(&self, contact_id: &Self::ContactID) -> Option { + None + } +} \ No newline at end of file diff --git a/kordophoned/src/daemon/contact_resolver/mod.rs b/kordophoned/src/daemon/contact_resolver/mod.rs index 555aed2..dce3fe3 100644 --- a/kordophoned/src/daemon/contact_resolver/mod.rs +++ b/kordophoned/src/daemon/contact_resolver/mod.rs @@ -1,5 +1,35 @@ +#[cfg(target_os = "linux")] pub mod eds; -pub use eds::EDSContactResolverBackend; + +pub mod generic; + +// Convenient alias for the platform's default backend +#[cfg(target_os = "linux")] +pub type DefaultContactResolverBackend = eds::EDSContactResolverBackend; +#[cfg(not(target_os = "linux"))] +pub type DefaultContactResolverBackend = generic::GenericContactResolverBackend; + +#[cfg(not(target_os = "linux"))] +#[derive(Clone)] +pub struct EDSContactResolverBackend; + +#[cfg(not(target_os = "linux"))] +impl Default for EDSContactResolverBackend { + fn default() -> Self { EDSContactResolverBackend } +} + +#[cfg(not(target_os = "linux"))] +impl ContactResolverBackend for EDSContactResolverBackend { + type ContactID = String; + + fn resolve_contact_id(&self, _address: &str) -> Option { + None + } + + fn get_contact_display_name(&self, _contact_id: &Self::ContactID) -> Option { + None + } +} use std::collections::HashMap; diff --git a/kordophoned/src/daemon/mod.rs b/kordophoned/src/daemon/mod.rs index 6ac25eb..e9466af 100644 --- a/kordophoned/src/daemon/mod.rs +++ b/kordophoned/src/daemon/mod.rs @@ -51,7 +51,7 @@ pub use attachment_store::AttachmentStoreEvent; pub mod contact_resolver; use contact_resolver::ContactResolver; -use contact_resolver::EDSContactResolverBackend; +use contact_resolver::DefaultContactResolverBackend; use kordophone_db::models::participant::Participant as DbParticipant; @@ -507,7 +507,7 @@ impl Daemon { // Insert each conversation let num_conversations = db_conversations.len(); - let mut contact_resolver = ContactResolver::new(EDSContactResolverBackend::default()); + let mut contact_resolver = ContactResolver::new(DefaultContactResolverBackend::default()); for conversation in db_conversations { // Insert or update conversation and its participants database diff --git a/kordophoned/src/dbus/agent.rs b/kordophoned/src/dbus/agent.rs index fcb71af..bf18163 100644 --- a/kordophoned/src/dbus/agent.rs +++ b/kordophoned/src/dbus/agent.rs @@ -9,7 +9,7 @@ use crate::daemon::{ settings::Settings, signals::Signal, DaemonResult, - contact_resolver::{ContactResolver, EDSContactResolverBackend}, + contact_resolver::{ContactResolver, DefaultContactResolverBackend}, }; use kordophone_db::models::participant::Participant; @@ -23,7 +23,7 @@ use dbus_tokio::connection; pub struct DBusAgent { event_sink: mpsc::Sender, signal_receiver: Arc>>>, - contact_resolver: ContactResolver, + contact_resolver: ContactResolver, } impl DBusAgent { @@ -31,7 +31,7 @@ impl DBusAgent { Self { event_sink, signal_receiver: Arc::new(Mutex::new(Some(signal_receiver))), - contact_resolver: ContactResolver::new(EDSContactResolverBackend::default()), + contact_resolver: ContactResolver::new(DefaultContactResolverBackend::default()), } } diff --git a/kordophoned/src/main.rs b/kordophoned/src/main.rs index 43a1b29..eeb968c 100644 --- a/kordophoned/src/main.rs +++ b/kordophoned/src/main.rs @@ -1,4 +1,6 @@ mod daemon; + +#[cfg(target_os = "linux")] mod dbus; use log::LevelFilter; @@ -6,8 +8,6 @@ use std::future; use daemon::Daemon; -use dbus::agent::DBusAgent; - fn initialize_logging() { // Weird: is this the best way to do this? let log_level = std::env::var("RUST_LOG") @@ -20,6 +20,27 @@ fn initialize_logging() { .init(); } +#[cfg(target_os = "linux")] +async fn start_ipc_agent(daemon: &Daemon) { + use dbus::agent::DBusAgent; + + // Start the D-Bus agent (events in, signals out). + let agent = DBusAgent::new(daemon.event_sender.clone(), daemon.obtain_signal_receiver()); + tokio::spawn(async move { + agent.run().await; + }); +} + +#[cfg(target_os = "macos")] +async fn start_ipc_agent(daemon: &Daemon) { + // TODO: Implement macOS IPC agent. +} + +#[cfg(not(any(target_os = "linux", target_os = "macos")))] +async fn start_ipc_agent(daemon: &Daemon) { + panic!("Unsupported IPC platform"); +} + #[tokio::main] async fn main() { initialize_logging(); @@ -32,11 +53,8 @@ async fn main() { }) .unwrap(); - // Start the D-Bus agent (events in, signals out). - let agent = DBusAgent::new(daemon.event_sender.clone(), daemon.obtain_signal_receiver()); - tokio::spawn(async move { - agent.run().await; - }); + // Start the IPC agent. + start_ipc_agent(&daemon).await; // Run the main daemon loop. daemon.run().await; diff --git a/kpcli/Cargo.toml b/kpcli/Cargo.toml index c83e9c3..4719106 100644 --- a/kpcli/Cargo.toml +++ b/kpcli/Cargo.toml @@ -8,8 +8,6 @@ edition = "2021" [dependencies] anyhow = "1.0.93" clap = { version = "4.5.20", features = ["derive"] } -dbus = "0.9.7" -dbus-tree = "0.9.2" dotenv = "0.15.0" env_logger = "0.11.8" futures-util = "0.3.31" @@ -22,5 +20,11 @@ serde_json = "1.0" time = "0.3.37" tokio = "1.41.1" -[build-dependencies] +# D-Bus dependencies only on Linux +[target.'cfg(target_os = "linux")'.dependencies] +dbus = "0.9.7" +dbus-tree = "0.9.2" + +# D-Bus codegen only on Linux +[target.'cfg(target_os = "linux")'.build-dependencies] dbus-codegen = "0.10.0" diff --git a/kpcli/build.rs b/kpcli/build.rs index 9254308..307f48d 100644 --- a/kpcli/build.rs +++ b/kpcli/build.rs @@ -1,5 +1,11 @@ const KORDOPHONE_XML: &str = "../kordophoned/include/net.buzzert.kordophonecd.Server.xml"; +#[cfg(not(target_os = "linux"))] +fn main() { + // No D-Bus codegen on non-Linux platforms +} + +#[cfg(target_os = "linux")] fn main() { let out_dir = std::env::var("OUT_DIR").unwrap(); let out_path = std::path::Path::new(&out_dir).join("kordophone-client.rs"); @@ -10,10 +16,11 @@ fn main() { ..Default::default() }; - let xml = std::fs::read_to_string(KORDOPHONE_XML).expect("Error reading server dbus interface"); + let xml = std::fs::read_to_string(KORDOPHONE_XML) + .expect("Error reading server dbus interface"); - let output = - dbus_codegen::generate(&xml, &opts).expect("Error generating client dbus interface"); + let output = dbus_codegen::generate(&xml, &opts) + .expect("Error generating client dbus interface"); std::fs::write(out_path, output).expect("Error writing client dbus code"); diff --git a/kpcli/src/main.rs b/kpcli/src/main.rs index a485c1a..cc30164 100644 --- a/kpcli/src/main.rs +++ b/kpcli/src/main.rs @@ -1,8 +1,10 @@ mod client; -mod daemon; mod db; mod printers; +#[cfg(target_os = "linux")] +mod daemon; + use anyhow::Result; use clap::{Parser, Subcommand}; use log::LevelFilter;