Private
Public Access
1
0

kordophoned sans kpcli building on macos

This commit is contained in:
James Magahern
2025-07-31 19:16:44 -07:00
parent 742703cb8e
commit 8115f94121
11 changed files with 120 additions and 27 deletions

View File

@@ -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"

View File

@@ -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");

View File

@@ -21,6 +21,7 @@ impl DatabaseAuthenticationStore {
#[async_trait]
impl AuthenticationStore for DatabaseAuthenticationStore {
#[cfg(target_os = "linux")]
async fn get_credentials(&mut self) -> Option<Credentials> {
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<Credentials> {
None
}
async fn get_token(&mut self) -> Option<String> {
self.database
.lock()

View File

@@ -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<Self::ContactID> {
None
}
fn get_contact_display_name(&self, contact_id: &Self::ContactID) -> Option<String> {
None
}
}

View File

@@ -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<Self::ContactID> {
None
}
fn get_contact_display_name(&self, _contact_id: &Self::ContactID) -> Option<String> {
None
}
}
use std::collections::HashMap;

View File

@@ -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

View File

@@ -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<Event>,
signal_receiver: Arc<Mutex<Option<mpsc::Receiver<Signal>>>>,
contact_resolver: ContactResolver<EDSContactResolverBackend>,
contact_resolver: ContactResolver<DefaultContactResolverBackend>,
}
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()),
}
}

View File

@@ -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;

View File

@@ -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"

View File

@@ -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");

View File

@@ -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;