diff options
Diffstat (limited to 'third_party/rust/dbus/src/crossroads/stdimpl.rs')
-rw-r--r-- | third_party/rust/dbus/src/crossroads/stdimpl.rs | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/third_party/rust/dbus/src/crossroads/stdimpl.rs b/third_party/rust/dbus/src/crossroads/stdimpl.rs new file mode 100644 index 0000000000..10729da5b1 --- /dev/null +++ b/third_party/rust/dbus/src/crossroads/stdimpl.rs @@ -0,0 +1,53 @@ +use super::crossroads::Crossroads; +use super::handlers::{ParInfo, Par}; +use super::info::{IfaceInfo, MethodInfo, PropInfo}; +use crate::arg; +use super::MethodErr; + +pub struct DBusProperties; + +impl DBusProperties { + pub fn register(cr: &mut Crossroads<Par>) { + cr.register_custom::<Self>(IfaceInfo::new("org.freedesktop.DBus.Properties", + vec!(MethodInfo::new_par("Get", |_: &DBusProperties, info| { + let (iname, propname) = info.msg().read2()?; + let (lookup, pinfo) = info.crossroads().reg_prop_lookup(info.path_data(), iname, propname) + .ok_or_else(|| { MethodErr::no_property(&"Could not find property") })?; + let handler = &pinfo.handlers.0.as_ref() + .ok_or_else(|| { MethodErr::no_property(&"Property can not be read") })?; + let iface = &**lookup.iface; + let mut pinfo = ParInfo::new(info.msg(), lookup); + let mut mret = info.msg().method_return(); + { + let mut ia = arg::IterAppend::new(&mut mret); + (handler)(iface, &mut ia, &mut pinfo)?; + } + Ok(Some(mret)) + })), + vec!(), vec!() + )); + + } +} + +pub struct DBusIntrospectable; + +use crate::crossroads as cr; + +pub trait Introspectable { + fn introspect(&self, info: &cr::ParInfo) -> Result<String, cr::MethodErr>; +} + +pub fn introspectable_ifaceinfo<I>() -> cr::IfaceInfo<'static, cr::Par> +where I: Introspectable + Send + Sync + 'static { + cr::IfaceInfo::new("org.freedesktop.DBus.Introspectable", vec!( + MethodInfo::new_par("Introspect", |intf: &I, info| { + let xml_data = intf.introspect(info)?; + let rm = info.msg().method_return(); + let rm = rm.append1(xml_data); + Ok(Some(rm)) + }), + ), vec!(), vec!()) +} + + |