diff --git a/Cargo.lock b/Cargo.lock index 895cde36..7baf885e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -82,9 +82,9 @@ checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" [[package]] name = "cc" -version = "1.0.50" +version = "1.0.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd" +checksum = "c3d87b23d6a92cd03af510a5ade527033f6aa6fa92161e2d5863a907d4c5e31d" [[package]] name = "cexpr" @@ -138,9 +138,9 @@ dependencies = [ [[package]] name = "dbus" -version = "0.7.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "add8dd36d6d34a084220eb9fe216d3e230d52b37c31702e1ffda4fb2d4ef950e" +checksum = "38f8875bb7afbc20dec12db09e18af3dcbd672b08592d2932950326a6437c616" dependencies = [ "libc", "libdbus-sys", @@ -148,18 +148,18 @@ dependencies = [ [[package]] name = "enumflags2" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a80e524ebf194285b57e5e7944018721c7fffc673253f5183f7accd88a2a3b0c" +checksum = "83c8d82922337cd23a15f88b70d8e4ef5f11da38dd7cdb55e84dd5de99695da0" dependencies = [ "enumflags2_derive", ] [[package]] name = "enumflags2_derive" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ed9afacaea0301eefb738c9deea725e6d53938004597cdc518a8cf9a7aa2f03" +checksum = "946ee94e3dbf58fdd324f9ce245c7b238d46a66f00e86a020b71996349e46cce" dependencies = [ "proc-macro2", "quote", @@ -472,9 +472,9 @@ dependencies = [ [[package]] name = "sysfs-class" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718e4a5d0e144ff01e05bb8618a4997d8901cdec74cf25826bca2535ef406f3e" +checksum = "5e1bbcf869732c45a77898f7f61ed6d411dfc37613517e444842f58d428856d1" dependencies = [ "numtoa", ] @@ -555,9 +555,9 @@ dependencies = [ [[package]] name = "uhid-virt" -version = "0.0.3" +version = "0.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03cee38747e38b73c5dd979a88eebc20829b78e785c2fb120c452305231a6340" +checksum = "057ecb2608f960fd97c220557339335bf7cef77ae77b71fb342d9555e396c00c" dependencies = [ "enumflags2", "libc", diff --git a/Cargo.toml b/Cargo.toml index e26d7d3e..e37ab71a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,16 +13,16 @@ name = "rog-core" path = "src/main.rs" [dependencies] -rusb = "0.5" -gumdrop = "0.8" -dbus = "0.7" +rusb = "^0.5.5" +gumdrop = "^0.8.0" +dbus = "^0.8.2" serde = "1.0" serde_derive = "1.0" toml = "0.5" -sysfs-class = "0.1.2" -aho-corasick = "0.7" -thiserror = "1.0.15" -log = "0.4" -uhid-virt = "0.0.3" +sysfs-class = "^0.1.2" +aho-corasick = "^0.7.10" +thiserror = "^1.0.15" +log = "^0.4.8" +uhid-virt = "^0.0.4" #keycode = "0.3" -env_logger = "0.7" \ No newline at end of file +env_logger = "^0.7.1" \ No newline at end of file diff --git a/src/daemon.rs b/src/daemon.rs index b520ad0a..384c2d2f 100644 --- a/src/daemon.rs +++ b/src/daemon.rs @@ -9,8 +9,8 @@ use dbus::{ }; use log::{error, info, warn}; use std::error::Error; +use std::sync::{Arc, Mutex}; use std::time::Duration; -use std::{cell::RefCell, rc::Rc}; pub fn start_daemon() -> Result<(), Box> { let laptop = match_laptop(); @@ -36,32 +36,27 @@ pub fn start_daemon() -> Result<(), Box> { }, ); connection.request_name(DBUS_IFACE, false, true, false)?; - let factory = Factory::new_fnmut::<()>(); + let factory = Factory::new_sync::<()>(); - let daemon = Rc::new(RefCell::new(rogcore)); + let daemon = Arc::new(Mutex::new(rogcore)); - // We create a tree with one object path inside and make that path introspectable. let tree = factory.tree(()).add( - factory.object_path(DBUS_PATH, ()).introspectable().add( - // We add an interface to the object path... - factory - .interface(DBUS_IFACE, ()) - // ...and a method inside the interface - .add_m( - factory - .method("ledmessage", (), { - let daemon = daemon.clone(); - let supported = Vec::from(laptop.supported_modes()); - move |m| { - // Reads the args passed to the method + factory.object_path(DBUS_PATH, ()).add( + factory.interface(DBUS_IFACE, ()).add_m( + factory + // method for ledmessage + .method("ledmessage", (), { + let daemon = daemon.clone(); + let supported = Vec::from(laptop.supported_modes()); + move |m| { + if let Ok(mut lock) = daemon.try_lock() { let bytes: Vec = m.msg.read1()?; - match daemon - .borrow_mut() - .aura_set_and_save(&supported, &bytes[..]) - { + match lock.aura_set_and_save(&supported, &bytes[..]) { Ok(_) => { - let s = format!("Wrote {:x?}", bytes); - let mret = m.msg.method_return().append1(&s); + let mret = m + .msg + .method_return() + .append1(&format!("Wrote {:x?}", bytes)); Ok(vec![mret]) } Err(err) => { @@ -69,17 +64,19 @@ pub fn start_daemon() -> Result<(), Box> { Err(MethodErr::failed(&err)) } } + } else { + Err(MethodErr::failed("Could not lock daemon for access")) } - }) - // Input? - .outarg::<&str, _>("reply") - .inarg::, _>("bytearray"), - ), + } + }) + .outarg::<&str, _>("reply") + .inarg::, _>("bytearray"), + ), ), ); // We add the tree to the connection so that incoming method calls will be handled. - tree.start_receive(&connection); + tree.start_receive_send(&connection); loop { connection @@ -90,9 +87,10 @@ pub fn start_daemon() -> Result<(), Box> { }); // TODO: this needs to move to a thread, but there is unsafety - let mut borrowed_daemon = daemon.borrow_mut(); - laptop.run(&mut borrowed_daemon).unwrap_or_else(|err| { - error!("{:?}", err); - }); + if let Ok(mut lock) = daemon.try_lock() { + laptop.run(&mut lock).unwrap_or_else(|err| { + error!("{:?}", err); + }); + } } }