use folder summary instead of opening all messages.

1999-09-05  bertrand  <Bertrand.Guiheneuf@aful.org>

	* tests/ui-tests/store_listing.c (show_folder_messages):
	use folder summary instead of opening all messages.

	* camel/providers/MH/camel-mh-folder.c (_create_summary):
	basic and highly non-efficient summary implementation.
	Should be seen as a proof of concept only.
	subfolder summary still has to be implemented.

	* camel/providers/maildir/camel-maildir-folder.c (_init_with_store):
	hasn't summary for the moment.
	* camel/providers/maildir/camel-maildir-folder.c
	cosmetic changes.

svn path=/trunk/; revision=1178
This commit is contained in:
bertrand
1999-09-05 16:15:12 +00:00
committed by Bertrand Guiheneuf
parent 0fe7101224
commit 4e4eb45bf6
6 changed files with 674 additions and 534 deletions

View File

@ -1,3 +1,19 @@
1999-09-05 bertrand <Bertrand.Guiheneuf@aful.org>
* tests/ui-tests/store_listing.c (show_folder_messages):
use folder summary instead of opening all messages.
* camel/providers/MH/camel-mh-folder.c (_create_summary):
basic and highly non-efficient summary implementation.
Should be seen as a proof of concept only.
subfolder summary still has to be implemented.
* camel/providers/maildir/camel-maildir-folder.c (_init_with_store):
hasn't summary for the moment.
* camel/providers/maildir/camel-maildir-folder.c
cosmetic changes.
1999-09-04 bertrand <Bertrand.Guiheneuf@aful.org>
* camel/providers/MH/camel-mh-folder.c (_create_summary):

View File

@ -167,6 +167,10 @@ _init_with_store (CamelFolder *folder, CamelStore *parent_store)
if (folder->parent_store) gtk_object_unref (GTK_OBJECT (folder->parent_store));
folder->parent_store = parent_store;
if (parent_store) gtk_object_ref (GTK_OBJECT (parent_store));
folder->open_mode = FOLDER_OPEN_UNKNOWN;
folder->open_state = FOLDER_CLOSE;
folder->name = NULL;
folder->full_name = NULL;
}
@ -187,6 +191,13 @@ _open (CamelFolder *folder, CamelFolderOpenMode mode)
}
void camel_folder_open (CamelFolder *folder, CamelFolderOpenMode mode)
{
CF_CLASS(folder)->open (folder, mode);
}
/**
* _close:Close a folder.
* @folder:
@ -972,7 +983,7 @@ camel_folder_has_summary_capability (CamelFolder *folder)
}
const CamelFolderSummary *
CamelFolderSummary *
camel_folder_get_summary (CamelFolder *folder)
{
return folder->summary;

View File

@ -120,6 +120,7 @@ GtkType camel_folder_get_type (void);
/* public methods */
CamelFolder *camel_folder_get_folder (CamelFolder *folder, gchar *folder_name);
void camel_folder_open (CamelFolder *folder, CamelFolderOpenMode mode);
gboolean camel_folder_create (CamelFolder *folder);
gboolean camel_folder_delete (CamelFolder *folder, gboolean recurse);
gboolean camel_folder_delete_messages (CamelFolder *folder);
@ -138,7 +139,9 @@ gint camel_folder_get_message_count (CamelFolder *folder);
gint camel_folder_append_message (CamelFolder *folder, CamelMimeMessage *message);
const GList *camel_folder_list_permanent_flags (CamelFolder *folder);
void camel_folder_copy_message_to (CamelFolder *folder, CamelMimeMessage *message, CamelFolder *dest_folder);
gboolean camel_folder_has_summary_capability (CamelFolder *folder);
CamelFolderSummary *camel_folder_get_summary (CamelFolder *folder);
#ifdef __cplusplus

View File

