[libnet-dbus-perl] 34/335: Added dpack method for type encoding. Switched to doing looser matching on signal rules to allow matches even when the rule does not specify a sender. Added connection method for connecting to a bus based on address, rather than the two well known type names

Intrigeri intrigeri at moszumanska.debian.org
Sat Mar 21 01:07:16 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 8a8c516622e2c8df1a2d55f63ee76ee0846c89a5
Author: Daniel P. Berrange <dan at berrange.com>
Date:   Mon Dec 27 16:24:49 2004 +0000

    Added dpack method for type encoding. Switched to doing looser matching on signal rules to allow matches even when the rule does not specify a sender. Added connection method for connecting to a bus based on address, rather than the two well known type names
---
 lib/Net/DBus.pm | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 85 insertions(+), 7 deletions(-)

diff --git a/lib/Net/DBus.pm b/lib/Net/DBus.pm
index 51e71fb..c4c3073 100644
--- a/lib/Net/DBus.pm
+++ b/lib/Net/DBus.pm
@@ -19,7 +19,8 @@ use base qw(Exporter);
 use vars qw(@EXPORT);
 
 @EXPORT = qw(dboolean dbyte dstring dint32
-             duint32 dint64 duint64 ddouble);
+             duint32 dint64 duint64 ddouble
+             dpack);
 
 require XSLoader;
 XSLoader::load('Net::DBus', $VERSION);
@@ -34,6 +35,22 @@ sub session {
     return $class->_new(&Net::DBus::Binding::Bus::SESSION);
 }
 
+
+sub connection {
+    my $class = shift;
+
+    my $self = {};
+    
+    $self->{connection} = Net::DBus::Binding::Bus->new(address => shift);
+    $self->{signals} = {};
+    
+    bless $self, $class;
+
+    $self->{connection}->add_filter(sub { $self->_signal_func(@_) });
+    
+    return $self;
+}
+
 sub _new {
     my $class = shift;
     my $self = {};
@@ -129,6 +146,40 @@ sub _match_rule {
 }
 
 
+sub _rule_matches {
+    my $self = shift;
+    my $rule = shift;
+    my $member = 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) {
+	return 0;
+    }
+    if (exists $bits{interface} &&
+	$bits{interface} ne $interface) {
+	return 0;
+    }
+    if (exists $bits{sender} &&
+	$bits{sender} ne $sender) {
+	return 0;
+    }
+    if (exists $bits{path} &&
+	$bits{path} ne $path) {
+	return 0;
+    }
+    return 1;
+}
+
 sub _signal_func {
     my $self = shift;
     my $connection = shift;
@@ -137,16 +188,15 @@ sub _signal_func {
     return 0 unless $message->isa("Net::DBus::Binding::Message::Signal");
     
     my $interface = $message->get_interface;
-    my $service = $message->get_sender;
+    my $sender = $message->get_sender;
     my $path = $message->get_path;
     my $member = $message->get_member;
 
-    my $rule = $self->_match_rule($member, $interface, $service, $path);
-
     my $handled = 0;
-    if (exists $self->{receivers}->{$rule}) {
+    foreach my $rule (grep { $self->_rule_matches($_, $member, $interface, $sender, $path) }
+		      keys %{$self->{receivers}}) {
 	foreach my $callback (@{$self->{receivers}->{$rule}}) {
-	    &$callback($interface, $member, $service, $path, $message);
+	    &$callback($interface, $member, $sender, $path, $message);
             $handled = 1;
 	}
     }
@@ -202,7 +252,35 @@ sub ddouble {
 					  $value);
 }
 
-
+our %flags = (
+	      'o' => &Net::DBus::Binding::Message::TYPE_BOOLEAN,
+	      'b' => &Net::DBus::Binding::Message::TYPE_BYTE,
+	      's' => &Net::DBus::Binding::Message::TYPE_STRING,
+	      'i' => &Net::DBus::Binding::Message::TYPE_INT32,
+	      'I' => &Net::DBus::Binding::Message::TYPE_UINT32,
+	      'l' => &Net::DBus::Binding::Message::TYPE_INT64,
+	      'L' => &Net::DBus::Binding::Message::TYPE_UINT64,
+	      'd' => &Net::DBus::Binding::Message::TYPE_DOUBLE,
+	      );
+
+sub dpack {
+    my $format = shift;
+    my @in = @_;
+    if (length $format != ($#in+1)) {
+	confess "incorrect number of arguments for format string";
+    }
+    
+    my @out;
+    foreach my $flag (split //, $format) {
+	my $value = shift @in;
+	if (!exists $flags{$flag}) {
+	    confess "unknown format flag '$flag'";
+	}
+	push @out, Net::DBus::Binding::Value->new($flags{$flag},
+						   $value);
+    }
+    return @out;
+}
 
 
 1;

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