diff options
author | Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> | 2007-03-05 17:56:17 (GMT) |
---|---|---|
committer | Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> | 2007-03-05 17:56:17 (GMT) |
commit | 148c93968bb89f952aacc6c2bc9e685f6c8fe99c (patch) | |
tree | d2890f76b4e28dbd70b2342b4884051a8d01835e /services/presence2/presenceservice.py | |
parent | 39c6542e40c552f011e6c694bbbd1a22c8f5e06e (diff) |
create/remove activities according to ActivitiesChanged signal
Diffstat (limited to 'services/presence2/presenceservice.py')
-rw-r--r-- | services/presence2/presenceservice.py | 83 |
1 files changed, 72 insertions, 11 deletions
diff --git a/services/presence2/presenceservice.py b/services/presence2/presenceservice.py index 7ffd923..47bcdea 100644 --- a/services/presence2/presenceservice.py +++ b/services/presence2/presenceservice.py @@ -43,7 +43,7 @@ class PresenceService(dbus.service.Object): self._next_object_id = 0 self._buddies = {} # key -> Buddy - self._handles = {} # tp client -> (handle -> Buddy) + self._handles_buddies = {} # tp client -> (handle -> Buddy) self._activities = {} # activity id -> Activity bus = dbus.SessionBus() @@ -59,19 +59,19 @@ class PresenceService(dbus.service.Object): # Set up the server connection self._server_plugin = ServerPlugin(self._registry) - self._handles[self._server_plugin] = {} + self._handles_buddies[self._server_plugin] = {} self._server_plugin.connect('status', self._server_status_cb) self._server_plugin.connect('contact-online', self._contact_online) self._server_plugin.connect('contact-offline', self._contact_offline) self._server_plugin.connect('avatar-updated', self._avatar_updated) self._server_plugin.connect('properties-changed', self._properties_changed) - self._server_plugin.connect('activities-changed', self._activities_changed) + self._server_plugin.connect('contact-activities-changed', self._contact_activities_changed) self._server_plugin.start() # Set up the link local connection self._ll_plugin = LinkLocalPlugin(self._registry) - self._handles[self._ll_plugin] = {} + self._handles_buddies[self._ll_plugin] = {} dbus.service.Object.__init__(self, self._bus_name, _PRESENCE_PATH) @@ -89,7 +89,7 @@ class PresenceService(dbus.service.Object): buddy.connect("validity-changed", self._buddy_validity_changed_cb) self._buddies[key] = buddy - buddies = self._handles[tp] + buddies = self._handles_buddies[tp] buddies[handle] = buddy # store the handle of the buddy for this CM buddy.handles[tp] = handle @@ -105,7 +105,7 @@ class PresenceService(dbus.service.Object): print "Buddy left: %s (%s)" % (buddy.props.nick, buddy.props.color) def _contact_offline(self, tp, handle): - buddy = self._handles[tp].pop(handle) + buddy = self._handles_buddies[tp].pop(handle) key = buddy.props.key # the handle of the buddy for this CM is not valid anymore @@ -122,19 +122,80 @@ class PresenceService(dbus.service.Object): return self._next_object_id def _avatar_updated(self, tp, handle, avatar): - buddy = self._handles[tp].get(handle) + buddy = self._handles_buddies[tp].get(handle) if buddy and not buddy.props.owner: print "Buddy %s icon updated" % buddy.props.key buddy.props.icon = avatar def _properties_changed(self, tp, handle, prop): - buddy = self._handles[tp].get(handle) + buddy = self._handles_buddies[tp].get(handle) if buddy: buddy.set_properties(prop) print "Buddy %s properties updated" % buddy.props.key - def _activities_changed(self, tp, handle, prop): - pass + def _new_activity(self, activity_id): + objid = self._get_next_object_id() + activity = Activity(self._bus_name, objid, activity_id) + # FIXME : don't do that shit ! + activity._valid = True + self._activities[activity_id] = activity + + print "new activity", activity_id + self.ActivityAppeared(activity.object_path()) + + return activity + + def _remove_activity(self, activity): + print "remove activity", activity.get_id() + + self.ActivityDisappeared(activity.object_path()) + del self._activities[activity.get_id()] + + def _contact_activities_changed(self, tp, contact_handle, activities): + print "------------activities changed-------------" + buddies = self._handles_buddies[tp] + buddy = buddies.get(contact_handle) + + if not buddy: + # We don't know this buddy + # FIXME: What should we do here? + # FIXME: Do we need to check if the buddy is valid or something? + print "contact_activities_changed: buddy unknow" + return + + old_activities = set() + for activity in buddy.get_joined_activities(): + old_activities.add(activity.get_id()) + + new_activities = set(activities) + + activities_joined = new_activities - old_activities + for act in activities_joined: + print "buddy", contact_handle, "joined", act + activity = self._activities.get(act) + if not activity: + # new activity + activity = self._new_activity(act) + + activity.buddy_joined(buddy) + buddy.add_activity(activity) + + activities_left = old_activities - new_activities + for act in activities_left: + print "buddy", contact_handle, "left", act + activity = self._activities.get(act) + if not activity: + continue + + activity.buddy_left(buddy) + buddy.remove_activity(activity) + + if not activity.get_joined_buddies(): + self._remove_activity(activity) + + # current activity + if len(activities) > 0: + buddy.set_properties({'current-activity':activities[0]}) @dbus.service.signal(_PRESENCE_INTERFACE, signature="o") def ActivityAppeared(self, activity): @@ -190,7 +251,7 @@ class PresenceService(dbus.service.Object): raise NotImplementedError("not implemented yet") def cleanup(self): - for tp in self._handles: + for tp in self._handles_buddies: tp.cleanup() def main(): |