2007-06-17 [colin] 2.9.2cvs67
[claws.git] / src / procmsg.c
index 3256084867d6ab95a41e56e2a0e2202e392a9019..04b4b76f20e9e76c9a1846144157a43939a06b91 100644 (file)
@@ -665,8 +665,10 @@ static void procmsg_empty_trash(FolderItem *trash)
                GSList *cur;
                for (cur = mlist ; cur != NULL ; cur = cur->next) {
                        MsgInfo * msginfo = (MsgInfo *) cur->data;
-                       if (MSG_IS_LOCKED(msginfo->flags))
+                       if (MSG_IS_LOCKED(msginfo->flags)) {
+                               procmsg_msginfo_free(msginfo);
                                continue;
+                       }
                        if (msginfo->total_size != 0 && 
                            msginfo->size != (off_t)msginfo->total_size)
                                partial_mark_for_delete(msginfo);
@@ -855,7 +857,7 @@ gint procmsg_send_queue(FolderItem *queue, gboolean save_msgs, gchar **errstr)
        
        if (send_queue_lock) {
                /* Avoid having to translate two similar strings */
-               log_warning("%s\n", _("Already trying to send."));
+               log_warning(LOG_PROTOCOL, "%s\n", _("Already trying to send."));
                if (errstr) {
                        if (*errstr) g_free(*errstr);
                        *errstr = g_strdup_printf(_("Already trying to send."));
@@ -919,7 +921,9 @@ gint procmsg_send_queue(FolderItem *queue, gboolean save_msgs, gchar **errstr)
                while (node != NULL) {
                        int res = 0;
                        next = node->next;
+                       send_queue_lock = FALSE;
                        res = procmsg_send_queue(FOLDER_ITEM(node->data), save_msgs, errstr);
+                       send_queue_lock = TRUE;
                        if (res < 0) 
                                err = -res;
                        else
@@ -1741,8 +1745,13 @@ send_mail:
                        }
                        
                        if (msginfo != NULL) {
+                               MsgPermFlags to_unset = 0;
+
+                               if (prefs_common.mark_as_read_on_new_window)
+                                       to_unset = (MSG_NEW|MSG_UNREAD);
+
                                if (replymessageid != NULL) {
-                                       procmsg_msginfo_unset_flags(msginfo, MSG_FORWARDED, 0);
+                                       procmsg_msginfo_unset_flags(msginfo, to_unset|MSG_FORWARDED, 0);
                                        procmsg_msginfo_set_flags(msginfo, MSG_REPLIED, 0);
                                }  else {
                                        procmsg_msginfo_unset_flags(msginfo, MSG_REPLIED, 0);
@@ -2113,13 +2122,15 @@ static gboolean procmsg_msginfo_filter(MsgInfo *msginfo, PrefsAccount* ac_prefs)
        mail_filtering_data.filtered = NULL;                    
        mail_filtering_data.unfiltered = NULL;
        mail_filtering_data.account = ac_prefs; 
-       if (hooks_invoke(MAIL_FILTERING_HOOKLIST, &mail_filtering_data)) {
+
+       if (!ac_prefs || ac_prefs->filterhook_on_recv)
+               if (hooks_invoke(MAIL_FILTERING_HOOKLIST, &mail_filtering_data))
                return TRUE;
-       }
 
        /* filter if enabled in prefs or move to inbox if not */
        if((filtering_rules != NULL) &&
-          filter_message_by_msginfo(filtering_rules, msginfo, ac_prefs)) {
+               filter_message_by_msginfo(filtering_rules, msginfo, ac_prefs,
+                               FILTERING_INCORPORATION, NULL)) {
                return TRUE;
        }
                
@@ -2159,6 +2170,7 @@ void procmsg_msglist_filter(GSList *list, PrefsAccount *ac,
        mail_filtering_data.unfiltered = NULL;  
        mail_filtering_data.account = ac;       
                        
+       if (!ac || ac->filterhook_on_recv)
        hooks_invoke(MAIL_LISTFILTERING_HOOKLIST, &mail_filtering_data);
        
        if (mail_filtering_data.filtered == NULL &&
@@ -2286,19 +2298,31 @@ int procmsg_spam_learner_learn (MsgInfo *info, GSList *list, gboolean spam)
 }
 
 static gchar *spam_folder_item = NULL;
-void procmsg_spam_set_folder (const char *item_identifier)
+static FolderItem * (*procmsg_spam_get_folder_func)(MsgInfo *msginfo) = NULL;
+void procmsg_spam_set_folder (const char *item_identifier, FolderItem *(*spam_get_folder_func)(MsgInfo *info))
 {
        g_free(spam_folder_item);
        if (item_identifier)
                spam_folder_item = g_strdup(item_identifier);
        else
                spam_folder_item = NULL;
+       if (spam_get_folder_func != NULL)
+               procmsg_spam_get_folder_func = spam_get_folder_func;
+       else
+               procmsg_spam_get_folder_func = NULL;
 }
 
-FolderItem *procmsg_spam_get_folder (void)
+FolderItem *procmsg_spam_get_folder (MsgInfo *msginfo)
 {
-       FolderItem *item = spam_folder_item ? folder_find_item_from_identifier(spam_folder_item) : NULL;
-       return item ? item : folder_get_default_trash();
+       FolderItem *item = NULL;
+       
+       if (procmsg_spam_get_folder_func) 
+               item = procmsg_spam_get_folder_func(msginfo);
+       if (item == NULL && spam_folder_item)
+               item = folder_find_item_from_identifier(spam_folder_item);
+       if (item == NULL)
+               item = folder_get_default_trash();
+       return item;
 }
 
 static void item_has_queued_mails(FolderItem *item, gpointer data)
@@ -2316,3 +2340,19 @@ gboolean procmsg_have_queued_mails_fast (void)
        folder_func_to_all_folders(item_has_queued_mails, &result);
        return result;
 }
+
+static void item_has_trashed_mails(FolderItem *item, gpointer data)
+{
+       gboolean *result = (gboolean *)data;
+       if (*result == TRUE)
+               return;
+       if (folder_has_parent_of_type(item, F_TRASH) && item->total_msgs > 0)
+               *result = TRUE;
+}
+
+gboolean procmsg_have_trashed_mails_fast (void)
+{
+       gboolean result = FALSE;
+       folder_func_to_all_folders(item_has_trashed_mails, &result);
+       return result;
+}