Summary files are here and work !!!
1999-09-08 bertrand <Bertrand.Guiheneuf@aful.org> * camel/providers/MH/mh-summary.c (mh_load_summary): (mh_save_summary): (mh_create_summary): implemented summary (files) for MH folders. * camel/providers/MH/camel-mh-folder.c (_get_message_by_uid): implemented. (camel_mh_folder_class_init): (_get_message_uid): implemented svn path=/trunk/; revision=1219
This commit is contained in:
committed by
Bertrand Guiheneuf
parent
13dce8b335
commit
68ceb01f60
10
ChangeLog
10
ChangeLog
@ -1,7 +1,15 @@
|
||||
1999-09-08 bertrand <Bertrand.Guiheneuf@aful.org>
|
||||
|
||||
* camel/providers/MH/mh-summary.c
|
||||
(mh_load_summary):
|
||||
(mh_save_summary):
|
||||
(mh_create_summary):
|
||||
implemented summary (files) for MH folders.
|
||||
|
||||
* camel/providers/MH/camel-mh-folder.c
|
||||
(_get_message_by_uid): impemented.
|
||||
(_get_message_by_uid): implemented.
|
||||
(camel_mh_folder_class_init):
|
||||
(_get_message_uid): implemented
|
||||
|
||||
* camel/camel-folder.c (camel_folder_has_uid_capability):
|
||||
(camel_folder_get_message_uid):
|
||||
|
||||
@ -51,7 +51,7 @@ typedef struct {
|
||||
|
||||
typedef struct {
|
||||
gchar *subject;
|
||||
gchar *UID;
|
||||
gchar *uid;
|
||||
gchar *date;
|
||||
gchar *sender;
|
||||
|
||||
|
||||
@ -1116,7 +1116,8 @@ _get_uid_list (CamelFolder *folder)
|
||||
* get the list of UID available in a folder. This
|
||||
* routine is usefull to know what messages are
|
||||
* available when the folder does not support
|
||||
* summaries.
|
||||
* summaries. The UIDs in the list must not be freed,
|
||||
* the folder object caches them.
|
||||
*
|
||||
* Return value: Glist of UID correspondind to the messages available in the folder.
|
||||
**/
|
||||
|
||||
@ -38,14 +38,14 @@ typedef enum {
|
||||
GSTRING_DICHOTOMY_NONE = 0,
|
||||
GSTRING_DICHOTOMY_RIGHT_DIR = 1,
|
||||
GSTRING_DICHOTOMY_STRIP_TRAILING = 2,
|
||||
GSTRING_DICHOTOMY_STRIP_LEADING = 4,
|
||||
GSTRING_DICHOTOMY_STRIP_LEADING = 4
|
||||
|
||||
} GStringDichotomyOption;
|
||||
|
||||
typedef enum {
|
||||
GSTRING_TRIM_NONE = 0,
|
||||
GSTRING_TRIM_STRIP_TRAILING = 1,
|
||||
GSTRING_TRIM_STRIP_LEADING = 2,
|
||||
GSTRING_TRIM_STRIP_LEADING = 2
|
||||
} GStringTrimOption;
|
||||
|
||||
|
||||
|
||||
@ -15,12 +15,14 @@ libcamelmh_la_SOURCES = \
|
||||
camel-mh-folder.c \
|
||||
camel-mh-provider.c \
|
||||
camel-mh-store.c \
|
||||
mh-summary.c \
|
||||
mh-uid.c \
|
||||
mh-utils.c
|
||||
|
||||
libcamelmhinclude_HEADERS = \
|
||||
camel-mh-folder.h \
|
||||
camel-mh-store.h \
|
||||
mh-summary.c \
|
||||
mh-uid.h \
|
||||
mh-utils.h
|
||||
|
||||
|
||||
@ -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 ***/
|
||||
|
||||
@ -134,7 +134,8 @@ mh_load_uid_list (CamelMhFolder *mh_folder)
|
||||
|
||||
|
||||
if (!((stat_error != -1) && S_ISREG (stat_buf.st_mode))) {
|
||||
CAMEL_LOG_FULL_DEBUG ("file %s does not exist. Exiting.\n", uidfile_path);
|
||||
CAMEL_LOG_FULL_DEBUG ("CamelMhFolder::load_uid_list "
|
||||
"file %s does not exist. Exiting.\n", uidfile_path);
|
||||
g_free (uidfile_path);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -38,14 +38,14 @@ typedef enum {
|
||||
STRING_DICHOTOMY_NONE = 0,
|
||||
STRING_DICHOTOMY_RIGHT_DIR = 1,
|
||||
STRING_DICHOTOMY_STRIP_TRAILING = 2,
|
||||
STRING_DICHOTOMY_STRIP_LEADING = 4,
|
||||
STRING_DICHOTOMY_STRIP_LEADING = 4
|
||||
|
||||
} StringDichotomyOption;
|
||||
|
||||
typedef enum {
|
||||
STRING_TRIM_NONE = 0,
|
||||
STRING_TRIM_STRIP_TRAILING = 1,
|
||||
STRING_TRIM_STRIP_LEADING = 2,
|
||||
STRING_TRIM_STRIP_LEADING = 2
|
||||
} StringTrimOption;
|
||||
|
||||
gboolean string_equal_for_glist (gconstpointer v, gconstpointer v2);
|
||||
|
||||
Reference in New Issue
Block a user