[evolution-data-server] Bug #681466 - Virtual Trash/Junk not updated on change
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server] Bug #681466 - Virtual Trash/Junk not updated on change
- Date: Thu, 9 Aug 2012 17:15:39 +0000 (UTC)
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]