1#[cfg(unix)]
6#[cfg_attr(docsrs, doc(cfg(unix)))]
7use crate::UnixFDList;
8use crate::{
9 ffi, DBusCapabilityFlags, DBusMessageByteOrder, DBusMessageFlags, DBusMessageHeaderField,
10 DBusMessageType,
11};
12use glib::{
13 prelude::*,
14 signal::{connect_raw, SignalHandlerId},
15 translate::*,
16};
17use std::boxed::Box as Box_;
18
19glib::wrapper! {
20 #[doc(alias = "GDBusMessage")]
21 pub struct DBusMessage(Object<ffi::GDBusMessage>);
22
23 match fn {
24 type_ => || ffi::g_dbus_message_get_type(),
25 }
26}
27
28impl DBusMessage {
29 #[doc(alias = "g_dbus_message_new")]
30 pub fn new() -> DBusMessage {
31 unsafe { from_glib_full(ffi::g_dbus_message_new()) }
32 }
33
34 #[doc(alias = "g_dbus_message_new_from_blob")]
35 #[doc(alias = "new_from_blob")]
36 pub fn from_blob(
37 blob: &[u8],
38 capabilities: DBusCapabilityFlags,
39 ) -> Result<DBusMessage, glib::Error> {
40 let blob_len = blob.len() as _;
41 unsafe {
42 let mut error = std::ptr::null_mut();
43 let ret = ffi::g_dbus_message_new_from_blob(
44 blob.to_glib_none().0,
45 blob_len,
46 capabilities.into_glib(),
47 &mut error,
48 );
49 if error.is_null() {
50 Ok(from_glib_full(ret))
51 } else {
52 Err(from_glib_full(error))
53 }
54 }
55 }
56
57 #[doc(alias = "g_dbus_message_new_method_call")]
58 pub fn new_method_call(
59 name: Option<&str>,
60 path: &str,
61 interface_: Option<&str>,
62 method: &str,
63 ) -> DBusMessage {
64 unsafe {
65 from_glib_full(ffi::g_dbus_message_new_method_call(
66 name.to_glib_none().0,
67 path.to_glib_none().0,
68 interface_.to_glib_none().0,
69 method.to_glib_none().0,
70 ))
71 }
72 }
73
74 #[doc(alias = "g_dbus_message_new_signal")]
75 pub fn new_signal(path: &str, interface_: &str, signal: &str) -> DBusMessage {
76 unsafe {
77 from_glib_full(ffi::g_dbus_message_new_signal(
78 path.to_glib_none().0,
79 interface_.to_glib_none().0,
80 signal.to_glib_none().0,
81 ))
82 }
83 }
84
85 #[doc(alias = "g_dbus_message_copy")]
86 pub fn copy(&self) -> Result<DBusMessage, glib::Error> {
87 unsafe {
88 let mut error = std::ptr::null_mut();
89 let ret = ffi::g_dbus_message_copy(self.to_glib_none().0, &mut error);
90 if error.is_null() {
91 Ok(from_glib_full(ret))
92 } else {
93 Err(from_glib_full(error))
94 }
95 }
96 }
97
98 #[doc(alias = "g_dbus_message_get_arg0")]
99 #[doc(alias = "get_arg0")]
100 pub fn arg0(&self) -> Option<glib::GString> {
101 unsafe { from_glib_none(ffi::g_dbus_message_get_arg0(self.to_glib_none().0)) }
102 }
103
104 #[cfg(feature = "v2_80")]
105 #[cfg_attr(docsrs, doc(cfg(feature = "v2_80")))]
106 #[doc(alias = "g_dbus_message_get_arg0_path")]
107 #[doc(alias = "get_arg0_path")]
108 pub fn arg0_path(&self) -> Option<glib::GString> {
109 unsafe { from_glib_none(ffi::g_dbus_message_get_arg0_path(self.to_glib_none().0)) }
110 }
111
112 #[doc(alias = "g_dbus_message_get_body")]
113 #[doc(alias = "get_body")]
114 pub fn body(&self) -> Option<glib::Variant> {
115 unsafe { from_glib_none(ffi::g_dbus_message_get_body(self.to_glib_none().0)) }
116 }
117
118 #[doc(alias = "g_dbus_message_get_byte_order")]
119 #[doc(alias = "get_byte_order")]
120 pub fn byte_order(&self) -> DBusMessageByteOrder {
121 unsafe { from_glib(ffi::g_dbus_message_get_byte_order(self.to_glib_none().0)) }
122 }
123
124 #[doc(alias = "g_dbus_message_get_destination")]
125 #[doc(alias = "get_destination")]
126 pub fn destination(&self) -> Option<glib::GString> {
127 unsafe { from_glib_none(ffi::g_dbus_message_get_destination(self.to_glib_none().0)) }
128 }
129
130 #[doc(alias = "g_dbus_message_get_error_name")]
131 #[doc(alias = "get_error_name")]
132 pub fn error_name(&self) -> Option<glib::GString> {
133 unsafe { from_glib_none(ffi::g_dbus_message_get_error_name(self.to_glib_none().0)) }
134 }
135
136 #[doc(alias = "g_dbus_message_get_flags")]
137 #[doc(alias = "get_flags")]
138 pub fn flags(&self) -> DBusMessageFlags {
139 unsafe { from_glib(ffi::g_dbus_message_get_flags(self.to_glib_none().0)) }
140 }
141
142 #[doc(alias = "g_dbus_message_get_header")]
143 #[doc(alias = "get_header")]
144 pub fn header(&self, header_field: DBusMessageHeaderField) -> Option<glib::Variant> {
145 unsafe {
146 from_glib_none(ffi::g_dbus_message_get_header(
147 self.to_glib_none().0,
148 header_field.into_glib(),
149 ))
150 }
151 }
152
153 #[doc(alias = "g_dbus_message_get_interface")]
154 #[doc(alias = "get_interface")]
155 pub fn interface(&self) -> Option<glib::GString> {
156 unsafe { from_glib_none(ffi::g_dbus_message_get_interface(self.to_glib_none().0)) }
157 }
158
159 #[doc(alias = "g_dbus_message_get_locked")]
160 #[doc(alias = "get_locked")]
161 #[doc(alias = "locked")]
162 pub fn is_locked(&self) -> bool {
163 unsafe { from_glib(ffi::g_dbus_message_get_locked(self.to_glib_none().0)) }
164 }
165
166 #[doc(alias = "g_dbus_message_get_member")]
167 #[doc(alias = "get_member")]
168 pub fn member(&self) -> Option<glib::GString> {
169 unsafe { from_glib_none(ffi::g_dbus_message_get_member(self.to_glib_none().0)) }
170 }
171
172 #[doc(alias = "g_dbus_message_get_message_type")]
173 #[doc(alias = "get_message_type")]
174 pub fn message_type(&self) -> DBusMessageType {
175 unsafe { from_glib(ffi::g_dbus_message_get_message_type(self.to_glib_none().0)) }
176 }
177
178 #[cfg(unix)]
179 #[cfg_attr(docsrs, doc(cfg(unix)))]
180 #[doc(alias = "g_dbus_message_get_num_unix_fds")]
181 #[doc(alias = "get_num_unix_fds")]
182 pub fn num_unix_fds(&self) -> u32 {
183 unsafe { ffi::g_dbus_message_get_num_unix_fds(self.to_glib_none().0) }
184 }
185
186 #[doc(alias = "g_dbus_message_get_path")]
187 #[doc(alias = "get_path")]
188 pub fn path(&self) -> Option<glib::GString> {
189 unsafe { from_glib_none(ffi::g_dbus_message_get_path(self.to_glib_none().0)) }
190 }
191
192 #[doc(alias = "g_dbus_message_get_reply_serial")]
193 #[doc(alias = "get_reply_serial")]
194 pub fn reply_serial(&self) -> u32 {
195 unsafe { ffi::g_dbus_message_get_reply_serial(self.to_glib_none().0) }
196 }
197
198 #[doc(alias = "g_dbus_message_get_sender")]
199 #[doc(alias = "get_sender")]
200 pub fn sender(&self) -> Option<glib::GString> {
201 unsafe { from_glib_none(ffi::g_dbus_message_get_sender(self.to_glib_none().0)) }
202 }
203
204 #[doc(alias = "g_dbus_message_get_serial")]
205 #[doc(alias = "get_serial")]
206 pub fn serial(&self) -> u32 {
207 unsafe { ffi::g_dbus_message_get_serial(self.to_glib_none().0) }
208 }
209
210 #[doc(alias = "g_dbus_message_get_signature")]
211 #[doc(alias = "get_signature")]
212 pub fn signature(&self) -> glib::GString {
213 unsafe { from_glib_none(ffi::g_dbus_message_get_signature(self.to_glib_none().0)) }
214 }
215
216 #[cfg(unix)]
217 #[cfg_attr(docsrs, doc(cfg(unix)))]
218 #[doc(alias = "g_dbus_message_get_unix_fd_list")]
219 #[doc(alias = "get_unix_fd_list")]
220 pub fn unix_fd_list(&self) -> Option<UnixFDList> {
221 unsafe { from_glib_none(ffi::g_dbus_message_get_unix_fd_list(self.to_glib_none().0)) }
222 }
223
224 #[doc(alias = "g_dbus_message_lock")]
225 pub fn lock(&self) {
226 unsafe {
227 ffi::g_dbus_message_lock(self.to_glib_none().0);
228 }
229 }
230
231 #[doc(alias = "g_dbus_message_new_method_error_literal")]
238 #[must_use]
239 pub fn new_method_error_literal(&self, error_name: &str, error_message: &str) -> DBusMessage {
240 unsafe {
241 from_glib_full(ffi::g_dbus_message_new_method_error_literal(
242 self.to_glib_none().0,
243 error_name.to_glib_none().0,
244 error_message.to_glib_none().0,
245 ))
246 }
247 }
248
249 #[doc(alias = "g_dbus_message_new_method_reply")]
256 #[must_use]
257 pub fn new_method_reply(&self) -> DBusMessage {
258 unsafe { from_glib_full(ffi::g_dbus_message_new_method_reply(self.to_glib_none().0)) }
259 }
260
261 #[doc(alias = "g_dbus_message_print")]
262 pub fn print(&self, indent: u32) -> glib::GString {
263 unsafe { from_glib_full(ffi::g_dbus_message_print(self.to_glib_none().0, indent)) }
264 }
265
266 #[doc(alias = "g_dbus_message_set_body")]
267 pub fn set_body(&self, body: &glib::Variant) {
268 unsafe {
269 ffi::g_dbus_message_set_body(self.to_glib_none().0, body.to_glib_none().0);
270 }
271 }
272
273 #[doc(alias = "g_dbus_message_set_byte_order")]
274 pub fn set_byte_order(&self, byte_order: DBusMessageByteOrder) {
275 unsafe {
276 ffi::g_dbus_message_set_byte_order(self.to_glib_none().0, byte_order.into_glib());
277 }
278 }
279
280 #[doc(alias = "g_dbus_message_set_destination")]
281 pub fn set_destination(&self, value: Option<&str>) {
282 unsafe {
283 ffi::g_dbus_message_set_destination(self.to_glib_none().0, value.to_glib_none().0);
284 }
285 }
286
287 #[doc(alias = "g_dbus_message_set_error_name")]
288 pub fn set_error_name(&self, value: &str) {
289 unsafe {
290 ffi::g_dbus_message_set_error_name(self.to_glib_none().0, value.to_glib_none().0);
291 }
292 }
293
294 #[doc(alias = "g_dbus_message_set_flags")]
295 pub fn set_flags(&self, flags: DBusMessageFlags) {
296 unsafe {
297 ffi::g_dbus_message_set_flags(self.to_glib_none().0, flags.into_glib());
298 }
299 }
300
301 #[doc(alias = "g_dbus_message_set_header")]
302 pub fn set_header(&self, header_field: DBusMessageHeaderField, value: Option<&glib::Variant>) {
303 unsafe {
304 ffi::g_dbus_message_set_header(
305 self.to_glib_none().0,
306 header_field.into_glib(),
307 value.to_glib_none().0,
308 );
309 }
310 }
311
312 #[doc(alias = "g_dbus_message_set_interface")]
313 pub fn set_interface(&self, value: Option<&str>) {
314 unsafe {
315 ffi::g_dbus_message_set_interface(self.to_glib_none().0, value.to_glib_none().0);
316 }
317 }
318
319 #[doc(alias = "g_dbus_message_set_member")]
320 pub fn set_member(&self, value: Option<&str>) {
321 unsafe {
322 ffi::g_dbus_message_set_member(self.to_glib_none().0, value.to_glib_none().0);
323 }
324 }
325
326 #[doc(alias = "g_dbus_message_set_message_type")]
327 pub fn set_message_type(&self, type_: DBusMessageType) {
328 unsafe {
329 ffi::g_dbus_message_set_message_type(self.to_glib_none().0, type_.into_glib());
330 }
331 }
332
333 #[cfg(unix)]
334 #[cfg_attr(docsrs, doc(cfg(unix)))]
335 #[doc(alias = "g_dbus_message_set_num_unix_fds")]
336 pub fn set_num_unix_fds(&self, value: u32) {
337 unsafe {
338 ffi::g_dbus_message_set_num_unix_fds(self.to_glib_none().0, value);
339 }
340 }
341
342 #[doc(alias = "g_dbus_message_set_path")]
343 pub fn set_path(&self, value: Option<&str>) {
344 unsafe {
345 ffi::g_dbus_message_set_path(self.to_glib_none().0, value.to_glib_none().0);
346 }
347 }
348
349 #[doc(alias = "g_dbus_message_set_reply_serial")]
350 pub fn set_reply_serial(&self, value: u32) {
351 unsafe {
352 ffi::g_dbus_message_set_reply_serial(self.to_glib_none().0, value);
353 }
354 }
355
356 #[doc(alias = "g_dbus_message_set_sender")]
357 pub fn set_sender(&self, value: Option<&str>) {
358 unsafe {
359 ffi::g_dbus_message_set_sender(self.to_glib_none().0, value.to_glib_none().0);
360 }
361 }
362
363 #[doc(alias = "g_dbus_message_set_serial")]
364 pub fn set_serial(&self, serial: u32) {
365 unsafe {
366 ffi::g_dbus_message_set_serial(self.to_glib_none().0, serial);
367 }
368 }
369
370 #[doc(alias = "g_dbus_message_set_signature")]
371 pub fn set_signature(&self, value: Option<&str>) {
372 unsafe {
373 ffi::g_dbus_message_set_signature(self.to_glib_none().0, value.to_glib_none().0);
374 }
375 }
376
377 #[cfg(unix)]
378 #[cfg_attr(docsrs, doc(cfg(unix)))]
379 #[doc(alias = "g_dbus_message_set_unix_fd_list")]
380 pub fn set_unix_fd_list(&self, fd_list: Option<&impl IsA<UnixFDList>>) {
381 unsafe {
382 ffi::g_dbus_message_set_unix_fd_list(
383 self.to_glib_none().0,
384 fd_list.map(|p| p.as_ref()).to_glib_none().0,
385 );
386 }
387 }
388
389 #[doc(alias = "g_dbus_message_to_blob")]
390 pub fn to_blob(&self, capabilities: DBusCapabilityFlags) -> Result<Vec<u8>, glib::Error> {
391 unsafe {
392 let mut out_size = std::mem::MaybeUninit::uninit();
393 let mut error = std::ptr::null_mut();
394 let ret = ffi::g_dbus_message_to_blob(
395 self.to_glib_none().0,
396 out_size.as_mut_ptr(),
397 capabilities.into_glib(),
398 &mut error,
399 );
400 if error.is_null() {
401 Ok(FromGlibContainer::from_glib_full_num(
402 ret,
403 out_size.assume_init() as _,
404 ))
405 } else {
406 Err(from_glib_full(error))
407 }
408 }
409 }
410
411 #[doc(alias = "g_dbus_message_to_gerror")]
412 pub fn to_gerror(&self) -> Result<(), glib::Error> {
413 unsafe {
414 let mut error = std::ptr::null_mut();
415 let is_ok = ffi::g_dbus_message_to_gerror(self.to_glib_none().0, &mut error);
416 debug_assert_eq!(is_ok == glib::ffi::GFALSE, !error.is_null());
417 if error.is_null() {
418 Ok(())
419 } else {
420 Err(from_glib_full(error))
421 }
422 }
423 }
424
425 #[doc(alias = "g_dbus_message_bytes_needed")]
426 pub fn bytes_needed(blob: &[u8]) -> Result<isize, glib::Error> {
427 let blob_len = blob.len() as _;
428 unsafe {
429 let mut error = std::ptr::null_mut();
430 let ret = ffi::g_dbus_message_bytes_needed(blob.to_glib_none().0, blob_len, &mut error);
431 if error.is_null() {
432 Ok(ret)
433 } else {
434 Err(from_glib_full(error))
435 }
436 }
437 }
438
439 #[doc(alias = "locked")]
440 pub fn connect_locked_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
441 unsafe extern "C" fn notify_locked_trampoline<F: Fn(&DBusMessage) + 'static>(
442 this: *mut ffi::GDBusMessage,
443 _param_spec: glib::ffi::gpointer,
444 f: glib::ffi::gpointer,
445 ) {
446 let f: &F = &*(f as *const F);
447 f(&from_glib_borrow(this))
448 }
449 unsafe {
450 let f: Box_<F> = Box_::new(f);
451 connect_raw(
452 self.as_ptr() as *mut _,
453 c"notify::locked".as_ptr() as *const _,
454 Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
455 notify_locked_trampoline::<F> as *const (),
456 )),
457 Box_::into_raw(f),
458 )
459 }
460 }
461}
462
463impl Default for DBusMessage {
464 fn default() -> Self {
465 Self::new()
466 }
467}