src/procmsg.c po/fr.po po/it.po po/pt_BR.po completed typo fixing
[claws.git] / src / procmsg.c
index 72549223dd894ada396bf4009262d9cf6e7672d6..2f57feb7826ed6e345b57bf7aee43c026616356c 100644 (file)
@@ -181,13 +181,14 @@ GSList *procmsg_read_cache(FolderItem *item, gboolean scan_file)
 
        default_flags.perm_flags = MSG_NEW|MSG_UNREAD;
        default_flags.tmp_flags = MSG_CACHED;
-       if (type == F_MH) {
+       if (type == F_MH || type == F_IMAP) {
                if (item->stype == F_QUEUE) {
                        MSG_SET_TMP_FLAGS(default_flags, MSG_QUEUED);
                } else if (item->stype == F_DRAFT) {
                        MSG_SET_TMP_FLAGS(default_flags, MSG_DRAFT);
                }
-       } else if (type == F_IMAP) {
+       }
+       if (type == F_IMAP) {
                MSG_SET_TMP_FLAGS(default_flags, MSG_IMAP);
        } else if (type == F_NEWS) {
                MSG_SET_TMP_FLAGS(default_flags, MSG_NEWS);
@@ -399,6 +400,57 @@ void procmsg_write_flags(MsgInfo *msginfo, FILE *fp)
        WRITE_CACHE_DATA_INT(flags, fp);
 }
 
+void procmsg_flush_mark_queue(FolderItem *item, FILE *fp)
+{
+       MsgInfo *flaginfo;
+
+       g_return_if_fail(item != NULL);
+       g_return_if_fail(fp != NULL);
+
+       while (item->mark_queue != NULL) {
+               flaginfo = (MsgInfo *)item->mark_queue->data;
+               procmsg_write_flags(flaginfo, fp);
+               procmsg_msginfo_free(flaginfo);
+               item->mark_queue = g_slist_remove(item->mark_queue, flaginfo);
+       }
+}
+
+void procmsg_add_flags(FolderItem *item, gint num, MsgFlags flags)
+{
+       FILE *fp;
+       gchar *path;
+       MsgInfo msginfo;
+
+       g_return_if_fail(item != NULL);
+
+       if (item->opened) {
+               MsgInfo *queue_msginfo;
+
+               queue_msginfo = g_new0(MsgInfo, 1);
+               queue_msginfo->msgnum = num;
+               queue_msginfo->flags = flags;
+               item->mark_queue = g_slist_append
+                       (item->mark_queue, queue_msginfo);
+               return;
+       }
+
+       path = folder_item_get_path(item);
+       g_return_if_fail(path != NULL);
+
+       if ((fp = procmsg_open_mark_file(path, TRUE)) == NULL) {
+               g_warning(_("can't open mark file\n"));
+               g_free(path);
+               return;
+       }
+       g_free(path);
+
+       msginfo.msgnum = num;
+       msginfo.flags = flags;
+
+       procmsg_write_flags(&msginfo, fp);
+       fclose(fp);
+}
+
 struct MarkSum {
        gint *new;
        gint *unread;
@@ -469,12 +521,8 @@ static GHashTable *procmsg_read_mark_file(const gchar *folder)
 
                flags = g_new0(MsgFlags, 1);
                flags->perm_flags = perm_flags;
-    
-               if(!MSG_IS_REALLY_DELETED(*flags)) {
-                       g_hash_table_insert(mark_table, GUINT_TO_POINTER(num), flags);
-               } else {
-                       g_hash_table_remove(mark_table, GUINT_TO_POINTER(num));
-               }
+
+               g_hash_table_insert(mark_table, GUINT_TO_POINTER(num), flags);
        }
 
        fclose(fp);
@@ -548,7 +596,7 @@ GNode *procmsg_get_thread_tree(GSList *mlist)
                                parent = root;
                        } else {
                                if(MSG_IS_IGNORE_THREAD(((MsgInfo *)parent->data)->flags)) {
-                                       procmsg_msginfo_set_flags(msginfo, MSG_IGNORE_THREAD, 0);
+                                       MSG_SET_PERM_FLAGS(msginfo->flags, MSG_IGNORE_THREAD);
                                }
                        }
                }
@@ -579,7 +627,7 @@ GNode *procmsg_get_thread_tree(GSList *mlist)
                                (parent, parent->children, node);
                        /* CLAWS: ignore thread */
                        if(MSG_IS_IGNORE_THREAD(((MsgInfo *)parent->data)->flags)) {
-                               procmsg_msginfo_set_flags(msginfo, MSG_IGNORE_THREAD, 0);
+                               MSG_SET_PERM_FLAGS(msginfo->flags, MSG_IGNORE_THREAD);
                        }
                }
                node = next;
