Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon McVittie <simon.mcvittie@collabora.co.uk>2007-05-16 11:30:49 (GMT)
committer Simon McVittie <simon.mcvittie@collabora.co.uk>2007-05-16 11:30:49 (GMT)
commit531321740cbf6bd971ce73dbfea2bb83a4d64566 (patch)
tree4f8a96813e1045edb81f2bd7e2e57bfcd3d19688
parent35d190b55e49aabcf7d9727cf3d44147451f4434 (diff)
parent5d9e19a8921dc187a88a43d4e5407a289b32bc06 (diff)
Merge branch 'master' of git+ssh://dev.laptop.org/git/sugar
Conflicts: services/presence/server_plugin.py
-rw-r--r--services/presence/server_plugin.py63
-rw-r--r--shell/model/MeshModel.py3
-rw-r--r--shell/view/home/MeshBox.py12
-rw-r--r--sugar/activity/activity.py23
-rw-r--r--sugar/datastore/datastore.py10
-rw-r--r--sugar/datastore/dbus_helpers.py17
6 files changed, 93 insertions, 35 deletions
diff --git a/services/presence/server_plugin.py b/services/presence/server_plugin.py
index ac569ba..d4930c9 100644
--- a/services/presence/server_plugin.py
+++ b/services/presence/server_plugin.py
@@ -622,7 +622,10 @@ class ServerPlugin(gobject.GObject):
def cleanup(self):
"""If we still have a connection, disconnect it"""
if self._conn:
- self._conn[CONN_INTERFACE].Disconnect()
+ try:
+ self._conn[CONN_INTERFACE].Disconnect()
+ except:
+ pass
self._conn = None
self._conn_status = CONNECTION_STATUS_DISCONNECTED
@@ -670,10 +673,16 @@ class ServerPlugin(gobject.GObject):
reply_handler=lambda *args: self._contact_online_activities_cb(handle, *args),
error_handler=lambda *args: self._contact_online_activities_error_cb(handle, *args))
- def _contact_online_aliases_error_cb(self, handle, err):
+ def _contact_online_aliases_error_cb(self, handle, props, retry, err):
"""Handle failure to retrieve given user's alias/information"""
- _logger.debug("Handle %s - Error getting nickname: %s" % (handle, err))
- self._contact_offline(handle)
+ if retry:
+ _logger.debug("Handle %s - Error getting nickname (will retry): %s" % (handle, err))
+ self._conn[CONN_INTERFACE_ALIASING].RequestAliases([handle],
+ reply_handler=lambda *args: self._contact_online_aliases_cb(handle, props, *args),
+ error_handler=lambda *args: self._contact_online_aliases_error_cb(handle, props, False, *args))
+ else:
+ _logger.debug("Handle %s - Error getting nickname: %s" % (handle, err))
+ self._contact_offline(handle)
def _contact_online_properties_cb(self, handle, props):
"""Handle failure to retrieve given user's alias/information"""
@@ -691,12 +700,23 @@ class ServerPlugin(gobject.GObject):
self._conn[CONN_INTERFACE_ALIASING].RequestAliases([handle],
reply_handler=lambda *args: self._contact_online_aliases_cb(handle, props, *args),
- error_handler=lambda *args: self._contact_online_aliases_error_cb(handle, *args))
-
- def _contact_online_properties_error_cb(self, handle, err):
- """Handle error retrieving property-set for a user (handle)"""
- _logger.debug("Handle %s - Error getting properties: %s" % (handle, err))
- self._contact_offline(handle)
+ error_handler=lambda *args: self._contact_online_aliases_error_cb(handle, props, True, *args))
+
+ def _contact_online_request_properties(self, handle, tries):
+ self._conn[CONN_INTERFACE_BUDDY_INFO].GetProperties(handle,
+ reply_handler=lambda *args: self._contact_online_properties_cb(handle, *args),
+ error_handler=lambda *args: self._contact_online_properties_error_cb(handle, tries, *args))
+ return False
+
+ def _contact_online_properties_error_cb(self, handle, tries, err):
+ """Handle error retrieving property-set for a user (handle)"""
+ if tries <= 3:
+ _logger.debug("Handle %s - Error getting properties (will retry): %s" % (handle, err))
+ tries += 1
+ gobject.timeout_add(1000, self._contact_online_request_properties, handle, tries)
+ else:
+ _logger.debug("Handle %s - Error getting properties: %s" % (handle, err))
+ self._contact_offline(handle)
def _contact_online(self, handle):
"""Handle a contact coming online"""
@@ -715,9 +735,7 @@ class ServerPlugin(gobject.GObject):
# are handled locally
return
- self._conn[CONN_INTERFACE_BUDDY_INFO].GetProperties(handle,
- reply_handler=lambda *args: self._contact_online_properties_cb(handle, *args),
- error_handler=lambda *args: self._contact_online_properties_error_cb(handle, *args))
+ self._contact_online_request_properties(handle, 1)
def _subscribe_members_changed_cb(self, added, removed, local_pending,
remote_pending, actor, reason):
@@ -765,6 +783,15 @@ class ServerPlugin(gobject.GObject):
elif status in ["offline", "invisible"]:
self._contact_offline(handle)
+ def _request_avatar_cb(self, handle, new_avatar_token, avatar, mime_type):
+ jid = self._online_contacts[handle]
+ if not jid:
+ logging.debug("Handle %s not valid yet..." % handle)
+ return
+ icon = ''.join(map(chr, avatar))
+ self._icon_cache.store_icon(jid, new_avatar_token, icon)
+ self.emit("avatar-updated", handle, icon)
+
def _avatar_updated_cb(self, handle, new_avatar_token):
"""Handle update of given user (handle)'s avatar"""
if handle == self._conn[CONN_INTERFACE].GetSelfHandle():
@@ -784,11 +811,11 @@ class ServerPlugin(gobject.GObject):
icon = self._icon_cache.get_icon(jid, new_avatar_token)
if not icon:
# cache miss
- avatar, mime_type = self._conn[CONN_INTERFACE_AVATARS].RequestAvatar(handle)
- icon = ''.join(map(chr, avatar))
- self._icon_cache.store_icon(jid, new_avatar_token, icon)
-
- self.emit("avatar-updated", handle, icon)
+ self._conn[CONN_INTERFACE_AVATARS].RequestAvatar(handle,
+ reply_handler=lambda *args: self._request_avatar_cb(handle, new_avatar_token, *args),
+ error_handler=lambda *args: self._log_error_cb("getting avatar", *args))
+ else:
+ self.emit("avatar-updated", handle, icon)
def _alias_changed_cb(self, aliases):
"""Handle update of aliases for all users"""
diff --git a/shell/model/MeshModel.py b/shell/model/MeshModel.py
index 475a22e..93e2a23 100644
--- a/shell/model/MeshModel.py
+++ b/shell/model/MeshModel.py
@@ -41,6 +41,9 @@ class ActivityModel:
def get_service_name(self):
return self._bundle.get_service_name()
+ def get_title(self):
+ return self._activity.props.name
+
class MeshModel(gobject.GObject):
__gsignals__ = {
'activity-added': (gobject.SIGNAL_RUN_FIRST,
diff --git a/shell/view/home/MeshBox.py b/shell/view/home/MeshBox.py
index 2f8d565..913d58c 100644
--- a/shell/view/home/MeshBox.py
+++ b/shell/view/home/MeshBox.py
@@ -170,11 +170,15 @@ class ActivityView(SnowflakeBox):
self._model = model
self._icons = {}
- icon = CanvasIcon(icon_name=model.get_icon_name(),
+ self._icon = CanvasIcon(icon_name=model.get_icon_name(),
xo_color=model.get_color(), box_width=80)
- icon.connect('activated', self._clicked_cb)
- self.append(icon, hippo.PACK_FIXED)
- self.set_root(icon)
+ self._icon.connect('activated', self._clicked_cb)
+ self._update_name()
+ self.append(self._icon, hippo.PACK_FIXED)
+ self.set_root(self._icon)
+
+ def _update_name(self):
+ self._icon.props.tooltip = self._model.get_title()
def has_buddy_icon(self, key):
return self._icons.has_key(key)
diff --git a/sugar/activity/activity.py b/sugar/activity/activity.py
index 85355f4..76e10b9 100644
--- a/sugar/activity/activity.py
+++ b/sugar/activity/activity.py
@@ -207,15 +207,20 @@ class Activity(Window, gtk.Container):
self.jobject['preview'] = ''
self.jobject['icon-color'] = profile.get_color().to_string()
self.jobject.file_path = ''
- try:
- datastore.write(self.jobject)
- except Exception, e:
- logging.error(e)
+ datastore.write(self.jobject,
+ reply_handler=self._internal_jobject_create_cb,
+ error_handler=self._internal_jobject_error_cb)
else:
self.jobject = None
self.connect('focus-out-event', self._focus_out_event_cb)
+ def _internal_jobject_create_cb(self):
+ pass
+
+ def _internal_jobject_error_cb(self, err):
+ logging.debug("Error creating activity datastore object: %s" % err)
+
def _focus_out_event_cb(self, widget, event):
if self.jobject:
self.save()
@@ -234,6 +239,12 @@ class Activity(Window, gtk.Container):
"""
raise NotImplementedError
+ def _internal_save_cb(self):
+ pass
+
+ def _internal_save_error_cb(self, err):
+ logging.debug("Error saving activity object to datastore: %s" % err)
+
def save(self):
"""Request that the activity is saved to the Journal."""
try:
@@ -241,7 +252,9 @@ class Activity(Window, gtk.Container):
self.write_file()
except NotImplementedError:
self.jobject.file_path = ''
- datastore.write(self.jobject)
+ datastore.write(self.jobject,
+ reply_handler=self._internal_save_cb,
+ error_handler=self._internal_save_error_cb)
def _internal_joined_cb(self, activity, success, err):
"""Callback when join has finished"""
diff --git a/sugar/datastore/datastore.py b/sugar/datastore/datastore.py
index 38842a0..99fd230 100644
--- a/sugar/datastore/datastore.py
+++ b/sugar/datastore/datastore.py
@@ -71,20 +71,22 @@ def get(object_id):
def create():
return DSObject(object_id=None, metadata={}, file_path=None)
-def write(ds_object):
+def write(ds_object, reply_handler=None, error_handler=None):
logging.debug('datastore.write')
if ds_object.object_id:
dbus_helpers.update(ds_object.object_id,
ds_object.metadata,
- ds_object.file_path)
+ ds_object.file_path,
+ reply_handler=reply_handler,
+ error_handler=error_handler)
else:
ds_object.object_id = dbus_helpers.create(ds_object.metadata,
ds_object.file_path)
# TODO: register the object for updates
logging.debug('Written object %s to the datastore.' % ds_object.object_id)
-def find(query):
- object_ids = dbus_helpers.find({})
+def find(query, reply_handler=None, error_handler=None):
+ object_ids = dbus_helpers.find(query, reply_handler, error_handler)
objects = []
for object_id in object_ids:
objects.append(get(object_id))
diff --git a/sugar/datastore/dbus_helpers.py b/sugar/datastore/dbus_helpers.py
index 68a1a3b..96c2dd4 100644
--- a/sugar/datastore/dbus_helpers.py
+++ b/sugar/datastore/dbus_helpers.py
@@ -54,13 +54,18 @@ def create(properties, filename):
logging.debug('dbus_helpers.create: ' + object_id)
return object_id
-def update(uid, properties, filename):
+def update(uid, properties, filename, reply_handler=None, error_handler=None):
logging.debug('dbus_helpers.update: %s, %s, %s' % (uid, properties, filename))
try:
logging.debug(get_contents(filename))
except UnicodeDecodeError:
pass
- _data_store.update(uid, dbus.Dictionary(properties), filename)
+ if reply_handler and error_handler:
+ _data_store.update(uid, dbus.Dictionary(properties), filename,
+ reply_handler=reply_handler,
+ error_handler=error_handler)
+ else:
+ _data_store.update(uid, dbus.Dictionary(properties), filename)
def get_properties(uid):
props = _data_store.get_properties(uid)
@@ -76,8 +81,12 @@ def get_filename(uid):
pass
return filename
-def find(query):
- return _data_store.find(query)
+def find(query, reply_handler, error_handler):
+ if reply_handler and error_handler:
+ return _data_store.find(query, reply_handler=reply_handler,
+ error_handler=error_handler)
+ else:
+ return _data_store.find(query)
"""