From 72c511ba6195bdfca25f201dac6ad0b7256526ec Mon Sep 17 00:00:00 2001 From: Marco Pesenti Gritti Date: Fri, 16 Mar 2007 19:36:28 +0000 Subject: Merge branch 'master' of git+ssh://dev.laptop.org/git/sugar --- diff --git a/services/presence2/buddy.py b/services/presence2/buddy.py index edef393..4b6031d 100644 --- a/services/presence2/buddy.py +++ b/services/presence2/buddy.py @@ -102,7 +102,7 @@ class Buddy(DBusGObject): return None if not self._activities.has_key(self._current_activity): return None - return self._activities[self._current_activity] + return self._current_activity elif pspec.name == "valid": return self._valid elif pspec.name == "owner": @@ -336,7 +336,8 @@ class Owner(Buddy): def _cur_activity_changed_cb(self, activity_id): if not self._activities.has_key(activity_id): - return + # This activity is local-only + activity_id = None props = {'current-activity': activity_id} self.set_properties(props) diff --git a/services/presence2/presenceservice.py b/services/presence2/presenceservice.py index f5ee296..d4ad38c 100644 --- a/services/presence2/presenceservice.py +++ b/services/presence2/presenceservice.py @@ -216,10 +216,6 @@ class PresenceService(dbus.service.Object): if not activity.get_joined_buddies(): self._remove_activity(activity) - # current activity - if len(activities) > 0: - buddy.set_properties({'current-activity':activities[0]}) - def _activity_invitation(self, tp, act_id): activity = self._activities.get(act_id) if activity: diff --git a/services/presence2/server_plugin.py b/services/presence2/server_plugin.py index e335194..6e309a8 100644 --- a/services/presence2/server_plugin.py +++ b/services/presence2/server_plugin.py @@ -238,6 +238,7 @@ class ServerPlugin(gobject.GObject): self._conn[CONN_INTERFACE_BUDDY_INFO].connect_to_signal('PropertiesChanged', self._buddy_properties_changed_cb) self._conn[CONN_INTERFACE_BUDDY_INFO].connect_to_signal('ActivitiesChanged', self._buddy_activities_changed_cb) + self._conn[CONN_INTERFACE_BUDDY_INFO].connect_to_signal('CurrentActivityChanged', self._buddy_current_activity_changed_cb) self._conn[CONN_INTERFACE_AVATARS].connect_to_signal('AvatarUpdated', self._avatar_updated_cb) @@ -316,8 +317,25 @@ class ServerPlugin(gobject.GObject): self._conn[CONN_INTERFACE_BUDDY_INFO].SetActivities(self._joined_activities) + cur_activity = self._owner.props.current_activity + cur_activity_handle = 0 + if not cur_activity: + cur_activity = "" + else: + cur_activity_handle = self._get_handle_for_activity(cur_activity) + if not cur_activity_handle: + # dont advertise a current activity that's not shared + cur_activity = "" + self._conn[CONN_INTERFACE_BUDDY_INFO].SetCurrentActivity(cur_activity, cur_activity_handle) + self._upload_avatar() + def _get_handle_for_activity(self, activity_id): + for (act, handle) in self._joined_activities: + if activity_id == act: + return handle + return None + def _status_changed_cb(self, state, reason): if state == CONNECTION_STATUS_CONNECTING: print 'connecting: %r' % reason @@ -455,6 +473,18 @@ class ServerPlugin(gobject.GObject): activities_id = map(lambda x: x[0], activities) self.emit("buddy-activities-changed", handle, activities_id) + def _buddy_current_activity_changed_cb(self, handle, activity, channel): + if handle == self._conn[CONN_INTERFACE].GetSelfHandle(): + # ignore network events for Owner current activity changes since those + # are handled locally + return + + if not len(activity) or not util.validate_activity_id(activity): + activity = None + prop = {'current-activity': activity} + logging.debug("Handle %s: current activity now %s" % (handle, activity)) + self._buddy_properties_changed_cb(handle, prop) + def _new_channel_cb(self, object_path, channel_type, handle_type, handle, suppress_handler): if handle_type == CONNECTION_HANDLE_TYPE_ROOM and channel_type == CHANNEL_TYPE_TEXT: channel = Channel(self._conn._dbus_object._named_service, object_path) -- cgit v0.9.1