[evolution-data-server/gnome-2-32] Bug #634658 - Unread counts for vfolders never update
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server/gnome-2-32] Bug #634658 - Unread counts for vfolders never update
- Date: Fri, 12 Nov 2010 16:12:16 +0000 (UTC)
commit 2ffb5606f2e060ee62a64ef282dd481ba271fce7
Author: Milan Crha <mcrha redhat com>
Date: Fri Nov 12 17:11:43 2010 +0100
Bug #634658 - Unread counts for vfolders never update
camel/camel-folder-summary.c | 67 +++++++++++++++++++++++++----------------
camel/camel-folder-summary.h | 3 ++
camel/camel-vee-folder.c | 39 +++++++++++++++++++++---
camel/camel-vee-summary.c | 22 ++++---------
4 files changed, 85 insertions(+), 46 deletions(-)
---
diff --git a/camel/camel-folder-summary.c b/camel/camel-folder-summary.c
index 2fb8c9a..d9cd871 100644
--- a/camel/camel-folder-summary.c
+++ b/camel/camel-folder-summary.c
@@ -2486,45 +2486,50 @@ camel_folder_summary_insert (CamelFolderSummary *s, CamelMessageInfo *info, gboo
camel_folder_summary_unlock (s, CAMEL_FOLDER_SUMMARY_SUMMARY_LOCK);
}
-static void
-update_summary (CamelFolderSummary *summary, CamelMessageInfoBase *info)
+void
+camel_folder_summary_update_counts_by_flags (CamelFolderSummary *summary, guint32 flags, gboolean subtract)
{
gint unread=0, deleted=0, junk=0;
- guint32 flags = info->flags;
+
+ g_return_if_fail (summary != NULL);
if (!(flags & CAMEL_MESSAGE_SEEN))
- unread = 1;
+ unread = subtract ? -1 : 1;
if (flags & CAMEL_MESSAGE_DELETED)
- deleted = 1;
+ deleted = subtract ? -1 : 1;
if (flags & CAMEL_MESSAGE_JUNK)
- junk = 1;
+ junk = subtract ? -1 : 1;
dd(printf("%p: %d %d %d | %d %d %d \n", (gpointer) summary, unread, deleted, junk, summary->unread_count, summary->visible_count, summary->saved_count));
- info->flags |= CAMEL_MESSAGE_FOLDER_FLAGGED;
- info->dirty = TRUE;
-
- if (summary) {
- if (unread)
- summary->unread_count += unread;
- if (deleted)
- summary->deleted_count += deleted;
- if (junk)
- summary->junk_count += junk;
- if (junk && !deleted)
- summary->junk_not_deleted_count += junk;
- summary->visible_count++;
- if (junk || deleted)
- summary->visible_count -= junk ? junk : deleted;
+ if (unread)
+ summary->unread_count += unread;
+ if (deleted)
+ summary->deleted_count += deleted;
+ if (junk)
+ summary->junk_count += junk;
+ if (junk && !deleted)
+ summary->junk_not_deleted_count += junk;
+ if (!junk && !deleted)
+ summary->visible_count += subtract ? -1 : 1;
- summary->saved_count++;
- camel_folder_summary_touch(summary);
- }
+ summary->saved_count += subtract ? -1 : 1;
+ camel_folder_summary_touch (summary);
dd(printf("%p: %d %d %d | %d %d %d\n", (gpointer) summary, unread, deleted, junk, summary->unread_count, summary->visible_count, summary->saved_count));
+}
+static void
+update_summary (CamelFolderSummary *summary, CamelMessageInfoBase *info)
+{
+ g_return_if_fail (summary != NULL);
+ g_return_if_fail (info != NULL);
+
+ camel_folder_summary_update_counts_by_flags (summary, info->flags, FALSE);
+ info->flags |= CAMEL_MESSAGE_FOLDER_FLAGGED;
+ info->dirty = TRUE;
}
/**
@@ -2812,7 +2817,12 @@ camel_folder_summary_clear(CamelFolderSummary *s)
g_ptr_array_foreach (s->uids, (GFunc) camel_pstring_free, NULL);
g_ptr_array_free (s->uids, TRUE);
s->uids = g_ptr_array_new ();
- s->visible_count = s->deleted_count = s->unread_count = 0;
+ s->saved_count = 0;
+ s->unread_count = 0;
+ s->deleted_count = 0;
+ s->junk_count = 0;
+ s->junk_not_deleted_count = 0;
+ s->visible_count = 0;
g_hash_table_destroy(s->loaded_infos);
s->loaded_infos = g_hash_table_new(g_str_hash, g_str_equal);
@@ -2852,7 +2862,12 @@ camel_folder_summary_clear_db (CamelFolderSummary *s)
g_ptr_array_foreach (s->uids, (GFunc) camel_pstring_free, NULL);
g_ptr_array_free (s->uids, TRUE);
s->uids = g_ptr_array_new ();
- s->visible_count = s->deleted_count = s->unread_count = 0;
+ s->saved_count = 0;
+ s->unread_count = 0;
+ s->deleted_count = 0;
+ s->junk_count = 0;
+ s->junk_not_deleted_count = 0;
+ s->visible_count = 0;
g_hash_table_destroy(s->loaded_infos);
s->loaded_infos = g_hash_table_new(g_str_hash, g_str_equal);
diff --git a/camel/camel-folder-summary.h b/camel/camel-folder-summary.h
index 8995cd7..991a8ff 100644
--- a/camel/camel-folder-summary.h
+++ b/camel/camel-folder-summary.h
@@ -398,6 +398,9 @@ void camel_folder_summary_remove_range(CamelFolderSummary *summary, gint start,
void camel_folder_summary_clear(CamelFolderSummary *summary);
void camel_folder_summary_clear_db (CamelFolderSummary *s);
+/* update visible/unread/... counts based on message flags */
+void camel_folder_summary_update_counts_by_flags (CamelFolderSummary *summary, guint32 flags, gboolean subtract);
+
/* lookup functions */
guint camel_folder_summary_count(CamelFolderSummary *summary);
CamelMessageInfo *camel_folder_summary_index(CamelFolderSummary *summary, gint index);
diff --git a/camel/camel-vee-folder.c b/camel/camel-vee-folder.c
index e36bb41..3936226 100644
--- a/camel/camel-vee-folder.c
+++ b/camel/camel-vee-folder.c
@@ -161,6 +161,7 @@ folder_changed_add_uid (CamelFolder *sub, const gchar *uid, const gchar hash[8],
}
vinfo = (CamelVeeMessageInfo *)camel_folder_get_message_info ((CamelFolder *)folder_unmatched, vuid);
if (vinfo) {
+ camel_folder_summary_update_counts_by_flags (CAMEL_FOLDER (folder_unmatched)->summary, vinfo->old_flags, TRUE);
full_name = camel_folder_get_full_name (
CAMEL_FOLDER (folder_unmatched));
camel_folder_change_info_remove_uid (
@@ -197,6 +198,12 @@ folder_changed_remove_uid (CamelFolder *sub, const gchar *uid, const gchar hash[
parent_store = camel_folder_get_parent_store (folder);
+ vinfo = (CamelVeeMessageInfo *) camel_folder_summary_uid (folder->summary, vuid);
+ if (vinfo) {
+ camel_folder_summary_update_counts_by_flags (folder->summary, vinfo->old_flags, TRUE);
+ camel_message_info_free ((CamelMessageInfo *) vinfo);
+ }
+
camel_folder_change_info_remove_uid (vf->changes, vuid);
if (use_db) {
full_name = camel_folder_get_full_name (folder);
@@ -229,6 +236,7 @@ folder_changed_remove_uid (CamelFolder *sub, const gchar *uid, const gchar hash[
vinfo = (CamelVeeMessageInfo *)camel_folder_get_message_info ((CamelFolder *)folder_unmatched, vuid);
if (vinfo) {
+ camel_folder_summary_update_counts_by_flags (CAMEL_FOLDER (folder_unmatched)->summary, vinfo->old_flags, TRUE);
full_name = camel_folder_get_full_name (
CAMEL_FOLDER (folder_unmatched));
camel_folder_change_info_remove_uid (
@@ -246,6 +254,17 @@ folder_changed_remove_uid (CamelFolder *sub, const gchar *uid, const gchar hash[
}
static void
+update_old_flags (CamelFolderSummary *summary, CamelVeeMessageInfo *vinfo)
+{
+ g_return_if_fail (summary != NULL);
+ g_return_if_fail (vinfo != NULL);
+
+ camel_folder_summary_update_counts_by_flags (summary, vinfo->old_flags, TRUE);
+ vinfo->old_flags = camel_message_info_flags ((CamelMessageInfo *)vinfo);
+ camel_folder_summary_update_counts_by_flags (summary, vinfo->old_flags, FALSE);
+}
+
+static void
folder_changed_change_uid (CamelFolder *sub, const gchar *uid, const gchar hash[8], CamelVeeFolder *vf, gboolean use_db)
{
gchar *vuid;
@@ -266,11 +285,13 @@ folder_changed_change_uid (CamelFolder *sub, const gchar *uid, const gchar hash[
if (info) {
if (vinfo) {
camel_folder_change_info_change_uid (vf->changes, vuid);
+ update_old_flags (folder->summary, vinfo);
camel_message_info_free ((CamelMessageInfo *)vinfo);
}
if (uinfo) {
camel_folder_change_info_change_uid (folder_unmatched->changes, vuid);
+ update_old_flags (CAMEL_FOLDER (folder_unmatched)->summary, uinfo);
camel_message_info_free ((CamelMessageInfo *)uinfo);
}
@@ -592,6 +613,7 @@ subfolder_renamed_update (CamelVeeFolder *vf, CamelFolder *sub, gchar hash[8])
gpointer oldval;
camel_folder_change_info_remove_uid (vf->changes, uid);
+ camel_folder_summary_update_counts_by_flags (CAMEL_FOLDER (vf)->summary, mi->old_flags, TRUE);
camel_folder_summary_remove (((CamelFolder *)vf)->summary, (CamelMessageInfo *)mi);
/* works since we always append on the end */
@@ -674,6 +696,7 @@ unmatched_check_uid (gchar *uidin, gpointer value, struct _update_data *u)
parent_store = camel_folder_get_parent_store (
CAMEL_FOLDER (u->folder_unmatched));
+ camel_folder_summary_update_counts_by_flags (CAMEL_FOLDER (u->folder_unmatched)->summary, mi->old_flags, TRUE);
camel_db_delete_uid_from_vfolder_transaction (
parent_store->cdb_w, full_name, uid, NULL);
camel_folder_summary_remove_uid_fast (
@@ -1068,6 +1091,7 @@ vee_folder_sync (CamelFolder *folder,
CamelVeeMessageInfo *mi = (CamelVeeMessageInfo *)camel_folder_summary_index (folder->summary, i);
if (mi->old_flags & CAMEL_MESSAGE_DELETED) {
del = g_slist_prepend (del, (gpointer) camel_pstring_strdup (((CamelMessageInfo *)mi)->uid));
+ camel_folder_summary_update_counts_by_flags (folder->summary, mi->old_flags, TRUE);
camel_folder_summary_remove_index_fast (folder->summary, i);
count--;
i--;
@@ -1403,11 +1427,6 @@ vee_folder_set_expression (CamelVeeFolder *vee_folder,
camel_folder_summary_clear (summary);
camel_db_recreate_vfolder (parent_store->cdb_w, full_name, NULL);
- summary->junk_count = 0;
- summary->deleted_count = 0;
- summary->unread_count = 0;
- summary->visible_count = 0;
- summary->junk_not_deleted_count = 0;
}
g_free (vee_folder->expression);
@@ -1484,6 +1503,7 @@ vee_folder_remove_folder_helper (CamelVeeFolder *vf, CamelFolder *source)
if (mi) {
if (mi->summary == ssummary) {
camel_folder_change_info_remove_uid (folder_unmatched->changes, camel_message_info_uid (mi));
+ camel_folder_summary_update_counts_by_flags (CAMEL_FOLDER (folder_unmatched)->summary, mi->old_flags, TRUE);
if (last == -1) {
last = start = i;
} else if (last+1 == i) {
@@ -1514,6 +1534,7 @@ vee_folder_remove_folder_helper (CamelVeeFolder *vf, CamelFolder *source)
const gchar *uid = camel_message_info_uid (mi);
camel_folder_change_info_remove_uid (vf->changes, uid);
+ camel_folder_summary_update_counts_by_flags (folder->summary, mi->old_flags, TRUE);
if (last == -1) {
last = start = i;
@@ -1723,9 +1744,11 @@ vee_folder_rebuild_folder (CamelVeeFolder *vee_folder,
} else {
camel_folder_summary_remove_range (folder->summary, start, last);
i -= (last-start)+1;
+ count -= (last - start) + 1;
start = last = i;
}
camel_folder_change_info_remove_uid (vee_folder->changes, camel_message_info_uid (mi));
+ camel_folder_summary_update_counts_by_flags (folder->summary, mi->old_flags, TRUE);
if (!CAMEL_IS_VEE_FOLDER (source)
&& unmatched_uids != NULL
&& g_hash_table_lookup_extended (unmatched_uids, uid, (gpointer *)&oldkey, &oldval)) {
@@ -1773,10 +1796,16 @@ vee_folder_rebuild_folder (CamelVeeFolder *vee_folder,
if (uid) {
if (strncmp (uid, u.hash, 8) == 0) {
if (g_hash_table_lookup (allhash, uid+8) == NULL) {
+ CamelVeeMessageInfo *vinfo = (CamelVeeMessageInfo *) camel_folder_summary_index (CAMEL_FOLDER (folder_unmatched)->summary, i);
+ if (vinfo) {
+ camel_folder_summary_update_counts_by_flags (CAMEL_FOLDER (folder_unmatched)->summary, vinfo->old_flags, TRUE);
+ camel_message_info_free (vinfo);
+ }
/* no longer exists at all, just remove it entirely */
camel_folder_summary_remove_index_fast (((CamelFolder *)folder_unmatched)->summary, i);
camel_folder_change_info_remove_uid (folder_unmatched->changes, uid);
i--;
+ count--;
} else {
g_hash_table_remove (allhash, uid+8);
}
diff --git a/camel/camel-vee-summary.c b/camel/camel-vee-summary.c
index 79fa82c..5974ed0 100644
--- a/camel/camel-vee-summary.c
+++ b/camel/camel-vee-summary.c
@@ -93,8 +93,6 @@ vee_info_uint32(const CamelMessageInfo *mi, gint id)
HANDLE_NULL_INFO(0);
ret = camel_message_info_uint32 (rmi, id);
- if (id == CAMEL_MESSAGE_INFO_FLAGS)
- ((CamelVeeMessageInfo *) mi)->old_flags = camel_message_info_flags (rmi);
camel_message_info_free (rmi);
return ret;
@@ -282,14 +280,12 @@ vee_info_set_flags(CamelMessageInfo *mi, guint32 flags, guint32 set)
if (hacked_unread_folder && !vsummary->fake_visible_count)
vsummary->fake_visible_count = mi->summary->visible_count;
-#if 0
/* Keep the summary in sync */
mi->summary->unread_count += unread - old_unread;
mi->summary->deleted_count += deleted - old_deleted;
mi->summary->junk_count += junked - old_junked;
mi->summary->junk_not_deleted_count += junked_not_deleted - old_junked_not_deleted;
mi->summary->visible_count += visible - old_visible;
-#endif
if (vsummary->fake_visible_count || hacked_unread_folder)
vsummary->fake_visible_count += visible - old_visible;
@@ -425,9 +421,6 @@ camel_vee_summary_new(CamelFolder *parent)
parent_store = camel_folder_get_parent_store (parent);
camel_db_create_vfolder (parent_store->cdb_w, full_name, NULL);
- /* FIXME[disk-summary] handle excep and ret */
- camel_folder_summary_header_load_from_db ((CamelFolderSummary *)s, parent_store, full_name, NULL);
-
return &s->summary;
}
@@ -459,8 +452,8 @@ CamelVeeMessageInfo *
camel_vee_summary_add(CamelVeeSummary *s, CamelFolderSummary *summary, const gchar *uid, const gchar hash[8])
{
CamelVeeMessageInfo *mi;
+ CamelMessageInfo *rmi;
gchar *vuid;
- GHashTable * fcache;
vuid = g_malloc(strlen(uid)+9);
memcpy(vuid, hash, 8);
strcpy(vuid+8, uid);
@@ -481,21 +474,20 @@ camel_vee_summary_add(CamelVeeSummary *s, CamelFolderSummary *summary, const gch
}
mi = (CamelVeeMessageInfo *)camel_message_info_new(&s->summary);
- mi->summary = summary;
- fcache = camel_folder_summary_get_flag_cache(summary);
- mi->old_flags = GPOINTER_TO_UINT(g_hash_table_lookup (fcache, uid));
- /* We would do lazy loading of flags, when the folders are loaded to memory through folder_reloaded signal */
- g_object_ref (summary);
+ mi->summary = g_object_ref (summary);
mi->info.uid = (gchar *) camel_pstring_strdup (vuid);
g_free (vuid);
camel_message_info_ref (mi);
- /* Get the flags and store it. We can use it a lot * /
+
+ /* Get actual flags and store it */
rmi = camel_folder_summary_uid (summary, uid);
if (rmi) {
mi->old_flags = camel_message_info_flags (rmi);
camel_message_info_free (rmi);
- }*/
+ }
+
camel_folder_summary_insert(&s->summary, (CamelMessageInfo *)mi, FALSE);
+ camel_folder_summary_update_counts_by_flags (&s->summary, camel_message_info_flags (mi), FALSE);
return mi;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]