balsa r8025 - in trunk: . libbalsa src
- From: pawels svn gnome org
- To: svn-commits-list gnome org
- Subject: balsa r8025 - in trunk: . libbalsa src
- Date: Sat, 27 Dec 2008 13:14:56 +0000 (UTC)
Author: pawels
Date: Sat Dec 27 13:14:56 2008
New Revision: 8025
URL: http://svn.gnome.org/viewvc/balsa?rev=8025&view=rev
Log:
* src/balsa-mime-widget-message.c: call balsa_message_save_part()
from header context menu.
* src/balsa-message.[ch]: implement balsa_message_save_part().
Call it from the "Message parts" tab.
* libbalsa/mailbox_imap.c: mark GMimeMessagePart as saveable as well.
* libbalsa/mailbox_local.c: ditto.
* libbalsa/body.c: GMime streams for MessageParts have to be created
in a particular way.
Modified:
trunk/ChangeLog
trunk/libbalsa/body.c
trunk/libbalsa/mailbox_imap.c
trunk/libbalsa/mailbox_local.c
trunk/src/balsa-index.c
trunk/src/balsa-message.c
trunk/src/balsa-message.h
trunk/src/balsa-mime-widget-message.c
Modified: trunk/libbalsa/body.c
==============================================================================
--- trunk/libbalsa/body.c (original)
+++ trunk/libbalsa/body.c Sat Dec 27 13:14:56 2008
@@ -441,9 +441,33 @@
if (body->message->mailbox) {
GMimeDataWrapper *wrapper;
GMimePartEncodingType encoding;
-
if(!libbalsa_mailbox_get_message_part(body->message, body, err))
return NULL;
+
+ /* We handle "real" parts and embedded rfc822 messages
+ differently. There is probably a way to unify if we use
+ GMimeObject common denominator. */
+ if(GMIME_IS_MESSAGE_PART(body->mime_part)) {
+ ssize_t bytes_written;
+ GMimeMessage *msg = g_mime_message_part_get_message
+ (GMIME_MESSAGE_PART(body->mime_part));
+ stream = g_mime_stream_mem_new();
+ libbalsa_mailbox_lock_store(body->message->mailbox);
+ bytes_written =
+ g_mime_object_write_to_stream(GMIME_OBJECT(msg), stream);
+ libbalsa_mailbox_unlock_store(body->message->mailbox);
+ printf("Written %ld bytes of embedded message\n",
+ (long) bytes_written);
+ if(bytes_written < 0) {
+ g_object_unref(stream);
+ g_set_error(err, LIBBALSA_MAILBOX_ERROR,
+ LIBBALSA_MAILBOX_ACCESS_ERROR,
+ _("Could not read embedded message"));
+ return NULL;
+ }
+ g_mime_stream_reset(stream);
+ return stream;
+ }
wrapper =
g_mime_part_get_content_object(GMIME_PART(body->mime_part));
Modified: trunk/libbalsa/mailbox_imap.c
==============================================================================
--- trunk/libbalsa/mailbox_imap.c (original)
+++ trunk/libbalsa/mailbox_imap.c Sat Dec 27 13:14:56 2008
@@ -2476,7 +2476,8 @@
/* FIXME if GMIME_IS_MESSAGE_PART? */
}
return GMIME_IS_PART(part->mime_part)
- || GMIME_IS_MULTIPART(part->mime_part);
+ || GMIME_IS_MULTIPART(part->mime_part)
+ || GMIME_IS_MESSAGE_PART(part->mime_part);
}
static gboolean
Modified: trunk/libbalsa/mailbox_local.c
==============================================================================
--- trunk/libbalsa/mailbox_local.c (original)
+++ trunk/libbalsa/mailbox_local.c Sat Dec 27 13:14:56 2008
@@ -1371,7 +1371,9 @@
{
g_return_val_if_fail(part->mime_part, FALSE);
- return GMIME_IS_PART(part->mime_part);
+ return GMIME_IS_PART(part->mime_part)
+ || GMIME_IS_MULTIPART(part->mime_part)
+ || GMIME_IS_MESSAGE_PART(part->mime_part);
}
/*--------------------------------*/
Modified: trunk/src/balsa-index.c
==============================================================================
--- trunk/src/balsa-index.c (original)
+++ trunk/src/balsa-index.c Sat Dec 27 13:14:56 2008
@@ -1758,7 +1758,7 @@
static void
-mru_menu_cb(gchar * url, BalsaIndex * index)
+mru_menu_cb(const gchar * url, BalsaIndex * index)
{
LibBalsaMailbox *mailbox = balsa_find_mailbox_by_url(url);
Modified: trunk/src/balsa-message.c
==============================================================================
--- trunk/src/balsa-message.c (original)
+++ trunk/src/balsa-message.c Sat Dec 27 13:14:56 2008
@@ -1541,6 +1541,35 @@
gtk_tree_view_expand_all(GTK_TREE_VIEW(bm->treeview));
}
+void
+balsa_message_copy_part(const gchar *url, LibBalsaMessageBody *part)
+{
+ GError *err = NULL;
+ LibBalsaMailbox *mailbox = balsa_find_mailbox_by_url(url);
+ GMimeStream *stream;
+
+ g_return_if_fail(mailbox != NULL);
+
+ stream = libbalsa_message_body_get_stream(part, &err);
+
+ if (!stream) {
+ libbalsa_information(LIBBALSA_INFORMATION_ERROR,
+ _("Reading embedded message failed: %s"),
+ err ? err->message : "?");
+ g_clear_error(&err);
+ return;
+ }
+
+ if (!libbalsa_mailbox_add_message(mailbox, stream, 0, &err)) {
+ libbalsa_information(LIBBALSA_INFORMATION_ERROR,
+ _("Appending message to %s failed: %s"),
+ mailbox->name,
+ err ? err->message : "?");
+ g_clear_error(&err);
+ }
+ g_object_unref(stream);
+}
+
static void
part_create_menu (BalsaPartInfo* info)
/* Remarks: Will add items in the following order:
@@ -1567,11 +1596,26 @@
G_CALLBACK (balsa_mime_widget_ctx_menu_vfs_cb),
(gpointer)info->body);
- menu_item = gtk_menu_item_new_with_label (_("Save..."));
+ menu_item = gtk_menu_item_new_with_mnemonic (_("_Save..."));
g_signal_connect (G_OBJECT (menu_item), "activate",
G_CALLBACK (balsa_mime_widget_ctx_menu_save), (gpointer) info->body);
gtk_menu_shell_append (GTK_MENU_SHELL (info->popup_menu), menu_item);
+ if (g_ascii_strcasecmp(content_type, "message/rfc822") == 0) {
+ GtkWidget *submenu;
+
+ menu_item =
+ gtk_menu_item_new_with_mnemonic(_("_Copy to folder..."));
+ gtk_menu_shell_append(GTK_MENU_SHELL(info->popup_menu), menu_item);
+
+ submenu =
+ balsa_mblist_mru_menu(GTK_WINDOW(gtk_widget_get_toplevel(info->popup_menu)),
+ &balsa_app.folder_mru,
+ G_CALLBACK(balsa_message_copy_part),
+ info->body);
+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu);
+ }
+
gtk_widget_show_all (info->popup_menu);
g_free (content_type);
}
Modified: trunk/src/balsa-message.h
==============================================================================
--- trunk/src/balsa-message.h (original)
+++ trunk/src/balsa-message.h Sat Dec 27 13:14:56 2008
@@ -109,6 +109,7 @@
void balsa_message_previous_part(BalsaMessage * bmessage);
gboolean balsa_message_has_previous_part(BalsaMessage * bmessage);
void balsa_message_save_current_part(BalsaMessage * bmessage);
+void balsa_message_copy_part(const gchar *url, LibBalsaMessageBody *part);
void balsa_message_set_displayed_headers(BalsaMessage * bmessage,
ShownHeaders sh);
Modified: trunk/src/balsa-mime-widget-message.c
==============================================================================
--- trunk/src/balsa-mime-widget-message.c (original)
+++ trunk/src/balsa-mime-widget-message.c Sat Dec 27 13:14:56 2008
@@ -456,16 +456,9 @@
}
static void
-bm_header_ctx_menu_copy(GtkWidget * menu_item,
- LibBalsaMessageBody *part)
-{
- printf("IMplement me!\n");
-}
-
-static void
bm_header_extend_popup(GtkTextView *textview, GtkMenu *menu, gpointer arg)
{
- GtkWidget *menu_item;
+ GtkWidget *menu_item, *submenu;
GtkWidget *separator = gtk_separator_menu_item_new();
gtk_menu_shell_append(GTK_MENU_SHELL(menu), separator);
@@ -476,12 +469,20 @@
arg);
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
gtk_widget_show(menu_item);
- menu_item = gtk_menu_item_new_with_label(_("Copy to folder..."));
- g_signal_connect(G_OBJECT(menu_item), "activate",
- G_CALLBACK(bm_header_ctx_menu_copy),
- arg);
+
+
+ menu_item = gtk_menu_item_new_with_mnemonic(_("_Copy to folder..."));
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
gtk_widget_show(menu_item);
+
+ submenu =
+ balsa_mblist_mru_menu(GTK_WINDOW
+ (gtk_widget_get_toplevel(GTK_WIDGET(textview))),
+ &balsa_app.folder_mru,
+ G_CALLBACK(balsa_message_copy_part), arg);
+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item),
+ submenu);
+ gtk_widget_show_all(submenu);
}
/* Indents in pixels: */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]