0.8.6claws105
[claws.git] / src / mh.c
index 522f095a616b582617d7e85a4661b7069a8534d7..8ff5fcaaa60168e818c564736f2da792fc4e8723 100644 (file)
--- a/src/mh.c
+++ b/src/mh.c
@@ -53,7 +53,7 @@ GSList  *mh_get_msg_list      (Folder         *folder,
 gchar   *mh_fetch_msg          (Folder         *folder,
                                 FolderItem     *item,
                                 gint            num);
-MsgInfo   *mh_fetch_msginfo    (Folder         *folder,
+MsgInfo   *mh_get_msginfo      (Folder         *folder,
                                 FolderItem     *item,
                                 gint            num);
 gint     mh_add_msg            (Folder         *folder,
@@ -83,8 +83,9 @@ gboolean mh_is_msg_changed    (Folder         *folder,
 
 gint    mh_scan_folder         (Folder         *folder,
                                 FolderItem     *item);
-GSList *mh_get_num_list                (Folder         *folder,
-                                FolderItem     *item);
+gint mh_get_num_list           (Folder         *folder,
+                                FolderItem     *item,
+                                GSList        **list);
 void    mh_scan_tree           (Folder         *folder);
 
 gint    mh_create_tree         (Folder         *folder);
@@ -119,22 +120,20 @@ Folder *mh_folder_new(const gchar *name, const gchar *path)
        return folder;
 }
 
-void mh_folder_destroy(MHFolder *folder)
+void mh_folder_destroy(Folder *folder)
 {
        folder_local_folder_destroy(LOCAL_FOLDER(folder));
 }
 
 static void mh_folder_init(Folder *folder, const gchar *name, const gchar *path)
 {
-       folder_local_folder_init(folder, name, path);
-
        folder->type = F_MH;
 
-/*
-       folder->get_msg_list        = mh_get_msg_list;
-*/
+       folder_local_folder_init(folder, name, path);
+
+/*     folder->get_msg_list        = mh_get_msg_list; */
        folder->fetch_msg           = mh_fetch_msg;
-       folder->fetch_msginfo       = mh_fetch_msginfo;
+       folder->get_msginfo         = mh_get_msginfo;
        folder->add_msg             = mh_add_msg;
        folder->move_msg            = mh_move_msg;
        folder->move_msgs_with_dest = mh_move_msgs_with_dest;
@@ -143,15 +142,14 @@ static void mh_folder_init(Folder *folder, const gchar *name, const gchar *path)
        folder->remove_msg          = mh_remove_msg;
        folder->remove_all_msg      = mh_remove_all_msg;
        folder->is_msg_changed      = mh_is_msg_changed;
-/*
-       folder->scan                = mh_scan_folder;
-*/
+/*     folder->scan                = mh_scan_folder; */
        folder->get_num_list        = mh_get_num_list;
        folder->scan_tree           = mh_scan_tree;
        folder->create_tree         = mh_create_tree;
        folder->create_folder       = mh_create_folder;
        folder->rename_folder       = mh_rename_folder;
        folder->remove_folder       = mh_remove_folder;
+       folder->destroy             = mh_folder_destroy;
 }
 
 void mh_get_last_num(Folder *folder, FolderItem *item)
@@ -190,47 +188,47 @@ void mh_get_last_num(Folder *folder, FolderItem *item)
        }
        closedir(dp);
 
-       debug_print(_("Last number in dir %s = %d\n"), item->path, max);
+       debug_print("Last number in dir %s = %d\n", item->path, max);
        item->last_num = max;
 }
 
-GSList *mh_get_num_list(Folder *folder, FolderItem *item)
+gint mh_get_num_list(Folder *folder, FolderItem *item, GSList **list)
 {
 
        gchar *path;
        DIR *dp;
        struct dirent *d;
        struct stat s;
-       gint num;
-       GSList *list = NULL;
+       gint num, nummsgs = 0;
 
-       g_return_val_if_fail(item != NULL, NULL);
+       g_return_val_if_fail(item != NULL, -1);
 
        debug_print("mh_get_last_num(): Scanning %s ...\n", item->path);
 
        path = folder_item_get_path(item);
-       g_return_val_if_fail(path != NULL, NULL);
+       g_return_val_if_fail(path != NULL, -1);
        if (change_dir(path) < 0) {
                g_free(path);
-               return NULL;
+               return -1;
        }
        g_free(path);
 
        if ((dp = opendir(".")) == NULL) {
                FILE_OP_ERROR(item->path, "opendir");
-               return NULL;
+               return -1;
        }
 
        while ((d = readdir(dp)) != NULL) {
                if ((num = to_number(d->d_name)) >= 0 &&
                    stat(d->d_name, &s) == 0 &&
                    S_ISREG(s.st_mode)) {
-                       list = g_slist_prepend(list, GINT_TO_POINTER(num));
+                       *list = g_slist_prepend(*list, GINT_TO_POINTER(num));
+                   nummsgs++;
                }
        }
        closedir(dp);
 
-       return list;
+       return nummsgs;
 }
 
 GSList *mh_get_msg_list(Folder *folder, FolderItem *item, gboolean use_cache)
@@ -313,38 +311,21 @@ gchar *mh_fetch_msg(Folder *folder, FolderItem *item, gint num)
        return file;
 }
 
