0.9.3claws64
[claws.git] / src / mh.c
index 9b3149fa7e400620763b379e32fada965cb8cc97..95cd75f1ccaaa63b6e6a97f1ced641208a4dd1bb 100644 (file)
--- a/src/mh.c
+++ b/src/mh.c
@@ -53,7 +53,10 @@ static MsgInfo *mh_get_msginfo(Folder * folder,
                               FolderItem * item, gint num);
 static gint mh_add_msg(Folder * folder,
                       FolderItem * dest,
-                      const gchar * file, gboolean remove_source);
+                      const gchar * file,
+                      MsgFlags * flags);
+static gint mh_add_msgs(Folder * folder,
+                FolderItem * dest, GSList * file_list, GRelation *relation);
 static gint mh_copy_msg(Folder * folder,
                        FolderItem * dest, MsgInfo * msginfo);
 static gint mh_remove_msg(Folder * folder, FolderItem * item, gint num);
@@ -79,7 +82,7 @@ static MsgInfo *mh_parse_msg(const gchar * file, FolderItem * item);
 static void mh_scan_tree_recursive(FolderItem * item);
 
 static gboolean mh_rename_folder_func(GNode * node, gpointer data);
-
+static gchar *mh_item_get_path(Folder *folder, FolderItem *item);
 
 FolderClass mh_class =
 {
@@ -96,9 +99,11 @@ FolderClass mh_class =
        /* FolderItem functions */
        NULL,
        NULL,
+       mh_item_get_path,
        mh_create_folder,
        mh_rename_folder,
        mh_remove_folder,
+       NULL,
        mh_get_num_list,
        NULL,
        NULL,
@@ -110,14 +115,16 @@ FolderClass mh_class =
        NULL,
        mh_fetch_msg,
        mh_add_msg,
+       mh_add_msgs,
        mh_copy_msg,
+       NULL,
        mh_remove_msg,
        mh_remove_all_msg,
        mh_is_msg_changed,
        NULL,
 };
 
-FolderClass *mh_get_class()
+FolderClass *mh_get_class(void)
 {
        return &mh_class;
 }
@@ -304,38 +311,59 @@ gchar *mh_get_new_msg_filename(FolderItem *dest)
        procmsg_write_flags(&newmsginfo, fp); \
 }
 
-gint mh_add_msg(Folder *folder, FolderItem *dest, const gchar *file,
-               gboolean remove_source)
+gint mh_add_msg(Folder *folder, FolderItem *dest, const gchar *file, MsgFlags *flags)
 {
+       gint ret;
+       GSList file_list;
+       MsgFileInfo fileinfo;
+
+       g_return_val_if_fail(file != NULL, -1);
+
+       fileinfo.file = (gchar *)file;
+       fileinfo.flags = flags;
+       file_list.data = &fileinfo;
+       file_list.next = NULL;
+
+        ret = mh_add_msgs(folder, dest, &file_list, NULL);
+       return ret;
+} 
+gint mh_add_msgs(Folder *folder, FolderItem *dest, GSList *file_list, 
+                 GRelation *relation)
+{ 
        gchar *destfile;
+       GSList *cur;
+       MsgFileInfo *fileinfo;
 
        g_return_val_if_fail(dest != NULL, -1);
-       g_return_val_if_fail(file != NULL, -1);
+       g_return_val_if_fail(file_list != NULL, -1);
 
        if (dest->last_num < 0) {
                mh_get_last_num(folder, dest);
                if (dest->last_num < 0) return -1;
        }
 
-       destfile = mh_get_new_msg_filename(dest);
-       g_return_val_if_fail(destfile != NULL, -1);
+       for (cur = file_list; cur != NULL; cur = cur->next) {
+               fileinfo = (MsgFileInfo *)cur->data;
 
-       if (link(file, destfile) < 0) {
-               if (copy_file(file, destfile, TRUE) < 0) {
-                       g_warning("can't copy message %s to %s\n",
-                                 file, destfile);
-                       g_free(destfile);
-                       return -1;
+               destfile = mh_get_new_msg_filename(dest);
+               if (destfile == NULL) return -1;
+
+               if (link(fileinfo->file, destfile) < 0) {
+                       if (copy_file(fileinfo->file, destfile, TRUE) < 0) {
+                               g_warning(_("can't copy message %s to %s\n"),
+                                         fileinfo->file, destfile);
+                               g_free(destfile);
+                               return -1;
+                       }
                }
-       }
+               if (relation != NULL)
+                       g_relation_insert(relation, fileinfo, GINT_TO_POINTER(dest->last_num + 1));
 
-       if (remove_source) {
-               if (unlink(file) < 0)
-                       FILE_OP_ERROR(file, "unlink");
+               g_free(destfile);
+               dest->last_num++;
        }
 
-       g_free(destfile);
-       dest->last_num++;
        return dest->last_num;
 }
 
@@ -344,7 +372,7 @@ gint mh_copy_msg(Folder *folder, FolderItem *dest, MsgInfo *msginfo)
        gchar *srcfile;
        gchar *destfile;
        gint filemode = 0;
-       PrefsFolderItem *prefs;
+       FolderItemPrefs *prefs;
 
        g_return_val_if_fail(dest != NULL, -1);
        g_return_val_if_fail(msginfo != NULL, -1);
@@ -507,6 +535,36 @@ gint mh_create_tree(Folder *folder)
 
 #undef MAKE_DIR_IF_NOT_EXIST
 
+gchar *mh_item_get_path(Folder *folder, FolderItem *item)
+{
+       gchar *folder_path, *path;
+
+       g_return_val_if_fail(folder != NULL, NULL);
+       g_return_val_if_fail(item != NULL, NULL);
+
+       folder_path = g_strdup(LOCAL_FOLDER(folder)->rootpath);
+       g_return_val_if_fail(folder_path != NULL, NULL);
+
+        if (folder_path[0] == G_DIR_SEPARATOR) {
+                if (item->path)
+                        path = g_strconcat(folder_path, G_DIR_SEPARATOR_S,
+                                           item->path, NULL);
+                else
+                        path = g_strdup(folder_path);
+        } else {
+                if (item->path)
+                        path = g_strconcat(get_home_dir(), G_DIR_SEPARATOR_S,
+                                           folder_path, G_DIR_SEPARATOR_S,
+                                           item->path, NULL);
+                else
+                        path = g_strconcat(get_home_dir(), G_DIR_SEPARATOR_S,
+                                           folder_path, NULL);
+        }
+       g_free(folder_path);
+
+       return path;
+}
+
 FolderItem *mh_create_folder(Folder *folder, FolderItem *parent,
                             const gchar *name)
 {