Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/sugar/activity/activity.py
diff options
context:
space:
mode:
authorSimon Schampijer <erikos@localhost.localdomain>2008-07-21 17:20:22 (GMT)
committer Simon Schampijer <erikos@localhost.localdomain>2008-07-21 17:20:22 (GMT)
commit7fc7b39f144db0ff34459db785e898c954cf8f49 (patch)
treef4a77614c052afdd444db09d6b6d6b6fb4f74992 /src/sugar/activity/activity.py
parent756b9309e8dc2686da64287466199e318817a62c (diff)
Shutdown/Rebbot syncs activities data #6014 (marco)
Diffstat (limited to 'src/sugar/activity/activity.py')
-rw-r--r--src/sugar/activity/activity.py79
1 files changed, 51 insertions, 28 deletions
diff --git a/src/sugar/activity/activity.py b/src/sugar/activity/activity.py
index 95d2960..6c84f45 100644
--- a/src/sugar/activity/activity.py
+++ b/src/sugar/activity/activity.py
@@ -436,6 +436,7 @@ class Activity(Window, gtk.Container):
self._preview = _sugarext.Preview()
self._updating_jobject = False
self._closing = False
+ self._quit_requested = False
self._deleting = False
self._max_participants = 0
self._invites_queue = []
@@ -564,10 +565,15 @@ class Activity(Window, gtk.Container):
canvas.connect('map', self.__canvas_map_cb)
def __sm_quit_requested_cb(self, client):
- client.will_quit(True)
+ self._quit_requested = True
+
+ if not self._prepare_close():
+ client.will_quit(False)
+ elif not self._updating_jobject:
+ client.will_quit(True)
def __sm_quit_cb(self, client):
- self.close(force=True)
+ self._complete_close()
def __canvas_map_cb(self, canvas):
if self._jobject and self._jobject.file_path:
@@ -641,16 +647,19 @@ class Activity(Window, gtk.Container):
def __save_cb(self):
logging.debug('Activity.__save_cb')
self._updating_jobject = False
- if self._closing:
- self._cleanup_jobject()
- self.destroy()
+ if self._quit_requested:
+ self._xsmp_client.will_quit(True)
+ elif self._closing:
+ self._complete_close()
def __save_error_cb(self, err):
logging.debug('Activity.__save_error_cb')
self._updating_jobject = False
+ if self._quit_requested:
+ self._xsmp_client.will_quit(False)
if self._closing:
- self._cleanup_jobject()
- self.destroy()
+ self._show_keep_failed_dialog()
+ self._closing = False
logging.debug("Error saving activity object to datastore: %s" % err)
def _cleanup_jobject(self):
@@ -713,6 +722,10 @@ class Activity(Window, gtk.Container):
own implementation of write_file() to save your Activity specific data.
"""
+ if self._jobject is None:
+ logging.debug('Cannot save, no journal object.')
+ return
+
logging.debug('Activity.save: %r' % self._jobject.object_id)
if self._updating_jobject:
@@ -852,7 +865,7 @@ class Activity(Window, gtk.Container):
self.__share_cb)
self._pservice.share_activity(self, private=private)
- def _display_keep_failed_dialog(self):
+ def _show_keep_failed_dialog(self):
alert = Alert()
alert.props.title = _('Keep error')
alert.props.msg = _('Keep error: all changes will be lost')
@@ -877,7 +890,30 @@ class Activity(Window, gtk.Container):
return True
- def close(self, force=False, skip_save=False):
+ def _prepare_close(self, skip_save=False):
+ if not skip_save:
+ try:
+ self.save()
+ except Exception:
+ logging.info(traceback.format_exc())
+ self._show_keep_failed_dialog()
+ return False
+
+ if self._shared_activity:
+ self._shared_activity.leave()
+
+ self._closing = True
+
+ return True
+
+ def _complete_close(self):
+ self._cleanup_jobject()
+ self.destroy()
+
+ # Make the exported object inaccessible
+ dbus.service.Object.remove_from_connection(self._bus)
+
+ def close(self, skip_save=False):
"""Request that the activity be stopped and saved to the Journal
Activities should not override this method, but should implement
@@ -885,28 +921,15 @@ class Activity(Window, gtk.Container):
to control wether it can close, it should override can_close().
"""
- if not force:
- if not self.can_close():
- return
-
- try:
- if not skip_save:
- self.save()
- except Exception:
- logging.info(traceback.format_exc())
- self._display_keep_failed_dialog()
+ if not self.can_close():
return
- if self._shared_activity:
- self._shared_activity.leave()
-
- if self._updating_jobject:
- self._closing = True
- else:
- self.destroy()
+ if not self._closing:
+ if not self._prepare_close(skip_save):
+ return
- # Make the exported object inaccessible
- dbus.service.Object.remove_from_connection(self._bus)
+ if not self._updating_jobject:
+ self._complete_close()
def __realize_cb(self, window):
wm.set_bundle_id(window.window, self.get_bundle_id())