[Commits] [SCM] claws branch, master, updated. 3.14.1-161-g9c26d83

mones at claws-mail.org mones at claws-mail.org
Mon Jan 23 23:48:39 CET 2017


The branch, master has been updated
       via  9c26d835ef841712269eb45d65cb2834622381f1 (commit)
      from  fb584dc3c6379f4faa1afb7f0dee71efa09cd407 (commit)

Summary of changes:
 src/mimeview.c |   91 ++++++++++++++++++++++++++++++++++++++++++++------------
 1 file changed, 72 insertions(+), 19 deletions(-)


- Log -----------------------------------------------------------------
commit 9c26d835ef841712269eb45d65cb2834622381f1
Author: Ricardo Mones <ricardo at mones.org>
Date:   Mon Jan 23 23:48:18 2017 +0100

    Better error handling and feedback for save all attachments

diff --git a/src/mimeview.c b/src/mimeview.c
index 3a49663..71447b3 100644
--- a/src/mimeview.c
+++ b/src/mimeview.c
@@ -14,7 +14,6 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
  */
 
 #ifdef HAVE_CONFIG_H
@@ -74,11 +73,12 @@ static void mimeview_show_message_part		(MimeView	*mimeview,
 						 MimeInfo	*partinfo);
 static void mimeview_change_view_type		(MimeView	*mimeview,
 						 MimeViewType	 type);
-static gchar *mimeview_get_filename_for_part		(MimeInfo	*partinfo,
+static gchar *mimeview_get_filename_for_part	(MimeInfo	*partinfo,
 						 const gchar	*basedir,
 						 gint		 number);
 static gboolean mimeview_write_part		(const gchar	*filename,
-						 MimeInfo	*partinfo);
+						 MimeInfo	*partinfo,
+						 gboolean	 handle_error);
 
 static void mimeview_selected		(GtkTreeSelection	*selection,
 					 MimeView	*mimeview);
