This is an automated email from the git hooks/post-receive script. intrigeri pushed a commit to branch experimental in repository libnet-dbus-perl.
commit 5cc1854fa564317471c59dfc4df167dcc8366ccd Author: Daniel P. Berrange <d...@berrange.com> Date: Thu Jun 30 21:44:28 2011 +0100 Automatically track unique<->bus names for signal handlers across restarts --- lib/Net/DBus.pm | 109 +++++++++++++++++++++---------------------- lib/Net/DBus/RemoteObject.pm | 4 +- 2 files changed, 56 insertions(+), 57 deletions(-) diff --git a/lib/Net/DBus.pm b/lib/Net/DBus.pm index a0aa161..16a8029 100644 --- a/lib/Net/DBus.pm +++ b/lib/Net/DBus.pm @@ -246,6 +246,7 @@ sub _new { $self->{connection} = shift; $self->{signals} = []; + # Map well known names to RemoteService objects $self->{services} = {}; my %params = @_; @@ -262,7 +263,15 @@ sub _new { $self->get_connection->add_filter(sub { return $self->_signal_func(@_); }); - $self->{bus} = Net::DBus::RemoteService->new($self, "org.freedesktop.DBus", "org.freedesktop.DBus"); + $self->{bus} = $self->{services}->{"org.freedesktop.DBus"} = + Net::DBus::RemoteService->new($self, "org.freedesktop.DBus", "org.freedesktop.DBus"); + $self->get_bus_object()->connect_to_signal('NameOwnerChanged', sub { + my ($svc, $old, $new) = @_; + # Slightly evil poking into the private 'owner_name' field here + if (exists $self->{services}->{$svc}) { + $self->{services}->{$svc}->{owner_name} = $new; + } + }); return $self; } @@ -298,19 +307,18 @@ sub get_service { return $self->{bus}; } - my $owner = $name; - if ($owner !~ /^:/) { - $owner = $self->get_service_owner($name); - if (!$owner) { - $self->get_bus_object->StartServiceByName($name, 0); + if (!exists $self->{services}->{$name}) { + my $owner = $name; + if ($owner !~ /^:/) { $owner = $self->get_service_owner($name); + if (!defined $owner) { + $self->get_bus_object->StartServiceByName($name, 0); + $owner = $self->get_service_owner($name); + } } + $self->{services}->{$name} = Net::DBus::RemoteService->new($self, $owner, $name); } - - unless (exists $self->{services}->{$owner}) { - $self->{services}->{$owner} = Net::DBus::RemoteService->new($self, $owner, $name); - } - return $self->{services}->{$owner}; + return $self->{services}->{$name}; } =item my $service = $bus->export_service($name); @@ -393,8 +401,12 @@ sub _add_signal_receiver { my $path = shift; my $rule = $self->_match_rule($signal_name, $interface, $service, $path); - - push @{$self->{signals}}, [$receiver, $rule, $signal_name, $interface, $service, $path]; + push @{$self->{signals}}, { cb => $receiver, + rule => $rule, + signal_name => $signal_name, + interface => $interface, + service => $service, + path => $path }; $self->{connection}->add_match($rule); } @@ -407,12 +419,10 @@ sub _remove_signal_receiver { my $path = shift; my $rule = $self->_match_rule($signal_name, $interface, $service, $path); - my @signals; foreach (@{$self->{signals}}) { - if ($_->[0] eq $receiver && - defined $_->[1] && - $_->[1] eq $rule) { + if ($_->{cb} eq $receiver && + $_->{rule} eq $rule) { $self->{connection}->remove_match($rule); } else { push @signals, $_; @@ -430,60 +440,50 @@ sub _match_rule { my $path = shift; my $rule = "type='signal'"; - if ($interface) { + if (defined $interface) { $rule .= ",interface='$interface'"; } - if ($service) { - if ($service !~ /^:/) { - # Resolve service name to a client id - $service = $self->get_service_owner($service); - } - if ($service) { - $rule .= ",sender='$service'"; - } - } - if ($path) { + if (defined $path) { $rule .= ",path='$path'"; } - if ($signal_name) { + if (defined $service) { + $rule .= ",sender='$service'"; + } + if (defined $signal_name) { $rule .= ",member='$signal_name'"; } + print "$rule\n"; return $rule; } -sub _rule_matches { +sub _handler_matches { my $self = shift; - my $rule = shift; - my $member = shift; + my $handler = shift; + my $signal_name = shift; my $interface = shift; my $sender = shift; my $path = shift; - my %bits; - map { - if (/^(\w+)='(.*)'$/) { - $bits{$1} = $2; - } - } split /,/, $rule; - - - if (exists $bits{member} && - $bits{member} ne $member) { + if (defined $handler->{signal_name} && + $handler->{signal_name} ne $signal_name) { return 0; } - if (exists $bits{interface} && - $bits{interface} ne $interface) { + if (defined $handler->{interface} && + $handler->{interface} ne $interface) { return 0; } - if (exists $bits{sender} && - $bits{sender} ne $sender) { + if (defined $handler->{path} && + $handler->{path} ne $path) { return 0; } - if (exists $bits{path} && - $bits{path} ne $path) { - return 0; + + if (defined $handler->{service}) { + my $owner = $self->{services}->{$handler->{service}}; + return 0 unless defined $owner; + return 0 unless $owner->get_owner_name eq $sender; } + return 1; } @@ -497,13 +497,12 @@ sub _signal_func { my $interface = $message->get_interface; my $sender = $message->get_sender; my $path = $message->get_path; - my $member = $message->get_member; - + my $signal_name = $message->get_member; + print "Sender $sender\n"; my $handled = 0; - foreach my $handler (grep { defined $_->[1] && - $self->_rule_matches($_->[1], $member, $interface, $sender, $path) } - @{$self->{signals}}) { - my $callback = $handler->[0]; + foreach my $handler (@{$self->{signals}}) { + next unless $self->_handler_matches($handler, $signal_name, $interface, $sender, $path); + my $callback = $handler->{cb}; &$callback($message); $handled = 1; } diff --git a/lib/Net/DBus/RemoteObject.pm b/lib/Net/DBus/RemoteObject.pm index fcf0052..bd7f153 100644 --- a/lib/Net/DBus/RemoteObject.pm +++ b/lib/Net/DBus/RemoteObject.pm @@ -266,7 +266,7 @@ sub connect_to_signal { _add_signal_receiver($cb, $name, $interface, - $self->{service}->get_owner_name(), + $self->{service}->get_service_name(), $self->{object_path}); } my $sigid = ++$self->{signal_id}; @@ -324,7 +324,7 @@ sub disconnect_from_signal { _remove_signal_receiver($self->{signal_handlers}->{$name}->{cb}, $name, $interface, - $self->{service}->get_owner_name(), + $self->{service}->get_service_name(), $self->{object_path}); delete $self->{signal_handlers}->{$name}; } -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libnet-dbus-perl.git _______________________________________________ Pkg-perl-cvs-commits mailing list Pkg-perl-cvs-commits@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-perl-cvs-commits