evolution r35257 - branches/mbarnes-composer/composer



Author: mbarnes
Date: Thu Mar 27 03:42:35 2008
New Revision: 35257
URL: http://svn.gnome.org/viewvc/evolution?rev=35257&view=rev

Log:
Fix a crash when shutting down the autosave system.


Modified:
   branches/mbarnes-composer/composer/e-composer-autosave.c
   branches/mbarnes-composer/composer/e-composer-autosave.h
   branches/mbarnes-composer/composer/e-msg-composer.c

Modified: branches/mbarnes-composer/composer/e-composer-autosave.c
==============================================================================
--- branches/mbarnes-composer/composer/e-composer-autosave.c	(original)
+++ branches/mbarnes-composer/composer/e-composer-autosave.c	Thu Mar 27 03:42:35 2008
@@ -209,6 +209,26 @@
 			composer_autosave_timeout, NULL);
 }
 
+void
+e_composer_autosave_unregister (EMsgComposer *composer)
+{
+	AutosaveState *state;
+
+	g_return_if_fail (E_IS_MSG_COMPOSER (composer));
+
+	state = g_object_get_data (G_OBJECT (composer), "autosave");
+	if (state == NULL || state->filename == NULL)
+		return;
+
+	if (e_composer_autosave_snapshot (composer)) {
+		close (state->fd);
+		g_unlink (state->filename);
+	} else
+		close (state->fd);
+
+	g_object_set_data (G_OBJECT (composer), "autosave", NULL);
+}
+
 gboolean
 e_composer_autosave_snapshot (EMsgComposer *composer)
 {

Modified: branches/mbarnes-composer/composer/e-composer-autosave.h
==============================================================================
--- branches/mbarnes-composer/composer/e-composer-autosave.h	(original)
+++ branches/mbarnes-composer/composer/e-composer-autosave.h	Thu Mar 27 03:42:35 2008
@@ -9,6 +9,7 @@
 GList *		e_composer_autosave_find_orphans (GError **error);
 
 void		e_composer_autosave_register	 (EMsgComposer *composer);
+void		e_composer_autosave_unregister	 (EMsgComposer *composer);
 gboolean	e_composer_autosave_snapshot	 (EMsgComposer *composer);
 gint		e_composer_autosave_get_fd	 (EMsgComposer *composer);
 const gchar *	e_composer_autosave_get_filename (EMsgComposer *composer);

Modified: branches/mbarnes-composer/composer/e-msg-composer.c
==============================================================================
--- branches/mbarnes-composer/composer/e-msg-composer.c	(original)
+++ branches/mbarnes-composer/composer/e-msg-composer.c	Thu Mar 27 03:42:35 2008
@@ -1527,29 +1527,6 @@
 	return composer;
 }
 
-static void
-autosave_manager_unregister (EMsgComposer *composer)
-{
-	const gchar *filename;
-	gint fd;
-
-	filename = e_composer_autosave_get_filename (composer);
-	fd = e_composer_autosave_get_fd (composer);
-
-	if (filename == NULL)
-		return;
-
-	/* only remove the file if we can successfully save it */
-	/* FIXME this test could probably be more efficient */
-	if (e_composer_autosave_snapshot (composer)) {
-		/* Close before unlinking necessary on Win32 */
-		close (fd);
-		g_unlink (filename);
-	} else {
-		close (fd);
-	}
-}
-
 /* Menu callbacks.  */
 static void
 menu_file_save_cb (BonoboUIComponent *uic,
@@ -2324,15 +2301,10 @@
 {
 	EMsgComposer *composer = E_MSG_COMPOSER (object);
 
-	/* When destroy () is called, the contents of the window
-	 * (including the remote editor control) will already have
-	 * been destroyed, so we have to do this here.
-	 */
-	autosave_manager_unregister (composer);
-
+	e_composer_autosave_unregister (composer);
 	e_composer_private_dispose (composer);
 
-	/* Chain up to parent's dispose () method. */
+	/* Chain up to parent's dispose() method. */
 	G_OBJECT_CLASS (parent_class)->dispose (object);
 }
 
@@ -2343,7 +2315,7 @@
 
 	e_composer_private_finalize (composer);
 
-	/* Chain up to parent's finalize () method. */
+	/* Chain up to parent's finalize() method. */
 	G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 
@@ -2375,7 +2347,7 @@
 		g_object_unref (gconf);
 	}
 
-	/* Chain up to parent's destroy () method. */
+	/* Chain up to parent's destroy() method. */
 	GTK_OBJECT_CLASS (parent_class)->destroy (object);
 }
 
@@ -2956,7 +2928,7 @@
 {
 	EComposerHeaderTable *table;
 	const gchar *subject;
-	gint button;
+	gint response;
 
 	if (!e_msg_composer_is_dirty (composer) &&
 		!e_composer_autosave_get_saved (composer)) {
@@ -2970,12 +2942,28 @@
 	table = e_msg_composer_get_header_table (composer);
 	subject = e_composer_header_table_get_subject (table);
 
-	button = e_error_run ((GtkWindow *)composer, "mail-composer:exit-unsaved",
-			     subject && subject[0] ? subject : _ ("Untitled Message"), NULL);
-	e_composer_autosave_register (composer);
-	e_msg_composer_check_autosave (GTK_WINDOW (composer));
+	if (subject == NULL || *subject == '\0')
+		subject = _("Untitled Message");
 
-	composer->priv->has_changed = FALSE;
+	response = e_error_run (
+		GTK_WINDOW (composer),
+		"mail-composer:exit-unsaved",
+		subject, NULL);
+
+	switch (response) {
+		case GTK_RESPONSE_YES:
+			g_signal_emit (composer, signals[SAVE_DRAFT], 0, TRUE);
+			e_composer_autosave_set_saved (composer, FALSE);
+			e_msg_composer_unset_changed (composer);
+			break;
+
+		case GTK_RESPONSE_NO:
+			gtk_widget_destroy (GTK_WIDGET (composer));
+			break;
+
+		case GTK_RESPONSE_CANCEL:
+			break;
+	}
 }
 
 static EMsgComposer *



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]