[evolution-data-server/gnome-2-32] Bug #634658 - Unread counts for vfolders never update



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]