aboutsummaryrefslogtreecommitdiffstats
path: root/camel/providers
diff options
context:
space:
mode:
Diffstat (limited to 'camel/providers')
-rw-r--r--camel/providers/MH/Makefile.am8
-rw-r--r--camel/providers/MH/camel-mh-folder.c53
-rw-r--r--camel/providers/MH/camel-mh-folder.h1
-rw-r--r--camel/providers/MH/mh-uid.c133
-rw-r--r--camel/providers/MH/mh-uid.h12
5 files changed, 171 insertions, 36 deletions
diff --git a/camel/providers/MH/Makefile.am b/camel/providers/MH/Makefile.am
index 6ebdc765b3..2442be6912 100644
--- a/camel/providers/MH/Makefile.am
+++ b/camel/providers/MH/Makefile.am
@@ -15,12 +15,14 @@ libcamelmh_la_SOURCES = \
camel-mh-folder.c \
camel-mh-provider.c \
camel-mh-store.c \
- mh-uid.c
+ mh-uid.c \
+ mh-utils.c
libcamelmhinclude_HEADERS = \
camel-mh-folder.h \
- camel-mh-store.h\
- mh-uid.h
+ camel-mh-store.h \
+ mh-uid.h \
+ mh-utils.h
libcamelmh_la_LDFLAGS = -version-info 0:0:0 -rpath $(libdir)
diff --git a/camel/providers/MH/camel-mh-folder.c b/camel/providers/MH/camel-mh-folder.c
index fa6661c722..272090fa0e 100644
--- a/camel/providers/MH/camel-mh-folder.c
+++ b/camel/providers/MH/camel-mh-folder.c
@@ -38,6 +38,7 @@
#include "camel-stream-buffered-fs.h"
#include "camel-folder-summary.h"
#include "gmime-utils.h"
+#include "mh-utils.h"
static CamelFolderClass *parent_class=NULL;
@@ -65,7 +66,6 @@ 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
camel_mh_folder_class_init (CamelMhFolderClass *camel_mh_folder_class)
@@ -221,7 +221,7 @@ _open (CamelFolder *folder, CamelFolderOpenMode mode)
dir_entry = readdir (dir_handle);
while (dir_entry != NULL) {
/* tests if the entry correspond to a message file */
- if (_is_a_message_file (dir_entry->d_name, mh_folder->directory_path))
+ if (mh_is_a_message_file (dir_entry->d_name, mh_folder->directory_path))
/* add the file name to the list */
mh_folder->file_name_list = g_list_insert_sorted (mh_folder->file_name_list,
g_strdup (dir_entry->d_name),
@@ -233,8 +233,30 @@ _open (CamelFolder *folder, CamelFolderOpenMode mode)
closedir (dir_handle);
_create_summary (folder);
+
+ /* get (or create) uid list */
+ if (!mh_load_uid_list (mh_folder))
+ mh_generate_uid_list (mh_folder);
+}
+
+
+
+static void
+_close (CamelFolder *folder, gboolean expunge)
+{
+ CamelMhFolder *mh_folder = CAMEL_MH_FOLDER (folder);
+
+ if (mh_folder->uid_array)
+ mh_save_uid_list (mh_folder);
+
+ /* call parent implementation */
+ parent_class->close (folder, expunge);
}
+
+
+
+
/**
* camel_mh_folder_set_name: set the name of an MH folder
* @folder: the folder to set the name
@@ -479,29 +501,6 @@ _list_subfolders (CamelFolder *folder)
-static gboolean
-_is_a_message_file (const gchar *file_name, const gchar *file_path)
-{
- struct stat stat_buf;
- gint stat_error = 0;
- gboolean ok;
- gchar *full_file_name;
- int i;
-
- /* test if the name is a number */
- i=0;
- while ((file_name[i] != '\0') && (file_name[i] >= '0') && (file_name[i] <= '9'))
- i++;
- if ((i==0) || (file_name[i] != '\0')) return FALSE;
-
- /* is it a regular file ? */
- full_file_name = g_strdup_printf ("%s/%s", file_path, file_name);
- stat_error = stat (full_file_name, &stat_buf);
- g_free (full_file_name);
-
- return ((stat_error != -1) && S_ISREG (stat_buf.st_mode));
-}
-
static void
_filename_free (gpointer data)
@@ -583,7 +582,7 @@ _get_message_count (CamelFolder *folder)
dir_entry = readdir (dir_handle);
while (dir_entry != NULL) {
/* tests if the entry correspond to a message file */
- if (_is_a_message_file (dir_entry->d_name, directory_path))
+ if (mh_is_a_message_file (dir_entry->d_name, directory_path))
message_count++;
/* read next entry */
dir_entry = readdir (dir_handle);
@@ -619,7 +618,7 @@ _find_next_free_message_file (CamelFolder *folder, gint *new_msg_number, gchar *
dir_entry = readdir (dir_handle);
while (dir_entry != NULL) {
/* tests if the entry correspond to a message file */
- if (_is_a_message_file (dir_entry->d_name, directory_path)) {
+ if (mh_is_a_message_file (dir_entry->d_name, directory_path)) {
/* see if the message number is the biggest found */
current_message_number = atoi (dir_entry->d_name);
if (current_message_number > last_max_message_number)
diff --git a/camel/providers/MH/camel-mh-folder.h b/camel/providers/MH/camel-mh-folder.h
index e1c2e86900..40800375eb 100644
--- a/camel/providers/MH/camel-mh-folder.h
+++ b/camel/providers/MH/camel-mh-folder.h
@@ -46,6 +46,7 @@ typedef struct {
gchar *directory_path;
GList *file_name_list;
+ GArray *uid_array;
} CamelMhFolder;
diff --git a/camel/providers/MH/mh-uid.c b/camel/providers/MH/mh-uid.c
index 8c777accaa..b112caa003 100644
--- a/camel/providers/MH/mh-uid.c
+++ b/camel/providers/MH/mh-uid.c
@@ -20,22 +20,34 @@
* USA
*/
+
+#include <config.h>
+
#include "mh-uid.h"
#include "camel-stream.h"
#include "camel-stream-fs.h"
#include "camel-stream-buffered-fs.h"
#include "gmime-utils.h"
#include "md5-utils.h"
+#include "mh-utils.h"
+
+#include <sys/stat.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <dirent.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
-guchar *
-mh_uid_get_for_file (gchar *filename)
+void
+mh_uid_get_for_file (gchar *filename, guchar uid[16])
{
CamelStream *message_stream;
GArray *header_array;
Rfc822Header *cur_header;
int i;
MD5Context ctx;
- guchar *md5_digest_uid;
message_stream = camel_stream_buffered_fs_new_with_name (filename,
@@ -61,10 +73,119 @@ mh_uid_get_for_file (gchar *filename)
g_array_free (header_array, TRUE);
- md5_digest_uid = g_new0 (guchar, 16);
- md5_final (md5_digest_uid, &ctx);
+ md5_final (uid, &ctx);
+}
+
+
+
+
+void
+mh_save_uid_list (CamelMhFolder *mh_folder)
+{
+ GArray *uid_array;
+ MhUidCouple *first_uid_couple;
+ gchar *directory_path = mh_folder->directory_path;
+ gchar *uidfile_path;
+ int fd;
+ int i;
+
+ uidfile_path = g_strdup_printf ("%s/%s", directory_path, ".camel-uid-list");
+ fd = open (uidfile_path, O_WRONLY | O_CREAT );
+ g_free (uidfile_path);
+ if (!fd) return;
+
+ uid_array = mh_folder->uid_array;
+ first_uid_couple = (MhUidCouple *)uid_array->data;
+
+ /* write the number of uid contained in the file */
+ write (fd, &(uid_array->len), sizeof (uid_array->len));
+
+ /* now write the array of uid self */
+ write (fd, first_uid_couple, sizeof (first_uid_couple) * uid_array->len);
+
+ close (fd);
+}
+
+
+gint
+mh_load_uid_list (CamelMhFolder *mh_folder)
+{
+ GArray *new_uid_array;
+ MhUidCouple *first_uid_couple;
+ gchar *directory_path = mh_folder->directory_path;
+ gchar *uidfile_path;
+ int fd;
+ guint uid_nb;
+
+ uidfile_path = g_strdup_printf ("%s/%s", directory_path, ".camel-uid-list");
+ fd = open (uidfile_path, O_RDONLY);
+ g_free (uidfile_path);
+ if (!fd) return -1;
+
+ if (mh_folder->uid_array) g_array_free (mh_folder->uid_array, FALSE);
+
+ read (fd, &uid_nb, sizeof (uid_nb));
+
+ new_uid_array = g_array_new (FALSE, FALSE, sizeof (MhUidCouple));
+ new_uid_array = g_array_set_size (new_uid_array, uid_nb);
+ first_uid_couple = (MhUidCouple *)new_uid_array->data;
+
+ /* read the number of uids in the file */
+ read (fd, first_uid_couple, sizeof (first_uid_couple) * uid_nb);
+
+ mh_folder->uid_array = new_uid_array;
- return md5_digest_uid;
+ return 1;
}
+gint
+mh_generate_uid_list (CamelMhFolder *mh_folder)
+{
+ GArray *new_uid_array;
+ const gchar *directory_path;
+ struct dirent *dir_entry;
+ DIR *dir_handle;
+ gchar *msg_path;
+ guint msg_count;
+ MhUidCouple *uid_couple;
+ guint file_number;
+
+ g_assert(mh_folder);
+
+ directory_path = mh_folder->directory_path;
+ if (!directory_path) return -1;
+
+ msg_count = camel_folder_get_message_count (CAMEL_FOLDER (mh_folder));
+ if (!msg_count) return -1;
+
+ new_uid_array = g_array_new (FALSE, FALSE, sizeof (MhUidCouple));
+ new_uid_array = g_array_set_size (new_uid_array, msg_count);
+ uid_couple = (MhUidCouple *)new_uid_array->data;
+
+ dir_handle = opendir (directory_path);
+
+ /* read first entry in the directory */
+ dir_entry = readdir (dir_handle);
+ while (dir_entry != NULL) {
+
+ /* tests if the entry correspond to a message file */
+ if (mh_is_a_message_file (dir_entry->d_name, directory_path)) {
+
+ /* get the uid for this message */
+ msg_path = g_strdup_printf ("%s/%s", directory_path, dir_entry->d_name);
+ mh_uid_get_for_file (msg_path, uid_couple->uid);
+ g_free (msg_path);
+
+ /* convert filename into file number */
+ uid_couple->file_number = atoi (dir_entry->d_name);
+ uid_couple++;
+ }
+
+ /* read next entry */
+ dir_entry = readdir (dir_handle);
+ }
+
+ closedir (dir_handle);
+
+}
diff --git a/camel/providers/MH/mh-uid.h b/camel/providers/MH/mh-uid.h
index 32fe138a53..63dfe5b159 100644
--- a/camel/providers/MH/mh-uid.h
+++ b/camel/providers/MH/mh-uid.h
@@ -24,5 +24,17 @@
#define MH_UID_H 1
#include <glib.h>
+#include "camel-mh-folder.h"
+
+
+typedef struct {
+ gchar uid[16];
+ guint file_number;
+} MhUidCouple;
+
+void mh_uid_get_for_file (gchar *filename, guchar uid[16]);
+void mh_save_uid_list (CamelMhFolder *mh_folder);
+gint mh_load_uid_list (CamelMhFolder *mh_folder);
+gint mh_generate_uid_list (CamelMhFolder *mh_folder);
#endif /* MH_UID_H */