-
Notifications
You must be signed in to change notification settings - Fork 25
Expand file tree
/
Copy pathdbus.cpp
More file actions
68 lines (57 loc) · 2.36 KB
/
dbus.cpp
File metadata and controls
68 lines (57 loc) · 2.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <dbus/dbus.h>
#include <cstddef>
#include <cstdio>
#include <iostream>
int
main (
int argc,
char * argv[]
) {
(void)argc;
(void)argv;
DBusError dbus_error;
DBusConnection * dbus_conn = nullptr;
DBusMessage * dbus_msg = nullptr;
DBusMessage * dbus_reply = nullptr;
const char * dbus_result = nullptr;
// Initialize D-Bus error
::dbus_error_init(&dbus_error);
// Connect to D-Bus
if ( nullptr == (dbus_conn = ::dbus_bus_get(DBUS_BUS_SYSTEM, &dbus_error)) ) {
::perror(dbus_error.name);
::perror(dbus_error.message);
// Compose remote procedure call
} else if ( nullptr == (dbus_msg = ::dbus_message_new_method_call("org.freedesktop.DBus", "/", "org.freedesktop.DBus.Introspectable", "Introspect")) ) {
::dbus_connection_unref(dbus_conn);
::perror("ERROR: ::dbus_message_new_method_call - Unable to allocate memory for the message!");
// Invoke remote procedure call, block for response
} else if ( nullptr == (dbus_reply = ::dbus_connection_send_with_reply_and_block(dbus_conn, dbus_msg, DBUS_TIMEOUT_USE_DEFAULT, &dbus_error)) ) {
::dbus_message_unref(dbus_msg);
::dbus_connection_unref(dbus_conn);
::perror(dbus_error.name);
::perror(dbus_error.message);
// Parse response
} else if ( !::dbus_message_get_args(dbus_reply, &dbus_error, DBUS_TYPE_STRING, &dbus_result, DBUS_TYPE_INVALID) ) {
::dbus_message_unref(dbus_msg);
::dbus_message_unref(dbus_reply);
::dbus_connection_unref(dbus_conn);
::perror(dbus_error.name);
::perror(dbus_error.message);
// Work with the results of the remote procedure call
} else {
std::cout << "Connected to D-Bus as \"" << ::dbus_bus_get_unique_name(dbus_conn) << "\"." << std::endl;
std::cout << "Introspection Result:" << std::endl;
std::cout << std::endl << dbus_result << std::endl << std::endl;
::dbus_message_unref(dbus_msg);
::dbus_message_unref(dbus_reply);
/*
* Applications must not close shared connections -
* see dbus_connection_close() docs. This is a bug in the application.
*/
//::dbus_connection_close(dbus_conn);
// When using the System Bus, unreference
// the connection instead of closing it
::dbus_connection_unref(dbus_conn);
}
return 0;
}