From 47a6c2acc1210f8fb55f035fc725369c2f4fe822 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Wed, 14 Oct 2020 13:36:18 -0700 Subject: [PATCH 1/2] Add ::new() and ::set_reply_serial() to Message --- dbus/src/message.rs | 19 +++++++++++++++++++ libdbus-sys/src/lib.rs | 2 ++ 2 files changed, 21 insertions(+) diff --git a/dbus/src/message.rs b/dbus/src/message.rs index 687e6052..7e8d5672 100644 --- a/dbus/src/message.rs +++ b/dbus/src/message.rs @@ -36,6 +36,19 @@ pub struct Message { unsafe impl Send for Message {} impl Message { + /// Creates a new message of a given type. + pub fn new(msg_type: MessageType) -> Self { + let msg_type = match msg_type { + MessageType::MethodCall => 1, + MessageType::MethodReturn => 2, + MessageType::Error => 3, + MessageType::Signal => 4, + }; + let ptr = unsafe { ffi::dbus_message_new(msg_type) }; + if ptr.is_null() { panic!("D-Bus error: dbus_message_new failed") } + Message { msg: ptr } + } + /// Creates a new method call message. pub fn new_method_call<'d, 'p, 'i, 'm, D, P, I, M>(destination: D, path: P, iface: I, method: M) -> Result where D: Into>, P: Into>, I: Into>, M: Into> { @@ -145,6 +158,12 @@ impl Message { if s == 0 { None } else { Some(s) } } + /// Gets the serial of the message this message is a reply to. + pub fn set_reply_serial(&self, reply_serial: u32) { + let x = unsafe { ffi::dbus_message_set_reply_serial(self.msg, reply_serial) }; + if x == 0 { panic!("D-Bus error: dbus_message_set_reply_serial failed") } + } + /// Returns true if the message does not expect a reply. pub fn get_no_reply(&self) -> bool { unsafe { ffi::dbus_message_get_no_reply(self.msg) != 0 } } diff --git a/libdbus-sys/src/lib.rs b/libdbus-sys/src/lib.rs index 913a15e6..fe243b53 100644 --- a/libdbus-sys/src/lib.rs +++ b/libdbus-sys/src/lib.rs @@ -213,6 +213,7 @@ extern "C" { pub fn dbus_set_error(error: *mut DBusError, name: *const c_char, message: *const c_char, ...); pub fn dbus_set_error_from_message(error: *mut DBusError, message: *mut DBusMessage) -> u32; + pub fn dbus_message_new(msg_type: c_int) -> *mut DBusMessage; pub fn dbus_message_new_method_call(destination: *const c_char, path: *const c_char, iface: *const c_char, method: *const c_char) -> *mut DBusMessage; pub fn dbus_message_new_method_return(message: *mut DBusMessage) -> *mut DBusMessage; @@ -226,6 +227,7 @@ extern "C" { pub fn dbus_message_is_method_call(message: *mut DBusMessage, iface: *const c_char, method: *const c_char) -> u32; pub fn dbus_message_is_signal(message: *mut DBusMessage, iface: *const c_char, signal_name: *const c_char) -> u32; pub fn dbus_message_get_reply_serial(message: *mut DBusMessage) -> u32; + pub fn dbus_message_set_reply_serial(message: *mut DBusMessage, reply_serial: u32) -> u32; pub fn dbus_message_get_serial(message: *mut DBusMessage) -> u32; pub fn dbus_message_get_path(message: *mut DBusMessage) -> *const c_char; pub fn dbus_message_get_interface(message: *mut DBusMessage) -> *const c_char; From 0e9a4e190ec66088781fffd6fcd791715f63ccee Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Wed, 14 Oct 2020 13:53:50 -0700 Subject: [PATCH 2/2] Add ::get_error_name() and ::set_error_name() to Message --- dbus/src/message.rs | 12 ++++++++++++ libdbus-sys/src/lib.rs | 2 ++ 2 files changed, 14 insertions(+) diff --git a/dbus/src/message.rs b/dbus/src/message.rs index 7e8d5672..662443d7 100644 --- a/dbus/src/message.rs +++ b/dbus/src/message.rs @@ -184,6 +184,18 @@ impl Message { unsafe { ffi::dbus_message_set_auto_start(self.msg, if v { 1 } else { 0 }) } } + /// Gets the error name + pub fn get_error_name(&self) -> Option { + self.msg_internal_str(unsafe { ffi::dbus_message_get_error_name(self.msg) }) + .map(|s| unsafe { ErrorName::from_slice_unchecked(s) }) + } + + /// Sets the error name + pub fn set_error_name(&mut self, error_name: &ErrorName) { + let x = unsafe { ffi::dbus_message_set_error_name(self.msg, error_name.as_ptr()) }; + if x == 0 { panic!("D-Bus error: dbus_message_set_error_name failed") } + } + /// Add one or more MessageItems to this Message. /// /// Note: using `append1`, `append2` or `append3` might be faster, especially for large arrays. diff --git a/libdbus-sys/src/lib.rs b/libdbus-sys/src/lib.rs index fe243b53..beb7db9a 100644 --- a/libdbus-sys/src/lib.rs +++ b/libdbus-sys/src/lib.rs @@ -240,6 +240,8 @@ extern "C" { pub fn dbus_message_set_no_reply(message: *mut DBusMessage, no_reply: u32); pub fn dbus_message_get_auto_start(message: *mut DBusMessage) -> u32; pub fn dbus_message_set_auto_start(message: *mut DBusMessage, no_reply: u32); + pub fn dbus_message_get_error_name(message: *mut DBusMessage) -> *const c_char; + pub fn dbus_message_set_error_name(message: *mut DBusMessage, error_name: *const c_char) -> u32; pub fn dbus_message_iter_append_basic(iter: *mut DBusMessageIter, t: c_int, value: *const c_void) -> u32; pub fn dbus_message_iter_append_fixed_array(iter: *mut DBusMessageIter, element_type: c_int,