diff options
author | Dan Williams <dcbw@redhat.com> | 2006-06-19 13:49:57 (GMT) |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2006-06-19 13:49:57 (GMT) |
commit | c65ef6f9cd4afb3560f2551aa9d1ac316711c69b (patch) | |
tree | ab184f26b4238e0fa6732fe67f2cd270a881f6f1 /sugar/presence/Buddy.py | |
parent | d08ea50d15834cef7649e57fbe6278c60ff7bdc8 (diff) |
Make the presence service resolve all shared activity services by default; it's up to the activities to ignore services that aren't theirs. Also add 'joined-activity' and 'left-activity' signals on Buddy objects, mainly for the PresenceWindow's 'Who's here' bits
Diffstat (limited to 'sugar/presence/Buddy.py')
-rw-r--r-- | sugar/presence/Buddy.py | 48 |
1 files changed, 41 insertions, 7 deletions
diff --git a/sugar/presence/Buddy.py b/sugar/presence/Buddy.py index b55230b..5fd3c77 100644 --- a/sugar/presence/Buddy.py +++ b/sugar/presence/Buddy.py @@ -20,7 +20,11 @@ class Buddy(gobject.GObject): 'service-added': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT])), 'service-removed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, - ([gobject.TYPE_PYOBJECT])) + ([gobject.TYPE_PYOBJECT])), + 'joined-activity': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + ([gobject.TYPE_STRING])), + 'left-activity': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + ([gobject.TYPE_STRING])) } def __init__(self, service): @@ -69,12 +73,27 @@ class Buddy(gobject.GObject): if service.get_publisher_address() != self._address: logging.error('Service publisher and buddy address doesnt match: %s %s' % (service.get_publisher_address(), self._address)) return False - if service.get_type() in self._services.keys(): + full_type = service.get_full_type() + if full_type in self._services.keys(): return False - self._services[service.get_full_type()] = service + self._services[full_type] = service if self._valid: self.emit("service-added", service) - if service.get_full_type() == PRESENCE_SERVICE_TYPE: + + # If this is the first service we've seen that's owned by + # a particular activity, send out the 'joined-activity' signal + (uid, short_stype) = Service._decompose_service_type(full_type) + if uid is not None: + found = False + for serv in self._services.values(): + if serv.get_activity_uid() == uid and serv.get_full_type() != full_type: + found = True + break + if not found: + print "Buddy (%s) joined activity %s." % (self._nick_name, service.get_activity_uid()) + self.emit("joined-activity", service) + + if full_type == PRESENCE_SERVICE_TYPE: # A buddy isn't valid until its official presence # service has been found and resolved self._valid = True @@ -89,11 +108,26 @@ class Buddy(gobject.GObject): return if service.get_name() != self._nick_name: return - if self._services.has_key(service.get_full_type()): + full_type = service.get_full_type() + if self._services.has_key(full_type): if self._valid: self.emit("service-removed", service) - del self._services[service.get_full_type()] - if service.get_full_type() == PRESENCE_SERVICE_TYPE: + del self._services[full_type] + + # If this is the lase service owned by a particular activity, + # and it's just been removed, send out the 'left-actvity' signal + (uid, short_stype) = Service._decompose_service_type(full_type) + if uid is not None: + found = False + for serv in self._services.values(): + if serv.get_activity_uid() == uid: + found = True + break + if not found: + print "Buddy (%s) left activity %s." % (self._nick_name, service.get_activity_uid()) + self.emit("left-activity", service) + + if full_type == PRESENCE_SERVICE_TYPE: self._valid = False def get_service_of_type(self, stype=None, activity=None): |