Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add some additional methods to Message #287

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
31 changes: 31 additions & 0 deletions dbus/src/message.rs
Expand Up @@ -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<Message, String>
where D: Into<BusName<'d>>, P: Into<Path<'p>>, I: Into<Interface<'i>>, M: Into<Member<'m>> {
Expand Down Expand Up @@ -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 } }

Expand All @@ -165,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<ErrorName> {
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.
Expand Down
4 changes: 4 additions & 0 deletions libdbus-sys/src/lib.rs
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -238,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,
Expand Down