*
* 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
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);
G_TYPE_POINTER);
ctree = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model));
+ g_object_unref(model);
gtk_tree_view_set_enable_search(GTK_TREE_VIEW(ctree), FALSE);
gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(ctree),
prefs_common.use_stripes_everywhere);
column = gtk_tree_view_get_column(GTK_TREE_VIEW(ctree), cols-1);
renderer = gtk_cell_renderer_text_new();
-#if(GTK_CHECK_VERSION(2,18,0))
gtk_cell_renderer_set_alignment(renderer, 1, 0.5);
-#endif
cols = gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(ctree),
-1, titles[COL_SIZE], renderer,
"text", COL_SIZE, NULL);
mime_notebook = gtk_notebook_new();
gtk_widget_show(mime_notebook);
- gtkut_widget_set_can_focus(mime_notebook, FALSE);
+ gtk_widget_set_can_focus(mime_notebook, FALSE);
gtk_notebook_set_show_tabs(GTK_NOTEBOOK(mime_notebook), FALSE);
gtk_notebook_set_show_border(GTK_NOTEBOOK(mime_notebook), FALSE);
MimeInfo *mimeview_get_selected_part(MimeView *mimeview)
{
- GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(mimeview->ctree));
- GtkTreeIter iter;
- GtkTreeSelection *selection;
- MimeInfo *partinfo = NULL;
-
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(mimeview->ctree));
- if (gtk_tree_selection_get_selected(selection, NULL, &iter))
- gtk_tree_model_get(model, &iter, COL_DATA, &partinfo, -1);
-
- return partinfo;
+ return gtkut_tree_view_get_selected_pointer(
+ GTK_TREE_VIEW(mimeview->ctree), COL_DATA);
}
MimeInfo *mimeview_get_node_part(MimeView *mimeview, GtkTreePath *path)
* \param partinfo Attachment to save
*/
static gboolean mimeview_write_part(const gchar *filename,
- MimeInfo *partinfo)
+ MimeInfo *partinfo,
+ gboolean handle_error)
{
gchar *dir;
gint err;
res = g_strdup_printf(_("Overwrite existing file '%s'?"),
tmp);
g_free(tmp);
- aval = alertpanel(_("Overwrite"), res, GTK_STOCK_CANCEL,
- GTK_STOCK_OK, NULL);
- g_free(res);
+ aval = alertpanel(_("Overwrite"), res, GTK_STOCK_CANCEL,
+ GTK_STOCK_OK, NULL, ALERTFOCUS_FIRST);
+ 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 occurred while saving message part #%d. "
+ "Do you want to cancel operation or skip error and "
+ "continue?"), n);
+ AlertValue av = alertpanel_full(_("Error saving all message parts"),
+ message, GTK_STOCK_CANCEL, _("Skip"), _("Skip all"),
+ ALERTFOCUS_FIRST, FALSE, NULL, ALERT_WARNING);
+ g_free(message);
+ return av;
+}
+
+static void mimeview_save_all_info(gint errors, gint total)
+{
+ if (!errors) {
+ gchar *msg = g_strdup_printf(
+ ngettext("%d file saved successfully.",
+ "%d files saved successfully.",
+ total),
+ total);
+ alertpanel_notice("%s", msg);
+ g_free(msg);
+ } else {
+ gchar *msg1 = g_strdup_printf(
+ ngettext("%d file saved successfully",
+ "%d files saved successfully",
+ total - errors),
+ total - errors);
+ gchar *msg2 = g_strdup_printf(
+ ngettext("%s, %d file failed.",
+ "%s, %d files failed.",
+ errors),
+ msg1, errors);
+ alertpanel_warning("%s", msg2);
+ g_free(msg2);
+ g_free(msg1);
+ }
+}
+
/**
* Menu callback: Save all attached files
* \param mimeview Current display
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;
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());
}
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;
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);
}
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)
return;
}
- mimeview_write_part(filename, partinfo);
+ mimeview_write_part(filename, partinfo, TRUE);
filedir = g_path_get_dirname(filename);
if (filedir && strcmp(filedir, ".")) {