diff options
-rw-r--r-- | mail/ChangeLog | 13 | ||||
-rw-r--r-- | mail/component-factory.c | 97 | ||||
-rw-r--r-- | mail/mail-ops.c | 17 | ||||
-rw-r--r-- | mail/mail-ops.h | 2 | ||||
-rw-r--r-- | mail/mail.h | 3 |
5 files changed, 121 insertions, 11 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog index 672fb860fe..ceabc5f8a5 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,16 @@ +2001-06-15 Jeffrey Stedfast <fejj@ximian.com> + + * mail-ops.c (mail_send_message): Fixed misuse of an uninitialized + variable. + + * component-factory.c (destination_folder_handle_drop): Implemented. + + * mail.h: Added prototype for evolution_folder_info_factory_init. + + * mail-ops.c (mail_do_transfer_messages): Now takes a const char* + as the dest_uri. This works better all around since we strdup'd + the string anyway. + 2001-06-15 Dan Winship <danw@ximian.com> * mail-format.c (mail_format_mime_message): We can't output diff --git a/mail/component-factory.c b/mail/component-factory.c index 2ab6d7c825..a4b95c30aa 100644 --- a/mail/component-factory.c +++ b/mail/component-factory.c @@ -67,7 +67,8 @@ static BonoboGenericFactory *component_factory = NULL; static GHashTable *storages_hash; static char *accepted_dnd_types[] = { - "message/rfc822", + "message/rfc822", /* if we drag from nautilus or something... */ + "x-evolution-folder-dnd", /* if we drag from an evolution folder... */ NULL }; @@ -273,6 +274,44 @@ destination_folder_handle_motion (EvolutionShellComponentDndDestinationFolder *f return TRUE; } +static gboolean +message_rfc822_dnd (CamelFolder *dest, CamelStream *stream) +{ + CamelMimeParser *mp; + CamelException *ex; + + mp = camel_mime_parser_new (); + camel_mime_parser_scan_from (mp, TRUE); + camel_mime_parser_init_with_stream (mp, stream); + + ex = camel_exception_new (); + + while (camel_mime_parser_step (mp, 0, 0) == HSCAN_FROM) { + CamelMessageInfo *info; + CamelMimeMessage *msg; + + msg = camel_mime_message_new (); + if (camel_mime_part_construct_from_parser (CAMEL_MIME_PART (msg), mp) == -1) { + camel_object_unref (CAMEL_OBJECT (msg)); + break; + } + + /* append the message to the folder... */ + info = g_new0 (CamelMessageInfo, 1); + camel_folder_append_message (dest, msg, info, ex); + camel_exception_clear (ex); + camel_object_unref (CAMEL_OBJECT (msg)); + + /* skip over the FROM_END state */ + camel_mime_parser_step (mp, 0, 0); + } + + camel_object_unref (CAMEL_OBJECT (mp)); + camel_exception_free (ex); + + return TRUE; +} + static CORBA_boolean destination_folder_handle_drop (EvolutionShellComponentDndDestinationFolder *folder, const char *physical_uri, @@ -281,14 +320,66 @@ destination_folder_handle_drop (EvolutionShellComponentDndDestinationFolder *fol const GNOME_Evolution_ShellComponentDnd_Data *data, gpointer user_data) { - CamelStream *stream; + gboolean retval = FALSE; if (action == GNOME_Evolution_ShellComponentDnd_ACTION_LINK) return FALSE; /* we can't create links */ g_print ("in destination_folder_handle_drop (%s)\n", physical_uri); - return TRUE; + if (data->format == 0) { + /* message/rfc822 */ + CamelFolder *folder; + CamelStream *stream; + + folder = mail_tool_uri_to_folder (physical_uri, NULL); + if (!folder) + return FALSE; + + /* write the message(s) out to a CamelStream so we can use it */ + stream = camel_stream_mem_new (); + camel_stream_write (stream, data->bytes._buffer, data->bytes._length); + camel_stream_reset (stream); + + retval = message_rfc822_dnd (folder, stream); + camel_object_unref (CAMEL_OBJECT (stream)); + } else { + /* x-evolution-dnd */ + char *uri, *in, *inptr, *inend; + CamelFolder *source; + GPtrArray *uids; + + /* format is "uri uid1\0uid2\0uid3\0...\0uidn" */ + + in = data->bytes._buffer; + inend = in + data->bytes._length; + + inptr = strchr (in, ' '); + uri = g_strndup (data->bytes._buffer, inptr - in); + source = mail_tool_uri_to_folder (uri, NULL); + g_free (uri); + + /* split the uids */ + inptr++; + uids = g_ptr_array_new (); + while (inptr < inend) { + char *start = inptr; + + while (inptr < inend && *inptr) + inptr++; + + g_ptr_array_add (uids, g_strndup (start, inptr - start)); + inptr++; + } + + mail_do_transfer_messages (source, uids, + action == GNOME_Evolution_ShellComponentDnd_ACTION_MOVE, + physical_uri); + } + + camel_object_unref (CAMEL_OBJECT (folder)); + + return retval; } diff --git a/mail/mail-ops.c b/mail/mail-ops.c index de2a933249..f79857de69 100644 --- a/mail/mail-ops.c +++ b/mail/mail-ops.c @@ -501,7 +501,7 @@ mail_send_message(CamelMimeMessage *message, const char *destination, CamelFilte /* Get information about the account this was composed by. */ acct_header = g_strdup (camel_medium_get_header (CAMEL_MEDIUM (message), "X-Evolution-Account")); - if (header) { + if (acct_header) { const MailConfigAccount *account; account = mail_config_get_account_by_name (acct_header); @@ -900,7 +900,8 @@ struct _transfer_msg { char *dest_uri; }; -static char *transfer_messages_desc(struct _mail_msg *mm, int done) +static char * +transfer_messages_desc (struct _mail_msg *mm, int done) { struct _transfer_msg *m = (struct _transfer_msg *)mm; @@ -909,7 +910,8 @@ static char *transfer_messages_desc(struct _mail_msg *mm, int done) } -static void transfer_messages_transfer(struct _mail_msg *mm) +static void +transfer_messages_transfer (struct _mail_msg *mm) { struct _transfer_msg *m = (struct _transfer_msg *)mm; CamelFolder *dest; @@ -941,7 +943,8 @@ static void transfer_messages_transfer(struct _mail_msg *mm) camel_object_unref((CamelObject *)dest); } -static void transfer_messages_free(struct _mail_msg *mm) +static void +transfer_messages_free (struct _mail_msg *mm) { struct _transfer_msg *m = (struct _transfer_msg *)mm; int i; @@ -964,14 +967,14 @@ static struct _mail_msg_op transfer_messages_op = { void mail_do_transfer_messages (CamelFolder *source, GPtrArray *uids, gboolean delete_from_source, - gchar *dest_uri) + const char *dest_uri) { struct _transfer_msg *m; - + g_return_if_fail (CAMEL_IS_FOLDER (source)); g_return_if_fail (uids != NULL); g_return_if_fail (dest_uri != NULL); - + m = mail_msg_new(&transfer_messages_op, NULL, sizeof(*m)); m->source = source; camel_object_ref((CamelObject *)source); diff --git a/mail/mail-ops.h b/mail/mail-ops.h index 205684da94..078b684448 100644 --- a/mail/mail-ops.h +++ b/mail/mail-ops.h @@ -50,7 +50,7 @@ void mail_append_mail (CamelFolder *folder, CamelMimeMessage *message, CamelMess void mail_do_transfer_messages (CamelFolder *source, GPtrArray *uids, gboolean delete_from_source, - gchar *dest_uri); + const char *dest_uri); /* get a single message, asynchronously */ void mail_get_message (CamelFolder *folder, const char *uid, diff --git a/mail/mail.h b/mail/mail.h index a024ff23e4..5c592a1263 100644 --- a/mail/mail.h +++ b/mail/mail.h @@ -72,3 +72,6 @@ void mail_hash_storage (CamelService *store, EvolutionStorage *storage); EvolutionStorage *mail_lookup_storage (CamelStore *store); void mail_storages_foreach (GHFunc func, gpointer data); int mail_storages_count (void); + + +void evolution_folder_info_factory_init (void); |