Skip to content

Commit d8e67ff

Browse files
committed
Add request function to dbus interface
1 parent 85decbc commit d8e67ff

File tree

2 files changed

+15
-5
lines changed

2 files changed

+15
-5
lines changed

surface-dtx-daemon/src/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ fn main() -> CliResult {
5757
let logger = logger(&config);
5858

5959
let mut runtime = Runtime::new().context(ErrorKind::Runtime)?;
60+
let device: Rc<_> = Device::open()?.into();
6061

6162
// set-up task-queue for external processes
6263
let (queue_tx, queue_rx) = tokio::sync::mpsc::channel(32);
@@ -66,11 +67,10 @@ fn main() -> CliResult {
6667
.context(ErrorKind::DBusService)?
6768
.into();
6869

69-
let serv: Rc<_> = service::build(logger.clone(), connection)?.into();
70+
let serv: Rc<_> = service::build(logger.clone(), connection, device.clone())?.into();
7071
let serv_task = serv.task(&mut runtime).context(ErrorKind::DBusService)?;
7172

7273
// event handler
73-
let device: Rc<_> = Device::open()?.into();
7474
let event_task = setup_event_task(logger.clone(), config, serv.clone(), device.clone(), queue_tx)?;
7575

7676
// process queue handler

surface-dtx-daemon/src/service.rs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::error::{Result, ResultExt, Error, ErrorKind, ErrorStr};
2-
use crate::device::OpMode;
2+
use crate::device::{Device, OpMode};
33

44
use std::rc::Rc;
55
use std::sync::Arc;
@@ -9,6 +9,7 @@ use slog::{Logger, debug};
99

1010
use dbus::{Connection, SignalArgs};
1111
use dbus::tree::{MTFn, ObjectPath, Interface, Signal, Property, Access, EmitsChangedSignal};
12+
use dbus::tree::MethodErr;
1213

1314
use dbus_tokio::AConnection;
1415
use dbus_tokio::tree::{ATree, AFactory, ATreeServer};
@@ -107,7 +108,7 @@ impl Service {
107108
}
108109

109110

110-
pub fn build(log: Logger, connection: Rc<Connection>) -> Result<Service> {
111+
pub fn build(log: Logger, connection: Rc<Connection>, device: Rc<Device>) -> Result<Service> {
111112
let factory = AFactory::new_afn::<()>();
112113

113114
connection.register_name("org.surface.dtx", dbus::NameFlag::ReplaceExisting as u32)
@@ -132,13 +133,22 @@ pub fn build(log: Logger, connection: Rc<Connection>) -> Result<Service> {
132133

133134
let device_mode = Arc::new(device_mode);
134135

136+
// request method
137+
let dtxreq = factory.method("Request", (), move |m| {
138+
match device.commands().latch_request() {
139+
Ok(()) => { Ok(vec![m.msg.method_return()]) },
140+
Err(e) => { Err(MethodErr::failed(&e)) },
141+
}
142+
});
143+
135144
// interface
136145
let iface: Arc<_> = factory.interface("org.surface.dtx", ())
146+
.add_m(dtxreq)
137147
.add_s(state_signal.clone())
138148
.add_p(device_mode.clone())
139149
.into();
140150

141-
// interface
151+
// object
142152
let object: Arc<_> = factory.object_path("/org/surface/dtx", ())
143153
.introspectable()
144154
.add(iface.clone())

0 commit comments

Comments
 (0)