# NAME
Protocol::DBus - D-Bus in pure Perl
# SYNOPSIS
my $dbus = Protcol::DBus::Client::system();
For blocking I/O:
$dbus->do_authn();
$dbus->send_call(
path => '/org/freedesktop/DBus',
interface => 'org.freedesktop.DBus.Properties',
member => 'GetAll',
destination => 'org.freedesktop.DBus',
signature => 's',
body => [ 'org.freedesktop.DBus' ],
on_return => sub { my ($msg) = @_ },
);
my $msg = $dbus->get_message();
For non-blocking I/O:
$dbus->blocking(0);
my $fileno = $dbus->fileno();
# You can use whatever polling method you prefer;
# the following is just for demonstration:
vec( my $mask, $fileno, 1 ) = 1;
while (!$dbus->do_authn()) {
if ($dbus->authn_pending_send()) {
select( undef, my $wout = $mask, undef, undef );
}
else {
select( my $rout = $mask, undef, undef, undef );
}
}
$dbus->send_call( .. ); # same parameters as above
while (1) {
my $wout = $dbus->pending_send() || q<>;
$wout &&= $mask;
select( my $rout = $mask, $wout, undef, undef );
if ($wout =~ tr<\0><>c) {
$dbus->flush_write_queue();
}
if ($rout =~ tr<\0><>c) {
# It’s critical to get_message() until undef is returned.
1 while $dbus->get_message();
}
}
# DESCRIPTION
This is an original, pure-Perl implementation of client logic for
[the D-Bus protocol](
https://dbus.freedesktop.org/doc/dbus-specification.html).
It’s not much more than an implementation of the wire protocol; it doesn’t
know about objects, services, or anything else besides the actual messages.
That said, what’s here already should allow implementation of anything you
can do with D-Bus; moreover, it would not be difficult to implement
convenience logic—e.g., to mimic interfaces like [Net::DBus](
https://metacpan.org/pod/Net::DBus)—on top of
what is here now.
Right now this distribution is an experimental effort. If you use it in your
project, be sure to check the changelog before deploying a new version. Please
file bug reports as appropriate.
See [Protocol::DBus::Client](
https://metacpan.org/pod/Protocol::DBus::Client) and the above sample for a starting point.
# EXAMPLES
See the distribution’s `examples/` directory.
# NOTES
- UNIX FD support requires that [Socket::MsgHdr](
https://metacpan.org/pod/Socket::MsgHdr) be loaded at
authentication time.
- Currently EXTERNAL is the only supported authentication mechanism.
# TODO
- Add conveniences like match rule logic.
- Improve parsing of bus paths in environment variables.
- Add DBUS\_COOKIE\_SHA1 authentication.
- Add more tests.
# SEE ALSO
[Net::DBus](
https://metacpan.org/pod/Net::DBus) uses libdbus (via XS) as its backend. It’s more mature and
more idiomatic as to how a D-Bus application is normally written, but
it’s also heavier, and it doesn’t appear to support passing filehandles.