Included save_all patch from Xaview FACQ
[claws.git] / src / mimeview.c
index f6cc55e3dd1c03cc38ba80fc5232732c371b5c73..2fe0feadd7e64c9c5e3974afa6a327c4288847ac 100644 (file)
@@ -102,6 +102,7 @@ static void mimeview_drag_data_get      (GtkWidget    *widget,
 static void mimeview_display_as_text   (MimeView       *mimeview);
 static void mimeview_show_image                (MimeView       *mimeview);
 static void mimeview_save_as           (MimeView       *mimeview);
+static void mimeview_save_all          (MimeView       *mimeview);
 static void mimeview_launch            (MimeView       *mimeview);
 static void mimeview_open_with         (MimeView       *mimeview);
 static void mimeview_view_file         (const gchar    *filename,
@@ -117,7 +118,8 @@ static GtkItemFactoryEntry mimeview_popup_entries[] =
        {N_("/Open _with..."),    NULL, mimeview_open_with,       0, NULL},
        {N_("/_Display as text"), NULL, mimeview_display_as_text, 0, NULL},
        {N_("/_Display image"),   NULL, mimeview_show_image,      0, NULL},
-       {N_("/_Save as..."),      NULL, mimeview_save_as,         0, NULL}
+       {N_("/_Save as..."),      NULL, mimeview_save_as,         0, NULL},
+       {N_("/Save _all..."),     NULL, mimeview_save_all,        0, NULL}
 #if USE_GPGME
         ,
         {N_("/_Check signature"), NULL, mimeview_check_signature, 0, NULL}
@@ -361,6 +363,12 @@ static void mimeview_set_multipart_tree(MimeView *mimeview,
 
        if (!mimeinfo->sub && mimeinfo->parent)
                current = mimeview_append_part(mimeview, mimeinfo, parent);
+       if (mimeinfo->sub && !mimeinfo->sub->children &&
+           mimeinfo->sub->mime_type != MIME_TEXT &&
+           mimeinfo->sub->mime_type != MIME_TEXT_HTML) {
+               mimeview_append_part(mimeview, mimeinfo->sub, parent);
+               return;
+       }
 
        if (mimeinfo->sub)
                mimeview_set_multipart_tree(mimeview, mimeinfo->sub, current);
@@ -535,7 +543,9 @@ static void mimeview_selected(GtkCTree *ctree, GtkCTreeNode *node, gint column,
                if (gdk_pointer_is_grabbed())
                        gdk_pointer_ungrab(GDK_CURRENT_TIME);
        }
-
+       
+       mimeview->textview->default_text = FALSE;
+       
        switch (partinfo->mime_type) {
        case MIME_TEXT:
        case MIME_TEXT_HTML:
@@ -543,16 +553,21 @@ static void mimeview_selected(GtkCTree *ctree, GtkCTreeNode *node, gint column,
        case MIME_MESSAGE_RFC822:
        case MIME_MULTIPART:
                mimeview_show_message_part(mimeview, partinfo);
+               
                break;
 #if (HAVE_GDK_PIXBUF || HAVE_GDK_IMLIB)
        case MIME_IMAGE:
+               mimeview->textview->default_text = TRUE;        
                if (prefs_common.display_img)
                        mimeview_show_image_part(mimeview, partinfo);
-               else
+               else {
+                       mimeview_change_view_type(mimeview, MIMEVIEW_TEXT);
                        textview_show_mime_part(mimeview->textview, partinfo);
+               }
                break;
 #endif
        default:
+               mimeview->textview->default_text = TRUE;        
                mimeview_change_view_type(mimeview, MIMEVIEW_TEXT);
 #if USE_GPGME
                if (g_strcasecmp(partinfo->content_type,
@@ -777,6 +792,66 @@ static void mimeview_drag_data_get(GtkWidget           *widget,
        g_free(filename);
 }
 
+static void mimeview_save_all(MimeView *mimeview)
+{
+       gchar *dirname;
+       gchar *defname = NULL;
+       MimeInfo *partinfo;
+       MimeInfo *attachment;
+       gchar buf[1024];
+
+       if (!mimeview->opened) return;
+       if (!mimeview->file) return;
+
+       partinfo = gtk_ctree_node_get_row_data
+               (GTK_CTREE(mimeview->ctree), mimeview->opened);
+
+       g_return_if_fail(partinfo != NULL);
+
+       dirname = filesel_select_file(_("Save as"), defname);
+
+       if (!dirname) return;
+
+       /* return to first children */
+       attachment = partinfo->parent->children->next;
+
+       /* for each attachment, extract it in the selected dir. */
+       while(attachment != NULL)
+       {
+               if(attachment->filename)
+               {
+                       gchar *attachname = g_strdup(attachment->filename);
+
+                       subst_chars(attachname, "/\\", G_DIR_SEPARATOR);
+                       subst_chars(attachname, ":?*&|<>\t\r\n", '_');
+                       g_snprintf(buf, sizeof(buf), "%s%s",
+                                       dirname,
+                                       (attachname[0] == G_DIR_SEPARATOR)
+                                       ? &attachname[1]
+                                       : attachname );
+                       g_free(attachname);
+                       make_dir_hier(g_dirname(buf));
+
+                       if (is_file_exist(buf))
+                       {
+                               AlertValue aval;
+
+                               aval = alertpanel(_("Overwrite"),
+                                               _("Overwrite existing file?"),
+                                               _("OK"), _("Cancel"), NULL);
+
+                               if (G_ALERTDEFAULT != aval) return;
+                       }
+
+                       if (procmime_get_part(buf, mimeview->file, attachment) < 0)
+                               alertpanel_error
+                                       (_("Can't save the part of multipart message."));
+               }
+
+               attachment = attachment->next;
+       }
+}
+
 static void mimeview_display_as_text(MimeView *mimeview)
 {
        MimeInfo *partinfo;