File bnc-472719-evo-disk-summary-patches.patch of Package evolution

--- e-util/e-util.c	2008-11-07 10:04:08.000000000 +0530
+++ e-util/e-util.c	2009-02-04 11:45:58.000000000 +0530
@@ -39,7 +39,7 @@
 #include <glib/gi18n.h>
 #include <glib/gstdio.h>
 #include <libgnome/gnome-help.h>
-#include <libgnome/gnome-util.h>
+#include <libgnome/gnome-init.h>
 
 #ifdef G_OS_WIN32
 #include <windows.h>
@@ -70,6 +70,27 @@ e_get_user_data_dir (void)
 }
 
 /**
+ * e_get_accels_filename:
+ *
+ * Returns the name of the user data file containing custom keyboard
+ * accelerator specifications.
+ *
+ * Returns: filename for accelerator specifications
+ **/
+const gchar *
+e_get_accels_filename (void)
+{
+	static gchar *filename = NULL;
+
+	if (G_UNLIKELY (filename == NULL))
+		filename = g_build_filename (
+			gnome_user_dir_get (),
+			"accels", PACKAGE, NULL);
+
+	return filename;
+}
+
+/**
  * e_display_help:
  * @parent: a parent #GtkWindow or %NULL
  * @link_id: help section to present or %NULL
--- e-util/e-util.h	2008-10-13 14:13:22.000000000 +0530
+++ e-util/e-util.h	2009-02-04 11:45:58.000000000 +0530
@@ -41,6 +41,7 @@ typedef enum {
 } EFocus;
 
 const gchar *	e_get_user_data_dir		(void);
+const gchar *	e_get_accels_filename		(void);
 void		e_display_help			(GtkWindow *parent,
 						 const gchar *link_id);
 
--- e-util/e-util-labels.c	2009-02-04 09:57:29.000000000 +0530
+++ e-util/e-util-labels.c	2009-02-04 11:48:00.000000000 +0530
@@ -83,7 +83,7 @@ e_util_labels_parse (GConfClient *client
 
 		/* Needed for Backward Compatibility */
 		if (num < LABEL_DEFAULTS_NUM) {
-			label->name = g_strdup (_(buf));
+			label->name = g_strdup ((buf && *buf) ? buf : _(label_defaults[num].name));
 			label->tag = g_strdup (label_defaults[num].tag);
 			num++;
 		} else if (!tag) {
--- mail/em-folder-tree.c	2008-11-07 10:04:07.000000000 +0530
+++ mail/em-folder-tree.c	2009-02-04 11:46:18.000000000 +0530
@@ -1896,7 +1896,8 @@ emft_tree_row_expanded (GtkTreeView *tre
 		return;
 	}
 
-	gtk_tree_store_set((GtkTreeStore *)model, root, COL_BOOL_LOAD_SUBDIRS, FALSE, -1);
+	/* do not set LOAD_SUBDIRS to FALSE until we are really done with loading */
+	/* gtk_tree_store_set ((GtkTreeStore *)model, root, COL_BOOL_LOAD_SUBDIRS, FALSE, -1); */
 
 	m = mail_msg_new (&get_folder_info_info);
 	m->root = gtk_tree_row_reference_new (model, tree_path);
@@ -2093,6 +2094,23 @@ emft_popup_properties (EPopup *ep, EPopu
 	g_free (uri);
 }
 
+static void
+emft_popup_uvfolder (EPopup *ep, EPopupItem *pitem, void *data)
+{
+	EMFolderTree *emft = data;
+	CamelFolder *folder;
+	char *meta = camel_object_meta_get(folder, "vfolder:unread");
+
+	if ((folder = em_folder_tree_get_selected_folder (emft)) != NULL) {
+		if (!meta || strcmp(meta, "false") == 0)
+			camel_object_meta_set(folder, "vfolder:unread", "true");
+		else
+			camel_object_meta_set(folder, "vfolder:unread", "false");
+	}
+	camel_object_state_write (folder);
+	g_free (meta);
+}
+
 static EPopupItem emft_popup_items[] = {
 #if 0
 	{ E_POPUP_ITEM, "00.emc.00", N_("_View"), emft_popup_view, NULL, NULL, EM_POPUP_FOLDER_SELECT },
@@ -2210,6 +2228,25 @@ emft_popup (EMFolderTree *emft, GdkEvent
 
 	if ((folder_type_flags & CAMEL_FOLDER_TYPE_MASK) == CAMEL_FOLDER_TYPE_TRASH)
 		menus = g_slist_prepend (menus, &trash_popup_item);
+	if (!isstore && strstr(uri, "vfolder")) {
+		/* This is a vfolder, so lets add hacked up menu item. */
+		static EPopupItem *item = NULL;
+		char *meta = camel_object_meta_get (selfolder, "vfolder:unread");
+
+		if (!item)
+			item = g_malloc0(sizeof(*item));
+		if (meta && (strcmp (meta, "true") == 0))
+			item->type = E_POPUP_TOGGLE | E_POPUP_ACTIVE;
+		else
+			item->type = E_POPUP_TOGGLE & ~E_POPUP_ACTIVE;
+		item->path = "99.emc.99";
+		item->label = _("_Unread Search Folder");
+		item->activate = emft_popup_uvfolder;
+		item->visible = EM_POPUP_FOLDER_SELECT;
+		item->user_data = NULL;
+		menus = g_slist_prepend (menus, item);
+		g_free (meta);
+	}
 
 	e_popup_add_items ((EPopup *)emp, menus, NULL, emft_popup_free, emft);
 
--- mail/em-folder-view.c	2008-11-07 10:04:07.000000000 +0530
+++ mail/em-folder-view.c	2009-02-04 11:46:18.000000000 +0530
@@ -478,13 +478,15 @@ em_folder_view_mark_selected(EMFolderVie
 		return 0;
 
 	uids = message_list_get_selected(emfv->list);
-	camel_folder_freeze(emfv->folder);
+	if (!CAMEL_IS_VEE_FOLDER(emfv->folder))
+		camel_folder_freeze(emfv->folder);
 
 	for (i=0; i<uids->len; i++)
 		camel_folder_set_message_flags(emfv->folder, uids->pdata[i], mask, set);
 
 	message_list_free_uids(emfv->list, uids);
-	camel_folder_thaw(emfv->folder);
+	if (!CAMEL_IS_VEE_FOLDER(emfv->folder))
+		camel_folder_thaw(emfv->folder);
 
 	return i;
 }
@@ -886,6 +888,7 @@ emfv_popup_source(EPopup *ep, EPopupItem
 
 	emmb = (EMMessageBrowser *)em_message_browser_window_new();
 	em_format_set_session((EMFormat *)((EMFolderView *)emmb)->preview, ((EMFormat *)emfv->preview)->session);
+	message_list_ensure_message (((EMFolderView *)emmb)->list, uids->pdata[0]);	
 	em_folder_view_set_folder((EMFolderView *)emmb, emfv->folder, emfv->folder_uri);
 	em_format_set_mode((EMFormat *)((EMFolderView *)emmb)->preview, EM_FORMAT_SOURCE);
 	em_folder_view_set_message((EMFolderView *)emmb, uids->pdata[0], FALSE);
@@ -1079,7 +1082,8 @@ emfv_delete_msg_response (GtkWidget *dia
 		}
 
 		uids = message_list_get_selected(emfv->list);
-		camel_folder_freeze(emfv->folder);
+		if (!CAMEL_IS_VEE_FOLDER(emfv->folder))
+			camel_folder_freeze(emfv->folder);
 
 		for (count=0; count < uids->len; count++) {
 			if (camel_folder_get_message_flags (emfv->folder, uids->pdata[count]) & CAMEL_MESSAGE_USER_NOT_DELETABLE) {
@@ -1102,7 +1106,8 @@ emfv_delete_msg_response (GtkWidget *dia
 		}
 
 		message_list_free_uids(emfv->list, uids);
-		camel_folder_thaw(emfv->folder);
+		if (!CAMEL_IS_VEE_FOLDER(emfv->folder))
+			camel_folder_thaw(emfv->folder);
 
 		emfv_select_next_message (emfv, count, FALSE);
 	}
@@ -2743,37 +2748,6 @@ emfv_format_link_clicked(EMFormatHTMLDis
 	}
 }
 
-static gchar *
-url_unescape_amp (const gchar *url)
-{
-	gchar *buff;
-	int i, j, amps;
-
-	if (!url)
-		return NULL;
-
-	amps = 0;
-	for (i = 0; url [i]; i++) {
-		if (url [i] == '&' && strncmp (url + i, "&amp;", 5) == 0)
-			amps++;
-	}
-
-	buff = g_strdup (url);
-
-	if (!amps)
-		return buff;
-
-	for (i = 0, j = 0; url [i]; i++, j++) {
-		buff [j] = url [i];
-
-		if (url [i] == '&' && strncmp (url + i, "&amp;", 5) == 0)
-			i += 4;
-	}
-	buff [j] = 0;
-
-	return buff;
-}
-
 static void
 emp_uri_popup_link_copy(EPopup *ep, EPopupItem *pitem, void *data)
 {
@@ -2781,7 +2755,7 @@ emp_uri_popup_link_copy(EPopup *ep, EPop
 	struct _EMFolderViewPrivate *p = emfv->priv;
 
 	g_free(p->selection_uri);
-	p->selection_uri = url_unescape_amp(pitem->user_data);
+	p->selection_uri = em_utils_url_unescape_amp(pitem->user_data);
 
 	gtk_selection_owner_set(p->invisible, GDK_SELECTION_PRIMARY, gtk_get_current_event_time());
 	gtk_selection_owner_set(p->invisible, GDK_SELECTION_CLIPBOARD, gtk_get_current_event_time());
--- mail/em-format.c	2008-10-13 14:07:24.000000000 +0530
+++ mail/em-format.c	2009-02-04 11:46:18.000000000 +0530
@@ -1124,7 +1124,7 @@ em_format_format_text(EMFormat *emf, Cam
 	camel_object_unref(filter_stream);
 	camel_stream_reset (mem_stream);
 
-	if (max == -1 || size < (max * 1024) || emf->composer) {
+	if (max == -1 || size == -1 || size < (max * 1024) || emf->composer) {
 		camel_stream_write_to_stream(mem_stream, (CamelStream *)stream);
 		camel_stream_flush((CamelStream *)stream);
 	} else {
@@ -1653,6 +1653,8 @@ emf_inlinepgp_encrypted(EMFormat *emf, C
 	CamelCipherValidity *valid;
 	CamelException *ex;
 	CamelMimePart *opart;
+	CamelDataWrapper *dw;
+	char *mime_type;
 
 	cipher = camel_gpg_context_new(emf->session);
 	ex = camel_exception_new();
@@ -1671,6 +1673,19 @@ emf_inlinepgp_encrypted(EMFormat *emf, C
 		return;
 	}
 
+	dw = camel_medium_get_content_object ((CamelMedium *)opart);
+	mime_type = camel_data_wrapper_get_mime_type (dw);
+
+	/* this ensures to show the 'opart' as inlined, if possible */
+	if (mime_type && g_ascii_strcasecmp (mime_type, "application/octet-stream") == 0) {
+		const char *snoop = em_utils_snoop_type (opart);
+
+		if (snoop)
+			camel_data_wrapper_set_mime_type (dw, snoop);
+	}
+
+	g_free (mime_type);
+
 	/* Pass it off to the real formatter */
 	em_format_format_secure(emf, stream, opart, valid);
 
--- mail/em-format-html-print.c	2008-10-13 14:07:24.000000000 +0530
+++ mail/em-format-html-print.c	2009-02-04 11:46:18.000000000 +0530
@@ -52,7 +52,7 @@ efhp_finalize (GObject *o)
 static void
 efhp_class_init (GObjectClass *class)
 {
-	parent_class = g_type_class_ref(EM_TYPE_FORMAT_HTML_PRINT);
+	parent_class = g_type_class_peek_parent (class);
 	class->finalize = efhp_finalize;
 }
 
--- mail/em-popup.c	2008-10-13 14:07:24.000000000 +0530
+++ mail/em-popup.c	2009-02-04 11:46:18.000000000 +0530
@@ -588,12 +588,14 @@ emp_uri_popup_link_open(EPopup *ep, EPop
 {
 	EMPopupTargetURI *t = (EMPopupTargetURI *)ep->target;
 	GError *err = NULL;
+	gchar *unescaped_uri = em_utils_url_unescape_amp (t->uri);
 
-	gnome_url_show(t->uri, &err);
+	gnome_url_show(unescaped_uri, &err);
 	if (err) {
 		g_warning("gnome_url_show: %s", err->message);
 		g_error_free(err);
 	}
+	g_free (unescaped_uri);
 }
 
 static void
--- mail/em-subscribe-editor.c	2008-10-13 14:07:24.000000000 +0530
+++ mail/em-subscribe-editor.c	2009-02-04 11:46:18.000000000 +0530
@@ -111,6 +111,12 @@ struct _EMSubscribeNode {
 	GtkTreePath *path;
 };
 
+typedef struct _MailMsgListNode MailMsgListNode;
+struct _MailMsgListNode {
+	EDListNode node;	
+	MailMsg *msg;
+};
+
 static void sub_editor_busy(EMSubscribeEditor *se, int dir);
 static int sub_queue_fill_level(EMSubscribe *sub, EMSubscribeNode *node);
 static void sub_selection_changed(GtkTreeSelection *selection, EMSubscribe *sub);
@@ -185,6 +191,7 @@ sub_folder_done (struct _zsubscribe_msg
 	GtkTreeModel *model;
 	EMSubscribeNode *node;
 	gboolean subscribed, issub;
+	MailMsgListNode *msgListNode;
 
 	m->sub->subscribe_id = -1;
 	if (m->sub->cancel)
@@ -209,10 +216,13 @@ sub_folder_done (struct _zsubscribe_msg
 	}
 
 	/* queue any further ones, or if out, update the ui */
-	next = (struct _zsubscribe_msg *)e_dlist_remhead(&m->sub->subscribe);
-	if (next) {
+	msgListNode = (MailMsgListNode *) e_dlist_remhead(&m->sub->subscribe);
+	if (msgListNode) {
+		next = (struct _zsubscribe_msg *) msgListNode->msg;
+	        /* Free the memory of the MailMsgListNode which won't be used anymore. */
+        	g_free(msgListNode);
 		next->sub->subscribe_id = next->base.seq;
-		mail_msg_unordered_push (next);
+                mail_msg_unordered_push (next);
 	} else {
 		/* should it go off the model instead? */
 		sub_selection_changed(gtk_tree_view_get_selection(m->sub->tree), m->sub);
@@ -239,6 +249,7 @@ static int
 sub_subscribe_folder (EMSubscribe *sub, EMSubscribeNode *node, int state, const char *spath)
 {
 	struct _zsubscribe_msg *m;
+	MailMsgListNode *msgListNode;
 	int id;
 
 	m = mail_msg_new (&sub_subscribe_folder_info);
@@ -254,8 +265,10 @@ sub_subscribe_folder (EMSubscribe *sub,
 		d(printf("running subscribe folder '%s'\n", spath));
 		mail_msg_unordered_push (m);
 	} else {
+		msgListNode = g_malloc0(sizeof(MailMsgListNode)); 
+		msgListNode->msg = (MailMsg *) m;
 		d(printf("queueing subscribe folder '%s'\n", spath));
-		e_dlist_addtail(&sub->subscribe, (EDListNode *)m);
+		e_dlist_addtail(&sub->subscribe, (EDListNode *)msgListNode);
 	}
 
 	return id;
@@ -541,6 +554,7 @@ static void
 sub_destroy(GtkWidget *w, EMSubscribe *sub)
 {
 	struct _zsubscribe_msg *m;
+	MailMsgListNode *msgListNode;	
 
 	d(printf("subscribe closed\n"));
 	sub->cancel = TRUE;
@@ -551,8 +565,12 @@ sub_destroy(GtkWidget *w, EMSubscribe *s
 	if (sub->subscribe_id != -1)
 		mail_msg_cancel(sub->subscribe_id);
 
-	while ( (m = (struct _zsubscribe_msg *)e_dlist_remhead(&sub->subscribe)) )
+	while ( (msgListNode = (MailMsgListNode *)e_dlist_remhead(&sub->subscribe))) {
+		m = (struct _zsubscribe_msg *) msgListNode->msg;
+		/* Free the memory of MailMsgListNode which won't be used anymore. */
+		g_free(msgListNode);
 		mail_msg_unref(m);
+	}
 
 	sub_unref(sub);
 }
--- mail/em-utils.c	2008-11-07 10:04:07.000000000 +0530
+++ mail/em-utils.c	2009-02-04 11:46:18.000000000 +0530
@@ -2442,3 +2442,34 @@ em_utils_show_info_silent (GtkWidget *wi
 		g_signal_connect(widget, "response", G_CALLBACK(error_response), NULL);
 	e_activity_handler_make_error (handler, "mail", E_LOG_WARNINGS, widget);
 }
+
+gchar *
+em_utils_url_unescape_amp (const gchar *url)
+{
+	gchar *buff;
+	int i, j, amps;
+
+	if (!url)
+		return NULL;
+
+	amps = 0;
+	for (i = 0; url [i]; i++) {
+		if (url [i] == '&' && strncmp (url + i, "&amp;", 5) == 0)
+			amps++;
+	}
+
+	buff = g_strdup (url);
+
+	if (!amps)
+		return buff;
+
+	for (i = 0, j = 0; url [i]; i++, j++) {
+		buff [j] = url [i];
+
+		if (url [i] == '&' && strncmp (url + i, "&amp;", 5) == 0)
+			i += 4;
+	}
+	buff [j] = 0;
+
+	return buff;
+}
--- mail/em-utils.h	2008-10-13 14:07:24.000000000 +0530
+++ mail/em-utils.h	2009-02-04 11:46:18.000000000 +0530
@@ -117,6 +117,9 @@ const char *em_utils_snoop_type(struct _
 /* clears flag 'get_password_canceled' at every known accounts, so if needed, get_password will show dialog */
 void em_utils_clear_get_password_canceled_accounts_flag (void);
 
+/* Unescapes &amp; back to a real & in URIs */
+gchar *em_utils_url_unescape_amp (const gchar *url);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
--- mail/message-list.c	2009-02-04 09:57:29.000000000 +0530
+++ mail/message-list.c	2009-02-04 11:46:19.000000000 +0530
@@ -42,6 +42,7 @@
 #include <camel/camel-folder-thread.h>
 #include <camel/camel-folder-summary.h>
 #include <camel/camel-vee-folder.h>
+#include <camel/camel-string-utils.h>
 
 #include <libedataserver/e-memory.h>
 
@@ -2303,6 +2304,11 @@ message_list_finalise (GObject *object)
 
 	g_hash_table_destroy (message_list->normalised_hash);
 
+	if (message_list->ensure_uid) {
+		g_free (message_list->ensure_uid);
+		message_list->ensure_uid = NULL;
+	}
+
 	if (message_list->thread_tree)
 		camel_folder_thread_messages_unref(message_list->thread_tree);
 
@@ -3975,13 +3981,11 @@ regen_list_exec (struct _regen_list_msg
 		uids = camel_folder_get_uids (m->folder);
 	} else {
 		searchuids = uids = camel_folder_search_by_expression (m->folder, expr, &m->base.ex);
-
 		/* If m->changes is not NULL, then it means we are called from folder_changed event,
 		   thus we will keep the selected message to be sure it doesn't disappear because
 		   it no longer belong to our search filter. */
-		if (uids && m->ml->search && ((m->changes && m->ml->cursor_uid) || m->ml->ensure_uid)) {
+		if (uids && ((m->changes && m->ml->cursor_uid) || m->ml->ensure_uid)) {
 			const char *looking_for = m->ml->cursor_uid;
-
 			/* ensure_uid has precedence of cursor_uid */
 			if (m->ml->ensure_uid)
 				looking_for = m->ml->ensure_uid;
@@ -4002,7 +4006,7 @@ regen_list_exec (struct _regen_list_msg
 				   on the flag whether we can view deleted messages or not. */
 
 				if (!was_deleted || (was_deleted && !m->hidedel))
-					g_ptr_array_add (uids, g_strdup (looking_for));
+					g_ptr_array_add (uids, (gpointer) camel_pstring_strdup (looking_for));
 			}
 		}
 	}
@@ -4146,11 +4150,6 @@ regen_list_done (struct _regen_list_msg
 	if (m->ml->priv->destroyed)
 		return;
 
-	if (m->ml->ensure_uid) {
-		g_free (m->ml->ensure_uid);
-		m->ml->ensure_uid = NULL;
-	}
-
 	if (!m->complete)
 		return;
 
--- shell/e-shell-window.c	2008-10-13 14:02:56.000000000 +0530
+++ shell/e-shell-window.c	2009-02-04 11:46:19.000000000 +0530
@@ -795,7 +795,7 @@ setup_widgets (EShellWindow *window)
 			info->icon_name, width, 0);
 		g_string_append_printf(xml, "\" pixtype=\"filename\" pixname=\"%s\"/>"
 				       "</placeholder></submenu></submenu>\n",
-				       gtk_icon_info_get_filename (icon_info));
+				       icon_info ? gtk_icon_info_get_filename (icon_info) : "");
 		gtk_icon_info_free (icon_info);
 		bonobo_ui_component_set_translate (e_shell_window_peek_bonobo_ui_component (window),
 						   "/menu",
--- shell/main.c	2008-10-13 14:02:56.000000000 +0530
+++ shell/main.c	2009-02-04 11:46:19.000000000 +0530
@@ -330,10 +330,10 @@ idle_cb (gchar **uris)
 		startup_line_mode = E_SHELL_STARTUP_LINE_MODE_OFFLINE;
 
 	shell = e_shell_new (startup_line_mode, &result);
-	e_shell_set_crash_recovery (shell, e_file_lock_exists ());
 
 	switch (result) {
 	case E_SHELL_CONSTRUCT_RESULT_OK:
+		e_shell_set_crash_recovery (shell, e_file_lock_exists ());
 		g_signal_connect (shell, "no_windows_left", G_CALLBACK (no_windows_left_cb), NULL);
 		g_object_weak_ref (G_OBJECT (shell), shell_weak_notify, NULL);
 		corba_shell = bonobo_object_corba_objref (BONOBO_OBJECT (shell));
@@ -656,6 +656,7 @@ main (int argc, char **argv)
 		exit (0);
 
 	gnome_sound_init ("localhost");
+	gtk_accel_map_load (e_get_accels_filename ());
 
 	if (!disable_eplugin) {
 		e_plugin_register_type(e_plugin_lib_get_type());
@@ -688,6 +689,8 @@ main (int argc, char **argv)
 
 	bonobo_main ();
 
+	gtk_accel_map_save (e_get_accels_filename ());
+
 	e_icon_factory_shutdown ();
 	g_object_unref (program);
 	gnome_sound_shutdown ();
--- widgets/misc/e-attachment-bar.c	2008-10-13 14:13:34.000000000 +0530
+++ widgets/misc/e-attachment-bar.c	2009-02-04 11:46:19.000000000 +0530
@@ -1001,7 +1001,8 @@ eab_icon_clicked_cb (EAttachmentBar *bar
 
 	if (E_IS_ATTACHMENT_BAR (bar) && event->type == GDK_2BUTTON_PRESS) {
 		p = e_attachment_bar_get_selected (bar);
-		if (p && p->next == NULL) {
+		/* check if has body already, remote files can take longer to fetch */
+		if (p && p->next == NULL && ((EAttachment *)p->data)->body) {
 			attachment = p->data;
 
 			/* Check if the file is stored already */
openSUSE Build Service is sponsored by