async_rustbus/rustbus_core/
standard_messages.rs

1//! Some standard messages that are often needed
2use crate::rustbus_core;
3
4use rustbus_core::message_builder::DynamicHeader;
5use rustbus_core::message_builder::MarshalledMessage;
6use rustbus_core::message_builder::MessageBuilder;
7
8pub fn hello() -> MarshalledMessage {
9    make_standard_msg("Hello")
10}
11
12pub fn ping(dest: String) -> MarshalledMessage {
13    MessageBuilder::new()
14        .call("Ping")
15        .on("/org/freedesktop/DBus")
16        .with_interface("org.freedesktop.DBus.Peer")
17        .at(dest)
18        .build()
19}
20
21pub fn ping_bus() -> MarshalledMessage {
22    MessageBuilder::new()
23        .call("Ping")
24        .on("/org/freedesktop/DBus")
25        .with_interface("org.freedesktop.DBus.Peer")
26        .build()
27}
28
29pub fn list_names() -> MarshalledMessage {
30    make_standard_msg("ListNames")
31}
32
33pub const DBUS_NAME_FLAG_ALLOW_REPLACEMENT: u32 = 1;
34pub const DBUS_NAME_FLAG_REPLACE_EXISTING: u32 = 1 << 1;
35pub const DBUS_NAME_FLAG_DO_NOT_QUEUE: u32 = 1 << 2;
36
37pub const DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER: u32 = 1;
38pub const DBUS_REQUEST_NAME_REPLY_IN_QUEUE: u32 = 2;
39pub const DBUS_REQUEST_NAME_REPLY_EXISTS: u32 = 3;
40pub const DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER: u32 = 4;
41
42fn make_standard_msg(name: &str) -> MarshalledMessage {
43    MessageBuilder::new()
44        .call(name)
45        .on("/org/freedesktop/DBus")
46        .with_interface("org.freedesktop.DBus")
47        .at("org.freedesktop.DBus")
48        .build()
49}
50/// Request a name on the bus
51pub fn request_name(name: &str, flags: u32) -> MarshalledMessage {
52    let mut msg = make_standard_msg("RequestName");
53    msg.body.push_param(name).unwrap();
54    msg.body.push_param(flags).unwrap();
55    msg
56}
57
58/// Release a name on the bus
59pub fn release_name(name: &str) -> MarshalledMessage {
60    let mut msg = make_standard_msg("ReleaseName");
61    msg.body.push_param(name).unwrap();
62    msg
63}
64
65/// Add a match rule to receive signals. e.g. match_rule = "type='signal'" to get all signals
66pub fn add_match(match_rule: &str) -> MarshalledMessage {
67    let mut msg = make_standard_msg("AddMatch");
68    msg.body.push_param(match_rule).unwrap();
69    msg
70}
71/// Remove a match rule to receive signals. e.g. match_rule = "type='signal'" to get all signals
72pub fn remove_match(match_rule: &str) -> MarshalledMessage {
73    let mut msg = make_standard_msg("RemoveMatch");
74    msg.body.push_param(match_rule).unwrap();
75    msg
76}
77/// Error message to tell the caller that this method is not known by your server
78pub fn unknown_method(call: &DynamicHeader) -> MarshalledMessage {
79    let text = format!(
80        "No calls to {}.{} are accepted for object {}",
81        call.interface.clone().unwrap_or_else(|| "".to_owned()),
82        call.member.clone().unwrap_or_else(|| "".to_owned()),
83        call.object.clone().unwrap_or_else(|| "".to_owned()),
84    );
85    call.make_error_response(
86        "org.freedesktop.DBus.Error.UnknownMethod".to_owned(),
87        Some(text),
88    )
89}
90
91/// Error message to tell the caller that this method uses a different interface than what the caller provided as parameters
92pub fn invalid_args(call: &DynamicHeader, sig: Option<&str>) -> MarshalledMessage {
93    let text = format!(
94        "Invalid arguments for calls to {}.{} on object {} {}",
95        call.interface.clone().unwrap_or_else(|| "".to_owned()),
96        call.member.clone().unwrap_or_else(|| "".to_owned()),
97        call.object.clone().unwrap_or_else(|| "".to_owned()),
98        if let Some(sig) = sig {
99            format!("expected signature: {}", sig)
100        } else {
101            "".to_owned()
102        }
103    );
104
105    call.make_error_response(
106        "org.freedesktop.DBus.Error.InvalidArgs".to_owned(),
107        Some(text),
108    )
109}