@@ -610,7 +658,7 @@ GNode *procmsg_get_thread_tree(GSList *mlist)
                                g_node_append(parent, node);
                                /* CLAWS: ignore thread */
                                if(MSG_IS_IGNORE_THREAD(((MsgInfo *)parent->data)->flags)) {
-                                       procmsg_msginfo_set_flags(msginfo, MSG_IGNORE_THREAD, 0);
+                                       MSG_SET_PERM_FLAGS(msginfo->flags, MSG_IGNORE_THREAD);
                                }
                        }
                }                                       
@@ -831,14 +879,15 @@ void procmsg_empty_trash(void)
        }
 }
 
-gint procmsg_send_queue(void)
+gint procmsg_send_queue(FolderItem *queue, gboolean save_msgs)
 {
-       FolderItem *queue;
        gint i;
        gint ret = 0;
 
-       queue = folder_get_default_queue();
+       if (!queue)
+               queue = folder_get_default_queue();
        g_return_val_if_fail(queue != NULL, -1);
+
        folder_item_scan(queue);
        if (queue->last_num < 0) return -1;
        else if (queue->last_num == 0) return 0;
@@ -851,8 +900,19 @@ gint procmsg_send_queue(void)
                        if (procmsg_send_message_queue(file) < 0) {
                                g_warning(_("Sending queued message %d failed.\n"), i);
                                ret = -1;
-                       } else
+                       } else {
+                       /* CLAWS: 
+                        * We save in procmsg_send_message_queue because
+                        * we need the destination folder from the queue
+                        * header
+                                               
+                               if (save_msgs)
+                                       procmsg_save_to_outbox
+                                               (queue->folder->outbox,
+                                                file, TRUE);
+*/
                                folder_item_remove_msg(queue, i);
+                       }
                        g_free(file);
                }
        }
@@ -860,6 +920,60 @@ gint procmsg_send_queue(void)
        return ret;
 }
 
+gint procmsg_save_to_outbox(FolderItem *outbox, const gchar *file,
+                           gboolean is_queued)
+{
+       gint num;
+       FILE *fp;
+       MsgFlags flag = {0, 0};
+
+       debug_print(_("saving sent message...\n"));
+
+       if (!outbox)
+               outbox = folder_get_default_outbox();
+       g_return_val_if_fail(outbox != NULL, -1);
+
+       /* remove queueing headers */
+       if (is_queued) {
+               gchar tmp[MAXPATHLEN + 1];
+               gchar buf[BUFFSIZE];
+               FILE *outfp;
+
+               g_snprintf(tmp, sizeof(tmp), "%s%ctmpmsg.out.%08x",
+                          get_rc_dir(), G_DIR_SEPARATOR, (guint)random());
+               if ((fp = fopen(file, "rb")) == NULL) {
+                       FILE_OP_ERROR(file, "fopen");
+                       return -1;
+               }
+               if ((outfp = fopen(tmp, "wb")) == NULL) {
+                       FILE_OP_ERROR(tmp, "fopen");
+                       fclose(fp);
+                       return -1;
+               }
+               while (fgets(buf, sizeof(buf), fp) != NULL)
+                       if (buf[0] == '\r' || buf[0] == '\n') break;
+               while (fgets(buf, sizeof(buf), fp) != NULL)
+                       fputs(buf, outfp);
+               fclose(outfp);
+               fclose(fp);
+               Xstrdup_a(file, tmp, return -1);
+       }
+
+       folder_item_scan(outbox);
+       if ((num = folder_item_add_msg(outbox, file, FALSE)) < 0) {
+               g_warning(_("can't save message\n"));
+               return -1;
+       }
+
+       if(is_queued) {
+               unlink(file);
+       }
+
+       procmsg_add_flags(outbox, num, flag);
+
+       return 0;
+}
+
 void procmsg_print_message(MsgInfo *msginfo, const gchar *cmdline)
 {
        static const gchar *def_cmd = "lpr %s";
@@ -1054,7 +1168,6 @@ gint procmsg_send_message_queue(const gchar *file)
        gchar buf[BUFFSIZE];
        gint hnum;
        PrefsAccount *mailac = NULL, *newsac = NULL;
-       gchar *tmp = NULL;
        int local = 0;
 
        g_return_val_if_fail(file != NULL, -1);
@@ -1094,30 +1207,6 @@ gint procmsg_send_message_queue(const gchar *file)
        }
        filepos = ftell(fp);
 
