balsa r8025 - in trunk: . libbalsa src



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]