diff options
-rw-r--r-- | camel/camel-folder-summary.c | 17 | ||||
-rw-r--r-- | camel/providers/mbox/camel-mbox-folder.c | 67 | ||||
-rw-r--r-- | camel/providers/mbox/camel-mbox-folder.h | 5 | ||||
-rw-r--r-- | camel/providers/mbox/camel-mbox-summary.c | 42 | ||||
-rw-r--r-- | camel/providers/mbox/camel-mbox-summary.h | 9 |
5 files changed, 108 insertions, 32 deletions
diff --git a/camel/camel-folder-summary.c b/camel/camel-folder-summary.c index fdeec5e13c..e1d4543ace 100644 --- a/camel/camel-folder-summary.c +++ b/camel/camel-folder-summary.c @@ -113,7 +113,14 @@ _finalize (GtkObject *object) CamelFolderSummary * camel_folder_summary_new () { - return gtk_type_new (CAMEL_FOLDER_SUMMARY_TYPE); + CamelFolderSummary *folder_summary; + + folder_summary = gtk_type_new (CAMEL_FOLDER_SUMMARY_TYPE); + folder_summary->message_info_list = g_array_new (FALSE, FALSE, sizeof (CamelMessageInfo)); + folder_summary->subfolder_info_list = g_array_new (FALSE, FALSE, sizeof (CamelFolderInfo)); + + return folder_summary; + } static const GArray * @@ -145,3 +152,11 @@ camel_folder_summary_get_message_info_list (CamelFolderSummary *summary) } + + + + + + + + diff --git a/camel/providers/mbox/camel-mbox-folder.c b/camel/providers/mbox/camel-mbox-folder.c index 917cc98781..87456ac0fe 100644 --- a/camel/providers/mbox/camel-mbox-folder.c +++ b/camel/providers/mbox/camel-mbox-folder.c @@ -185,12 +185,12 @@ _init_with_store (CamelFolder *folder, CamelStore *parent_store, CamelException folder->can_hold_folders = TRUE; folder->has_summary_capability = TRUE; folder->has_uid_capability = TRUE; - folder->summary = NULL; + folder->summary = camel_folder_summary_new (); mbox_folder->folder_file_path = NULL; mbox_folder->summary_file_path = NULL; mbox_folder->folder_dir_path = NULL; - mbox_folder->summary = NULL; + mbox_folder->internal_summary = NULL; mbox_folder->uid_array = NULL; CAMEL_LOG_FULL_DEBUG ("Leaving CamelMhFolder::init_with_store\n"); @@ -206,6 +206,7 @@ _init_with_store (CamelFolder *folder, CamelStore *parent_store, CamelException static void _check_get_or_maybe_generate_summary_file (CamelMboxFolder *mbox_folder, CamelException *ex) { + CamelFolder *folder = CAMEL_FOLDER (mbox_folder); GArray *message_info_array; gboolean summary_file_exists; gboolean summary_file_is_sync; @@ -270,21 +271,25 @@ _check_get_or_maybe_generate_summary_file (CamelMboxFolder *mbox_folder, CamelEx /* **FIXME : Free the parsed information structure */ /* allocate an internal summary object */ - mbox_folder->summary = g_new (CamelMboxSummary, 1); + mbox_folder->internal_summary = g_new (CamelMboxSummary, 1); /* generate the folder md5 signature */ - md5_get_digest_from_file (mbox_folder->folder_file_path, mbox_folder->summary->md5_digest); + md5_get_digest_from_file (mbox_folder->folder_file_path, mbox_folder->internal_summary->md5_digest); /* store the number of messages as well as the summary array */ - mbox_folder->summary->nb_message = mbox_summary_info->len; - mbox_folder->summary->next_uid = next_uid; - mbox_folder->summary->mbox_file_size = file_size; - mbox_folder->summary->message_info = mbox_summary_info; + mbox_folder->internal_summary->nb_message = mbox_summary_info->len; + mbox_folder->internal_summary->next_uid = next_uid; + mbox_folder->internal_summary->mbox_file_size = file_size; + mbox_folder->internal_summary->message_info = mbox_summary_info; } else { /* every thing seems ok, just read the summary file from disk */ - mbox_folder->summary = camel_mbox_load_summary (mbox_folder->summary_file_path, ex); + mbox_folder->internal_summary = camel_mbox_load_summary (mbox_folder->summary_file_path, ex); } + + /* copy the internal summary information to the external + folder summary used by the display engines */ + camel_mbox_summary_append_internal_to_external (mbox_folder->internal_summary, folder->summary, 0); } @@ -324,7 +329,7 @@ _close (CamelFolder *folder, gboolean expunge, CamelException *ex) parent_class->close (folder, expunge, ex); /* save the folder summary on disc */ - camel_mbox_save_summary (mbox_folder->summary, mbox_folder->summary_file_path, ex); + camel_mbox_save_summary (mbox_folder->internal_summary, mbox_folder->summary_file_path, ex); } @@ -512,11 +517,11 @@ _create (CamelFolder *folder, CamelException *ex) close (creat_fd); /* create the summary object */ - mbox_folder->summary = g_new (CamelMboxSummary, 1); - mbox_folder->summary->nb_message = 0; - mbox_folder->summary->next_uid = 1; - mbox_folder->summary->mbox_file_size = 0; - mbox_folder->summary->message_info = g_array_new (FALSE, FALSE, sizeof (CamelMboxSummaryInformation)); + mbox_folder->internal_summary = g_new (CamelMboxSummary, 1); + mbox_folder->internal_summary->nb_message = 0; + mbox_folder->internal_summary->next_uid = 1; + mbox_folder->internal_summary->mbox_file_size = 0; + mbox_folder->internal_summary->message_info = g_array_new (FALSE, FALSE, sizeof (CamelMboxSummaryInformation)); return TRUE; @@ -872,9 +877,9 @@ _get_message_count (CamelFolder *folder, CamelException *ex) gint message_count; g_assert (folder); - g_assert (mbox_folder->summary); + g_assert (mbox_folder->internal_summary); - message_count = mbox_folder->summary->nb_message; + message_count = mbox_folder->internal_summary->nb_message; CAMEL_LOG_FULL_DEBUG ("CamelMboxFolder::get_message_count found %d messages\n", message_count); return message_count; @@ -919,7 +924,7 @@ _append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException This position is still stored in the summary for the moment */ - next_uid = mbox_folder->summary->next_uid; + next_uid = mbox_folder->internal_summary->next_uid; tmp_file_fd = open (tmp_message_filename, O_RDONLY); message_info_array = camel_mbox_parse_file (tmp_file_fd, "From - ", @@ -935,7 +940,7 @@ _append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException /* get the value of the last available UID as saved in the summary file */ - next_uid = mbox_folder->summary->next_uid; + next_uid = mbox_folder->internal_summary->next_uid; /* OK, this is not very efficient, we should not use the same @@ -957,14 +962,20 @@ _append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException /* store the number of messages as well as the summary array */ - mbox_folder->summary->nb_message += 1; - mbox_folder->summary->next_uid = next_uid; + mbox_folder->internal_summary->nb_message += 1; + mbox_folder->internal_summary->next_uid = next_uid; - ((CamelMboxSummaryInformation *)(mbox_summary_info->data))->position += mbox_folder->summary->mbox_file_size; - mbox_folder->summary->mbox_file_size += tmp_file_size; - - camel_summary_append_entries (mbox_folder->summary, mbox_summary_info); + ((CamelMboxSummaryInformation *)(mbox_summary_info->data))->position += mbox_folder->internal_summary->mbox_file_size; + mbox_folder->internal_summary->mbox_file_size += tmp_file_size; + camel_mbox_summary_append_entries (mbox_folder->internal_summary, mbox_summary_info); + + /* append the new entry of the internal summary to + the external summary */ + camel_mbox_summary_append_internal_to_external (mbox_folder->internal_summary, + folder->summary, + mbox_folder->internal_summary->nb_message-1); + g_array_free (mbox_summary_info, TRUE); @@ -993,7 +1004,7 @@ _append_message (CamelFolder *folder, CamelMimeMessage *message, CamelException unlink (tmp_message_filename); /* generate the folder md5 signature */ - md5_get_digest_from_file (mbox_folder->folder_file_path, mbox_folder->summary->md5_digest); + md5_get_digest_from_file (mbox_folder->folder_file_path, mbox_folder->internal_summary->md5_digest); g_free (tmp_message_filename); @@ -1016,7 +1027,7 @@ _get_uid_list (CamelFolder *folder, CamelException *ex) CAMEL_LOG_FULL_DEBUG ("Entering CamelMboxFolder::get_uid_list\n"); - message_info_array = mbox_folder->summary->message_info; + message_info_array = mbox_folder->internal_summary->message_info; for (i=0; i<message_info_array->len; i++) { @@ -1054,7 +1065,7 @@ _get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex) searched_uid = strtoul(uid, (char **)NULL, 10); - message_info_array = mbox_folder->summary->message_info; + message_info_array = mbox_folder->internal_summary->message_info; i=0; uid_found = FALSE; diff --git a/camel/providers/mbox/camel-mbox-folder.h b/camel/providers/mbox/camel-mbox-folder.h index 0923d28d2e..9fdc765103 100644 --- a/camel/providers/mbox/camel-mbox-folder.h +++ b/camel/providers/mbox/camel-mbox-folder.h @@ -47,12 +47,15 @@ extern "C" { typedef struct { CamelFolder parent_object; + + CamelFolderSummary *external_summary; + /* the external summary is intended to be read by callers */ gchar *folder_file_path; /* contains the messages */ gchar *summary_file_path; /* contains the messages summary */ gchar *folder_dir_path; /* contains the subfolders */ - CamelMboxSummary *summary; /* internal summary object */ + CamelMboxSummary *internal_summary; /* internal summary object */ GList *uid_array; } CamelMboxFolder; diff --git a/camel/providers/mbox/camel-mbox-summary.c b/camel/providers/mbox/camel-mbox-summary.c index 2d09c61a43..094d032cb3 100644 --- a/camel/providers/mbox/camel-mbox-summary.c +++ b/camel/providers/mbox/camel-mbox-summary.c @@ -255,9 +255,49 @@ camel_mbox_check_summary_sync (gchar *summary_filename, void -camel_summary_append_entries (CamelMboxSummary *summary, GArray *entries) +camel_mbox_summary_append_entries (CamelMboxSummary *summary, GArray *entries) { summary->message_info = g_array_append_vals (summary->message_info, entries->data, entries->len); } + + + + + +void +camel_mbox_summary_append_internal_to_external (CamelMboxSummary *internal, + CamelFolderSummary *external, + guint first_entry) +{ + GArray *internal_array; + GArray *external_array; + + CamelMessageInfo external_entry; + CamelMboxSummaryInformation *internal_entry; + + int i; + + + internal_array = internal->message_info; + external_array = external->message_info_list; + + /* we don't set any extra fields */ + external_entry.extended_fields = NULL; + + + for (i=first_entry; i<internal_array->len; i++) { + internal_entry = (CamelMboxSummaryInformation *)(internal_array->data) + i; + + external_entry.subject = internal_entry->subject ? strdup (internal_entry->subject) : NULL; + external_entry.uid = g_strdup_printf ("%u", internal_entry->uid); + external_entry.date = internal_entry->date ? strdup (internal_entry->date) : NULL; + external_entry.sender = internal_entry->sender ? strdup (internal_entry->sender) : NULL; + + g_array_append_vals (external_array, &external_entry, 1); + + } + + +} diff --git a/camel/providers/mbox/camel-mbox-summary.h b/camel/providers/mbox/camel-mbox-summary.h index 749a5a49f2..af64ff7cf5 100644 --- a/camel/providers/mbox/camel-mbox-summary.h +++ b/camel/providers/mbox/camel-mbox-summary.h @@ -68,7 +68,14 @@ camel_mbox_check_summary_sync (gchar *summary_filename, CamelException *ex); void -camel_summary_append_entries (CamelMboxSummary *summary, GArray *entries); +camel_mbox_summary_append_entries (CamelMboxSummary *summary, GArray *entries); + + + +void +camel_mbox_summary_append_internal_to_external (CamelMboxSummary *internal, + CamelFolderSummary *external, + guint first_entry); #endif /* MH_SUMMARY_H */ |