diff options
author | Marco Pesenti Gritti <marco@localhost.localdomain> | 2007-05-24 15:54:15 (GMT) |
---|---|---|
committer | Marco Pesenti Gritti <marco@localhost.localdomain> | 2007-05-24 15:54:15 (GMT) |
commit | 9786385baa523e074584f825e9a5127f1dc23f8f (patch) | |
tree | bc2de593e129ebe3fdf574ea9f98b27036876689 | |
parent | 98c5c0734ecfbf3e996b80bbe0b615e63b94295a (diff) | |
parent | 494e17b3cd03aa43a5d170d42e4463428a000272 (diff) |
Merge branch 'master' of git+ssh://dev.laptop.org/git/sugar
-rw-r--r-- | services/presence/buddy.py | 38 | ||||
-rw-r--r-- | services/presence/server_plugin.py | 1 | ||||
-rw-r--r-- | sugar/presence/presenceservice.py | 45 |
3 files changed, 72 insertions, 12 deletions
diff --git a/services/presence/buddy.py b/services/presence/buddy.py index 53999e8..ab397ef 100644 --- a/services/presence/buddy.py +++ b/services/presence/buddy.py @@ -236,6 +236,28 @@ class Buddy(ExportedGObject): full set of properties, just the changes. """ + @dbus.service.signal(_BUDDY_INTERFACE, signature='sou') + def TelepathyHandleAdded(self, tp_conn_name, tp_conn_path, handle): + """Another Telepathy handle has become associated with the buddy. + + This must only be emitted for non-channel-specific handles. + + tp_conn_name -- The bus name at which the Telepathy connection may be + found + tp_conn_path -- The object path at which the Telepathy connection may + be found + handle -- The handle of type CONTACT, which is not channel-specific, + newly associated with the buddy + """ + + @dbus.service.signal(_BUDDY_INTERFACE, signature='sou') + def TelepathyHandleRemoved(self, tp_conn_name, tp_conn_path, handle): + """A Telepathy handle has ceased to be associated with the buddy, + probably because that contact went offline. + + The parameters are the same as for TelepathyHandleAdded. + """ + # dbus methods @dbus.service.method(_BUDDY_INTERFACE, in_signature="", out_signature="ay") @@ -294,6 +316,22 @@ class Buddy(ExportedGObject): props[_PROP_CURACT] = "" return props + @dbus.service.method(_BUDDY_INTERFACE, + in_signature='', out_signature='a(sou)') + def GetTelepathyHandles(self): + """Return a list of non-channel-specific Telepathy contact handles + associated with this Buddy. + + :Returns: + An array of triples (connection well-known bus name, connection + object path, handle). + """ + ret = [] + for plugin in self.handles: + conn = plugin.get_connection() + ret.append((str(conn.service_name), conn.object_path, + self.handles[plugin])) + # methods def object_path(self): """Retrieve our dbus.ObjectPath object""" diff --git a/services/presence/server_plugin.py b/services/presence/server_plugin.py index d4930c9..daa31aa 100644 --- a/services/presence/server_plugin.py +++ b/services/presence/server_plugin.py @@ -125,6 +125,7 @@ class ServerPlugin(gobject.GObject): """ gobject.GObject.__init__(self) + self._conn = None self._icon_cache = BuddyIconCache() self._registry = registry diff --git a/sugar/presence/presenceservice.py b/sugar/presence/presenceservice.py index 1bc9a57..a0b60ee 100644 --- a/sugar/presence/presenceservice.py +++ b/sugar/presence/presenceservice.py @@ -16,20 +16,15 @@ # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. -import dbus, dbus.glib, gobject import logging -# XXX use absolute imports -# from sugar.presence import buddy, activity -# this *kind* of relative import is deprecated -# with an explicit relative import slated to be -# introduced (available in Python 2.5 with a __future__ -# import), that would read as: -# from . import buddy, activity -# see PEP: http://docs.python.org/whatsnew/pep-328.html +import dbus +import dbus.exceptions +import dbus.glib +import gobject -import buddy -from activity import Activity +from sugar.presence.buddy import Buddy +from sugar.presence.activity import Activity DBUS_SERVICE = "org.laptop.Sugar.Presence" @@ -159,7 +154,7 @@ class PresenceService(gobject.GObject): obj = self._objcache[object_path] except KeyError: if object_path.startswith(self._PS_BUDDY_OP): - obj = buddy.Buddy(self._bus, self._new_object, + obj = Buddy(self._bus, self._new_object, self._del_object, object_path) elif object_path.startswith(self._PS_ACTIVITY_OP): obj = Activity(self._bus, self._new_object, @@ -317,6 +312,32 @@ class PresenceService(gobject.GObject): return None return self._new_object(buddy_op) + def get_buddy_by_telepathy_handle(self, tp_conn_name, tp_conn_path, + handle): + """Retrieve single Buddy object for the given public key + + :Parameters: + `tp_conn_name` : str + The well-known bus name of a Telepathy connection + `tp_conn_path` : dbus.ObjectPath + The object path of the Telepathy connection + `handle` : int or long + The handle of a Telepathy contact on that connection, + of type HANDLE_TYPE_CONTACT. This may not be a + channel-specific handle. + :Returns: the Buddy object, or None if the buddy is not found + """ + try: + buddy_op = self._ps.GetBuddyByTelepathyHandle(tp_conn_name, + tp_conn_path, + handle) + except dbus.exceptions.DBusException, err: + _logger.warn('Unable to retrieve buddy handle for handle %u at ' + 'conn %s:%s from presence service: %s', + handle, tp_conn_name, tp_conn_path, err) + return None + return self._new_object(buddy_op) + def get_owner(self): """Retrieves the laptop "owner" Buddy object.""" try: |