Active Topics

 


Reply
Thread Tools
Posts: 356 | Thanked: 123 times | Joined on Dec 2008
#1
I am trying to monitor a dbus signal, and make my n900 output some text when a specific signal is received.

I am using python. This is the signal that I am monitoring for (any presence change for a user on my jabber account). I got this using the dbus-monitor command:

Code:
signal sender=:1.496 -> dest=(null destination) serial=3979 path=/org/freedesktop/Telepathy/Connection/gabble/jabber/username_40gmail_2ecom_2fMaemo; interface=org.freedesktop.Telepathy.Connection.Interface.SimplePresence; member=PresencesChanged
   array [
      dict entry(
         uint32 209
         struct {
            uint32 2
            string "available"
            string "243"
         }
      )
   ]
Here is my code:

Code:
#! /usr/bin/python
import gobject, dbus
from dbus.mainloop.glib import DBusGMainLoop

def handle_presence():
    print "status changed"

if __name__ == '__main__':
	print "starting"
	DBusGMainLoop(set_as_default=True)
	bus = dbus.SystemBus()
	bus.add_signal_receiver(handle_presence, 'PresencesChanged', 'org.freedesktop.Telepathy.Connection.Interface.SimplePresence', None, '/org/freedesktop/Telepathy/Connection/gabble/jabber/username_40gmail_2ecom_2fMaemo')
	gobject.MainLoop().run()
As far as I can tell, this should work, but nothing is outputted.
 
Posts: 992 | Thanked: 738 times | Joined on Jun 2010 @ Low Earth Orbit
#2
Have you used dbus-monitor to confirm that the events you expect are being triggered?
 
Posts: 356 | Thanked: 123 times | Joined on Dec 2008
#3
Originally Posted by kureyon View Post
Have you used dbus-monitor to confirm that the events you expect are being triggered?
Yes, and they definitely are. I manually changed a user's presence that is on my buddy list while running dbus-monitor. I copied that exact line into this post, and made my script using it.
 
daperl's Avatar
Posts: 2,427 | Thanked: 2,986 times | Joined on Dec 2007
#4
Change

bus = dbus.SystemBus()

to

bus = dbus.SessionBus()

and all should be good.
__________________
N9: Go white or go home
 

The Following 2 Users Say Thank You to daperl For This Useful Post:
Posts: 356 | Thanked: 123 times | Joined on Dec 2008
#5
Originally Posted by daperl View Post
Change

bus = dbus.SystemBus()

to

bus = dbus.SessionBus()

and all should be good.
Thank you! I have been playing around with it for hours, and this fixed it for me!
 
Posts: 356 | Thanked: 123 times | Joined on Dec 2008
#6
Do you know what type is passed to handle_presence?
 
nicolai's Avatar
Posts: 1,637 | Thanked: 4,424 times | Joined on Apr 2009 @ Germany
#7
 

The Following User Says Thank You to nicolai For This Useful Post:
daperl's Avatar
Posts: 2,427 | Thanked: 2,986 times | Joined on Dec 2007
#8
I changed your code to this:

Code:
def handle_presence(*args):
    print "status changed",args
and here's the output:

Code:
status changed (dbus.Dictionary({dbus.UInt32(1L): dbus.Struct((dbus.UInt32(2L), dbus.String(u'available'), dbus.String(u'')), signature=None)}, signature=dbus.Signature('u(uss)')),)
So, it looks like a one-value tuple with a dbus.Dictionary.

But I noticed that no events occur when the account is disabled, so maybe you also want to listen for this:

Code:
bus.add_signal_receiver(handle_presence, 'StatusChanged', 'org.freedesktop.Telepathy.Connection', None, '/org/freedesktop/Telepathy/Connection/gabble/jabber/username_40gmail_2ecom_2fMaemo')
Here's the output when I swap that with the other receiver call:

enabled:

Code:
status changed (dbus.UInt32(1L), dbus.UInt32(1L))
status changed (dbus.UInt32(0L), dbus.UInt32(1L))
disabled:

Code:
status changed (dbus.UInt32(2L), dbus.UInt32(1L))
__________________
N9: Go white or go home
 

The Following 2 Users Say Thank You to daperl For This Useful Post:
Posts: 356 | Thanked: 123 times | Joined on Dec 2008
#9
What variable type is args?

I receive the following when I do print args:

Code:
(dbus.Dictionary({dbus.UInt32(3L): dbus.Struct((dbus.UInt32(4L), dbus.String(u'xa'), dbus.String(u"I'm away from my computer")), signature=None)}, signature=dbus.Signature('u(uss)')),)
It appears that it is a structure inside of a dictionary. How do I set a variable to the value of the status ("I'm away from my computer")?
 
daperl's Avatar
Posts: 2,427 | Thanked: 2,986 times | Joined on Dec 2007
#10
I think all is answered by following nicolai's link and the dbus-python tutorial. According to the Data Types section, dbus.Dictionary is a sub-class of dict.

Remove the '*' from '*arg' and arg should just be a dbus.Dictionary.
__________________
N9: Go white or go home
 

The Following User Says Thank You to daperl For This Useful Post:
Reply


 
Forum Jump


All times are GMT. The time now is 20:09.