[libnet-dbus-perl] 290/335: Automatically track unique<->bus names for signal handlers across restarts

Intrigeri intrigeri at moszumanska.debian.org
Sat Mar 21 01:08:11 UTC 2015


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 <dan at 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



More information about the Pkg-perl-cvs-commits mailing list