[evolution] mail/state.ini: Remember stores by UID instead of URI.



commit 9585c43f4e6be99584b7970bbccc0700b0120311
Author: Matthew Barnes <mbarnes redhat com>
Date:   Sun Apr 8 13:22:25 2012 -0400

    mail/state.ini: Remember stores by UID instead of URI.
    
    This breaks backward compatibility slightly by changing the way the
    folder tree "expanded" state for CamelStores is remembered.  Instead of
    naming the [Store ...] key file group after the CamelStore's URI string,
    we now name it after its UID string.

 mail/e-mail-sidebar.c |   79 ++++++++++++++++++++++++++++++----------
 mail/em-folder-tree.c |   97 +++++++++++++++++++++++++++++++++++--------------
 2 files changed, 129 insertions(+), 47 deletions(-)
---
diff --git a/mail/e-mail-sidebar.c b/mail/e-mail-sidebar.c
index b8dc823..ef2133a 100644
--- a/mail/e-mail-sidebar.c
+++ b/mail/e-mail-sidebar.c
@@ -28,6 +28,8 @@
 #include <string.h>
 #include <camel/camel.h>
 
+#include <libemail-engine/e-mail-folder-utils.h>
+
 #include "mail/em-utils.h"
 
 #define E_MAIL_SIDEBAR_GET_PRIVATE(obj) \
