[evolution-data-server] Bug #634658 - Unread counts for vfolders never update



commit e00854a79d1c513d4b2598e9a69673a17dd80a91
Author: Milan Crha <mcrha redhat com>
Date:   Fri Nov 12 17:09:24 2010 +0100

    Bug #634658 - Unread counts for vfolders never update

 camel/camel-db.c                            |   57 --------------
 camel/camel-db.h                            |    1 -
 camel/camel-folder-summary.c                |  106 +++++++++++----------------
 camel/camel-folder-summary.h                |    5 +-
 camel/camel-vee-folder.c                    |   39 +++++++++-
 camel/camel-vee-summary.c                   |   22 ++----
 camel/providers/local/camel-local-summary.c |    1 -
 7 files changed, 87 insertions(+), 144 deletions(-)
---
diff --git a/camel/camel-db.c b/camel/camel-db.c
index 137e7fc..2a001cd 100644
--- a/camel/camel-db.c
+++ b/camel/camel-db.c
@@ -1090,63 +1090,6 @@ camel_db_delete_uid_from_vfolder_transaction (CamelDB *db,
 	return ret;
 }
 
-struct _db_data_uids_flags {
-	GPtrArray *uids;
-	GPtrArray *flags;
-};
-static gint
-read_uids_flags_callback (gpointer ref, gint ncol, gchar ** cols, gchar ** name)
-{
-	struct _db_data_uids_flags *data= (struct _db_data_uids_flags *) ref;
-
-	gint i;
-	for (i = 0; i < ncol; ++i) {
-		if (!strcmp (name [i], "uid"))
-			g_ptr_array_add (data->uids, (gchar *) (camel_pstring_strdup (cols[i])));
-		else if (!strcmp (name [i], "flags"))
-			g_ptr_array_add (data->flags, GUINT_TO_POINTER (strtoul (cols[i], NULL, 10)));
-	}
-
-	 return 0;
-}
-
-/**
- * camel_db_get_folder_uids_flags:
- *
- * Since: 2.26
- **/
-gint
-camel_db_get_folder_uids_flags (CamelDB *db,
-                                const gchar *folder_name,
-                                const gchar *sort_by,
-                                const gchar *collate,
-                                GPtrArray *summary,
-                                GHashTable *table,
-                                GError **error)
-{
-	 GPtrArray *uids = summary;
-	 GPtrArray *flags = g_ptr_array_new ();
-	 gchar *sel_query;
-	 gint ret;
-	 struct _db_data_uids_flags data;
-	 gint i;
-
-	 data.uids = uids;
-	 data.flags = flags;
-
-	 sel_query = sqlite3_mprintf("SELECT uid,flags FROM %Q%s%s%s%s", folder_name, sort_by ? " order by " : "", sort_by ? sort_by: "", (sort_by && collate) ? " collate " : "", (sort_by && collate) ? collate : "");
-
-	 ret = camel_db_select (db, sel_query, read_uids_flags_callback, &data, error);
-	 sqlite3_free (sel_query);
-
-	 for (i=0; i<uids->len; i++) {
-		 g_hash_table_insert (table, uids->pdata[i], flags->pdata[i]);
-	 }
-
-	 g_ptr_array_free (flags, TRUE);
-	 return ret;
-}
-
 static gint
 read_uids_callback (gpointer ref, gint ncol, gchar ** cols, gchar ** name)
 {
diff --git a/camel/camel-db.h b/camel/camel-db.h
index bf047ff..14de951 100644
--- a/camel/camel-db.h
+++ b/camel/camel-db.h
@@ -259,7 +259,6 @@ gint camel_db_add_to_vfolder (CamelDB *db, gchar *folder_name, gchar *vuid, GErr
 gint camel_db_add_to_vfolder_transaction (CamelDB *db, const gchar *folder_name, const gchar *vuid, GError **error);
 
 gint camel_db_get_folder_uids (CamelDB *db, const gchar *folder_name, const gchar *sort_by, const gchar *collate, GPtrArray *array, GError **error);
-gint camel_db_get_folder_uids_flags (CamelDB *db, const gchar *folder_name, const gchar *sort_by, const gchar *collate, GPtrArray *summary, GHashTable *table, GError **error);
 
 GPtrArray * camel_db_get_folder_junk_uids (CamelDB *db, gchar *folder_name, GError **error);
 GPtrArray * camel_db_get_folder_deleted_uids (CamelDB *db, const gchar *folder_name, GError **error);
diff --git a/camel/camel-folder-summary.c b/camel/camel-folder-summary.c
index 1591669..e985125 100644
--- a/camel/camel-folder-summary.c
+++ b/camel/camel-folder-summary.c
@@ -85,7 +85,6 @@ struct _CamelFolderSummaryPrivate {
 	GStaticRecMutex filter_lock;	/* for accessing any of the filtering/indexing stuff, since we share them */
 	GStaticRecMutex alloc_lock;	/* for setting up and using allocators */
 	GStaticRecMutex ref_lock;	/* for reffing/unreffing messageinfo's ALWAYS obtain before summary_lock */
-	GHashTable *flag_cache;
 
 	gboolean need_preview;
 	GHashTable *preview_updates;
@@ -213,7 +212,6 @@ folder_summary_finalize (GObject *object)
 {
 	CamelFolderSummary *summary = CAMEL_FOLDER_SUMMARY (object);
 
-	g_hash_table_destroy (summary->priv->flag_cache);
 	if (summary->timeout_handle)
 		g_source_remove (summary->timeout_handle);
 	/*camel_folder_summary_clear(s);*/
@@ -853,8 +851,6 @@ info_set_flags (CamelMessageInfo *info, guint32 flags, guint32 set)
 		if (((junk && !(mi->flags & CAMEL_MESSAGE_DELETED)))||  (deleted && !(mi->flags & CAMEL_MESSAGE_JUNK)) )
 			mi->summary->visible_count -= junk ? junk : deleted;
 	}
-	if (mi->uid)
-		g_hash_table_replace (CAMEL_FOLDER_SUMMARY_GET_PRIVATE (mi->summary)->flag_cache, (gchar *)mi->uid, GUINT_TO_POINTER (mi->flags));
 	if (mi->summary && mi->summary->folder && mi->uid) {
 		CamelFolderChangeInfo *changes = camel_folder_change_info_new ();
 
@@ -928,8 +924,6 @@ camel_folder_summary_init (CamelFolderSummary *summary)
 	summary->priv->filter_charset = g_hash_table_new (
 		camel_strcase_hash, camel_strcase_equal);
 
-	summary->priv->flag_cache = g_hash_table_new (g_str_hash, g_str_equal);
-
 	summary->message_info_chunks = NULL;
 	summary->content_info_chunks = NULL;
 	summary->priv->need_preview = FALSE;
@@ -1798,19 +1792,6 @@ camel_folder_summary_prepare_fetch_all (CamelFolderSummary *s,
 }
 
 /**
- * camel_folder_summary_get_flag_cache:
- *
- * Since: 2.26
- **/
-GHashTable *
-camel_folder_summary_get_flag_cache (CamelFolderSummary *summary)
-{
-	struct _CamelFolderSummaryPrivate *p = CAMEL_FOLDER_SUMMARY_GET_PRIVATE (summary);
-
-	return p->flag_cache;
-}
-
-/**
  * camel_folder_summary_load_from_db:
  *
  * Since: 2.24
@@ -1823,7 +1804,6 @@ camel_folder_summary_load_from_db (CamelFolderSummary *s,
 	CamelStore *parent_store;
 	const gchar *full_name;
 	gint ret = 0;
-	struct _CamelFolderSummaryPrivate *p = CAMEL_FOLDER_SUMMARY_GET_PRIVATE (s);
 	GError *local_error = NULL;
 
 	/* struct _db_pass_data data; */
@@ -1839,9 +1819,9 @@ camel_folder_summary_load_from_db (CamelFolderSummary *s,
 
 	cdb = parent_store->cdb_r;
 
-	ret = camel_db_get_folder_uids_flags (
+	ret = camel_db_get_folder_uids (
 		cdb, full_name, s->sort_by, s->collate,
-		s->uids, p->flag_cache, &local_error);
+		s->uids, &local_error);
 
 	if (local_error != NULL && local_error->message != NULL &&
 		strstr (local_error->message, "no such table") != NULL) {
@@ -2448,7 +2428,6 @@ camel_folder_summary_add (CamelFolderSummary *s, CamelMessageInfo *info)
 	/* FIXME[disk-summary] SHould we ref it or redesign it later on */
 	/* The uid array should have its own memory. We will unload the infos when not reqd.*/
 	g_ptr_array_add (s->uids, (gpointer) camel_pstring_strdup ((camel_message_info_uid (info))));
-	g_hash_table_replace (CAMEL_FOLDER_SUMMARY_GET_PRIVATE (s)->flag_cache, (gchar *)info->uid, GUINT_TO_POINTER (camel_message_info_flags (info)));
 
 	g_hash_table_insert (s->loaded_infos, (gpointer) camel_message_info_uid (info), info);
 	s->flags |= CAMEL_SUMMARY_DIRTY;
@@ -2477,9 +2456,6 @@ camel_folder_summary_insert (CamelFolderSummary *s, CamelMessageInfo *info, gboo
 		g_ptr_array_add (s->uids, (gchar *) camel_pstring_strdup (camel_message_info_uid (info)));
 
 	g_hash_table_insert (s->loaded_infos, (gchar *) camel_message_info_uid (info), info);
-	if (load) {
-		g_hash_table_replace (CAMEL_FOLDER_SUMMARY_GET_PRIVATE (s)->flag_cache, (gchar *)info->uid, GUINT_TO_POINTER (camel_message_info_flags (info)));
-	}
 
 	if (!load)
 		s->flags |= CAMEL_SUMMARY_DIRTY;
@@ -2487,45 +2463,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;
 }
 
 /**
@@ -2813,7 +2794,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);
@@ -2853,7 +2839,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);
@@ -4649,17 +4640,6 @@ camel_message_info_user_tag (const CamelMessageInfo *mi, const gchar *id)
 }
 
 /**
- * camel_folder_summary_update_flag_cache:
- *
- * Since: 2.26
- **/
-void
-camel_folder_summary_update_flag_cache (CamelFolderSummary *s, const gchar *uid, guint32 flag)
-{
-	g_hash_table_replace (CAMEL_FOLDER_SUMMARY_GET_PRIVATE (s)->flag_cache, (gchar *) uid, GUINT_TO_POINTER (flag));
-}
-
-/**
  * camel_message_info_set_flags:
  * @mi: a #CamelMessageInfo
  * @flags: mask of flags to change
diff --git a/camel/camel-folder-summary.h b/camel/camel-folder-summary.h
index 0f36749..d536a99 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);
@@ -408,8 +411,6 @@ gboolean camel_folder_summary_check_uid (CamelFolderSummary *s, const gchar *uid
 GPtrArray *camel_folder_summary_array (CamelFolderSummary *summary);
 GHashTable *camel_folder_summary_get_hashtable (CamelFolderSummary *s);
 void camel_folder_summary_free_hashtable (GHashTable *ht);
-GHashTable *camel_folder_summary_get_flag_cache (CamelFolderSummary *summary);
-void camel_folder_summary_update_flag_cache (CamelFolderSummary *s, const gchar *uid, guint32 flag);
 
 /* basically like strings, but certain keywords can be compressed and de-cased */
 gint camel_folder_summary_encode_token (FILE *out, const gchar *str);
diff --git a/camel/camel-vee-folder.c b/camel/camel-vee-folder.c
index 12a2ba2..bb2236c 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 (
@@ -1355,6 +1378,7 @@ vee_folder_synchronize_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--;
@@ -1422,11 +1446,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);
@@ -1503,6 +1522,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) {
@@ -1533,6 +1553,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;
@@ -1742,9 +1763,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)) {
@@ -1792,10 +1815,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 07a90ab..a3fe8be 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;
@@ -284,14 +282,12 @@ vee_info_set_flags (CamelMessageInfo *mi,
 		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;
@@ -427,9 +423,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;
 }
 
@@ -461,8 +454,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);
@@ -483,21 +476,20 @@ camel_vee_summary_add (CamelVeeSummary *s, CamelFolderSummary *summary, const gc
 	}
 
 	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;
 }
diff --git a/camel/providers/local/camel-local-summary.c b/camel/providers/local/camel-local-summary.c
index 7ad10f8..a5c7bca 100644
--- a/camel/providers/local/camel-local-summary.c
+++ b/camel/providers/local/camel-local-summary.c
@@ -522,7 +522,6 @@ local_summary_add (CamelLocalSummary *cls,
 
 			update_summary (s, (CamelMessageInfoBase *) mi, (CamelMessageInfoBase *) info);
 			mi->info.flags |= (camel_message_info_flags (info) & 0xffff);
-			camel_folder_summary_update_flag_cache (s, mi->info.uid, mi->info.flags);
 			mi->info.size = camel_message_info_size (info);
 		}
 



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