-MsgInfo *mh_fetch_msginfo(Folder *folder, FolderItem *item, gint num)
+MsgInfo *mh_get_msginfo(Folder *folder, FolderItem *item, gint num)
 {
-       gchar *path;
-       gchar *file;
-       MsgFlags flags;
        MsgInfo *msginfo;
-       struct stat s;
+       gchar *file;
 
        g_return_val_if_fail(item != NULL, NULL);
        g_return_val_if_fail(num > 0, NULL);
 
-       path = folder_item_get_path(item);
-       file = g_strconcat(path, G_DIR_SEPARATOR_S, itos(num), NULL);
-       g_free(path);
-       if (!is_file_exist(file)) {
-               g_free(file);
-               return NULL;
-       }
+       file = mh_fetch_msg(folder, item, num);
+       if (!file) return NULL;
 
-       folder_item_set_default_flags(item, &flags);
-       msginfo = procheader_parse_file(file, flags, TRUE, FALSE);
+       msginfo = mh_parse_msg(file, item);
        msginfo->msgnum = num;
-       msginfo->folder = item;
 
-       if (stat(file, &s) < 0) {
-               FILE_OP_ERROR(file, "stat");
-               msginfo->size = 0;
-               msginfo->mtime = 0;
-       } else {
-               msginfo->size = s.st_size;
-               msginfo->mtime = s.st_mtime;
-       }
+       g_free(file);
 
        return msginfo;
 }
