/rust/registry/src/index.crates.io-6f17d22bba15001f/dbus-0.9.7/src/arg/mod.rs
Line | Count | Source (jump to first uncovered line) |
1 | | //! Types and traits for easily getting a message's arguments, or appening a message with arguments. |
2 | | //! |
3 | | //! Also see the argument's guide (in the examples directory) for details about which Rust |
4 | | //! types correspond to which D-Bus types. |
5 | | //! |
6 | | //! A message has `read1`, `read2` etc, and `append1`, `append2` etc, which is one |
7 | | //! starting point into this module's types. |
8 | | |
9 | | |
10 | | mod msgarg; |
11 | | mod basic_impl; |
12 | | mod variantstruct_impl; |
13 | | mod array_impl; |
14 | | |
15 | | pub mod messageitem; |
16 | | |
17 | | pub use self::msgarg::{Arg, FixedArray, Get, DictKey, Append, RefArg, AppendAll, ReadAll, ArgAll, |
18 | | cast, cast_mut, prop_cast, PropMap}; |
19 | | pub use self::array_impl::{Array, Dict}; |
20 | | pub use self::variantstruct_impl::Variant; |
21 | | |
22 | | use std::{fmt, mem, ptr, error}; |
23 | | use crate::{ffi, Message, Signature, Path}; |
24 | | use std::ffi::{CStr, CString}; |
25 | | use std::os::raw::{c_void, c_int}; |
26 | | #[cfg(unix)] |
27 | | use std::os::unix::io::{AsRawFd, FromRawFd}; |
28 | | use std::collections::VecDeque; |
29 | | |
30 | 0 | fn check(f: &str, i: u32) { if i == 0 { panic!("D-Bus error: '{}' failed", f) }} |
31 | | |
32 | 0 | fn ffi_iter() -> ffi::DBusMessageIter { |
33 | 0 | // Safe because DBusMessageIter contains only fields that are allowed to be zeroed (i e no references or similar) |
34 | 0 | unsafe { mem::zeroed() } |
35 | 0 | } |
36 | | |
37 | | #[cfg(feature = "stdfd")] |
38 | | pub use std::os::unix::io::OwnedFd; |
39 | | |
40 | | /// An RAII wrapper around Fd to ensure that file descriptor is closed |
41 | | /// when the scope ends. Enable the `stdfd` feature to use std's OwnedFd instead. |
42 | | #[cfg(not(feature = "stdfd"))] |
43 | | #[derive(Debug, PartialEq, PartialOrd)] |
44 | | pub struct OwnedFd { |
45 | | #[cfg(unix)] |
46 | | fd: std::os::unix::io::RawFd |
47 | | } |
48 | | |
49 | | #[cfg(all(unix,not(feature = "stdfd")))] |
50 | | mod owned_fd_impl { |
51 | | use super::OwnedFd; |
52 | | use std::os::unix::io::{RawFd, AsRawFd, FromRawFd, IntoRawFd}; |
53 | | |
54 | | impl OwnedFd { |
55 | | /// Create a new OwnedFd from a RawFd. |
56 | | /// |
57 | | /// This function is unsafe, because you could potentially send in an invalid file descriptor, |
58 | | /// or close it during the lifetime of this struct. This could potentially be unsound. |
59 | 0 | pub unsafe fn new(fd: RawFd) -> OwnedFd { |
60 | 0 | OwnedFd { fd: fd } |
61 | 0 | } |
62 | | |
63 | | /// Convert an OwnedFD back into a RawFd. |
64 | 0 | pub fn into_fd(self) -> RawFd { |
65 | 0 | let s = self.fd; |
66 | 0 | ::std::mem::forget(self); |
67 | 0 | s |
68 | 0 | } |
69 | | |
70 | | /// Tries to clone the fd. |
71 | 0 | pub fn try_clone(&self) -> Result<Self, &'static str> { |
72 | 0 | let x = unsafe { libc::dup(self.fd) }; |
73 | 0 | if x == -1 { Err("Duplicating file descriptor failed") } |
74 | 0 | else { Ok(unsafe { OwnedFd::new(x) }) } |
75 | 0 | } |
76 | | } |
77 | | |
78 | | impl Drop for OwnedFd { |
79 | 0 | fn drop(&mut self) { |
80 | 0 | unsafe { libc::close(self.fd); } |
81 | 0 | } |
82 | | } |
83 | | |
84 | | impl AsRawFd for OwnedFd { |
85 | 0 | fn as_raw_fd(&self) -> RawFd { |
86 | 0 | self.fd |
87 | 0 | } |
88 | | } |
89 | | |
90 | | impl IntoRawFd for OwnedFd { |
91 | 0 | fn into_raw_fd(self) -> RawFd { |
92 | 0 | self.into_fd() |
93 | 0 | } |
94 | | } |
95 | | |
96 | | impl FromRawFd for OwnedFd { |
97 | 0 | unsafe fn from_raw_fd(fd: RawFd) -> Self { OwnedFd::new(fd) } |
98 | | } |
99 | | } |
100 | | |
101 | | #[cfg(not(feature = "stdfd"))] |
102 | | impl Clone for OwnedFd { |
103 | | #[cfg(unix)] |
104 | 0 | fn clone(&self) -> OwnedFd { |
105 | 0 | self.try_clone().unwrap() |
106 | 0 | } |
107 | | |
108 | | #[cfg(windows)] |
109 | | fn clone(&self) -> OwnedFd { |
110 | | OwnedFd {} |
111 | | } |
112 | | } |
113 | | |
114 | | |
115 | | #[derive(Clone, Copy)] |
116 | | /// Helper struct for appending one or more arguments to a Message. |
117 | | pub struct IterAppend<'a>(ffi::DBusMessageIter, &'a Message); |
118 | | |
119 | | impl<'a> IterAppend<'a> { |
120 | | /// Creates a new IterAppend struct. |
121 | 0 | pub fn new(m: &'a mut Message) -> IterAppend<'a> { |
122 | 0 | let mut i = ffi_iter(); |
123 | 0 | unsafe { ffi::dbus_message_iter_init_append(m.ptr(), &mut i) }; |
124 | 0 | IterAppend(i, m) |
125 | 0 | } |
126 | | |
127 | | /// Appends the argument. |
128 | 0 | pub fn append<T: Append>(&mut self, a: T) { a.append(self) } Unexecuted instantiation: <dbus::arg::IterAppend>::append::<&str> Unexecuted instantiation: <dbus::arg::IterAppend>::append::<&&str> |
129 | | |
130 | 0 | fn append_container<F: FnOnce(&mut IterAppend<'a>)>(&mut self, arg_type: ArgType, sig: Option<&CStr>, f: F) { |
131 | 0 | let mut s = IterAppend(ffi_iter(), self.1); |
132 | 0 | let p = sig.map(|s| s.as_ptr()).unwrap_or(ptr::null()); Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>, <alloc::vec::Vec<dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<dbus::strings::Path, <alloc::vec::Vec<dbus::strings::Path> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<dbus::strings::Member, <alloc::vec::Vec<dbus::strings::Member> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<dbus::strings::ErrorName, <alloc::vec::Vec<dbus::strings::ErrorName> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<dbus::strings::Interface, <alloc::vec::Vec<dbus::strings::Interface> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<dbus::strings::Signature, <alloc::vec::Vec<dbus::strings::Signature> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<alloc::string::String, <alloc::vec::Vec<alloc::string::String> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<std::fs::File, <alloc::vec::Vec<std::fs::File> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<bool, <alloc::vec::Vec<bool> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<f64, <alloc::vec::Vec<f64> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<u8, <alloc::vec::Vec<u8> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<i32, <alloc::vec::Vec<i32> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<u32, <alloc::vec::Vec<u32> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<i16, <alloc::vec::Vec<i16> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<u16, <alloc::vec::Vec<u16> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<i64, <alloc::vec::Vec<i64> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<u64, <alloc::vec::Vec<u64> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::messageitem::MessageItemDict as dbus::arg::msgarg::Append>::append_by_ref::{closure#0}::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<dbus::strings::Path, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<dbus::strings::Signature, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<alloc::string::String, std::collections::hash::map::HashMap<alloc::string::String, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<alloc::string::String, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<bool, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<u8, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<i32, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<u32, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<i16, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<u16, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<i64, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<u64, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<dbus::strings::Path> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<dbus::strings::Signature> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<alloc::string::String> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<bool> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<f64> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<u8> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<i32> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<u32> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<i16> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<u16> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<i64> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<u64> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::messageitem::MessageItemArray as dbus::arg::msgarg::Append>::append_by_ref::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>> as dbus::arg::msgarg::Append>::append_by_ref::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::messageitem::MessageItemDict as dbus::arg::msgarg::Append>::append_by_ref::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<alloc::collections::vec_deque::VecDeque<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<dbus::strings::Path, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<dbus::strings::Signature, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<alloc::string::String, std::collections::hash::map::HashMap<alloc::string::String, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<alloc::string::String, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<bool, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<u8, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<i32, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<u32, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<i16, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<u16, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<i64, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<u64, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::messageitem::MessageItem as dbus::arg::msgarg::Append>::append_by_ref::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::messageitem::MessageItem as dbus::arg::msgarg::Append>::append_by_ref::{closure#1}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::variantstruct_impl::Variant<dbus::arg::messageitem::MessageItem> as dbus::arg::msgarg::Append>::append_by_ref::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<dbus::strings::Path> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<dbus::strings::Signature> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<alloc::string::String> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<bool> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<f64> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<u8> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<i32> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<u32> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<i16> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<u16> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<i64> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<u64> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#0} Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalArray as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#0} |
133 | 0 | check("dbus_message_iter_open_container", |
134 | 0 | unsafe { ffi::dbus_message_iter_open_container(&mut self.0, arg_type as c_int, p, &mut s.0) }); |
135 | 0 | f(&mut s); |
136 | 0 | check("dbus_message_iter_close_container", |
137 | 0 | unsafe { ffi::dbus_message_iter_close_container(&mut self.0, &mut s.0) }); |
138 | 0 | } Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>, <alloc::vec::Vec<dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<dbus::strings::Path, <alloc::vec::Vec<dbus::strings::Path> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<dbus::strings::Member, <alloc::vec::Vec<dbus::strings::Member> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<dbus::strings::ErrorName, <alloc::vec::Vec<dbus::strings::ErrorName> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<dbus::strings::Interface, <alloc::vec::Vec<dbus::strings::Interface> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<dbus::strings::Signature, <alloc::vec::Vec<dbus::strings::Signature> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<alloc::string::String, <alloc::vec::Vec<alloc::string::String> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<std::fs::File, <alloc::vec::Vec<std::fs::File> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<bool, <alloc::vec::Vec<bool> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<f64, <alloc::vec::Vec<f64> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<u8, <alloc::vec::Vec<u8> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<i32, <alloc::vec::Vec<i32> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<u32, <alloc::vec::Vec<u32> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<i16, <alloc::vec::Vec<i16> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<u16, <alloc::vec::Vec<u16> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<i64, <alloc::vec::Vec<i64> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<dbus::arg::array_impl::array_append<u64, <alloc::vec::Vec<u64> as dbus::arg::msgarg::RefArg>::append::{closure#0}>::{closure#1}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::messageitem::MessageItemDict as dbus::arg::msgarg::Append>::append_by_ref::{closure#0}::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<dbus::strings::Path, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<dbus::strings::Signature, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<alloc::string::String, std::collections::hash::map::HashMap<alloc::string::String, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<alloc::string::String, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<bool, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<u8, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<i32, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<u32, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<i16, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<u16, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<i64, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<u64, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<dbus::strings::Path> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<dbus::strings::Signature> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<alloc::string::String> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<bool> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<f64> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<u8> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<i32> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<u32> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<i16> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<u16> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<i64> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<u64> as dbus::arg::msgarg::RefArg>::append::{closure#0}::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::messageitem::MessageItemArray as dbus::arg::msgarg::Append>::append_by_ref::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>> as dbus::arg::msgarg::Append>::append_by_ref::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::messageitem::MessageItemDict as dbus::arg::msgarg::Append>::append_by_ref::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>> as dbus::arg::msgarg::RefArg>::append::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<alloc::collections::vec_deque::VecDeque<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>> as dbus::arg::msgarg::RefArg>::append::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<dbus::strings::Path, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<dbus::strings::Signature, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<alloc::string::String, std::collections::hash::map::HashMap<alloc::string::String, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<alloc::string::String, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<bool, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<u8, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<i32, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<u32, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<i16, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<u16, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<i64, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<std::collections::hash::map::HashMap<u64, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> as dbus::arg::msgarg::RefArg>::append::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::messageitem::MessageItem as dbus::arg::msgarg::Append>::append_by_ref::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::messageitem::MessageItem as dbus::arg::msgarg::Append>::append_by_ref::{closure#1}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>> as dbus::arg::msgarg::RefArg>::append::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::variantstruct_impl::Variant<dbus::arg::messageitem::MessageItem> as dbus::arg::msgarg::Append>::append_by_ref::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<dbus::strings::Path> as dbus::arg::msgarg::RefArg>::append::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<dbus::strings::Signature> as dbus::arg::msgarg::RefArg>::append::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<alloc::string::String> as dbus::arg::msgarg::RefArg>::append::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<bool> as dbus::arg::msgarg::RefArg>::append::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<f64> as dbus::arg::msgarg::RefArg>::append::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<u8> as dbus::arg::msgarg::RefArg>::append::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<i32> as dbus::arg::msgarg::RefArg>::append::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<u32> as dbus::arg::msgarg::RefArg>::append::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<i16> as dbus::arg::msgarg::RefArg>::append::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<u16> as dbus::arg::msgarg::RefArg>::append::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<i64> as dbus::arg::msgarg::RefArg>::append::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalDict<u64> as dbus::arg::msgarg::RefArg>::append::{closure#0}> Unexecuted instantiation: <dbus::arg::IterAppend>::append_container::<<dbus::arg::array_impl::InternalArray as dbus::arg::msgarg::RefArg>::append::{closure#0}> |
139 | | |
140 | | /// Low-level function to append a variant. |
141 | | /// |
142 | | /// Use in case the `Variant` struct is not flexible enough - |
143 | | /// the easier way is to just call e g "append1" on a message and supply a `Variant` parameter. |
144 | | /// |
145 | | /// In order not to get D-Bus errors: during the call to "f" you need to call "append" on |
146 | | /// the supplied `IterAppend` exactly once, |
147 | | /// and with a value which has the same signature as inner_sig. |
148 | 0 | pub fn append_variant<F: FnOnce(&mut IterAppend<'a>)>(&mut self, inner_sig: &Signature, f: F) { |
149 | 0 | self.append_container(ArgType::Variant, Some(inner_sig.as_cstr()), f) |
150 | 0 | } |
151 | | |
152 | | /// Low-level function to append an array. |
153 | | /// |
154 | | /// Use in case the `Array` struct is not flexible enough - |
155 | | /// the easier way is to just call e g "append1" on a message and supply an `Array` parameter. |
156 | | /// |
157 | | /// In order not to get D-Bus errors: during the call to "f", you should only call "append" on |
158 | | /// the supplied `IterAppend` with values which has the same signature as inner_sig. |
159 | 0 | pub fn append_array<F: FnOnce(&mut IterAppend<'a>)>(&mut self, inner_sig: &Signature, f: F) { |
160 | 0 | self.append_container(ArgType::Array, Some(inner_sig.as_cstr()), f) |
161 | 0 | } |
162 | | |
163 | | /// Low-level function to append a struct. |
164 | | /// |
165 | | /// Use in case tuples are not flexible enough - |
166 | | /// the easier way is to just call e g "append1" on a message and supply a tuple parameter. |
167 | 0 | pub fn append_struct<F: FnOnce(&mut IterAppend<'a>)>(&mut self, f: F) { |
168 | 0 | self.append_container(ArgType::Struct, None, f) |
169 | 0 | } |
170 | | |
171 | | /// Low-level function to append a dict entry. |
172 | | /// |
173 | | /// Use in case the `Dict` struct is not flexible enough - |
174 | | /// the easier way is to just call e g "append1" on a message and supply a `Dict` parameter. |
175 | | /// |
176 | | /// In order not to get D-Bus errors: during the call to "f", you should call "append" once |
177 | | /// for the key, then once for the value. You should only call this function for a subiterator |
178 | | /// you got from calling "append_dict", and signatures need to match what you specified in "append_dict". |
179 | 0 | pub fn append_dict_entry<F: FnOnce(&mut IterAppend<'a>)>(&mut self, f: F) { |
180 | 0 | self.append_container(ArgType::DictEntry, None, f) |
181 | 0 | } |
182 | | |
183 | | /// Low-level function to append a dict. |
184 | | /// |
185 | | /// Use in case the `Dict` struct is not flexible enough - |
186 | | /// the easier way is to just call e g "append1" on a message and supply a `Dict` parameter. |
187 | | /// |
188 | | /// In order not to get D-Bus errors: during the call to "f", you should only call "append_dict_entry" |
189 | | /// for the subiterator - do this as many times as the number of dict entries. |
190 | 0 | pub fn append_dict<F: FnOnce(&mut IterAppend<'a>)>(&mut self, key_sig: &Signature, value_sig: &Signature, f: F) { |
191 | 0 | let sig = format!("{{{}{}}}", key_sig, value_sig); |
192 | 0 | self.append_container(Array::<bool,()>::ARG_TYPE, Some(&CString::new(sig).unwrap()), f); |
193 | 0 | } |
194 | | } |
195 | | |
196 | | |
197 | | |
198 | | #[derive(Clone, Copy)] |
199 | | /// Helper struct for retrieve one or more arguments from a Message. |
200 | | pub struct Iter<'a>(ffi::DBusMessageIter, &'a Message, u32); |
201 | | |
202 | | impl<'a> Iter<'a> { |
203 | | /// Creates a new struct for iterating over the arguments of a message, starting with the first argument. |
204 | 0 | pub fn new(m: &'a Message) -> Iter<'a> { |
205 | 0 | let mut i = ffi_iter(); |
206 | 0 | unsafe { ffi::dbus_message_iter_init(m.ptr(), &mut i) }; |
207 | 0 | Iter(i, m, 0) |
208 | 0 | } |
209 | | |
210 | | /// Returns the current argument, if T is the argument type. Otherwise returns None. |
211 | 0 | pub fn get<T: Get<'a>>(&mut self) -> Option<T> { |
212 | 0 | T::get(self) |
213 | 0 | } Unexecuted instantiation: <dbus::arg::Iter>::get::<dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>> Unexecuted instantiation: <dbus::arg::Iter>::get::<std::fs::File> Unexecuted instantiation: <dbus::arg::Iter>::get::<alloc::vec::Vec<alloc::string::String>> Unexecuted instantiation: <dbus::arg::Iter>::get::<std::collections::hash::map::HashMap<alloc::string::String, std::collections::hash::map::HashMap<alloc::string::String, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>>>> Unexecuted instantiation: <dbus::arg::Iter>::get::<std::collections::hash::map::HashMap<alloc::string::String, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>>> Unexecuted instantiation: <dbus::arg::Iter>::get::<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>> Unexecuted instantiation: <dbus::arg::Iter>::get::<bool> Unexecuted instantiation: <dbus::arg::Iter>::get::<alloc::string::String> Unexecuted instantiation: <dbus::arg::Iter>::get::<u8> Unexecuted instantiation: <dbus::arg::Iter>::get::<i16> Unexecuted instantiation: <dbus::arg::Iter>::get::<u16> Unexecuted instantiation: <dbus::arg::Iter>::get::<i32> Unexecuted instantiation: <dbus::arg::Iter>::get::<u32> Unexecuted instantiation: <dbus::arg::Iter>::get::<i64> Unexecuted instantiation: <dbus::arg::Iter>::get::<u64> Unexecuted instantiation: <dbus::arg::Iter>::get::<f64> Unexecuted instantiation: <dbus::arg::Iter>::get::<dbus::arg::OwnedFd> Unexecuted instantiation: <dbus::arg::Iter>::get::<dbus::strings::Path> Unexecuted instantiation: <dbus::arg::Iter>::get::<dbus::strings::Signature> |
214 | | |
215 | | /// Returns the current argument as a trait object. |
216 | | /// |
217 | | /// See the argument guide's reference part for information on what types hide inside the RefArg. |
218 | 0 | pub fn get_refarg(&mut self) -> Option<Box<dyn RefArg + 'static>> { |
219 | 0 | Some(match self.arg_type() { |
220 | 0 | ArgType::Array => array_impl::get_array_refarg(self), |
221 | 0 | ArgType::Variant => Box::new(Variant::new_refarg(self).unwrap()), |
222 | 0 | ArgType::Boolean => Box::new(self.get::<bool>().unwrap()), |
223 | 0 | ArgType::Invalid => return None, |
224 | 0 | ArgType::String => Box::new(self.get::<String>().unwrap()), |
225 | 0 | ArgType::DictEntry => unimplemented!(), |
226 | 0 | ArgType::Byte => Box::new(self.get::<u8>().unwrap()), |
227 | 0 | ArgType::Int16 => Box::new(self.get::<i16>().unwrap()), |
228 | 0 | ArgType::UInt16 => Box::new(self.get::<u16>().unwrap()), |
229 | 0 | ArgType::Int32 => Box::new(self.get::<i32>().unwrap()), |
230 | 0 | ArgType::UInt32 => Box::new(self.get::<u32>().unwrap()), |
231 | 0 | ArgType::Int64 => Box::new(self.get::<i64>().unwrap()), |
232 | 0 | ArgType::UInt64 => Box::new(self.get::<u64>().unwrap()), |
233 | 0 | ArgType::Double => Box::new(self.get::<f64>().unwrap()), |
234 | 0 | ArgType::UnixFd => Box::new(self.get::<std::fs::File>().unwrap()), |
235 | 0 | ArgType::Struct => Box::new(self.recurse(ArgType::Struct).unwrap().collect::<VecDeque<_>>()), |
236 | 0 | ArgType::ObjectPath => Box::new(self.get::<Path>().unwrap().into_static()), |
237 | 0 | ArgType::Signature => Box::new(self.get::<Signature>().unwrap().into_static()), |
238 | | }) |
239 | 0 | } |
240 | | |
241 | | /// Returns the type signature for the current argument. |
242 | 0 | pub fn signature(&mut self) -> Signature<'static> { |
243 | 0 | unsafe { |
244 | 0 | let c = ffi::dbus_message_iter_get_signature(&mut self.0); |
245 | 0 | assert!(c != ptr::null_mut()); |
246 | 0 | let cc = CStr::from_ptr(c); |
247 | 0 | let r = Signature::new(std::str::from_utf8(cc.to_bytes()).unwrap()); |
248 | 0 | ffi::dbus_free(c as *mut c_void); |
249 | 0 | r.unwrap() |
250 | 0 | } |
251 | 0 | } |
252 | | |
253 | | /// The raw arg_type for the current item. |
254 | | /// |
255 | | /// Unlike Arg::arg_type, this requires access to self and is not a static method. |
256 | | /// You can match this against Arg::arg_type for different types to understand what type the current item is. |
257 | | /// In case you're past the last argument, this function will return 0. |
258 | 0 | pub fn arg_type(&mut self) -> ArgType { |
259 | 0 | let s = unsafe { ffi::dbus_message_iter_get_arg_type(&mut self.0) }; |
260 | 0 | ArgType::from_i32(s as i32).unwrap() |
261 | 0 | } |
262 | | |
263 | | /// Returns false if there are no more items. |
264 | 0 | pub fn next(&mut self) -> bool { |
265 | 0 | self.2 += 1; |
266 | 0 | unsafe { ffi::dbus_message_iter_next(&mut self.0) != 0 } |
267 | 0 | } |
268 | | |
269 | | /// Wrapper around `get` and `next`. Calls `get`, and then `next` if `get` succeeded. |
270 | | /// |
271 | | /// Also returns a `Result` rather than an `Option` to give an error if successful. |
272 | | /// |
273 | | /// # Example |
274 | | /// ```ignore |
275 | | /// struct ServiceBrowserItemNew { |
276 | | /// interface: i32, |
277 | | /// protocol: i32, |
278 | | /// name: String, |
279 | | /// item_type: String, |
280 | | /// domain: String, |
281 | | /// flags: u32, |
282 | | /// } |
283 | | /// |
284 | | /// fn service_browser_item_new_msg(m: &Message) -> Result<ServiceBrowserItemNew, TypeMismatchError> { |
285 | | /// let mut iter = m.iter_init(); |
286 | | /// Ok(ServiceBrowserItemNew { |
287 | | /// interface: iter.read()?, |
288 | | /// protocol: iter.read()?, |
289 | | /// name: iter.read()?, |
290 | | /// item_type: iter.read()?, |
291 | | /// domain: iter.read()?, |
292 | | /// flags: iter.read()?, |
293 | | /// }) |
294 | | /// } |
295 | | /// ``` |
296 | 0 | pub fn read<T: Arg + Get<'a>>(&mut self) -> Result<T, TypeMismatchError> { |
297 | 0 | let r = self.get().ok_or_else(|| |
298 | 0 | TypeMismatchError { expected: T::ARG_TYPE, found: self.arg_type(), position: self.2 })?; Unexecuted instantiation: <dbus::arg::Iter>::read::<alloc::vec::Vec<alloc::string::String>>::{closure#0} Unexecuted instantiation: <dbus::arg::Iter>::read::<std::collections::hash::map::HashMap<alloc::string::String, std::collections::hash::map::HashMap<alloc::string::String, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>>>>::{closure#0} Unexecuted instantiation: <dbus::arg::Iter>::read::<std::collections::hash::map::HashMap<alloc::string::String, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>>>::{closure#0} Unexecuted instantiation: <dbus::arg::Iter>::read::<dbus::strings::Path>::{closure#0} Unexecuted instantiation: <dbus::arg::Iter>::read::<alloc::string::String>::{closure#0} |
299 | 0 | self.next(); |
300 | 0 | Ok(r) |
301 | 0 | } Unexecuted instantiation: <dbus::arg::Iter>::read::<alloc::vec::Vec<alloc::string::String>> Unexecuted instantiation: <dbus::arg::Iter>::read::<std::collections::hash::map::HashMap<alloc::string::String, std::collections::hash::map::HashMap<alloc::string::String, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>>>> Unexecuted instantiation: <dbus::arg::Iter>::read::<std::collections::hash::map::HashMap<alloc::string::String, dbus::arg::variantstruct_impl::Variant<alloc::boxed::Box<dyn dbus::arg::msgarg::RefArg>>>> Unexecuted instantiation: <dbus::arg::Iter>::read::<dbus::strings::Path> Unexecuted instantiation: <dbus::arg::Iter>::read::<alloc::string::String> |
302 | | |
303 | | /// If the current argument is a container of the specified arg_type, then a new |
304 | | /// Iter is returned which is for iterating over the contents inside the container. |
305 | | /// |
306 | | /// Primarily for internal use (the "get" function is more ergonomic), but could be |
307 | | /// useful for recursing into containers with unknown types. |
308 | 0 | pub fn recurse(&mut self, arg_type: ArgType) -> Option<Iter<'a>> { |
309 | 0 | let containers = [ArgType::Array, ArgType::DictEntry, ArgType::Struct, ArgType::Variant]; |
310 | 0 | if !containers.iter().any(|&t| t == arg_type) { return None; } |
311 | 0 |
|
312 | 0 | let mut subiter = ffi_iter(); |
313 | 0 | unsafe { |
314 | 0 | if ffi::dbus_message_iter_get_arg_type(&mut self.0) != arg_type as c_int { return None }; |
315 | 0 | ffi::dbus_message_iter_recurse(&mut self.0, &mut subiter) |
316 | 0 | } |
317 | 0 | Some(Iter(subiter, self.1, 0)) |
318 | 0 | } |
319 | | } |
320 | | |
321 | | impl<'a> fmt::Debug for Iter<'a> { |
322 | 0 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
323 | 0 | let mut z = self.clone(); |
324 | 0 | let mut t = f.debug_tuple("Iter"); |
325 | | loop { |
326 | 0 | t.field(&z.arg_type()); |
327 | 0 | if !z.next() { break } |
328 | | } |
329 | 0 | t.finish() |
330 | 0 | } |
331 | | } |
332 | | |
333 | | impl<'a> Iterator for Iter<'a> { |
334 | | type Item = Box<dyn RefArg + 'static>; |
335 | 0 | fn next(&mut self) -> Option<Self::Item> { |
336 | 0 | let r = self.get_refarg(); |
337 | 0 | if r.is_some() { self.next(); } |
338 | 0 | r |
339 | 0 | } |
340 | | } |
341 | | |
342 | | /// Type of Argument |
343 | | /// |
344 | | /// use this to figure out, e g, which type of argument is at the current position of Iter. |
345 | | #[repr(u8)] |
346 | | #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq, Ord, PartialOrd)] |
347 | | pub enum ArgType { |
348 | | /// Dicts are Arrays of dict entries, so Dict types will have Array as ArgType. |
349 | | Array = ffi::DBUS_TYPE_ARRAY as u8, |
350 | | /// Variant |
351 | | Variant = ffi::DBUS_TYPE_VARIANT as u8, |
352 | | /// bool |
353 | | Boolean = ffi::DBUS_TYPE_BOOLEAN as u8, |
354 | | /// Invalid arg type - this is also the ArgType returned when there are no more arguments available. |
355 | | Invalid = ffi::DBUS_TYPE_INVALID as u8, |
356 | | /// String |
357 | | String = ffi::DBUS_TYPE_STRING as u8, |
358 | | /// Dict entry; you'll usually not encounter this one as dicts are arrays of dict entries. |
359 | | DictEntry = ffi::DBUS_TYPE_DICT_ENTRY as u8, |
360 | | /// u8 |
361 | | Byte = ffi::DBUS_TYPE_BYTE as u8, |
362 | | /// i16 |
363 | | Int16 = ffi::DBUS_TYPE_INT16 as u8, |
364 | | /// u16 |
365 | | UInt16 = ffi::DBUS_TYPE_UINT16 as u8, |
366 | | /// i32 |
367 | | Int32 = ffi::DBUS_TYPE_INT32 as u8, |
368 | | /// u32 |
369 | | UInt32 = ffi::DBUS_TYPE_UINT32 as u8, |
370 | | /// i64 |
371 | | Int64 = ffi::DBUS_TYPE_INT64 as u8, |
372 | | /// u64 |
373 | | UInt64 = ffi::DBUS_TYPE_UINT64 as u8, |
374 | | /// f64 |
375 | | Double = ffi::DBUS_TYPE_DOUBLE as u8, |
376 | | /// File |
377 | | UnixFd = ffi::DBUS_TYPE_UNIX_FD as u8, |
378 | | /// Use tuples or Vec<Box<dyn RefArg>> to read/write structs. |
379 | | Struct = ffi::DBUS_TYPE_STRUCT as u8, |
380 | | /// Path |
381 | | ObjectPath = ffi::DBUS_TYPE_OBJECT_PATH as u8, |
382 | | /// Signature |
383 | | Signature = ffi::DBUS_TYPE_SIGNATURE as u8, |
384 | | } |
385 | | |
386 | | const ALL_ARG_TYPES: [(ArgType, &str); 18] = |
387 | | [(ArgType::Variant, "Variant"), |
388 | | (ArgType::Array, "Array/Dict"), |
389 | | (ArgType::Struct, "Struct"), |
390 | | (ArgType::String, "String"), |
391 | | (ArgType::DictEntry, "Dict entry"), |
392 | | (ArgType::ObjectPath, "Path"), |
393 | | (ArgType::Signature, "Signature"), |
394 | | (ArgType::UnixFd, "File"), |
395 | | (ArgType::Boolean, "bool"), |
396 | | (ArgType::Byte, "u8"), |
397 | | (ArgType::Int16, "i16"), |
398 | | (ArgType::Int32, "i32"), |
399 | | (ArgType::Int64, "i64"), |
400 | | (ArgType::UInt16, "u16"), |
401 | | (ArgType::UInt32, "u32"), |
402 | | (ArgType::UInt64, "u64"), |
403 | | (ArgType::Double, "f64"), |
404 | | (ArgType::Invalid, "nothing")]; |
405 | | |
406 | | impl ArgType { |
407 | | /// A str corresponding to the name of a Rust type. |
408 | 0 | pub fn as_str(self) -> &'static str { |
409 | 0 | ALL_ARG_TYPES.iter().skip_while(|a| a.0 != self).next().unwrap().1 |
410 | 0 | } |
411 | | |
412 | | /// Returns a Vec of all possible argtypes. |
413 | 0 | pub fn all() -> Vec<Self> { |
414 | 0 | ALL_ARG_TYPES.iter().map(|x| x.0).collect() |
415 | 0 | } |
416 | | |
417 | | /// Converts an i32 to an ArgType (or an error). |
418 | 0 | pub fn from_i32(i: i32) -> Result<ArgType, String> { |
419 | 0 | for &(a, _) in &ALL_ARG_TYPES { |
420 | 0 | if a as i32 == i { return Ok(a); } |
421 | | } |
422 | 0 | Err(format!("Invalid ArgType {} ({})", i, i as u8 as char)) |
423 | 0 | } |
424 | | } |
425 | | |
426 | | |
427 | | /// Error struct to indicate a D-Bus argument type mismatch. |
428 | | /// |
429 | | /// Might be returned from `iter::read()`. |
430 | | #[derive(Clone, Copy, Debug, PartialEq, Eq)] |
431 | | pub struct TypeMismatchError { |
432 | | expected: ArgType, |
433 | | found: ArgType, |
434 | | position: u32, |
435 | | } |
436 | | |
437 | | impl TypeMismatchError { |
438 | | /// The ArgType we were trying to read, but failed |
439 | 0 | pub fn expected_arg_type(&self) -> ArgType { self.expected } |
440 | | |
441 | | /// The ArgType we should have been trying to read, if we wanted the read to succeed |
442 | 0 | pub fn found_arg_type(&self) -> ArgType { self.found } |
443 | | |
444 | | /// At what argument was the error found? |
445 | | /// |
446 | | /// Returns 0 for first argument, 1 for second argument, etc. |
447 | 0 | pub fn pos(&self) -> u32 { self.position } |
448 | | } |
449 | | |
450 | | impl error::Error for TypeMismatchError { |
451 | 0 | fn description(&self) -> &str { "D-Bus argument type mismatch" } |
452 | 0 | fn cause(&self) -> Option<&dyn error::Error> { None } |
453 | | } |
454 | | |
455 | | impl fmt::Display for TypeMismatchError { |
456 | 0 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
457 | 0 | write!(f, "D-Bus argument type mismatch at position {}: expected {}, found {}", |
458 | 0 | self.position, self.expected.as_str(), |
459 | 0 | if self.expected == self.found { "same but still different somehow" } else { self.found.as_str() } |
460 | | ) |
461 | 0 | } |
462 | | } |
463 | | |
464 | | |
465 | | #[allow(dead_code)] |
466 | 0 | fn test_compile() { |
467 | 0 | let mut msg = Message::new_signal("/", "a.b", "C").unwrap(); |
468 | 0 | let mut q = IterAppend::new(&mut msg); |
469 | 0 |
|
470 | 0 | q.append(5u8); |
471 | 0 | q.append(Array::new(&[5u8, 6, 7])); |
472 | 0 | q.append((8u8, &[9u8, 6, 7][..])); |
473 | 0 | q.append(Variant((6u8, 7u8))); |
474 | 0 | } |