@@ -1816,7 +1816,8 @@ static gchar *mimeview_get_filename_for_part(MimeInfo *partinfo,
  * \param partinfo Attachment to save
  */
 static gboolean mimeview_write_part(const gchar *filename,
-				    MimeInfo *partinfo)
+				    MimeInfo *partinfo,
+				    gboolean handle_error)
 {
 	gchar *dir;
 	gint err;
@@ -1839,22 +1840,64 @@ static gboolean mimeview_write_part(const gchar *filename,
 		res = g_strdup_printf(_("Overwrite existing file '%s'?"),
 				      tmp);
 		g_free(tmp);
-		aval = alertpanel(_("Overwrite"), res, GTK_STOCK_CANCEL, 
+		aval = alertpanel(_("Overwrite"), res, GTK_STOCK_CANCEL,
 				  GTK_STOCK_OK, NULL);
-		g_free(res);					  
+		g_free(res);
 		if (G_ALERTALTERNATE != aval) return FALSE;
 	}
 
 	if ((err = procmime_get_part(filename, partinfo)) < 0) {
-		alertpanel_error
-			(_("Couldn't save the part of multipart message: %s"), 
-				g_strerror(-err));
+		debug_print("error saving MIME part: %d\n", err);
+		if (handle_error)
+			alertpanel_error
+				(_("Couldn't save the part of multipart message: %s"),
+				 g_strerror(-err));
 		return FALSE;
 	}
 
 	return TRUE;
 }
 
+static AlertValue mimeview_save_all_error_ask(gint n)
+{
+	gchar *message = g_strdup_printf(
+		_("An error has ocurred while saving attachment #%d. "
+		"Do you want to cancel operation or skip error and "
+		"continue?"), n);
+	AlertValue av = alertpanel_full(_("Error saving all attachments"),
+		message, GTK_STOCK_CANCEL, _("Skip"), _("Skip all"),
+		FALSE, NULL, ALERT_WARNING, G_ALERTDEFAULT);
+	g_free(message);
+	return av;
+}
+
+static void mimeview_save_all_info(gint errors, gint total)
+{
+	if (!errors) {
+		gchar *msg = g_strdup_printf(
+				ngettext("%d attachment saved succesfully.",
+					"%d attachments saved succesfully.",
+					total),
+				total);
+		alertpanel_notice(msg);
+		g_free(msg);
+	} else {
+		gchar *msg1 = g_strdup_printf(
+				ngettext("%d attachment saved succesfully",
+					"%d attachments saved succesfully",
+					total - errors),
+				total - errors);
+		gchar *msg2 = g_strdup_printf(
+				ngettext("%s, %d attachment failed.",
+					"%s, %d attachments failed.",
+					errors),
+				msg1, errors);
+		alertpanel_warning(msg2);
+		g_free(msg2);
+		g_free(msg1);
+	}
+}
+
 /**
  * Menu callback: Save all attached files
  * \param mimeview Current display
@@ -1864,7 +1907,8 @@ static void mimeview_save_all(MimeView *mimeview)
 	MimeInfo *partinfo;
 	gchar *dirname;
 	gchar *startdir = NULL;
-	gint number = 1;
+	gint number = 1, errors = 0;
+	gboolean skip_errors = FALSE;
 
 	if (!mimeview->opened) return;
 	if (!mimeview->file) return;
@@ -1872,8 +1916,7 @@ static void mimeview_save_all(MimeView *mimeview)
 
 	partinfo = mimeview->mimeinfo;
 	if (prefs_common.attach_save_dir && *prefs_common.attach_save_dir)
-		startdir = g_strconcat(prefs_common.attach_save_dir,
-				       G_DIR_SEPARATOR_S, NULL);
+		startdir = g_strconcat(prefs_common.attach_save_dir, G_DIR_SEPARATOR_S, NULL);
 	else
 		startdir = g_strdup(get_home_dir());
 
@@ -1885,8 +1928,7 @@ static void mimeview_save_all(MimeView *mimeview)
 	}
 
 	if (!is_dir_exist (dirname)) {
-		alertpanel_error(_("'%s' is not a directory."),
-				 dirname);
+		alertpanel_error(_("'%s' is not a directory."), dirname);
 		g_free(startdir);
 		g_free(dirname);
 		return;
@@ -1903,17 +1945,26 @@ static void mimeview_save_all(MimeView *mimeview)
 		if (partinfo && partinfo->type == MIMETYPE_TEXT)
 			partinfo = procmime_mimeinfo_next(partinfo);
 	}
-		
+
 	while (partinfo != NULL) {
 		if (partinfo->type != MIMETYPE_MESSAGE &&
 		    partinfo->type != MIMETYPE_MULTIPART &&
 		    (partinfo->disposition != DISPOSITIONTYPE_INLINE
 		     || get_real_part_name(partinfo) != NULL)) {
-			gchar *filename = mimeview_get_filename_for_part
-				(partinfo, dirname, number++);
+			gchar *filename = mimeview_get_filename_for_part(
+				partinfo, dirname, number++);
 
-			mimeview_write_part(filename, partinfo);
+			gboolean ok = mimeview_write_part(filename, partinfo, FALSE);
 			g_free(filename);
+			if (!ok) {
+				++errors;
+				if (!skip_errors) {
+					AlertValue av = mimeview_save_all_error_ask(number - 1);
+					skip_errors = (av == G_ALERTOTHER);
+					if (av == G_ALERTDEFAULT) /* cancel */
+						break;
+				}
+			}
 		}
 		partinfo = procmime_mimeinfo_next(partinfo);
 	}
@@ -1923,6 +1974,8 @@ static void mimeview_save_all(MimeView *mimeview)
 	prefs_common.attach_save_dir = g_filename_to_utf8(dirname,
 					-1, NULL, NULL, NULL);
 	g_free(dirname);
+
+	mimeview_save_all_info(errors, number - 1);
 }
 
 static MimeInfo *mimeview_get_part_to_use(MimeView *mimeview)
@@ -1998,7 +2051,7 @@ void mimeview_save_as(MimeView *mimeview)
 		return;
 	}
 
-	mimeview_write_part(filename, partinfo);
+	mimeview_write_part(filename, partinfo, TRUE);
 
 	filedir = g_path_get_dirname(filename);
 	if (filedir && strcmp(filedir, ".")) {

-----------------------------------------------------------------------


hooks/post-receive
-- 
Claws Mail


More information about the Commits mailing list