aboutsummaryrefslogtreecommitdiffstats
path: root/camel
diff options
context:
space:
mode:
Diffstat (limited to 'camel')
-rw-r--r--camel/camel-folder.c15
-rw-r--r--camel/camel-folder.h5
-rw-r--r--camel/providers/MH/camel-mh-folder.c66
3 files changed, 84 insertions, 2 deletions
diff --git a/camel/camel-folder.c b/camel/camel-folder.c
index 5fa22a5b72..2d0a29faab 100644
--- a/camel/camel-folder.c
+++ b/camel/camel-folder.c
@@ -51,6 +51,8 @@ static GList *_list_subfolders (CamelFolder *folder);
static GList *_expunge (CamelFolder *folder);
static CamelMimeMessage *_get_message (CamelFolder *folder, gint number);
static gint _get_message_count (CamelFolder *folder);
+static gint _append_message (CamelFolder *folder, CamelMimeMessage *message);
+
static void
camel_folder_class_init (CamelFolderClass *camel_folder_class)
@@ -78,6 +80,7 @@ camel_folder_class_init (CamelFolderClass *camel_folder_class)
camel_folder_class->expunge = _expunge;
camel_folder_class->get_message = _get_message;
camel_folder_class->get_message_count = _get_message_count;
+ camel_folder_class->append_message = _append_message;
/* virtual method overload */
}
@@ -784,3 +787,15 @@ camel_folder_get_message_count (CamelFolder *folder)
return CF_CLASS (folder)->get_message_count (folder);
}
+
+static gint
+_append_message (CamelFolder *folder, CamelMimeMessage *message)
+{
+ return -1;
+}
+
+
+gint camel_folder_append_message (CamelFolder *folder, CamelMimeMessage *message)
+{
+ return CF_CLASS (folder)->append_message (folder, message);
+}
diff --git a/camel/camel-folder.h b/camel/camel-folder.h
index b678631eea..e980e39e15 100644
--- a/camel/camel-folder.h
+++ b/camel/camel-folder.h
@@ -100,7 +100,7 @@ typedef struct {
GList * (*expunge) (CamelFolder *folder);
CamelMimeMessage * (*get_message) (CamelFolder *folder, gint number);
gint (*get_message_count) (CamelFolder *folder);
-
+ gint (*append_message) (CamelFolder *folder, CamelMimeMessage *message);
} CamelFolderClass;
@@ -125,7 +125,8 @@ const gchar *camel_folder_get_name (CamelFolder *folder);
const gchar *camel_folder_get_full_name (CamelFolder *folder);
CamelMimeMessage *camel_folder_get_message (CamelFolder *folder, gint number);
gboolean camel_folder_exists (CamelFolder *folder);
-gint camel_get_message_count (CamelFolder *folder);
+gint camel_folder_get_message_count (CamelFolder *folder);
+gint camel_folder_append_message (CamelFolder *folder, CamelMimeMessage *message);
diff --git a/camel/providers/MH/camel-mh-folder.c b/camel/providers/MH/camel-mh-folder.c
index 2e19349e67..a1c78fd309 100644
--- a/camel/providers/MH/camel-mh-folder.c
+++ b/camel/providers/MH/camel-mh-folder.c
@@ -51,6 +51,8 @@ static gboolean _delete_messages (CamelFolder *folder);
static GList *_list_subfolders (CamelFolder *folder);
static CamelMimeMessage *_get_message (CamelFolder *folder, gint number);
static gint _get_message_count (CamelFolder *folder);
+static gint _append_message (CamelFolder *folder, CamelMimeMessage *message);
+
static void
camel_mh_folder_class_init (CamelMhFolderClass *camel_mh_folder_class)
@@ -69,6 +71,7 @@ camel_mh_folder_class_init (CamelMhFolderClass *camel_mh_folder_class)
camel_folder_class->list_subfolders = _list_subfolders;
camel_folder_class->get_message = _get_message;
camel_folder_class->get_message_count = _get_message_count;
+ camel_folder_class->append_message = _append_message;
}
@@ -480,3 +483,66 @@ _get_message_count (CamelFolder *folder)
closedir (dir_handle);
return message_count;
}
+
+
+
+
+static gint
+_append_message (CamelFolder *folder, CamelMimeMessage *message)
+{
+ CamelMhFolder *mh_folder = CAMEL_MH_FOLDER(folder);
+ const gchar *directory_path;
+ struct dirent *dir_entry;
+ DIR *dir_handle;
+ guint last_max_message_number = 0;
+ guint current_message_number;
+ guint new_message_number;
+ gchar *new_message_filename;
+ CamelStream *output_stream;
+ gboolean error;
+
+ CAMEL_LOG_FULL_DEBUG ("Entering CamelMhFolder::append_message\n");
+
+ g_assert(folder);
+
+ directory_path = mh_folder->directory_path;
+ if (!directory_path) return -1;
+
+ if (!camel_folder_exists (folder)) return 0;
+
+ 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 (_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)
+ last_max_message_number = current_message_number;
+ }
+ /* read next entry */
+ dir_entry = readdir (dir_handle);
+ }
+ closedir (dir_handle);
+
+ new_message_number = last_max_message_number + 1;
+ new_message_filename = g_strdup_printf ("%s/%d", directory_path, new_message_number);
+ CAMEL_LOG_FULL_DEBUG ("CamelMhFolder::append_message new message path is %s\n", new_message_filename);
+
+ output_stream = camel_stream_fs_new_with_name (new_message_filename, CAMEL_STREAM_FS_WRITE);
+ if (output_stream != NULL) {
+ camel_data_wrapper_write_to_stream (CAMEL_DATA_WRAPPER (message), output_stream);
+ camel_stream_close (output_stream);
+ } else {
+ CAMEL_LOG_WARNING ("CamelMhFolder::append_message could not open %s for writing\n", new_message_filename);
+ CAMEL_LOG_FULL_DEBUG (" Full error text is : %s\n", strerror(errno));
+ error = TRUE;
+ }
+
+ g_free (new_message_filename);
+ CAMEL_LOG_FULL_DEBUG ("Leaving CamelMhFolder::append_message\n");
+ if (error) return -1;
+ else return new_message_number;
+}