evolution-data-server r9228 - trunk/camel/providers/imap



Author: sragavan
Date: Wed Jul 30 09:06:23 2008
New Revision: 9228
URL: http://svn.gnome.org/viewvc/evolution-data-server?rev=9228&view=rev

Log:
2008-07-30  Srinivasa Ragavan  <sragavan novell com>

	* camel/providers/imap/camel-imap-folder.c: Revamp imap_rescan. It
	seemed to be broken to me, if a older message in the uid is broken, we
	seem to delete the summaries of the later messages. This could be
	experimental code.


Modified:
   trunk/camel/providers/imap/ChangeLog
   trunk/camel/providers/imap/camel-imap-folder.c

Modified: trunk/camel/providers/imap/camel-imap-folder.c
==============================================================================
--- trunk/camel/providers/imap/camel-imap-folder.c	(original)
+++ trunk/camel/providers/imap/camel-imap-folder.c	Wed Jul 30 09:06:23 2008
@@ -819,7 +819,7 @@
 	} *new;
 	char *resp, *uid;
 	CamelImapResponseType type;
-	int i, seq, summary_got;
+	int i, j, seq, summary_got, del=0;
 	guint summary_len;
 	CamelMessageInfo *info;
 	CamelImapMessageInfo *iinfo;
@@ -918,26 +918,57 @@
 	
 	if (summary_len - camel_folder_summary_cache_size (folder->summary) > 50)
 		camel_folder_summary_reload_from_db (folder->summary, ex);
-	
-	for (i = 0; i < summary_len && new[i].uid; i++) {
+
+	for (i = 0, j = 0; i < summary_len && new[j].uid; i++) {
 		gboolean changed = FALSE;
 
 		uid = camel_folder_summary_uid_from_index (folder->summary, i);
 		
-		if (!uid) 
-			continue; 
+		if (!uid)
+			continue;
 
 		info = camel_folder_summary_uid (folder->summary, uid);
 
 		iinfo = (CamelImapMessageInfo *)info;
 
-		if (strcmp (uid, new[i].uid) != 0) {
+		if (strcmp (uid, new[j].uid) != 0) {
 			g_free (uid);
 
-			seq = i + 1;
+			/* these will be deleted from db in a moment. So adjust the counts please */
+			if (info) {
+				CamelMessageInfoBase *dinfo = (CamelMessageInfoBase *) info;
+				int unread=0, deleted=0, junk=0;
+				guint32 flags;
+
+				flags = dinfo->flags;
+				if (!(flags & CAMEL_MESSAGE_SEEN))
+					unread = 1;
+
+				if (flags & CAMEL_MESSAGE_DELETED)
+					deleted = 1;
+
+				if (flags & CAMEL_MESSAGE_JUNK)
+					junk = 1;
+
+				if (unread)
+					folder->summary->unread_count--;
+
+				if (deleted)
+					folder->summary->deleted_count--;
+				if (junk)
+					folder->summary->junk_count--;
+
+				if (junk && !deleted)
+					folder->summary->junk_not_deleted_count--;
+
+				if (!junk &&  !deleted) 
+					folder->summary->visible_count--;
+
+				folder->summary->saved_count--;
+			}
+			seq = i + 1-del;
+			del++;
 			g_array_append_val (removed, seq);
-			i--;
-			summary_len--;
 			camel_message_info_free(info);
 			continue;
 		}
@@ -946,13 +977,12 @@
 
 		/* Update summary flags */
 
-		if (new[i].flags != iinfo->server_flags) {
+		if (new[j].flags != iinfo->server_flags) {
 			guint32 server_set, server_cleared;
 			int read=0, deleted=0, junk=0;
 
-
-			server_set = new[i].flags & ~iinfo->server_flags;
-			server_cleared = iinfo->server_flags & ~new[i].flags;
+			server_set = new[j].flags & ~iinfo->server_flags;
+			server_cleared = iinfo->server_flags & ~new[j].flags;
 
 			if (server_set & CAMEL_MESSAGE_SEEN)
 				read = 1;
@@ -985,27 +1015,29 @@
 				folder->summary->visible_count -= junk ? junk : deleted;			
 			
 			iinfo->info.flags = (iinfo->info.flags | server_set) & ~server_cleared;
-			iinfo->server_flags = new[i].flags;
+			iinfo->server_flags = new[j].flags;
 			iinfo->info.dirty = TRUE;
 			changed = TRUE;
 		}
 		
+		
 		/* Do not merge custom flags when server doesn't support it.
 		   Because server always reports NULL, which means none, which
 		   will remove user's flags from local machine, which is bad.
 		*/
-		if ((folder->permanent_flags & CAMEL_MESSAGE_USER) != 0 && merge_custom_flags (info, new[i].custom_flags))
+		if ((folder->permanent_flags & CAMEL_MESSAGE_USER) != 0 && merge_custom_flags (info, new[j].custom_flags))
 			changed = TRUE;
 
 		if (changed) {
 			if (changes == NULL)
 				changes = camel_folder_change_info_new();
-			camel_folder_change_info_change_uid(changes, new[i].uid);
+			camel_folder_change_info_change_uid(changes, new[j].uid);
 		}
 
 		camel_message_info_free(info);
-		g_free (new[i].uid);
-		g_free (new[i].custom_flags);
+		g_free (new[j].uid);
+		g_free (new[j].custom_flags);
+		j++;
 	}
 
 	if (changes) {
@@ -1015,12 +1047,16 @@
 
 	seq = i + 1;
 
+
+#if 0
+	/* FIXME: Srini: I don't think this will be called any longer. */
 	/* Free remaining memory. */
 	while (i < summary_len && new[i].uid) {
 		g_free (new[i].uid);
 		g_free (new[i].custom_flags);
 		i++;
 	}
+#endif 	
 	g_free (new);
 
 	/* Remove any leftover cached summary messages. (Yes, we
@@ -1028,9 +1064,45 @@
 	 * See RFC2060 7.4.1)
 	 */
 
-	for (i = seq; i <= summary_len; i++)
-		g_array_append_val (removed, seq);
+	for (i = seq; i <= summary_len; i++) {
+		CamelMessageInfoBase *dinfo;
+		int j;
+		dinfo = (CamelMessageInfoBase *) camel_folder_summary_index (folder->summary, i-1);
+		if (dinfo) {
+			/* these will be deleted from db in a moment. So adjust the counts please */
+			int unread=0, deleted=0, junk=0;
+			guint32 flags;
+
+			flags = dinfo->flags;
+			if (!(flags & CAMEL_MESSAGE_SEEN))
+				unread = 1;
+
+			if (flags & CAMEL_MESSAGE_DELETED)
+				deleted = 1;
+
+			if (flags & CAMEL_MESSAGE_JUNK)
+				junk = 1;
+			
+			if (unread)
+				folder->summary->unread_count--;
+			
+			if (deleted)
+				folder->summary->deleted_count--;
+			if (junk)
+				folder->summary->junk_count--;
+			
+			if (junk && !deleted)
+				folder->summary->junk_not_deleted_count--;
+			
+			if (!junk &&  !deleted) 
+				folder->summary->visible_count--;
 
+			folder->summary->saved_count--;
+			camel_message_info_free(dinfo);
+		}
+		j = seq - del;
+		g_array_append_val (removed, j);
+	}
 	/* And finally update the summary. */
 	camel_imap_folder_changed (folder, exists, removed, ex);
 	g_array_free (removed, TRUE);



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