Attachment remover: notify the user about what has been done when processing
[claws.git] / src / plugins / att_remover / att_remover.c
index 1092c15ef650c18b226bdacee559de011f1583d3..ad4cf8f6b637bc7c338483d9521b6a2459e10e91 100644 (file)
@@ -87,7 +87,7 @@ static MimeInfo *find_first_text_part(MimeInfo *partinfo)
 static gboolean key_pressed_cb(GtkWidget *widget, GdkEventKey *event,
                                AttRemover *attremover)
 {
-       if (event && event->keyval == GDK_Escape)
+       if (event && event->keyval == GDK_KEY_Escape)
                gtk_widget_destroy(attremover->window);
 
        return FALSE;
@@ -129,9 +129,14 @@ static gint save_new_message(MsgInfo *oldmsg, MsgInfo *newmsg, MimeInfo *info,
                flags.tmp_flags &= ~MSG_HAS_ATTACHMENT;
 
        oldmsg->flags.perm_flags &= ~MSG_LOCKED;
+       msgnum = folder_item_add_msg(item, finalmsg->plaintext_file, &flags, TRUE);
+       if (msgnum < 0) {
+               g_warning("could not add message without attachments");
+               procmsg_msginfo_free(&newmsg);
+               procmsg_msginfo_free(&finalmsg);
+               return msgnum;
+       }
        folder_item_remove_msg(item, oldmsg->msgnum);
-       msgnum = folder_item_add_msg(item, finalmsg->plaintext_file, 
-                       &flags, TRUE);
        finalmsg->msgnum = msgnum;
        procmsg_msginfo_free(&newmsg);
        procmsg_msginfo_free(&finalmsg);
@@ -413,13 +418,15 @@ static void remove_attachments(GSList *msglist)
        SummaryView *summaryview = mainwin->summaryview;
        GSList *cur;
        gint msgnum = -1;
+       gint stripped_msgs = 0;
+       gint total_msgs = 0;
        
        if (alertpanel_full(_("Destroy attachments"),
                   _("Do you really want to remove all attachments from "
                   "the selected messages?\n\n"
                  "The deleted data will be unrecoverable."), 
-                 GTK_STOCK_CANCEL, GTK_STOCK_DELETE, NULL,
-                  FALSE, NULL, ALERT_QUESTION, G_ALERTALTERNATE) != G_ALERTALTERNATE)
+                 GTK_STOCK_CANCEL, GTK_STOCK_DELETE, NULL, ALERTFOCUS_SECOND,
+                  FALSE, NULL, ALERT_QUESTION) != G_ALERTALTERNATE)
                return;
 
        main_window_cursor_wait(summaryview->mainwin);
@@ -432,10 +439,12 @@ static void remove_attachments(GSList *msglist)
                MsgInfo *newmsg = NULL;
                MimeInfo *info = NULL;
                MimeInfo *partinfo = NULL;
+               MimeInfo *nextpartinfo = NULL;
 
                if (!msginfo)
                        continue;
-               
+               total_msgs++;                   /* count all processed messages */
+
                newmsg = procmsg_msginfo_copy(msginfo);
                info = procmime_scan_message(newmsg);
        
@@ -443,12 +452,27 @@ static void remove_attachments(GSList *msglist)
                        procmsg_msginfo_free(&newmsg);
                        continue;
                }
-               partinfo->node->next = NULL;
-               partinfo->node->children = NULL;
-               info->node->children->data = partinfo;
+               /* only strip attachments where there is at least one */
+               nextpartinfo = procmime_mimeinfo_next(partinfo);
+               if (nextpartinfo) {
+                       partinfo->node->next = NULL;
+                       partinfo->node->children = NULL;
+                       info->node->children->data = partinfo;
 
-               msgnum = save_new_message(msginfo, newmsg, info, FALSE);                
+                       msgnum = save_new_message(msginfo, newmsg, info, FALSE);
+
+                       stripped_msgs++;        /* count messages with removed attachment(s) */
+               }
        }
+       if (stripped_msgs == 0) {
+               alertpanel_notice(_("The selected messages don't have any attachments."));
+       } else {
+               if (stripped_msgs != total_msgs)
+                       alertpanel_notice(_("Attachments removed from %d of the %d selected messages."),
+                                                       stripped_msgs, total_msgs);
+               else
+                       alertpanel_notice(_("Attachments removed from all %d selected messages."), total_msgs);
+       }       
 
        inc_unlock();
        folder_item_update_thaw();
@@ -477,12 +501,10 @@ static void remove_attachments_ui(GtkAction *action, gpointer data)
                
                if (!partinfo) {
                        alertpanel_notice(_("This message doesn't have any attachments."));
-                       g_slist_free(msglist);
-                       return;
+               } else {
+                       AttRemoverData.msginfo = msglist->data;
+                       remove_attachments_dialog(&AttRemoverData);
                }
-               
-               AttRemoverData.msginfo = msglist->data;
-               remove_attachments_dialog(&AttRemoverData);
        } else
                remove_attachments(msglist);