-       if(newsgroup_list || prefs_common.savemsg) {
-               FILE *tmpfp;
-
-               /* write to temporary file */
-               tmp = g_strdup_printf("%s%ctmp%d", g_get_tmp_dir(),
-                           G_DIR_SEPARATOR, (gint)file);
-               if ((tmpfp = fopen(tmp, "wb")) == NULL) {
-                       FILE_OP_ERROR(tmp, "fopen");
-                       newsval = -1;
-               }
-               if (change_file_mode_rw(tmpfp, tmp) < 0) {
-                       FILE_OP_ERROR(tmp, "chmod");
-                       g_warning(_("can't change file mode\n"));
-               }
-
-               while ((newsval == 0) && fgets(buf, sizeof(buf), fp) != NULL) {
-                       if (fputs(buf, tmpfp) == EOF) {
-                               FILE_OP_ERROR(tmp, "fputs");
-                               newsval = -1;
-                       }
-               }
-               fclose(tmpfp);
-       }
-
        fseek(fp, filepos, SEEK_SET);
        if (to_list) {
                debug_print(_("Sending message by mail\n"));
@@ -1171,53 +1260,45 @@ gint procmsg_send_message_queue(const gchar *file)
 
        if(newsgroup_list && (newsval == 0)) {
                Folder *folder;
+               gchar *tmp = NULL;
+               FILE *tmpfp;
 
-               debug_print(_("Sending message by news\n"));
-
-               folder = FOLDER(newsac->folder);
-
-               newsval = news_post(folder, tmp);
-               if (newsval < 0) {
-                       alertpanel_error(_("Error occurred while posting the message to %s ."),
-                                 newsac->nntp_server);
-               }
-       }
-
-       /* save message to outbox */
-       if (mailval == 0 && newsval == 0 && savecopyfolder) {
-               FolderItem *folder;
-               gchar *path;
-               gint num;
-               FILE *fp;
-
-               debug_print(_("saving sent message...\n"));
-
-               folder = folder_find_item_from_identifier(savecopyfolder);
-               if(!folder)
-                       folder = folder_get_default_outbox();
-               path = folder_item_get_path(folder);
-               if (!is_dir_exist(path))
-                       make_dir_hier(path);
+               /* write to temporary file */
+               tmp = g_strdup_printf("%s%ctmp%d", g_get_tmp_dir(),
+                           G_DIR_SEPARATOR, (gint)file);
+               if ((tmpfp = fopen(tmp, "wb")) == NULL) {
+                       FILE_OP_ERROR(tmp, "fopen");
+                       newsval = -1;
+                       alertpanel_error(_("Could not create temporary file for news sending."));
+               } else {
+                       if (change_file_mode_rw(tmpfp, tmp) < 0) {
+                               FILE_OP_ERROR(tmp, "chmod");
+                               g_warning(_("can't change file mode\n"));
+                       }
+
+                       while ((newsval == 0) && fgets(buf, sizeof(buf), fp) != NULL) {
+                               if (fputs(buf, tmpfp) == EOF) {
+                                       FILE_OP_ERROR(tmp, "fputs");
+                                       newsval = -1;
+                                       alertpanel_error(_("Error when writing temporary file for news sending."));
+                               }
+                       }
+                       fclose(tmpfp);
 
-               folder_item_scan(folder);
-               if ((num = folder_item_add_msg(folder, tmp, FALSE)) < 0) {
-                       g_warning(_("can't save message\n"));
-               }
+                       if(newsval == 0) {
+                               debug_print(_("Sending message by news\n"));
 
-               if(num) {
-                       if ((fp = procmsg_open_mark_file(path, TRUE)) == NULL)
-                               g_warning(_("can't open mark file\n"));
-                       else {
-                               MsgInfo newmsginfo;
+                               folder = FOLDER(newsac->folder);
 
-                               newmsginfo.msgnum = num;
-                               newmsginfo.flags.perm_flags = 0;
-                               newmsginfo.flags.tmp_flags = 0;
-                               procmsg_write_flags(&newmsginfo, fp);
-                               fclose(fp);
+                               newsval = news_post(folder, tmp);
+                               if (newsval < 0) {
+                                       alertpanel_error(_("Error occurred while posting the message to %s ."),
+                                                newsac->nntp_server);
+                               }
                        }
+                       unlink(tmp);
                }
-               g_free(path);
+               g_free(tmp);
        }
 
        slist_free_strings(to_list);
@@ -1227,129 +1308,19 @@ gint procmsg_send_message_queue(const gchar *file)
        g_free(from);
        g_free(smtpserver);
        fclose(fp);
-       if(tmp) {
-               unlink(tmp);
-               g_free(tmp);
-       }
-
-       return (newsval != 0 ? newsval : mailval);
-}
-
-#define CHANGE_FLAGS(msginfo) \
-{ \
-if (msginfo->folder->folder->change_flags != NULL) \
-msginfo->folder->folder->change_flags(msginfo->folder->folder, \
-                                     msginfo->folder, \
-                                     msginfo); \
-}
-
-void procmsg_msginfo_set_flags(MsgInfo *msginfo, MsgPermFlags perm_flags, MsgTmpFlags tmp_flags)
-{
-       gboolean changed = FALSE;
-       FolderItem *item = msginfo->folder;
-
-       debug_print(_("Setting flags for message %d in folder %s\n"), msginfo->msgnum, item->path);
-
-       /* if new flag is set */
-       if((perm_flags & MSG_NEW) && !MSG_IS_NEW(msginfo->flags) &&
-          !MSG_IS_IGNORE_THREAD(msginfo->flags)) {
-               item->new++;
-               changed = TRUE;
-       }
-
-       /* if unread flag is set */
-       if((perm_flags & MSG_UNREAD) && !MSG_IS_UNREAD(msginfo->flags) &&
-          !MSG_IS_IGNORE_THREAD(msginfo->flags)) {
-               item->unread++;
-               changed = TRUE;
-       }
-
-       /* if ignore thread flag is set */
-       if((perm_flags & MSG_IGNORE_THREAD) && !MSG_IS_IGNORE_THREAD(msginfo->flags)) {
-               if(MSG_IS_NEW(msginfo->flags) || (perm_flags & MSG_NEW)) {
-                       item->new--;
-                       changed = TRUE;
-               }
-               if(MSG_IS_UNREAD(msginfo->flags) || (perm_flags & MSG_UNREAD)) {
-                       item->unread--;
-                       changed = TRUE;
-               }
-       }
-
-       if (MSG_IS_IMAP(msginfo->flags))
-               imap_msg_set_perm_flags(msginfo, perm_flags);
-
-       msginfo->flags.perm_flags |= perm_flags;
-       msginfo->flags.tmp_flags |= tmp_flags;
-
-       if(changed) {
-               folderview_update_item(item, FALSE);
-       }
-       CHANGE_FLAGS(msginfo);
-       procmsg_msginfo_write_flags(msginfo);
-}
-
-void procmsg_msginfo_unset_flags(MsgInfo *msginfo, MsgPermFlags perm_flags, MsgTmpFlags tmp_flags)
-{
-       gboolean changed = FALSE;
-       FolderItem *item = msginfo->folder;
-       
-       debug_print(_("Unsetting flags for message %d in folder %s\n"), msginfo->msgnum, item->path);
-
-       /* if new flag is unset */
-       if((perm_flags & MSG_NEW) && MSG_IS_NEW(msginfo->flags) &&
-          !MSG_IS_IGNORE_THREAD(msginfo->flags)) {
-               item->new--;
-               changed = TRUE;
-       }
 
-       /* if unread flag is unset */
-       if((perm_flags & MSG_UNREAD) && MSG_IS_UNREAD(msginfo->flags) &&
-          !MSG_IS_IGNORE_THREAD(msginfo->flags)) {
-               item->unread--;
-               changed = TRUE;
-       }
-
-       /* if ignore thread flag is unset */
-       if((perm_flags & MSG_IGNORE_THREAD) && !MSG_IS_IGNORE_THREAD(msginfo->flags)) {
-               if(MSG_IS_NEW(msginfo->flags) || (perm_flags & MSG_NEW)) {
-                       item->new++;
-                       changed = TRUE;
-               }
-               if(MSG_IS_UNREAD(msginfo->flags) || (perm_flags & MSG_UNREAD)) {
-                       item->unread++;
-                       changed = TRUE;
-               }
-       }
+       /* save message to outbox */
+       if (mailval == 0 && newsval == 0 && savecopyfolder) {
+               FolderItem *outbox;
 
-       if (MSG_IS_IMAP(msginfo->flags))
-               imap_msg_unset_perm_flags(msginfo, perm_flags);
+               debug_print(_("saving sent message...\n"));
 
-       msginfo->flags.perm_flags &= ~perm_flags;
-       msginfo->flags.tmp_flags &= ~tmp_flags;
+               outbox = folder_find_item_from_identifier(savecopyfolder);
+               if(!outbox)
+                       outbox = folder_get_default_outbox();
 
-       if(changed) {
-               folderview_update_item(item, FALSE);
+               procmsg_save_to_outbox(outbox, file, TRUE);
        }
-       CHANGE_FLAGS(msginfo);
-       procmsg_msginfo_write_flags(msginfo);
-}
 
-void procmsg_msginfo_write_flags(MsgInfo *msginfo)
-{
-       gchar *destdir;
-       FILE *fp;
-
-       destdir = folder_item_get_path(msginfo->folder);
-       if (!is_dir_exist(destdir))
-               make_dir_hier(destdir);
-
-       if ((fp = procmsg_open_mark_file(destdir, TRUE))) {
-               procmsg_write_flags(msginfo, fp);
-               fclose(fp);
-       } else {
-               g_warning(_("Can't open mark file.\n"));
-       }
-       
-       g_free(destdir);
+       return (newsval != 0 ? newsval : mailval);
 }