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:
committed by
Bertrand Guiheneuf
parent
0fe7101224
commit
4e4eb45bf6
16
ChangeLog
16
ChangeLog
@ -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):
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
@ -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,
|
||||
|
||||
Reference in New Issue
Block a user