diff options
Diffstat (limited to 'camel/providers/MH/camel-mh-folder.c')
-rw-r--r-- | camel/providers/MH/camel-mh-folder.c | 153 |
1 files changed, 87 insertions, 66 deletions
diff --git a/camel/providers/MH/camel-mh-folder.c b/camel/providers/MH/camel-mh-folder.c index 231c79039a..ee658b52dd 100644 --- a/camel/providers/MH/camel-mh-folder.c +++ b/camel/providers/MH/camel-mh-folder.c @@ -40,6 +40,7 @@ #include "gmime-utils.h" #include "mh-utils.h" #include "mh-uid.h" +#include "mh-summary.h" static CamelFolderClass *parent_class=NULL; @@ -65,6 +66,9 @@ static void _copy_message_to (CamelFolder *folder, CamelMimeMessage *message, Ca static void _open (CamelFolder *folder, CamelFolderOpenMode mode); static void _close (CamelFolder *folder, gboolean expunge); +static const gchar *_get_message_uid (CamelFolder *folder, CamelMimeMessage *message); +static CamelMimeMessage *_get_message_by_uid (CamelFolder *folder, const gchar *uid); +static GList *_get_uid_list (CamelFolder *folder); /* some utility functions */ static int copy_reg (const char *src_path, const char *dst_path); @@ -91,7 +95,10 @@ camel_mh_folder_class_init (CamelMhFolderClass *camel_mh_folder_class) camel_folder_class->copy_message_to = _copy_message_to; camel_folder_class->open = _open; camel_folder_class->close = _close; - + camel_folder_class->get_message_uid = _get_message_uid; + camel_folder_class->get_message_by_uid = _get_message_by_uid; + camel_folder_class->get_uid_list = _get_uid_list; + } @@ -146,62 +153,10 @@ _init_with_store (CamelFolder *folder, CamelStore *parent_store) folder->can_hold_messages = TRUE; folder->can_hold_folders = TRUE; folder->has_summary_capability = TRUE; - - folder->summary = camel_folder_summary_new (); -} - - -static void -_create_summary (CamelFolder *folder) -{ - CamelMhFolder *mh_folder = CAMEL_MH_FOLDER (folder); - CamelFolderSummary *summary = folder->summary; - CamelMessageInfo *message_info; - CamelFolderInfo *subfolder_info; - CamelStream *message_stream; - GList *file_list = mh_folder->file_name_list; - gchar *filename; - gchar *message_fullpath; - gchar *directory_path = mh_folder->directory_path; - GArray *header_array; - Rfc822Header *cur_header; - int i; - - summary = folder->summary; - - while (file_list) { - - filename = (gchar *)(file_list->data); - message_info = g_new0 (CamelMessageInfo, 1); - message_fullpath = g_strdup_printf ("%s/%s", directory_path, filename); - message_stream = camel_stream_buffered_fs_new_with_name (message_fullpath, - CAMEL_STREAM_BUFFERED_FS_READ); - header_array = get_header_array_from_stream (message_stream); - gtk_object_unref (GTK_OBJECT (message_stream)); - - for (i=0; i<header_array->len; i++) { - cur_header = (Rfc822Header *)header_array->data + i; - if (!g_strcasecmp (cur_header->name, "subject")) { - message_info->subject = cur_header->value; - g_free (cur_header->name); - } else if (!g_strcasecmp (cur_header->name, "sender")) { - message_info->date = cur_header->value; - g_free (cur_header->name); - } else if (!g_strcasecmp (cur_header->name, "date")) { - message_info->date = cur_header->value; - g_free (cur_header->name); - } else { - g_free (cur_header->name); - g_free (cur_header->value); - } - } - g_array_free (header_array, TRUE); - - message_info->UID = NULL; - - summary->message_info_list = g_list_append (summary->message_info_list, message_info); - file_list = file_list->next; - } + folder->has_uid_capability = TRUE; + + folder->summary = NULL; + } @@ -235,11 +190,16 @@ _open (CamelFolder *folder, CamelFolderOpenMode mode) closedir (dir_handle); - _create_summary (folder); - /* get (or create) uid list */ if (!(mh_load_uid_list (mh_folder) > 0)) mh_generate_uid_list (mh_folder); + + /* get or create summary */ + /* it is important that it comes after uid list reading/generation */ + if (!(mh_load_summary (mh_folder) > 0)) + mh_generate_summary (folder); + printf ("**** summary = %p\n", folder->summary); + } @@ -248,9 +208,15 @@ static void _close (CamelFolder *folder, gboolean expunge) { CamelMhFolder *mh_folder = CAMEL_MH_FOLDER (folder); + + /* save uid list, if any */ if (mh_folder->uid_array) mh_save_uid_list (mh_folder); + /* save summary, if any */ + if (folder->summary) + mh_save_summary (mh_folder); + /* call parent implementation */ parent_class->close (folder, expunge); } @@ -277,9 +243,9 @@ _set_name (CamelFolder *folder, const gchar *name) gchar separator; CAMEL_LOG_FULL_DEBUG ("Entering CamelMhFolder::set_name\n"); - g_assert(folder); - g_assert(name); - g_assert(folder->parent_store); + g_assert (folder); + g_assert (name); + g_assert (folder->parent_store); /* call default implementation */ parent_class->set_name (folder, name); @@ -546,8 +512,8 @@ _get_message (CamelFolder *folder, gint number) camel_data_wrapper_construct_from_stream ( CAMEL_DATA_WRAPPER (message), input_stream); gtk_object_unref (GTK_OBJECT (input_stream)); message->message_number = number; - gtk_object_set_data_full (GTK_OBJECT (message), "fullpath", - g_strdup (message_file_name), _filename_free); + gtk_object_set_data_full (GTK_OBJECT (message), "filename", + g_strdup (message_name), _filename_free); #warning Set flags and all this stuff here } @@ -680,15 +646,21 @@ _expunge (CamelFolder *folder) * the gtk_object->destroy signal be used to expunge * freed messages objects marked DELETED ? */ + CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder); CamelMimeMessage *message; GList *message_node; gchar *fullpath; + gchar *filename; gint unlink_error; + const gchar *directory_path; CAMEL_LOG_FULL_DEBUG ("Entering CamelFolder::expunge\n"); message_node = folder->message_list; + directory_path = mh_folder->directory_path; + if (!directory_path) return; + /* look in folder message list which messages * need to be expunged */ while ( message_node) { @@ -697,7 +669,8 @@ _expunge (CamelFolder *folder) if (message && camel_mime_message_get_flag (message, "DELETED")) { CAMEL_LOG_FULL_DEBUG ("CamelMhFolder::expunge, expunging message %d\n", message->message_number); /* expunge the message */ - fullpath = gtk_object_get_data (GTK_OBJECT (message), "fullpath"); + filename = gtk_object_get_data (GTK_OBJECT (message), "filename"); + fullpath = g_strdup_printf ("%s/%s", directory_path, filename); CAMEL_LOG_FULL_DEBUG ("CamelMhFolder::expunge, message fullpath is %s\n", fullpath); unlink_error = unlink(fullpath); @@ -744,7 +717,36 @@ _copy_message_to (CamelFolder *folder, CamelMimeMessage *message, CamelFolder *d static const gchar * _get_message_uid (CamelFolder *folder, CamelMimeMessage *message) { + CamelMhFolder *mh_folder = CAMEL_MH_FOLDER (folder); + GArray *uid_array; + gboolean found = FALSE; + MhUidCouple *uid_couple; + gchar *filename; + guint file_number; + gint i; + + /* if the message already has its uid stored, + return it */ + if (message->message_uid) + return (message->message_uid); + + /* else, it has a filename associated to it */ + filename = gtk_object_get_data (GTK_OBJECT (message), "filename"); + file_number = atoi (file_number); + uid_array = mh_folder->uid_array; + uid_couple = (MhUidCouple *)uid_array->data; + + /* look in the uid array for the file number */ + found = (uid_couple->file_number == file_number); + for (i=0; (i<uid_array->len) && (!found); i++) { + uid_couple++; + found = (uid_couple->file_number == file_number); + } + + if (found) return uid_couple->uid; + else return NULL; + } @@ -801,11 +803,30 @@ _get_message_by_uid (CamelFolder *folder, const gchar *uid) static GList * _get_uid_list (CamelFolder *folder) { - return NULL; + CamelMhFolder *mh_folder = CAMEL_MH_FOLDER (folder); + GList *uid_list; + GArray *uid_array; + MhUidCouple *uid_couple; + int i; + + uid_array = mh_folder->uid_array; + uid_couple = (MhUidCouple *)uid_array->data; + + for (i=0; i<uid_array->len; i++) { + uid_list = g_list_prepend (uid_list, uid_couple->uid); + uid_couple++; + } + + return uid_list; } + + + + + /************************************************************************/ /*** Took directly from GNU fileutils-4.0 ***/ |