diff options
-rw-r--r-- | mail/ChangeLog | 6 | ||||
-rw-r--r-- | mail/component-factory.c | 48 | ||||
-rw-r--r-- | mail/mail-ops.c | 110 | ||||
-rw-r--r-- | mail/mail-ops.h | 6 |
4 files changed, 166 insertions, 4 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog index 085bc9211a..e03e667e17 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,8 +1,14 @@ 2001-05-23 Jeffrey Stedfast <fejj@ximian.com> + * component-factory.c (xfer_folder): New function that the shell + component calls to copy/move a folder. + (component_fn): Set the xfer_folder_fn argument. + * mail-ops.c (mail_remove_folder): New async function to remove a folder. God knows if it does what the ShellComponent needs or not yet. + (mail_xfer_folder): Yet another yummy async function to move or + copy a folder to a new location. * component-factory.c (storage_remove_folder): New function for removing folders. diff --git a/mail/component-factory.c b/mail/component-factory.c index 6bfd489bff..312bcf3054 100644 --- a/mail/component-factory.c +++ b/mail/component-factory.c @@ -188,9 +188,7 @@ remove_folder (EvolutionShellComponent *shell_component, CORBA_exception_init (&ev); - /* FIXME: what if the folder is mh or maildir? */ - /* ?? maybe we should just rm -rf the physical_uri?? */ - uri = g_strdup_printf ("mbox://%s", physical_uri); + uri = g_strdup_printf ("file://%s", physical_uri); mail_remove_folder (uri, do_remove_folder, CORBA_Object_duplicate (listener, &ev)); GNOME_Evolution_ShellComponentListener_notifyResult (listener, GNOME_Evolution_ShellComponentListener_OK, &ev); @@ -198,6 +196,48 @@ remove_folder (EvolutionShellComponent *shell_component, CORBA_exception_free (&ev); } +static void +do_xfer_folder (char *src_uri, char *dest_uri, gboolean remove_source, CamelFolder *dest_folder, void *data) +{ + GNOME_Evolution_ShellComponentListener listener = data; + GNOME_Evolution_ShellComponentListener_Result result; + CORBA_Environment ev; + + if (dest_folder) + result = GNOME_Evolution_ShellComponentListener_OK; + else + result = GNOME_Evolution_ShellComponentListener_INVALID_URI; + + CORBA_exception_init (&ev); + GNOME_Evolution_ShellComponentListener_notifyResult (listener, result, &ev); + CORBA_Object_release (listener, &ev); + CORBA_exception_free (&ev); +} + +static void +xfer_folder (EvolutionShellComponent *shell_component, + const char *source_physical_uri, + const char *destination_physical_uri, + gboolean remove_source, + const GNOME_Evolution_ShellComponentListener listener, + void *closure) +{ + CORBA_Environment ev; + char *dest_uri; + + CORBA_exception_init (&ev); + + dest_uri = g_strdup_printf ("mbox://%s", destination_physical_uri); + mail_xfer_folder (source_physical_uri, dest_uri, remove_source, do_xfer_folder, + CORBA_Object_duplicate (listener, &ev)); + g_free (dest_uri); + + GNOME_Evolution_ShellComponentListener_notifyResult (listener, + GNOME_Evolution_ShellComponentListener_OK, &ev); + + CORBA_exception_free (&ev); +} + static struct { char *name, **uri; CamelFolder **folder; @@ -334,7 +374,7 @@ component_fn (BonoboGenericFactory *factory, void *closure) create_view, create_folder, remove_folder, - NULL, /* xfer_folder_fn */ + xfer_folder, NULL, /* populate_folder_context_menu_fn */ NULL, /* get_dnd_selection_fn */ NULL); diff --git a/mail/mail-ops.c b/mail/mail-ops.c index 23c0b047db..4b99bc76ac 100644 --- a/mail/mail-ops.c +++ b/mail/mail-ops.c @@ -1463,6 +1463,116 @@ mail_remove_folder (const char *uri, void (*done) (char *uri, gboolean removed, e_thread_put (mail_thread_new, (EMsg *)m); } +/* ** XFER FOLDER ******************************************************* */ + +struct _xfer_folder_msg { + struct _mail_msg msg; + + char *src_uri; + char *dest_uri; + gboolean remove; + CamelFolder *folder; + void (*done) (char *src_uri, char *dest_uri, gboolean remove, CamelFolder *folder, void *data); + void *data; +}; + +static char * +xfer_folder_desc (struct _mail_msg *mm, int done) +{ + struct _xfer_folder_msg *m = (struct _xfer_folder_msg *)mm; + + if (m->remove) + return g_strdup_printf (_("Moving folder %s to %s"), m->src_uri, m->dest_uri); + else + return g_strdup_printf (_("Copying folder %s to %s"), m->src_uri, m->dest_uri); +} + +static void +xfer_folder_get (struct _mail_msg *mm) +{ + struct _xfer_folder_msg *m = (struct _xfer_folder_msg *)mm; + CamelFolder *src, *dest = NULL; + GPtrArray *uids; + + camel_operation_register (mm->cancel); + + src = mail_tool_uri_to_folder (m->src_uri, &mm->ex); + if (camel_exception_is_set (&mm->ex)) + goto done; + + dest = mail_tool_get_folder_from_urlname (m->dest_uri, "mbox", + CAMEL_STORE_FOLDER_CREATE | CAMEL_STORE_FOLDER_BODY_INDEX, + &mm->ex); + if (camel_exception_is_set (&mm->ex)) + goto done; + + uids = camel_folder_get_uids (src); + if (m->remove) + camel_folder_move_messages_to (src, uids, dest, &mm->ex); + else + camel_folder_copy_messages_to (src, uids, dest, &mm->ex); + + camel_folder_free_uids (src, uids); + + if (camel_exception_is_set (&mm->ex)) + goto done; + + if (m->remove) + camel_store_delete_folder (src->parent_store, src->full_name, &mm->ex); + + done: + if (src) + camel_object_unref (CAMEL_OBJECT (src)); + + m->folder = dest; + + camel_operation_unregister (mm->cancel); +} + +static void +xfer_folder_got (struct _mail_msg *mm) +{ + struct _xfer_folder_msg *m = (struct _xfer_folder_msg *)mm; + + if (m->done) + m->done (m->src_uri, m->dest_uri, m->remove, m->folder, m->data); +} + +static void +xfer_folder_free (struct _mail_msg *mm) +{ + struct _xfer_folder_msg *m = (struct _xfer_folder_msg *)mm; + + g_free (m->src_uri); + g_free (m->dest_uri); + if (m->folder) + camel_object_unref (CAMEL_OBJECT (m->folder)); +} + +static struct _mail_msg_op xfer_folder_op = { + xfer_folder_desc, + xfer_folder_get, + xfer_folder_got, + xfer_folder_free, +}; + +void +mail_xfer_folder (const char *src_uri, const char *dest_uri, gboolean remove_source, + void (*done) (char *src_uri, char *dest_uri, gboolean remove, CamelFolder *folder, void *data), + void *data) +{ + struct _xfer_folder_msg *m; + + m = mail_msg_new (&xfer_folder_op, NULL, sizeof(*m)); + m->src_uri = g_strdup (src_uri); + m->dest_uri = g_strdup (dest_uri); + m->remove = remove_source; + m->data = data; + m->done = done; + + e_thread_put (mail_thread_new, (EMsg *)m); +} + /* ** SYNC FOLDER ********************************************************* */ struct _sync_folder_msg { diff --git a/mail/mail-ops.h b/mail/mail-ops.h index 305dae6b77..e6677c4443 100644 --- a/mail/mail-ops.h +++ b/mail/mail-ops.h @@ -100,6 +100,12 @@ void mail_remove_folder (const char *uri, void (*done) (char *uri, gboolean removed, void *data), void *data); +/* transfer (copy/move) a folder */ +void mail_xfer_folder (const char *src_uri, const char *dest_uri, gboolean remove_source, + void (*done) (char *src_uri, char *dest_uri, gboolean remove_source, + CamelFolder *folder, void *data), + void *data); + /* save messages */ int mail_save_messages (CamelFolder *folder, GPtrArray *uids, const char *path, void (*done) (CamelFolder *folder, GPtrArray *uids, char *path, void *data), |