0.8.6claws105
[claws.git] / src / mh.c
index 865ed85488c831810b8a74af4908303e3b7f6a78..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,7 +120,7 @@ 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));
 }
@@ -130,11 +131,9 @@ static void mh_folder_init(Folder *folder, const gchar *name, const gchar *path)
 
        folder_local_folder_init(folder, name, path);
 
-/*
-       folder->get_msg_list        = mh_get_msg_list;
-*/
+/*     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)
@@ -194,43 +192,43 @@ void mh_get_last_num(Folder *folder, FolderItem *item)
        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,43 +311,19 @@ 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;
-       }
-
-       folder_item_set_default_flags(item, &flags);
-       msginfo = procheader_parse_file(file, flags, TRUE, FALSE);
-       if(!msginfo) {
-               g_free(file);
-               return NULL;
-       }
+       file = mh_fetch_msg(folder, item, num);
+       if (!file) return NULL;
 
+       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);
 
@@ -416,7 +390,7 @@ gint mh_add_msg(Folder *folder, FolderItem *dest, const gchar *file,
 
        if (link(file, destfile) < 0) {
                if (copy_file(file, destfile, TRUE) < 0) {
-                       g_warning(_("can't copy message %s to %s\n"),
+                       g_warning("can't copy message %s to %s\n",
                                  file, destfile);
                        g_free(destfile);
                        return -1;
@@ -444,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;
        }
 
@@ -512,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);
@@ -548,7 +522,7 @@ 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",
@@ -603,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;
        }
 
@@ -626,13 +600,21 @@ gint mh_copy_msg(Folder *folder, FolderItem *dest, MsgInfo *msginfo)
                    msginfo->msgnum, dest->path);
        
 
-       if (copy_file(srcfile, destfile, TRUE) < 0) {
+       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");
@@ -712,7 +694,7 @@ 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",
@@ -874,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) \
@@ -910,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);
 
@@ -936,8 +921,17 @@ FolderItem *mh_create_folder(Folder *folder, FolderItem *parent,
                path = g_strdup(name);
        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;
 }