@@ -91,13 +93,14 @@ mail_sidebar_model_loaded_row_cb (GtkTreeModel *model,
                                   EMailSidebar *sidebar)
 {
 	GtkTreeView *tree_view;
+	CamelStore *store;
 	GKeyFile *key_file;
 	gboolean expanded;
 	gboolean is_folder;
 	gboolean is_store;
-	const gchar *key;
+	gchar *folder_name;
 	gchar *group_name;
-	gchar *uri;
+	const gchar *key;
 
 	tree_view = GTK_TREE_VIEW (sidebar);
 	key_file = e_mail_sidebar_get_key_file (sidebar);
@@ -108,7 +111,8 @@ mail_sidebar_model_loaded_row_cb (GtkTreeModel *model,
 
 	gtk_tree_model_get (
 		model, iter,
-		COL_STRING_URI, &uri,
+		COL_POINTER_CAMEL_STORE, &store,
+		COL_STRING_FULL_NAME, &folder_name,
 		COL_BOOL_IS_STORE, &is_store,
 		COL_BOOL_IS_FOLDER, &is_folder, -1);
 
@@ -116,10 +120,17 @@ mail_sidebar_model_loaded_row_cb (GtkTreeModel *model,
 
 	key = STATE_KEY_EXPANDED;
 	if (is_store) {
-		group_name = g_strdup_printf ("Store %s", uri);
+		const gchar *uid;
+
+		uid = camel_service_get_uid (CAMEL_SERVICE (store));
+		group_name = g_strdup_printf ("Store %s", uid);
 		expanded = TRUE;
 	} else {
+		gchar *uri;
+
+		uri = e_mail_folder_uri_build (store, folder_name);
 		group_name = g_strdup_printf ("Folder %s", uri);
+		g_free (uri);
 		expanded = FALSE;
 	}
 
@@ -131,7 +142,7 @@ mail_sidebar_model_loaded_row_cb (GtkTreeModel *model,
 		gtk_tree_view_expand_row (tree_view, path, FALSE);
 
 	g_free (group_name);
-	g_free (uri);
+	g_free (folder_name);
 }
 
 static void
@@ -149,8 +160,18 @@ mail_sidebar_selection_changed_cb (GtkTreeSelection *selection,
 	if (key_file == NULL)
 		return;
 
-	if (gtk_tree_selection_get_selected (selection, &model, &iter))
-		gtk_tree_model_get (model, &iter, COL_STRING_URI, &uri, -1);
+	if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
+		CamelStore *store;
+		gchar *folder_name;
+
+		gtk_tree_model_get (
+			model, &iter,
+			COL_POINTER_CAMEL_STORE, &store,
+			COL_STRING_FULL_NAME, &folder_name, -1);
+
+		if (CAMEL_IS_STORE (store) && folder_name != NULL)
+			uri = e_mail_folder_uri_build (store, folder_name);
+	}
 
 	if (uri != NULL)
 		g_key_file_set_string (
@@ -273,7 +294,6 @@ mail_sidebar_row_expanded (GtkTreeView *tree_view,
 	gboolean is_folder;
 	gboolean is_store;
 	gchar *group_name;
-	gchar *uri;
 
 	/* Chain up to parent's row_expanded() method.  Do this first
 	 * because we stomp on the path argument a few lines down. */
@@ -292,29 +312,40 @@ mail_sidebar_row_expanded (GtkTreeView *tree_view,
 
 	/* Expand the node and all ancestors. */
 	while (gtk_tree_path_get_depth (path) > 0) {
+		CamelStore *store;
 		GtkTreeIter iter;
+		gchar *folder_name;
 
 		gtk_tree_model_get_iter (model, &iter, path);
 
 		gtk_tree_model_get (
 			model, &iter,
-			COL_STRING_URI, &uri,
+			COL_POINTER_CAMEL_STORE, &store,
+			COL_STRING_FULL_NAME, &folder_name,
 			COL_BOOL_IS_STORE, &is_store,
 			COL_BOOL_IS_FOLDER, &is_folder, -1);
 
 		g_return_if_fail (is_store || is_folder);
 
 		key = STATE_KEY_EXPANDED;
-		if (is_store)
-			group_name = g_strdup_printf ("Store %s", uri);
-		else
+		if (is_store) {
+			const gchar *uid;
+
+			uid = camel_service_get_uid (CAMEL_SERVICE (store));
+			group_name = g_strdup_printf ("Store %s", uid);
+		} else {
+			gchar *uri;
+
+			uri = e_mail_folder_uri_build (store, folder_name);
 			group_name = g_strdup_printf ("Folder %s", uri);
+			g_free (uri);
+		}
 
 		g_key_file_set_boolean (key_file, group_name, key, TRUE);
 		e_mail_sidebar_key_file_changed (sidebar);
 
 		g_free (group_name);
-		g_free (uri);
+		g_free (folder_name);
 
 		gtk_tree_path_up (path);
 	}
@@ -330,11 +361,12 @@ mail_sidebar_row_collapsed (GtkTreeView *tree_view,
 	EMailSidebar *sidebar;
 	GtkTreeModel *model;
 	GKeyFile *key_file;
+	CamelStore *store;
 	const gchar *key;
 	gboolean is_folder;
 	gboolean is_store;
+	gchar *folder_name;
 	gchar *group_name;
-	gchar *uri;
 
 	sidebar = E_MAIL_SIDEBAR (tree_view);
 	key_file = e_mail_sidebar_get_key_file (sidebar);
@@ -347,23 +379,32 @@ mail_sidebar_row_collapsed (GtkTreeView *tree_view,
 
 	gtk_tree_model_get (
 		model, iter,
-		COL_STRING_URI, &uri,
+		COL_POINTER_CAMEL_STORE, &store,
+		COL_STRING_FULL_NAME, &folder_name,
 		COL_BOOL_IS_STORE, &is_store,
 		COL_BOOL_IS_FOLDER, &is_folder, -1);
 
 	g_return_if_fail (is_store || is_folder);
 
 	key = STATE_KEY_EXPANDED;
-	if (is_store)
-		group_name = g_strdup_printf ("Store %s", uri);
-	else
+	if (is_store) {
+		const gchar *uid;
+
+		uid = camel_service_get_uid (CAMEL_SERVICE (store));
+		group_name = g_strdup_printf ("Store %s", uid);
+	} else {
+		gchar *uri;
+
+		uri = e_mail_folder_uri_build (store, folder_name);
 		group_name = g_strdup_printf ("Folder %s", uri);
+		g_free (uri);
+	}
 
 	g_key_file_set_boolean (key_file, group_name, key, FALSE);
 	e_mail_sidebar_key_file_changed (sidebar);
 
 	g_free (group_name);
-	g_free (uri);
+	g_free (folder_name);
 }
 
 static guint32
diff --git a/mail/em-folder-tree.c b/mail/em-folder-tree.c
index 4dbbb36..606721f 100644
--- a/mail/em-folder-tree.c
+++ b/mail/em-folder-tree.c
@@ -3440,12 +3440,15 @@ em_folder_tree_restore_state (EMFolderTree *folder_tree,
                               GKeyFile *key_file)
 {
 	EShell *shell;
+	EMFolderTreeModel *folder_tree_model;
+	EMailSession *session;
 	GtkTreeModel *tree_model;
 	GtkTreeView *tree_view;
 	GtkTreeIter iter;
 	gboolean valid;
 	gchar **groups_arr;
 	GSList *groups, *group;
+	gboolean express_mode;
 	gint ii;
 
 	/* Make sure we have a key file to restore state from. */
@@ -3454,10 +3457,15 @@ em_folder_tree_restore_state (EMFolderTree *folder_tree,
 
 	/* XXX Pass this in. */
 	shell = e_shell_get_default ();
+	express_mode = e_shell_get_express_mode (shell);
 
 	tree_view = GTK_TREE_VIEW (folder_tree);
 	tree_model = gtk_tree_view_get_model (tree_view);
 
+	folder_tree_model = EM_FOLDER_TREE_MODEL (tree_model);
+	session = em_folder_tree_model_get_session (folder_tree_model);
+	g_return_if_fail (E_IS_MAIL_SESSION (session));
+
 	/* Set the initial folder tree expanded state in two stages:
 	 *
 	 * 1) Iterate over the "Store" and "Folder" state file groups
@@ -3484,39 +3492,66 @@ em_folder_tree_restore_state (EMFolderTree *folder_tree,
 	groups = g_slist_sort (groups, sort_by_store_and_uri);
 
 	for (group = groups; group != NULL; group = group->next) {
-		GtkTreeRowReference *reference;
-		GtkTreePath *path;
-		GtkTreeIter iter;
+		GtkTreeRowReference *reference = NULL;
+		CamelStore *store = NULL;
 		const gchar *group_name = group->data;
 		const gchar *key = STATE_KEY_EXPANDED;
-		const gchar *uri;
+		gchar *folder_name = NULL;
 		gboolean expanded;
+		gboolean success = FALSE;
 
 		if (g_str_has_prefix (group_name, "Store ")) {
-			uri = group_name + 6;
+			CamelService *service;
+			const gchar *uid = group_name + 6;
+
+			service = camel_session_get_service (
+				CAMEL_SESSION (session), uid);
+			if (CAMEL_IS_STORE (service)) {
+				store = g_object_ref (service);
+				success = TRUE;
+			}
 			expanded = TRUE;
+
 		} else if (g_str_has_prefix (group_name, "Folder ")) {
-			uri = group_name + 7;
+			const gchar *uri = group_name + 7;
+
+			success = e_mail_folder_uri_parse (
+				CAMEL_SESSION (session), uri,
+				&store, &folder_name, NULL);
 			expanded = FALSE;
-		} else
-			continue;
+		}
 
 		if (g_key_file_has_key (key_file, group_name, key, NULL))
 			expanded = g_key_file_get_boolean (
 				key_file, group_name, key, NULL);
 
-		if (!expanded)
-			continue;
+		if (expanded && success) {
+			EMFolderTreeModelStoreInfo *si;
 
-		reference = em_folder_tree_model_lookup_uri (
-			EM_FOLDER_TREE_MODEL (tree_model), uri);
-		if (reference == NULL)
-			continue;
+			si = em_folder_tree_model_lookup_store_info (
+				folder_tree_model, store);
+			if (si != NULL) {
+				if (folder_name != NULL)
+					reference = g_hash_table_lookup (
+						si->full_hash, folder_name);
+				else
+					reference = si->row;
+			}
+		}
 
-		path = gtk_tree_row_reference_get_path (reference);
-		gtk_tree_model_get_iter (tree_model, &iter, path);
-		gtk_tree_view_expand_row (tree_view, path, FALSE);
-		gtk_tree_path_free (path);
+		if (gtk_tree_row_reference_valid (reference)) {
+			GtkTreePath *path;
+			GtkTreeIter iter;
+
+			path = gtk_tree_row_reference_get_path (reference);
+			gtk_tree_model_get_iter (tree_model, &iter, path);
+			gtk_tree_view_expand_row (tree_view, path, FALSE);
+			gtk_tree_path_free (path);
+		}
+
+		if (store != NULL)
+			g_object_unref (store);
+		g_free (folder_name);
 	}
 
 	g_slist_free (groups);
@@ -3527,28 +3562,35 @@ em_folder_tree_restore_state (EMFolderTree *folder_tree,
 	valid = gtk_tree_model_get_iter_first (tree_model, &iter);
 
 	while (valid) {
+		CamelStore *store;
+		CamelService *service;
 		const gchar *key = STATE_KEY_EXPANDED;
+		const gchar *uid;
 		gboolean expand_row;
+		gboolean built_in_store;
 		gchar *group_name;
-		gchar *uri;
 
 		gtk_tree_model_get (
-			tree_model, &iter, COL_STRING_URI, &uri, -1);
+			tree_model, &iter,
+			COL_POINTER_CAMEL_STORE, &store, -1);
 
-		if (uri == NULL)
+		if (!CAMEL_IS_STORE (store))
 			goto next;
 
-		group_name = g_strdup_printf ("Store %s", uri);
+		service = CAMEL_SERVICE (store);
+		uid = camel_service_get_uid (service);
+		group_name = g_strdup_printf ("Store %s", uid);
 
 		/* Expand stores that have no "Expanded" key. */
 		expand_row = !g_key_file_has_key (
 			key_file, group_name, key, NULL);
 
-		/* Do not expand local stores in Express mode. */
-		if (e_shell_get_express_mode (shell)) {
-			expand_row &= (strncmp (uri, "vfolder", 7) != 0);
-			expand_row &= (strncmp (uri, "maildir", 7) != 0);
-		}
+		built_in_store =
+			(g_strcmp0 (uid, E_MAIL_SESSION_LOCAL_UID) == 0) ||
+			(g_strcmp0 (uid, E_MAIL_SESSION_VFOLDER_UID) == 0);
+
+		if (express_mode && built_in_store)
+			expand_row = FALSE;
 
 		if (expand_row) {
 			GtkTreePath *path;
@@ -3559,7 +3601,6 @@ em_folder_tree_restore_state (EMFolderTree *folder_tree,
 		}
 
 		g_free (group_name);
-		g_free (uri);
 
 	next:
 		valid = gtk_tree_model_iter_next (tree_model, &iter);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]