Protocol-DBus
view release on metacpan or search on metacpan
lib/Protocol/DBus.pm view on Meta::CPAN
package Protocol::DBus;
use strict;
use warnings;
our $VERSION = '0.21';
=encoding utf8
=head1 NAME
Protocol::DBus - D-Bus in pure Perl
=head1 SYNOPSIS
(NB: Examples below assume use of
L<subroutine signatures|perlsub/Signatures>.)
For blocking I/O:
my $dbus = Protcol::DBus::Client::system();
# Authentication and âHelloâ call/response:
$dbus->initialize();
$dbus->send_call(
path => '/org/freedesktop/DBus',
interface => 'org.freedesktop.DBus.Properties',
member => 'GetAll',
destination => 'org.freedesktop.DBus',
signature => 's',
body => [ 'org.freedesktop.DBus' ],
)->then( sub ($resp_msg) { .. } );
my $msg = $dbus->get_message();
For non-blocking I/O, it is recommended to use an event loop.
This distribution includes some connectors to simplify that work:
=over
=item * L<Protocol::DBus::Client::IOAsync> (for L<IO::Async>)
=item * L<Protocol::DBus::Client::Mojo> (for L<Mojolicious>)
=item * L<Protocol::DBus::Client::AnyEvent> (for L<AnyEvent>)
=back
Example:
my $loop = IO::Async::Loop->new();
my $dbus = Protcol::DBus::Client::IOAsync::login_session($loop);
$dbus->initialize()->then(
sub ($dbus) {
return $dbus->send_call( ⦠); # same arguments as above
},
)->finally( sub { $loop->stop() } );
$loop->run();
You can also interface with a manually-written event loop.
See L<the example|/EXAMPLE USING MANUALLY-WRITTEN EVENT LOOP> below.
=head1 DESCRIPTION
=begin html
<a href='https://coveralls.io/github/FGasper/p5-Protocol-DBus?branch=master'><img src='https://coveralls.io/repos/github/FGasper/p5-Protocol-DBus/badge.svg?branch=master' alt='Coverage Status' /></a>
=end html
This is an original, pure-Perl implementation of client messaging logic for
L<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.
This is fine, of course, if all you want to do is, e.g., replace
an invocation of C<gdbus> or C<dbus-send> with pure Perl.
If you want an interface that mimics D-Busâs actual object system,
youâll need to implement it yourself or use something like L<Net::DBus>.
(See L</DIFFERENCES FROM Net::DBus> below.)
=head1 STATUS
This project is in BETA status. While the API should be pretty stable now,
breaking changes can still happen. If you use this module
in your project, you B<MUST> check the changelog before deploying a new
version. Please file bug reports as appropriate.
=head1 EXAMPLES
See L<Protocol::DBus::Client> and the above samples for a starting point.
Also see the distributionâs F<examples/> directory.
=head1 DIFFERENCES FROM Net::DBus
L<Net::DBus> is an XS binding to
L<libdbus|https://www.freedesktop.org/wiki/Software/dbus/>,
the reference D-Bus implementation. It is CPANâs most mature D-Bus
implementation.
There are several reasons why you might prefer this module instead,
though, such as:
=over
=item * Net::DBus discerns how to send a method call via D-Bus introspection.
While handy, this costs extra network overhead and requires an XML parser.
With Protocol::DBus you give a signature directly to send a method call.
=item * Protocol::DBus can work smoothly with any event system you like,
including custom-written ones. (The distribution ships with connectors for
three popular ones.) Net::DBus, on the other hand, expects you to use its
own event loop, L<Net::DBus::Reactor>.
=item * Protocol::DBus has a considerably lighter memory footprint.
=item * Protocol::DBus is pure Perl, so on most OSes you can fat-pack it
for easy distribution.
=item * Protocol::DBus exposes a simpler API.
=back
Of course, there are tradeoffs: most notably, Protocol::DBusâs API is
simpler because it doesnât attempt to implement D-Busâs object system.
(You never B<need> the object system, but it can be a useful abstraction.)
An XS-powered D-Bus library is also likely to outperform a
pure-Perl one, introspection overhead notwithstanding. YMMV. BYOB.
=head1 NOTES
=over
=item * UNIX FD support requires that L<Socket::MsgHdr> be loaded at
authentication time.
=item * Certain OSes may require L<Socket::MsgHdr> in order to authenticate
via a UNIX socket. (Linux, notably, does not.) It depends if your OS can
send local socket credentials without using L<sendmsg(2)>.
=item * EXTERNAL and DBUS_COOKIE_SHA1 authentications are supported.
=back
=head1 TODO
=over
=item * Improve parsing of bus paths in environment variables.
=item * Add more tests.
=back
=head1 EXAMPLE USING MANUALLY-WRITTEN EVENT LOOP
my $dbus = Protcol::DBus::Client::system();
( run in 0.912 second using v1.01-cache-2.11-cpan-39bf76dae61 )