diff options
Diffstat (limited to 'mail/e-attachment-handler-mail.c')
-rw-r--r-- | mail/e-attachment-handler-mail.c | 524 |
1 files changed, 0 insertions, 524 deletions
diff --git a/mail/e-attachment-handler-mail.c b/mail/e-attachment-handler-mail.c deleted file mode 100644 index c17c97d8ca..0000000000 --- a/mail/e-attachment-handler-mail.c +++ /dev/null @@ -1,524 +0,0 @@ -/* - * e-attachment-handler-mail.c - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with the program; if not, see <http://www.gnu.org/licenses/> - * - * - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * - */ - -#include "e-attachment-handler-mail.h" - -#include <glib/gi18n.h> -#include <camel/camel-folder.h> -#include <camel/camel-stream-mem.h> - -#include "e-util/e-error.h" -#include "mail/em-composer-utils.h" -#include "mail/mail-tools.h" - -#define E_ATTACHMENT_HANDLER_MAIL_GET_PRIVATE(obj) \ - (G_TYPE_INSTANCE_GET_PRIVATE \ - ((obj), E_TYPE_ATTACHMENT_HANDLER_MAIL, EAttachmentHandlerMailPrivate)) - -struct _EAttachmentHandlerMailPrivate { - gint placeholder; -}; - -static gpointer parent_class; - -static const gchar *ui = -"<ui>" -" <popup name='context'>" -" <placeholder name='custom-actions'>" -" <menuitem action='mail-reply-sender'/>" -" <menuitem action='mail-reply-all'/>" -" <menuitem action='mail-forward'/>" -" </placeholder>" -" </popup>" -"</ui>"; - -/* Note: Do not use the info field. */ -static GtkTargetEntry target_table[] = { - { (gchar *) "message/rfc822", 0, 0 }, - { (gchar *) "x-uid-list", 0, 0 } -}; - -static void -attachment_handler_mail_forward (GtkAction *action, - EAttachmentView *view) -{ - EAttachment *attachment; - CamelMimePart *mime_part; - CamelDataWrapper *wrapper; - GList *selected; - - selected = e_attachment_view_get_selected_attachments (view); - g_return_if_fail (g_list_length (selected) == 1); - - attachment = E_ATTACHMENT (selected->data); - mime_part = e_attachment_get_mime_part (attachment); - wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (mime_part)); - - em_utils_forward_message (CAMEL_MIME_MESSAGE (wrapper), NULL); - - g_list_foreach (selected, (GFunc) g_object_unref, NULL); - g_list_free (selected); -} - -static void -attachment_handler_mail_reply_all (GtkAction *action, - EAttachmentView *view) -{ - EAttachment *attachment; - CamelMimePart *mime_part; - CamelDataWrapper *wrapper; - GList *selected; - - selected = e_attachment_view_get_selected_attachments (view); - g_return_if_fail (g_list_length (selected) == 1); - - attachment = E_ATTACHMENT (selected->data); - mime_part = e_attachment_get_mime_part (attachment); - wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (mime_part)); - - em_utils_reply_to_message ( - NULL, NULL, CAMEL_MIME_MESSAGE (wrapper), - REPLY_MODE_ALL, NULL); - - g_list_foreach (selected, (GFunc) g_object_unref, NULL); - g_list_free (selected); -} - -static void -attachment_handler_mail_reply_sender (GtkAction *action, - EAttachmentView *view) -{ - EAttachment *attachment; - CamelMimePart *mime_part; - CamelDataWrapper *wrapper; - GList *selected; - - selected = e_attachment_view_get_selected_attachments (view); - g_return_if_fail (g_list_length (selected) == 1); - - attachment = E_ATTACHMENT (selected->data); - mime_part = e_attachment_get_mime_part (attachment); - wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (mime_part)); - - em_utils_reply_to_message ( - NULL, NULL, CAMEL_MIME_MESSAGE (wrapper), - REPLY_MODE_SENDER, NULL); - - g_list_foreach (selected, (GFunc) g_object_unref, NULL); - g_list_free (selected); -} - -static GtkActionEntry standard_entries[] = { - - { "mail-forward", - "mail-forward", - N_("_Forward"), - NULL, - NULL, /* XXX Add a tooltip! */ - G_CALLBACK (attachment_handler_mail_forward) }, - - { "mail-reply-all", - "mail-reply-all", - N_("Reply to _All"), - NULL, - NULL, /* XXX Add a tooltip! */ - G_CALLBACK (attachment_handler_mail_reply_all) }, - - { "mail-reply-sender", - "mail-reply-sender", - N_("_Reply to Sender"), - NULL, - NULL, /* XXX Add a tooltip! */ - G_CALLBACK (attachment_handler_mail_reply_sender) } -}; - -static void -attachment_handler_mail_message_rfc822 (EAttachmentView *view, - GdkDragContext *drag_context, - gint x, - gint y, - GtkSelectionData *selection_data, - guint info, - guint time) -{ - static GdkAtom atom = GDK_NONE; - EAttachmentStore *store; - EAttachment *attachment; - CamelMimeMessage *message; - CamelDataWrapper *wrapper; - CamelStream *stream; - const gchar *data; - gboolean success = FALSE; - gpointer parent; - gint length; - - if (G_UNLIKELY (atom == GDK_NONE)) - atom = gdk_atom_intern_static_string ("message/rfc822"); - - if (gtk_selection_data_get_target (selection_data) != atom) - return; - - g_signal_stop_emission_by_name (view, "drag-data-received"); - - data = (const gchar *) gtk_selection_data_get_data (selection_data); - length = gtk_selection_data_get_length (selection_data); - - stream = camel_stream_mem_new (); - camel_stream_write (stream, data, length); - camel_stream_reset (stream); - - message = camel_mime_message_new (); - wrapper = CAMEL_DATA_WRAPPER (message); - - if (camel_data_wrapper_construct_from_stream (wrapper, stream) == -1) - goto exit; - - store = e_attachment_view_get_store (view); - - parent = gtk_widget_get_toplevel (GTK_WIDGET (view)); - parent = GTK_WIDGET_TOPLEVEL (parent) ? parent : NULL; - - attachment = e_attachment_new_for_message (message); - e_attachment_store_add_attachment (store, attachment); - e_attachment_load_async ( - attachment, (GAsyncReadyCallback) - e_attachment_load_handle_error, parent); - g_object_unref (attachment); - - success = TRUE; - -exit: - camel_object_unref (message); - camel_object_unref (stream); - - gtk_drag_finish (drag_context, success, FALSE, time); -} - -static void -attachment_handler_mail_x_uid_list (EAttachmentView *view, - GdkDragContext *drag_context, - gint x, - gint y, - GtkSelectionData *selection_data, - guint info, - guint time) -{ - static GdkAtom atom = GDK_NONE; - CamelException ex = CAMEL_EXCEPTION_INITIALISER; - CamelDataWrapper *wrapper; - CamelMimeMessage *message; - CamelMultipart *multipart; - CamelMimePart *mime_part; - CamelFolder *folder = NULL; - EAttachment *attachment; - EAttachmentStore *store; - GPtrArray *uids; - const gchar *data; - const gchar *cp, *end; - gchar *description; - gpointer parent; - gint length; - guint ii; - - if (G_UNLIKELY (atom == GDK_NONE)) - atom = gdk_atom_intern_static_string ("x-uid-list"); - - if (gtk_selection_data_get_target (selection_data) != atom) - return; - - store = e_attachment_view_get_store (view); - - parent = gtk_widget_get_toplevel (GTK_WIDGET (view)); - parent = GTK_WIDGET_TOPLEVEL (parent) ? parent : NULL; - - uids = g_ptr_array_new (); - - data = (const gchar *) gtk_selection_data_get_data (selection_data); - length = gtk_selection_data_get_length (selection_data); - - /* The UID list is delimited by NUL characters. - * Brilliant. So we can't use g_strsplit(). */ - - cp = data; - end = data + length; - - while (cp < end) { - const gchar *start = cp; - - while (cp < end && *cp != '\0') - cp++; - - /* Skip the first string. */ - if (start > data) - g_ptr_array_add (uids, g_strndup (start, cp - start)); - - cp++; - } - - if (uids->len == 0) - goto exit; - - /* The first string is the folder URI. */ - folder = mail_tool_uri_to_folder (data, 0, &ex); - if (folder == NULL) - goto exit; - - /* Handle one message. */ - if (uids->len == 1) { - message = camel_folder_get_message ( - folder, uids->pdata[0], &ex); - if (message == NULL) - goto exit; - - attachment = e_attachment_new_for_message (message); - e_attachment_store_add_attachment (store, attachment); - e_attachment_load_async ( - attachment, (GAsyncReadyCallback) - e_attachment_load_handle_error, parent); - g_object_unref (attachment); - - camel_object_unref (message); - goto exit; - } - - /* Build a multipart/digest message out of the UIDs. */ - - multipart = camel_multipart_new (); - wrapper = CAMEL_DATA_WRAPPER (multipart); - camel_data_wrapper_set_mime_type (wrapper, "multipart/digest"); - camel_multipart_set_boundary (multipart, NULL); - - for (ii = 0; ii < uids->len; ii++) { - message = camel_folder_get_message ( - folder, uids->pdata[ii], &ex); - if (message == NULL) { - camel_object_unref (multipart); - goto exit; - } - - mime_part = camel_mime_part_new (); - wrapper = CAMEL_DATA_WRAPPER (message); - camel_mime_part_set_disposition (mime_part, "inline"); - camel_medium_set_content_object ( - CAMEL_MEDIUM (mime_part), wrapper); - camel_mime_part_set_content_type (mime_part, "message/rfc822"); - camel_multipart_add_part (multipart, mime_part); - camel_object_unref (mime_part); - - camel_object_unref (message); - } - - mime_part = camel_mime_part_new (); - wrapper = CAMEL_DATA_WRAPPER (multipart); - camel_medium_set_content_object (CAMEL_MEDIUM (mime_part), wrapper); - - /* Translators: This is only for multiple messages. */ - description = g_strdup_printf (_("%d attached messages"), uids->len); - camel_mime_part_set_description (mime_part, description); - g_free (description); - - attachment = e_attachment_new (); - e_attachment_set_mime_part (attachment, mime_part); - e_attachment_store_add_attachment (store, attachment); - e_attachment_load_async ( - attachment, (GAsyncReadyCallback) - e_attachment_load_handle_error, parent); - g_object_unref (attachment); - - camel_object_unref (mime_part); - camel_object_unref (multipart); - -exit: - if (camel_exception_is_set (&ex)) { - gchar *folder_name; - - if (folder != NULL) - camel_object_get ( - folder, NULL, CAMEL_FOLDER_NAME, - &folder_name, NULL); - else - folder_name = g_strdup (data); - - e_error_run ( - parent, "mail-composer:attach-nomessages", - folder_name, camel_exception_get_description (&ex), - NULL); - - if (folder != NULL) - camel_object_free ( - folder, CAMEL_FOLDER_NAME, folder_name); - else - g_free (folder_name); - - camel_exception_clear (&ex); - } - - if (folder != NULL) - camel_object_unref (folder); - - g_ptr_array_free (uids, TRUE); - - g_signal_stop_emission_by_name (view, "drag-data-received"); -} - -static void -attachment_handler_mail_update_actions (EAttachmentView *view) -{ - EAttachment *attachment; - CamelMimePart *mime_part; - CamelDataWrapper *wrapper; - GtkActionGroup *action_group; - GList *selected; - gboolean visible = FALSE; - - selected = e_attachment_view_get_selected_attachments (view); - - if (g_list_length (selected) != 1) - goto exit; - - attachment = E_ATTACHMENT (selected->data); - mime_part = e_attachment_get_mime_part (attachment); - - if (!CAMEL_IS_MIME_PART (mime_part)) - goto exit; - - wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (mime_part)); - - visible = CAMEL_IS_MIME_MESSAGE (wrapper); - -exit: - action_group = e_attachment_view_get_action_group (view, "mail"); - gtk_action_group_set_visible (action_group, visible); - - g_list_foreach (selected, (GFunc) g_object_unref, NULL); - g_list_free (selected); -} - -static void -attachment_handler_mail_constructed (GObject *object) -{ - EAttachmentHandler *handler; - EAttachmentView *view; - GtkActionGroup *action_group; - GtkUIManager *ui_manager; - GError *error = NULL; - - handler = E_ATTACHMENT_HANDLER (object); - - /* Chain up to parent's constructed() method. */ - G_OBJECT_CLASS (parent_class)->constructed (object); - - view = e_attachment_handler_get_view (handler); - - action_group = e_attachment_view_add_action_group (view, "mail"); - gtk_action_group_add_actions ( - action_group, standard_entries, - G_N_ELEMENTS (standard_entries), view); - - ui_manager = e_attachment_view_get_ui_manager (view); - gtk_ui_manager_add_ui_from_string (ui_manager, ui, -1, &error); - - if (error != NULL) { - g_warning ("%s", error->message); - g_error_free (error); - } - - g_signal_connect ( - view, "update-actions", - G_CALLBACK (attachment_handler_mail_update_actions), - NULL); - - g_signal_connect ( - view, "drag-data-received", - G_CALLBACK (attachment_handler_mail_message_rfc822), - NULL); - - g_signal_connect ( - view, "drag-data-received", - G_CALLBACK (attachment_handler_mail_x_uid_list), - NULL); -} - -static GdkDragAction -attachment_handler_mail_get_drag_actions (EAttachmentHandler *handler) -{ - return GDK_ACTION_COPY; -} - -static const GtkTargetEntry * -attachment_handler_mail_get_target_table (EAttachmentHandler *handler, - guint *n_targets) -{ - if (n_targets != NULL) - *n_targets = G_N_ELEMENTS (target_table); - - return target_table; -} - -static void -attachment_handler_mail_class_init (EAttachmentHandlerMailClass *class) -{ - GObjectClass *object_class; - EAttachmentHandlerClass *handler_class; - - parent_class = g_type_class_peek_parent (class); - g_type_class_add_private (class, sizeof (EAttachmentHandlerMailPrivate)); - - object_class = G_OBJECT_CLASS (class); - object_class->constructed = attachment_handler_mail_constructed; - - handler_class = E_ATTACHMENT_HANDLER_CLASS (class); - handler_class->get_drag_actions = attachment_handler_mail_get_drag_actions; - handler_class->get_target_table = attachment_handler_mail_get_target_table; -} - -static void -attachment_handler_mail_init (EAttachmentHandlerMail *handler) -{ - handler->priv = E_ATTACHMENT_HANDLER_MAIL_GET_PRIVATE (handler); -} - -GType -e_attachment_handler_mail_get_type (void) -{ - static GType type = 0; - - if (G_UNLIKELY (type == 0)) { - static const GTypeInfo type_info = { - sizeof (EAttachmentHandlerMailClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) attachment_handler_mail_class_init, - (GClassFinalizeFunc) NULL, - NULL, /* class_data */ - sizeof (EAttachmentHandlerMail), - 0, /* n_preallocs */ - (GInstanceInitFunc) attachment_handler_mail_init, - NULL /* value_table */ - }; - - type = g_type_register_static ( - E_TYPE_ATTACHMENT_HANDLER, - "EAttachmentHandlerMail", &type_info, 0); - } - - return type; -} |