[evolution-data-server] Bug #681466 - Virtual Trash/Junk not updated on change



commit 5f8798e974396798495934fad2efea89c05609b3
Author: Milan Crha <mcrha redhat com>
Date:   Thu Aug 9 19:14:22 2012 +0200

    Bug #681466 - Virtual Trash/Junk not updated on change

 camel/camel-folder-search.c  |   13 ++++++++++++-
 camel/camel-vee-data-cache.c |   36 ++++++++++++++++++++++++++++++++++++
 camel/camel-vee-data-cache.h |    4 ++++
 camel/camel-vee-folder.c     |   31 +++++++++++++++++++------------
 4 files changed, 71 insertions(+), 13 deletions(-)
---
diff --git a/camel/camel-folder-search.c b/camel/camel-folder-search.c
index dd52acd..88a5946 100644
--- a/camel/camel-folder-search.c
+++ b/camel/camel-folder-search.c
@@ -391,6 +391,9 @@ camel_folder_search_count (CamelFolderSearch *search,
 	if (g_cancellable_set_error_if_cancelled (cancellable, error))
 		goto fail;
 
+	if (!expr || !*expr)
+		expr = "(match-all)";
+
 	p = search->priv;
 
 	g_assert (search->folder);
@@ -543,6 +546,9 @@ camel_folder_search_search (CamelFolderSearch *search,
 	if (g_cancellable_set_error_if_cancelled (cancellable, error))
 		goto fail;
 
+	if (!expr || !*expr)
+		expr = "(match-all)";
+
 	p = search->priv;
 
 	g_assert (search->folder);
@@ -684,8 +690,13 @@ fail:
 	return matches;
 }
 
-void camel_folder_search_free_result (CamelFolderSearch *search, GPtrArray *result)
+void
+camel_folder_search_free_result (CamelFolderSearch *search,
+				 GPtrArray *result)
 {
+	if (!result)
+		return;
+
 	g_ptr_array_foreach (result, (GFunc) camel_pstring_free, NULL);
 	g_ptr_array_free (result, TRUE);
 }
diff --git a/camel/camel-vee-data-cache.c b/camel/camel-vee-data-cache.c
index 8fe92f2..f441073 100644
--- a/camel/camel-vee-data-cache.c
+++ b/camel/camel-vee-data-cache.c
@@ -482,6 +482,38 @@ camel_vee_data_cache_get_subfolder_data (CamelVeeDataCache *data_cache,
 	return res;
 }
 
+/* Returns whether data_cache contains certain UID for certain folder;
+   instead of camel_vee_data_cache_get_message_info_data() only
+   returns FALSE if not, while camel_vee_data_cache_get_message_info_data()
+   auto-adds it to data_cache.
+*/
+gboolean
+camel_vee_data_cache_contains_message_info_data (CamelVeeDataCache *data_cache,
+						 CamelFolder *folder,
+						 const gchar *orig_message_uid)
+{
+	gboolean res;
+	VeeData vdata;
+
+	g_return_val_if_fail (CAMEL_IS_VEE_DATA_CACHE (data_cache), FALSE);
+	g_return_val_if_fail (CAMEL_IS_FOLDER (folder), FALSE);
+	g_return_val_if_fail (orig_message_uid != NULL, FALSE);
+
+	g_mutex_lock (data_cache->priv->mi_mutex);
+
+	/* make sure the orig_message_uid comes from the string pool */
+	vdata.folder = folder;
+	vdata.orig_message_uid = camel_pstring_strdup (orig_message_uid);
+
+	res = g_hash_table_lookup (data_cache->priv->orig_message_uid_hash, &vdata) != NULL;
+
+	camel_pstring_free (vdata.orig_message_uid);
+
+	g_mutex_unlock (data_cache->priv->mi_mutex);
+
+	return res;
+}
+
 CamelVeeMessageInfoData *
 camel_vee_data_cache_get_message_info_data (CamelVeeDataCache *data_cache,
                                             CamelFolder *folder,
@@ -625,6 +657,8 @@ camel_vee_data_cache_remove_message_info_data (CamelVeeDataCache *data_cache,
 
 	g_mutex_lock (data_cache->priv->mi_mutex);
 
+	g_object_ref (mi_data);
+
 	sf_data = camel_vee_message_info_data_get_subfolder_data (mi_data);
 
 	vdata.folder = camel_vee_subfolder_data_get_folder (sf_data);
@@ -634,5 +668,7 @@ camel_vee_data_cache_remove_message_info_data (CamelVeeDataCache *data_cache,
 	g_hash_table_remove (data_cache->priv->vee_message_uid_hash, vuid);
 	g_hash_table_remove (data_cache->priv->orig_message_uid_hash, &vdata);
 
+	g_object_unref (mi_data);
+
 	g_mutex_unlock (data_cache->priv->mi_mutex);
 }
diff --git a/camel/camel-vee-data-cache.h b/camel/camel-vee-data-cache.h
index 99249f5..3323b66 100644
--- a/camel/camel-vee-data-cache.h
+++ b/camel/camel-vee-data-cache.h
@@ -154,6 +154,10 @@ void				camel_vee_data_cache_remove_subfolder	(CamelVeeDataCache *data_cache,
 									 CamelFolder *subfolder);
 CamelVeeSubfolderData *		camel_vee_data_cache_get_subfolder_data	(CamelVeeDataCache *data_cache, /* returned is reffed */
 									 CamelFolder *folder);
+gboolean			camel_vee_data_cache_contains_message_info_data
+									(CamelVeeDataCache *data_cache,
+									 CamelFolder *folder,
+									 const gchar *orig_message_uid);
 CamelVeeMessageInfoData *	camel_vee_data_cache_get_message_info_data				/* returned is reffed */
 									(CamelVeeDataCache *data_cache,
 									 CamelFolder *folder,
diff --git a/camel/camel-vee-folder.c b/camel/camel-vee-folder.c
index bc4fd99..901b137 100644
--- a/camel/camel-vee-folder.c
+++ b/camel/camel-vee-folder.c
@@ -166,6 +166,7 @@ static void
 vee_folder_note_unmatch_uid (CamelVeeFolder *vfolder,
                              CamelVeeSummary *vsummary,
                              CamelFolder *subfolder,
+			     CamelVeeDataCache *data_cache,
                              CamelVeeMessageInfoData *unmatched_mi_data,
                              CamelFolderChangeInfo *changes)
 {
@@ -182,6 +183,8 @@ vee_folder_note_unmatch_uid (CamelVeeFolder *vfolder,
 
 		if (vfolder->priv->parent_vee_store)
 			camel_vee_store_note_vuid_unused (vfolder->priv->parent_vee_store, unmatched_mi_data, vfolder);
+		else
+			camel_vee_data_cache_remove_message_info_data (data_cache, unmatched_mi_data);
 
 		g_object_unref (unmatched_mi_data);
 	}
@@ -199,15 +202,22 @@ vee_folder_remove_unmatched (CamelVeeFolder *vfolder,
 {
 	CamelVeeMessageInfoData *mi_data;
 
-	if (is_orig_message_uid)
+	if (is_orig_message_uid) {
+		/* camel_vee_data_cache_get_message_info_data() auto-adds items if not there,
+		   thus check whether the cache has it already, and if not, then skip the action.
+		   This can happen for virtual Junk/Trash folders.
+		*/
+		if (!camel_vee_data_cache_contains_message_info_data (data_cache, subfolder, orig_message_uid))
+			return;
+
 		mi_data = camel_vee_data_cache_get_message_info_data (data_cache, subfolder, orig_message_uid);
-	else
+	} else
 		mi_data = camel_vee_data_cache_get_message_info_data_by_vuid (data_cache, orig_message_uid);
 
 	if (!mi_data)
 		return;
 
-	vee_folder_note_unmatch_uid (vfolder, vsummary, subfolder, mi_data, changes);
+	vee_folder_note_unmatch_uid (vfolder, vsummary, subfolder, data_cache, mi_data, changes);
 
 	g_object_unref (mi_data);
 }
@@ -276,13 +286,6 @@ vee_folder_merge_matching (CamelVeeFolder *vfolder,
 		g_object_unref (mi_data);
 	}
 
-	/* Not a real search folder influencing Unmatched folder, thus skip it.
-	   The removal requires CamelVeeMessageInfoData, which is added on demand
-	   to CamelVeeDataCache, thus even the virtual trash/junk folder doesn't
-	   need it, it is left in the data_cache since then on */
-	if (!vfolder->priv->parent_vee_store)
-		return;
-
 	rud.vfolder = vfolder;
 	rud.vsummary = vsummary;
 	rud.subfolder = subfolder;
@@ -662,8 +665,10 @@ vee_folder_propagate_skipped_changes (CamelVeeFolder *vf)
 		gpointer pkey, pvalue;
 		CamelVeeSummary *vsummary;
 		CamelFolder *v_folder;
+		CamelVeeDataCache *data_cache;
 
 		changes = camel_folder_change_info_new ();
+		data_cache = vee_folder_get_data_cache (vf);
 		v_folder = CAMEL_FOLDER (vf);
 		vsummary = CAMEL_VEE_SUMMARY (v_folder->summary);
 
@@ -676,7 +681,7 @@ vee_folder_propagate_skipped_changes (CamelVeeFolder *vf)
 
 			sf_data = camel_vee_message_info_data_get_subfolder_data (mi_data);
 			subfolder = camel_vee_subfolder_data_get_folder (sf_data);
-			vee_folder_note_unmatch_uid (vf, vsummary, subfolder, mi_data, changes);
+			vee_folder_note_unmatch_uid (vf, vsummary, subfolder, data_cache, mi_data, changes);
 		}
 		g_hash_table_remove_all (vf->priv->unmatched_remove_changed);
 
@@ -1502,6 +1507,7 @@ camel_vee_folder_remove_vuid (CamelVeeFolder *vfolder,
 {
 	CamelVeeSummary *vsummary;
 	CamelVeeSubfolderData *sf_data;
+	CamelVeeDataCache *data_cache;
 	CamelFolder *subfolder;
 
 	g_return_if_fail (CAMEL_IS_VEE_FOLDER (vfolder));
@@ -1535,7 +1541,8 @@ camel_vee_folder_remove_vuid (CamelVeeFolder *vfolder,
 	camel_vee_folder_unlock (vfolder, CAMEL_VEE_FOLDER_CHANGED_LOCK);
 
 	vsummary = CAMEL_VEE_SUMMARY (CAMEL_FOLDER (vfolder)->summary);
-	vee_folder_note_unmatch_uid (vfolder, vsummary, subfolder, mi_data, changes);
+	data_cache = vee_folder_get_data_cache (vfolder);
+	vee_folder_note_unmatch_uid (vfolder, vsummary, subfolder, data_cache, mi_data, changes);
 }
 
 /**



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