diff --git a/Cargo.lock b/Cargo.lock index ca1bd19..6679ace 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -86,7 +86,7 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" dependencies = [ - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -96,14 +96,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" dependencies = [ "anstyle", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "anyhow" -version = "1.0.94" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" [[package]] name = "arrayvec" @@ -216,7 +216,7 @@ dependencies = [ "js-sys", "num-traits", "wasm-bindgen", - "windows-targets 0.52.4", + "windows-targets 0.52.6", ] [[package]] @@ -449,6 +449,27 @@ dependencies = [ "syn", ] +[[package]] +name = "directories" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16f5094c54661b38d03bd7e50df373292118db60b585c08a411c6d840017fe7d" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.59.0", +] + [[package]] name = "dotenv" version = "0.15.0" @@ -511,7 +532,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -819,13 +840,16 @@ dependencies = [ name = "kordophoned" version = "0.1.0" dependencies = [ + "anyhow", "dbus", "dbus-codegen", "dbus-crossroads", "dbus-tokio", "dbus-tree", + "directories", "env_logger", "kordophone", + "kordophone-db", "log", "tokio", ] @@ -869,6 +893,16 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.5.0", + "libc", +] + [[package]] name = "libsqlite3-sys" version = "0.30.1" @@ -946,7 +980,7 @@ dependencies = [ "hermit-abi 0.3.9", "libc", "wasi", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -1041,6 +1075,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + [[package]] name = "parking_lot" version = "0.12.1" @@ -1163,6 +1203,17 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_users" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + [[package]] name = "regex" version = "1.11.1" @@ -1208,7 +1259,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -1223,7 +1274,7 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" dependencies = [ - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -1335,7 +1386,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -1370,7 +1421,7 @@ dependencies = [ "cfg-if", "fastrand", "rustix", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -1391,6 +1442,26 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "time" version = "0.3.37" @@ -1437,7 +1508,7 @@ dependencies = [ "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -1690,7 +1761,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys", + "windows-sys 0.59.0", ] [[package]] @@ -1705,7 +1776,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.4", + "windows-targets 0.52.6", ] [[package]] @@ -1714,7 +1785,16 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.4", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", ] [[package]] @@ -1734,17 +1814,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.4", - "windows_aarch64_msvc 0.52.4", - "windows_i686_gnu 0.52.4", - "windows_i686_msvc 0.52.4", - "windows_x86_64_gnu 0.52.4", - "windows_x86_64_gnullvm 0.52.4", - "windows_x86_64_msvc 0.52.4", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -1755,9 +1836,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -1767,9 +1848,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -1779,9 +1860,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -1791,9 +1878,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -1803,9 +1890,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -1815,9 +1902,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -1827,9 +1914,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" diff --git a/kordophone/src/lib.rs b/kordophone/src/lib.rs index bb69a38..f93f108 100644 --- a/kordophone/src/lib.rs +++ b/kordophone/src/lib.rs @@ -2,20 +2,6 @@ pub mod api; pub mod model; pub use self::api::APIInterface; -use ctor::ctor; #[cfg(test)] -pub mod tests; - -extern crate env_logger; - -fn initialize_logging() { - env_logger::Builder::from_default_env() - .format_timestamp_secs() - .init(); -} - -#[ctor] -fn init() { - initialize_logging(); -} +pub mod tests; \ No newline at end of file diff --git a/kordophoned/Cargo.toml b/kordophoned/Cargo.toml index 208b953..7af3d47 100644 --- a/kordophoned/Cargo.toml +++ b/kordophoned/Cargo.toml @@ -4,12 +4,15 @@ version = "0.1.0" edition = "2021" [dependencies] +anyhow = "1.0.98" dbus = "0.9.7" dbus-crossroads = "0.5.2" dbus-tokio = "0.7.6" dbus-tree = "0.9.2" +directories = "6.0.0" env_logger = "0.11.6" kordophone = { path = "../kordophone" } +kordophone-db = { path = "../kordophone-db" } log = "0.4.25" tokio = { version = "1", features = ["full"] } diff --git a/kordophoned/src/daemon/mod.rs b/kordophoned/src/daemon/mod.rs index 0cdb6aa..178abac 100644 --- a/kordophoned/src/daemon/mod.rs +++ b/kordophoned/src/daemon/mod.rs @@ -1,9 +1,46 @@ +use directories::ProjectDirs; +use std::path::PathBuf; +use anyhow::Result; + +use kordophone_db::{ + database::Database, + settings::Settings, + models::Conversation, +}; + pub struct Daemon { pub version: String, + database: Database, } impl Daemon { - pub fn new() -> Self { - Self { version: "0.1.0".to_string() } + pub fn new() -> Result { + let database_path = Self::get_database_path(); + log::info!("Database path: {}", database_path.display()); + + // Create the database directory if it doesn't exist + let database_dir = database_path.parent().unwrap(); + std::fs::create_dir_all(database_dir)?; + + let database = Database::new(&database_path.to_string_lossy())?; + Ok(Self { version: "0.1.0".to_string(), database }) + } + + pub fn get_version(&self) -> String { + self.version.clone() + } + + pub fn get_conversations(&mut self) -> Vec { + self.database.with_repository(|r| r.all_conversations().unwrap()) + } + + fn get_database_path() -> PathBuf { + if let Some(proj_dirs) = ProjectDirs::from("com", "kordophone", "kordophone") { + let data_dir = proj_dirs.data_dir(); + data_dir.join("database.db") + } else { + // Fallback to a local path if we can't get the system directories + PathBuf::from("database.db") + } } } \ No newline at end of file diff --git a/kordophoned/src/dbus/endpoint.rs b/kordophoned/src/dbus/endpoint.rs index 33cb906..e1f3cce 100644 --- a/kordophoned/src/dbus/endpoint.rs +++ b/kordophoned/src/dbus/endpoint.rs @@ -1,5 +1,5 @@ use log::info; -use std::sync::Arc; +use std::sync::{Arc, Mutex}; use crate::{daemon::Daemon, dbus::interface}; use dbus_crossroads::Crossroads; @@ -13,11 +13,11 @@ use dbus::{ pub struct Endpoint { connection: Arc, - daemon: Arc, + daemon: Arc>, } impl Endpoint { - pub fn new(daemon: Arc) -> Self { + pub fn new(daemon: Daemon) -> Self { let (resource, connection) = connection::new_session_sync().unwrap(); // The resource is a task that should be spawned onto a tokio compatible @@ -29,7 +29,10 @@ impl Endpoint { panic!("Lost connection to D-Bus: {}", err); }); - Self { connection, daemon } + Self { + connection, + daemon: Arc::new(Mutex::new(daemon)) + } } pub async fn start(&self) { diff --git a/kordophoned/src/dbus/server_impl.rs b/kordophoned/src/dbus/server_impl.rs index b356a81..a1dae48 100644 --- a/kordophoned/src/dbus/server_impl.rs +++ b/kordophoned/src/dbus/server_impl.rs @@ -1,16 +1,30 @@ use dbus::arg; use dbus_tree::MethodErr; -use std::sync::Arc; +use std::sync::{Arc, Mutex}; use crate::daemon::Daemon; use crate::dbus::interface::NetBuzzertKordophoneServer as DbusServer; -impl DbusServer for Arc { +impl DbusServer for Arc> { fn get_version(&mut self) -> Result { - Ok(self.version.clone()) + let daemon = self.lock().map_err(|_| MethodErr::failed("Failed to lock daemon"))?; + Ok(daemon.version.clone()) } - + fn get_conversations(&mut self) -> Result, dbus::MethodErr> { - todo!() + // Get a repository instance and use it to fetch conversations + let mut daemon = self.lock().map_err(|_| MethodErr::failed("Failed to lock daemon"))?; + let conversations = daemon.get_conversations(); + + // Convert conversations to DBus property maps + let result = conversations.into_iter().map(|conv| { + let mut map = arg::PropMap::new(); + map.insert("guid".into(), arg::Variant(Box::new(conv.guid))); + map.insert("display_name".into(), arg::Variant(Box::new(conv.display_name.unwrap_or_default()))); + map.insert("unread_count".into(), arg::Variant(Box::new(conv.unread_count as i32))); + map + }).collect(); + + Ok(result) } } \ No newline at end of file diff --git a/kordophoned/src/main.rs b/kordophoned/src/main.rs index 71b75d5..a63db94 100644 --- a/kordophoned/src/main.rs +++ b/kordophoned/src/main.rs @@ -2,7 +2,6 @@ mod dbus; mod daemon; use std::future; -use std::sync::Arc; use log::LevelFilter; use daemon::Daemon; @@ -19,9 +18,15 @@ fn initialize_logging() { async fn main() { initialize_logging(); - // Daemon is stored in an Arc so it can be shared with other endpoints eventually. - let daemon = Arc::new(Daemon::new()); + // Create the daemon + let daemon = Daemon::new() + .map_err(|e| { + log::error!("Failed to start daemon: {}", e); + std::process::exit(1); + }) + .unwrap(); + // Create the D-Bus endpoint let endpoint = DbusEndpoint::new(daemon); endpoint.start().await;