@@ -408,8 +389,8 @@ gint mh_add_msg(Folder *folder, FolderItem *dest, const gchar *file,
        g_return_val_if_fail(destfile != NULL, -1);
 
        if (link(file, destfile) < 0) {
-               if (copy_file(file, destfile) < 0) {
-                       g_warning(_("can't copy message %s to %s\n"),
+               if (copy_file(file, destfile, TRUE) < 0) {
+                       g_warning("can't copy message %s to %s\n",
                                  file, destfile);
                        g_free(destfile);
                        return -1;
@@ -437,7 +418,7 @@ static gint mh_do_move(Folder *folder, FolderItem *dest, MsgInfo *msginfo)
        g_return_val_if_fail(msginfo != NULL, -1);
 
        if (msginfo->folder == dest) {
-               g_warning(_("the src folder is identical to the dest.\n"));
+               g_warning("the src folder is identical to the dest.\n");
                return -1;
        }
 
@@ -449,19 +430,15 @@ static gint mh_do_move(Folder *folder, FolderItem *dest, MsgInfo *msginfo)
        prefs = dest->prefs;
 
        destfile = mh_get_new_msg_filename(dest);
-       g_return_val_if_fail(destfile != NULL, -1);
+       if (!destfile) return -1;
 
-       debug_print(_("Moving message %s%c%d to %s ...\n"),
+       srcfile = procmsg_get_message_file(msginfo);
+       
+       debug_print("Moving message %s%c%d to %s ...\n",
                    msginfo->folder->path, G_DIR_SEPARATOR,
                    msginfo->msgnum, dest->path);
-       srcfile = procmsg_get_message_file(msginfo);
 
-       destfile = mh_get_new_msg_filename(dest);
-       if(!destfile) return -1;
-
-       srcfile = procmsg_get_message_file(msginfo);
-
-       if (move_file(srcfile, destfile) < 0) {
+       if (move_file(srcfile, destfile, FALSE) < 0) {
                g_free(srcfile);
                g_free(destfile);
                return -1;
@@ -509,7 +486,7 @@ gint mh_move_msg(Folder *folder, FolderItem *dest, MsgInfo *msginfo)
  
                destdir = folder_item_get_path(dest);
                if ((fp = procmsg_open_mark_file(destdir, TRUE)) == NULL)
-                       g_warning(_("Can't open mark file.\n"));
+                       g_warning("Can't open mark file.\n");
                else {
                        SET_DEST_MSG_FLAGS(fp, dest, msginfo);
                        fclose(fp);
@@ -545,20 +522,18 @@ static gint mh_do_move_msgs_with_dest(Folder *folder, FolderItem *dest,
                msginfo = (MsgInfo *)cur->data;
 
                if (msginfo->folder == dest) {
-                       g_warning(_("the src folder is identical to the dest.\n"));
+                       g_warning("the src folder is identical to the dest.\n");
                        continue;
                }
-               debug_print(_("Moving message %s%c%d to %s ...\n"),
+               debug_print("Moving message %s%c%d to %s ...\n",
                            msginfo->folder->path, G_DIR_SEPARATOR,
                            msginfo->msgnum, dest->path);
 
                destfile = mh_get_new_msg_filename(dest);
-               if (!destfile) break;
+               if (!destfile) return -1;
                srcfile = procmsg_get_message_file(msginfo);
-               destfile = mh_get_new_msg_filename(dest);
-               if(!destfile) return -1;
 
-               if (move_file(srcfile, destfile) < 0) {
+               if (move_file(srcfile, destfile, FALSE) < 0) {
                        g_free(srcfile);
                        g_free(destfile);
                        break;
@@ -602,7 +577,7 @@ gint mh_copy_msg(Folder *folder, FolderItem *dest, MsgInfo *msginfo)
        g_return_val_if_fail(msginfo != NULL, -1);
 
        if (msginfo->folder == dest) {
-               g_warning(_("the src folder is identical to the dest.\n"));
+               g_warning("the src folder is identical to the dest.\n");
                return -1;
        }
 
@@ -613,27 +588,33 @@ gint mh_copy_msg(Folder *folder, FolderItem *dest, MsgInfo *msginfo)
 
        prefs = dest->prefs;
 
-       destfile = mh_get_new_msg_filename(dest);
-       g_return_val_if_fail(destfile != NULL, -1);
-
-       debug_print(_("Copying message %s%c%d to %s ...\n"),
-                   msginfo->folder->path, G_DIR_SEPARATOR,
-                   msginfo->msgnum, dest->path);
-
        srcfile = procmsg_get_message_file(msginfo);
        destfile = mh_get_new_msg_filename(dest);
-       if(!destfile) {
+       if (!destfile) {
                g_free(srcfile);
                return -1;
        }
        
-       if (copy_file(srcfile, destfile) < 0) {
+       debug_print("Copying message %s%c%d to %s ...\n",
+                   msginfo->folder->path, G_DIR_SEPARATOR,
+                   msginfo->msgnum, dest->path);
+       
+
+       if ((MSG_IS_QUEUED(msginfo->flags) || MSG_IS_DRAFT(msginfo->flags))
+       &&  dest->stype != F_QUEUE && dest->stype != F_DRAFT) {
+               if (procmsg_remove_special_headers(srcfile, destfile) !=0) {
+                       g_free(srcfile);
+                       g_free(destfile);
+                       return -1;
+               }
+       } else if (copy_file(srcfile, destfile, TRUE) < 0) {
                FILE_OP_ERROR(srcfile, "copy");
                g_free(srcfile);
                g_free(destfile);
                return -1;
        }
 
+
        if (prefs && prefs->enable_folder_chmod && prefs->folder_chmod) {
                if (chmod(destfile, prefs->folder_chmod) < 0)
                        FILE_OP_ERROR(destfile, "chmod");
@@ -713,10 +694,10 @@ gint mh_copy_msgs_with_dest(Folder *folder, FolderItem *dest, GSList *msglist)
                msginfo = (MsgInfo *)cur->data;
 
                if (msginfo->folder == dest) {
-                       g_warning(_("the src folder is identical to the dest.\n"));
+                       g_warning("the src folder is identical to the dest.\n");
                        continue;
                }
-               debug_print(_("Copying message %s%c%d to %s ...\n"),
+               debug_print("Copying message %s%c%d to %s ...\n",
                            msginfo->folder->path, G_DIR_SEPARATOR,
                            msginfo->msgnum, dest->path);
 
@@ -724,7 +705,7 @@ gint mh_copy_msgs_with_dest(Folder *folder, FolderItem *dest, GSList *msglist)
                if (!destfile) break;
                srcfile = procmsg_get_message_file(msginfo);
 
-               if (copy_file(srcfile, destfile) < 0) {
+               if (copy_file(srcfile, destfile, TRUE) < 0) {
                        FILE_OP_ERROR(srcfile, "copy");
                        g_free(srcfile);
                        g_free(destfile);
@@ -843,7 +824,7 @@ gint mh_scan_folder(Folder *folder, FolderItem *item)
                item->total = n_msg;
        }
 */
-       debug_print(_("Last number in dir %s = %d\n"), item->path, max);
+       debug_print("Last number in dir %s = %d\n", item->path, max);
        item->last_num = max;
 
        return 0;
@@ -856,7 +837,7 @@ void mh_scan_tree(Folder *folder)
 
        g_return_if_fail(folder != NULL);
 
-       item = folder_item_new(folder->name, NULL);
+       item = folder_item_new(folder, folder->name, NULL);
        item->folder = folder;
        folder->node = g_node_new(item);
 
@@ -875,8 +856,8 @@ void mh_scan_tree(Folder *folder)
 { \
        if (!is_dir_exist(dir)) { \
                if (is_file_exist(dir)) { \
-                       g_warning(_("File `%s' already exists.\n" \
-                                   "Can't create folder."), dir); \
+                       g_warning("File `%s' already exists.\n" \
+                                   "Can't create folder.", dir); \
                        return -1; \
                } \
                if (make_dir(dir) < 0) \
@@ -911,15 +892,18 @@ FolderItem *mh_create_folder(Folder *folder, FolderItem *parent,
        gchar *path;
        gchar *fullpath;
        FolderItem *new_item;
+       gchar *mh_sequences_filename;
+       FILE *mh_sequences_file;
 
        g_return_val_if_fail(folder != NULL, NULL);
        g_return_val_if_fail(parent != NULL, NULL);
        g_return_val_if_fail(name != NULL, NULL);
 
        path = folder_item_get_path(parent);
-       if (!is_dir_exist(path))
-               make_dir_hier(path);
-
+       if (!is_dir_exist(path)) 
+               if (make_dir_hier(path) != 0)
+                       return NULL;
+               
        fullpath = g_strconcat(path, G_DIR_SEPARATOR_S, name, NULL);
        g_free(path);
 
@@ -935,10 +919,19 @@ FolderItem *mh_create_folder(Folder *folder, FolderItem *parent,
                                   NULL);
        else
                path = g_strdup(name);
-       new_item = folder_item_new(name, path);
+       new_item = folder_item_new(folder, name, path);
        folder_item_append(parent, new_item);
+
        g_free(path);
 
+       path = folder_item_get_path(new_item);
+       mh_sequences_filename = g_strconcat(path, G_DIR_SEPARATOR_S,
+                                           ".mh_sequences", NULL);
+       if ((mh_sequences_file = fopen(mh_sequences_filename, "a+b")) != NULL) {
+               fclose(mh_sequences_file);
+       }
+       g_free(mh_sequences_filename);
+
        return new_item;
 }
 
@@ -1043,7 +1036,7 @@ static GSList *mh_get_uncached_msgs(GHashTable *msg_table, FolderItem *item)
                return NULL;
        }
 
-       debug_print(_("\tSearching uncached messages... "));
+       debug_print("\tSearching uncached messages... ");
 
        if (msg_table) {
                while ((d = readdir(dp)) != NULL) {
@@ -1098,16 +1091,16 @@ static GSList *mh_get_uncached_msgs(GHashTable *msg_table, FolderItem *item)
        closedir(dp);
 
        if (n_newmsg)
-               debug_print(_("%d uncached message(s) found.\n"), n_newmsg);
+               debug_print("%d uncached message(s) found.\n", n_newmsg);
        else
-               debug_print(_("done.\n"));
+               debug_print("done.\n");
 
        /* sort new messages in numerical order */
        if (newlist) {
-               debug_print(_("\tSorting uncached messages in numerical order... "));
+               debug_print("\tSorting uncached messages in numerical order... ");
                newlist = g_slist_sort
                        (newlist, (GCompareFunc)procmsg_cmp_msgnum_for_sort);
-               debug_print(_("done.\n"));
+               debug_print("done.\n");
        }
 
        return newlist;
@@ -1149,6 +1142,7 @@ static MsgInfo *mh_parse_msg(const gchar *file, FolderItem *item)
        return msginfo;
 }
 
+#if 0
 static gboolean mh_is_maildir_one(const gchar *path, const gchar *dir)
 {
        gchar *entry;
@@ -1172,6 +1166,7 @@ static gboolean mh_is_maildir(const gchar *path)
               mh_is_maildir_one(path, "cur") &&
               mh_is_maildir_one(path, "tmp");
 }
+#endif
 
 static void mh_scan_tree_recursive(FolderItem *item)
 {
@@ -1215,12 +1210,14 @@ static void mh_scan_tree_recursive(FolderItem *item)
                if (S_ISDIR(s.st_mode)) {
                        FolderItem *new_item;
 
+#if 0
                        if (mh_is_maildir(entry)) {
                                g_free(entry);
                                continue;
                        }
+#endif
 
-                       new_item = folder_item_new(d->d_name, entry);
+                       new_item = folder_item_new(item->folder, d->d_name, entry);
                        folder_item_append(item, new_item);
                        if (!item->path) {
                                if (!strcmp(d->d_name, INBOX_DIR)) {