diff --git a/dbus/src/arg/array_impl.rs b/dbus/src/arg/array_impl.rs index b5a45dad..1568d1e7 100644 --- a/dbus/src/arg/array_impl.rs +++ b/dbus/src/arg/array_impl.rs @@ -8,6 +8,7 @@ use std::ffi::{CString}; use std::os::raw::{c_void, c_int}; use std::collections::{HashMap, BTreeMap}; use std::hash::{Hash, BuildHasher}; +use std::borrow::Cow; // Map DBus-Type -> Alignment. Copied from _dbus_marshal_write_fixed_multi in // http://dbus.freedesktop.org/doc/api/html/dbus-marshal-basic_8c_source.html#l01020 @@ -53,6 +54,12 @@ impl<'a, T: Arg + Append + Clone> Append for &'a [T] { } } +impl<'a, T: Arg + Append + Clone> Append for Cow<'a, [T]> { + fn append_by_ref(&self, i: &mut IterAppend) { + (&*self).append_by_ref(i) + } +} + impl<'a, T: Arg + RefArg> RefArg for &'a [T] { fn arg_type(&self) -> ArgType { ArgType::Array } fn signature(&self) -> Signature<'static> { Signature::from(format!("a{}", ::signature())) } diff --git a/dbus/src/arg/basic_impl.rs b/dbus/src/arg/basic_impl.rs index 47d99755..850e9995 100644 --- a/dbus/src/arg/basic_impl.rs +++ b/dbus/src/arg/basic_impl.rs @@ -6,6 +6,7 @@ use std::{ptr, any, mem}; use std::ffi::CStr; use std::os::raw::{c_void, c_char, c_int}; use std::fs::File; +use std::borrow::Cow; fn arg_append_basic(i: *mut ffi::DBusMessageIter, arg_type: ArgType, v: T) { @@ -184,6 +185,12 @@ impl<'a> Get<'a> for &'a str { .and_then(|s| s.to_str().ok()) } } +impl<'a> Append for Cow<'a, str> { + fn append_by_ref(&self, i: &mut IterAppend) { + (&*self).append_by_ref(i) + } +} + impl<'a> Arg for String { const ARG_TYPE: ArgType = ArgType::String; fn signature() -> Signature<'static> { unsafe { Signature::from_slice_unchecked("s\0") } }