@ -37,6 +37,7 @@
#include "camel-stream-fs.h"
#include "camel-stream-buffered-fs.h"
#include "camel-folder-summary.h"
#include "gmime-utils.h"
static CamelFolderClass *parent_class=NULL;
@ -46,7 +47,7 @@ static CamelFolderClass *parent_class=NULL;
#define CF_CLASS(so) CAMEL_FOLDER_CLASS (GTK_OBJECT(so)->klass)
#define CMHS_CLASS(so) CAMEL_STORE_CLASS (GTK_OBJECT(so)->klass)
static int copy_reg (const char *src_path, const char *dst_path);
static void _set_name(CamelFolder *folder, const gchar *name);
static void _init_with_store (CamelFolder *folder, CamelStore *parent_store);
static gboolean _exists (CamelFolder *folder);
@ -61,6 +62,9 @@ static void _expunge (CamelFolder *folder);
static void _copy_message_to (CamelFolder *folder, CamelMimeMessage *message, CamelFolder *dest_folder);
static void _open (CamelFolder *folder, CamelFolderOpenMode mode);
/* some utility functions */
static int copy_reg (const char *src_path, const char *dst_path);
static gboolean _is_a_message_file (const gchar *file_name, const gchar *file_path);
static void
@ -148,18 +152,51 @@ static void
_create_summary (CamelFolder *folder)
{
CamelMhFolder *mh_folder = CAMEL_MH_FOLDER (folder);
CamelFolderSummary *summary = folder->summary;
CamelMessageInfo *message_info;
CamelFolderSummary *subfolder_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_info->subject = NULL;
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;
}
}
@ -172,7 +209,8 @@ _open (CamelFolder *folder, CamelFolderOpenMode mode)
CamelMhFolder *mh_folder = CAMEL_MH_FOLDER (folder);
struct dirent *dir_entry;
DIR *dir_handle;
if (folder->open_state == FOLDER_OPEN) return;
@ -194,6 +232,7 @@ _open (CamelFolder *folder, CamelFolderOpenMode mode)
closedir (dir_handle);
_create_summary (folder);
}
/**

File diff suppressed because it is too large Load Diff

View File

@ -14,6 +14,7 @@
#include "camel-mh-folder.h"
#include "camel-mh-store.h"
#include "camel.h"
#include "camel-folder-summary.h"
static GladeXML *xml;
static CamelSession *_session;
@ -132,19 +133,22 @@ show_folder_messages (CamelFolder *folder)
const gchar *clist_row_text[3];
const char *sent_date, *subject, *sender;
gint current_row;
CamelFolderSummary *summary;
message_clist = glade_xml_get_widget (xml, "message-clist");
/* clear old message list */
gtk_clist_clear (GTK_CLIST (message_clist));
#if 0
folder_message_count = camel_folder_get_message_count (folder);
for (i=0; i<folder_message_count; i++) {
message = camel_folder_get_message (folder, i);
gtk_object_ref (GTK_OBJECT (message));
sent_date = camel_mime_message_get_sent_date (message);
sender = camel_mime_message_get_from (message);
subject = camel_mime_message_get_subject (message);
message = camel_folder_get_message (folder, i);
gtk_object_ref (GTK_OBJECT (message));
sent_date = camel_mime_message_get_sent_date (message);
sender = camel_mime_message_get_from (message);
subject = camel_mime_message_get_subject (message);
if (sent_date) clist_row_text [0] = sent_date;
@ -158,10 +162,30 @@ show_folder_messages (CamelFolder *folder)
gtk_clist_set_row_data_full (GTK_CLIST (message_clist), current_row, (gpointer)message, message_destroy_notify);
}
}
#endif
if (camel_folder_has_summary_capability (folder)) {
const GList *message_info_list;
CamelMessageInfo *msg_info;
printf ("Folder has summary. Good\n");
summary = camel_folder_get_summary (folder);
message_info_list = camel_folder_summary_get_message_info_list (summary);
printf ("message_info_list = %p\n", message_info_list);
while (message_info_list) {
msg_info = (CamelMessageInfo *)message_info_list->data;
clist_row_text [0] = msg_info->date;
clist_row_text [1] = msg_info->sender;
clist_row_text [2] = msg_info->subject;
printf ("New message : subject = %s\n", msg_info->subject);
current_row = gtk_clist_append (GTK_CLIST (message_clist), clist_row_text);
message_info_list = message_info_list->next;
}
} else {
printf ("Folder does not have summary. Skipping\n");
}
}
/* add a mail store given by its URL */
@ -200,10 +224,13 @@ add_mail_store (const gchar *store_url)
/* normally, use get_root_folder */
root_folder = camel_store_get_folder (store, "");
camel_folder_open (root_folder, FOLDER_OPEN_RW);
subfolder_list = camel_folder_list_subfolders (root_folder);
while (subfolder_list) {
new_tree_text[0] = subfolder_list->data;
new_folder = camel_store_get_folder (store, subfolder_list->data);
camel_folder_open (new_folder, FOLDER_OPEN_RW);
new_folder_node = gtk_ctree_insert_node (GTK_CTREE (mailbox_and_store_tree),
new_store_node,
NULL,