extern crate dbus;
extern crate dbus_tokio;
extern crate tokio;
extern crate tokio_timer;
extern crate futures;
use dbus::*;
use std::rc::Rc;
use tokio::reactor::Handle;
use tokio::runtime::current_thread::Runtime;
use tokio_timer::{clock, Interval};
use std::time::Duration;
use futures::{Stream, Future};
use dbus_tokio::AConnection;
fn main() {
let c = Rc::new(Connection::get_private(BusType::Session).unwrap());
c.add_match("type=signal,sender=com.example.dbustest,member=HelloHappened").unwrap();
let mut rt = Runtime::new().unwrap();
let aconn = AConnection::new(c.clone(), Handle::current(), &mut rt).unwrap();
let interval = Interval::new(clock::now(), Duration::from_secs(2));
let interval = interval.map_err(|e| panic!("TimerError: {}", e) );
let calls = interval.for_each(|_| {
println!("Calling Hello...");
let m = Message::new_method_call("com.example.dbustest", "/hello", "com.example.dbustest", "Hello")
.unwrap().append1(500u32);
aconn.method_call(m).unwrap().then(|reply| {
let m = reply.unwrap();
let msg: &str = m.get1().unwrap();
println!("{}", msg);
Ok(())
})
});
let messages = aconn.messages().unwrap();
let signals = messages.for_each(|m| {
let headers = m.headers();
let member = headers.3.unwrap();
if member == "HelloHappened" {
let arg1 : &str = m.get1().unwrap();
println!("Hello from {} happened on the bus!", arg1)
} else {
println!("Unprocessed message: {:?}", m)
}
Ok(())
});
rt.block_on(signals.join(calls)).unwrap();
}