diff options
Diffstat (limited to 'camel')
-rw-r--r-- | camel/ChangeLog | 8 | ||||
-rw-r--r-- | camel/camel-folder.c | 52 | ||||
-rw-r--r-- | camel/camel-folder.h | 17 |
3 files changed, 75 insertions, 2 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog index 8c8dedb695..00bdee683a 100644 --- a/camel/ChangeLog +++ b/camel/ChangeLog @@ -1,3 +1,11 @@ +2000-06-30 Dan Winship <danw@helixcode.com> + + * camel-folder.c (camel_folder_move_message_to): New function, to + move a message from one folder to another. The default + implementation just uses append_message and delete_message, but + providers can implement more efficient versions for use when both + folders are on the same store. + 2000-06-29 Jeffrey Stedfast <fejj@helixcode.com> * providers/imap/camel-imap-folder.c (imap_expunge): Should now diff --git a/camel/camel-folder.c b/camel/camel-folder.c index f3cea51af2..39415e16cd 100644 --- a/camel/camel-folder.c +++ b/camel/camel-folder.c @@ -122,6 +122,11 @@ static const CamelMessageInfo *summary_get_by_uid (CamelFolder *folder, static GList *search_by_expression (CamelFolder *folder, const char *exp, CamelException *ex); +static void move_message_to (CamelFolder *source, + const char *uid, + CamelFolder *dest, + CamelException *ex); + static void camel_folder_class_init (CamelFolderClass *camel_folder_class) { @@ -159,6 +164,7 @@ camel_folder_class_init (CamelFolderClass *camel_folder_class) camel_folder_class->free_summary = free_summary; camel_folder_class->search_by_expression = search_by_expression; camel_folder_class->summary_get_by_uid = summary_get_by_uid; + camel_folder_class->move_message_to = move_message_to; /* virtual method overload */ gtk_object_class->finalize = finalize; @@ -1013,3 +1019,49 @@ camel_folder_search_by_expression (CamelFolder *folder, const char *expression, return CF_CLASS (folder)->search_by_expression (folder, expression, ex); } + + +static void +move_message_to (CamelFolder *source, const char *uid, CamelFolder *dest, + CamelException *ex) +{ + CamelMimeMessage *msg; + + /* Default implementation. */ + + msg = camel_folder_get_message_by_uid (source, uid, ex); + if (!msg) + return; + camel_folder_append_message (dest, msg, ex); + gtk_object_unref (GTK_OBJECT (msg)); + if (camel_exception_is_set (ex)) + return; + camel_folder_delete_message_by_uid (source, uid, ex); +} + +/** + * camel_folder_move_message_to: + * @source: source folder + * @uid: UID of message in @source + * @dest: destination folder + * @ex: a CamelException + * + * This moves a message from one folder to another. If the @source and + * @dest folders have the same parent_store, this may be more efficient + * than a camel_folder_append_message() followed by + * camel_folder_delete_message_by_uid(). + **/ +void +camel_folder_move_message_to (CamelFolder *source, const char *uid, + CamelFolder *dest, CamelException *ex) +{ + g_return_if_fail (CAMEL_IS_FOLDER (source)); + g_return_if_fail (CAMEL_IS_FOLDER (dest)); + g_return_if_fail (uid != NULL); + + if (source->parent_store == dest->parent_store) { + return CF_CLASS (source)->move_message_to (source, uid, + dest, ex); + } else + return move_message_to (source, uid, dest, ex); +} diff --git a/camel/camel-folder.h b/camel/camel-folder.h index 9e9acc6afd..d0a7ceea02 100644 --- a/camel/camel-folder.h +++ b/camel/camel-folder.h @@ -155,9 +155,17 @@ typedef struct { gboolean (*has_search_capability) (CamelFolder *folder); - GList * (*search_by_expression) (CamelFolder *folder, const char *expression, CamelException *ex); + GList * (*search_by_expression) (CamelFolder *folder, + const char *expression, + CamelException *ex); - const CamelMessageInfo * (*summary_get_by_uid) (CamelFolder *, const char *uid); + const CamelMessageInfo * (*summary_get_by_uid) (CamelFolder *, + const char *uid); + + void (*move_message_to) (CamelFolder *source, + const char *uid, + CamelFolder *destination, + CamelException *ex); } CamelFolderClass; @@ -271,6 +279,11 @@ GList * camel_folder_search_by_expression (CamelFolder *folder, const char const CamelMessageInfo *camel_folder_summary_get_by_uid (CamelFolder *summary, const char *uid); +void camel_folder_move_message_to (CamelFolder *source, + const char *uid, + CamelFolder *dest, + CamelException *ex); + #ifdef __cplusplus } #endif /* __cplusplus */ |