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 a30cd09b83195d427398715ed4d5c62b40591a9b Author: Daniel P. Berrange <d...@berrange.com> Date: Tue Nov 23 23:24:47 2004 +0000 Fixed many problems with signals --- lib/Net/DBus.pm | 80 +++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 55 insertions(+), 25 deletions(-) diff --git a/lib/Net/DBus.pm b/lib/Net/DBus.pm index a14a357..51e71fb 100644 --- a/lib/Net/DBus.pm +++ b/lib/Net/DBus.pm @@ -24,17 +24,21 @@ use vars qw(@EXPORT); require XSLoader; XSLoader::load('Net::DBus', $VERSION); -use vars qw($TYPE_SESSION $TYPE_SYSTEM); +sub system { + my $class = shift; + return $class->_new(&Net::DBus::Binding::Bus::SYSTEM); +} -$TYPE_SESSION = &Net::DBus::Binding::Bus::SESSION; -$TYPE_SYSTEM = &Net::DBus::Binding::Bus::SYSTEM; +sub session { + my $class = shift; + return $class->_new(&Net::DBus::Binding::Bus::SESSION); +} -sub new { +sub _new { my $class = shift; my $self = {}; - my $type = shift; - - $self->{connection} = Net::DBus::Binding::Bus->new(type => $type); + + $self->{connection} = Net::DBus::Binding::Bus->new(type => shift); $self->{signals} = {}; bless $self, $class; @@ -44,25 +48,30 @@ sub new { return $self; } +sub get_connection { + my $self = shift; + return $self->{connection}; +} sub get_service { my $self = shift; my $name = @_ ? shift : "org.freedesktop.Broadcast"; - return Net::DBus::RemoteService->new($self->{connection}, $name); + return Net::DBus::RemoteService->new($self, $name); } sub add_signal_receiver { my $self = shift; my $receiver = shift; - my $interface = @_ ? shift : "None"; - my $service = @_ ? shift : "None"; - my $path = @_ ? shift : "None"; + my $signal_name = shift; + my $interface = shift; + my $service = shift; + my $path = shift; - my $rule = $self->_match_rule($interface, $service, $path); + my $rule = $self->_match_rule($signal_name, $interface, $service, $path); $self->{receivers}->{$rule} = [] unless $self->{receivers}->{$rule}; - push @{$self->{receivers}}, $receiver; + push @{$self->{receivers}->{$rule}}, $receiver; $self->{connection}->add_match($rule); } @@ -70,12 +79,13 @@ sub add_signal_receiver { sub remove_signal_receiver { my $self = shift; my $receiver = shift; - my $interface = @_ ? shift : "None"; - my $service = @_ ? shift : "None"; - my $path = @_ ? shift : "None"; - - my $rule = $self->_match_rule($interface, $service, $path); + my $signal_name = shift; + my $interface = shift; + my $service = shift; + my $path = shift; + my $rule = $self->_match_rule($signal_name, $interface, $service, $path); + my @receivers; foreach (@{$self->{receivers}->{$rule}}) { if ($_ eq $receiver) { @@ -90,12 +100,32 @@ sub remove_signal_receiver { sub _match_rule { my $self = shift; + my $signal_name = shift; my $interface = shift; my $service = shift; my $path = shift; - # FIXME: use the service here too!!! - return "type='signal',interface='$interface',path='$path'"; + my $rule = "type='signal'"; + if ($interface) { + $rule .= ",interface='$interface'"; + } + if ($service) { + if ($service !~ /^:/ && + $service ne "org.freedesktop.DBus") { + my $bus_service = $self->get_service("org.freedesktop.DBus"); + my $bus_object = $bus_service->get_object('/org/freedesktop/DBus', + 'org.freedesktop.DBus'); + $service = $bus_object->GetServiceOwner($service); + } + $rule .= ",sender='$service'"; + } + if ($path) { + $rule .= ",path='$path'"; + } + if ($signal_name) { + $rule .= ",member='$signal_name'"; + } + return $rule; } @@ -104,19 +134,19 @@ sub _signal_func { my $connection = shift; my $message = shift; - return 0 unless $message->isa("Net::DBus::Message::Signal"); + return 0 unless $message->isa("Net::DBus::Binding::Message::Signal"); my $interface = $message->get_interface; my $service = $message->get_sender; my $path = $message->get_path; my $member = $message->get_member; - my $rule = $self->_match_rule($interface, $service, $path); - + my $rule = $self->_match_rule($member, $interface, $service, $path); + my $handled = 0; if (exists $self->{receivers}->{$rule}) { - foreach (@{$self->{receivers}->{$rule}}) { - &$_($interface, $member, $service, $path, $message); + foreach my $callback (@{$self->{receivers}->{$rule}}) { + &$callback($interface, $member, $service, $path, $message); $handled = 1; } } -- 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