camel-imap4 r5 - trunk/imap4



Author: fejj
Date: Mon May 12 00:38:07 2008
New Revision: 5
URL: http://svn.gnome.org/viewvc/camel-imap4?rev=5&view=rev

Log:
2008-05-11  Jeffrey Stedfast  <fejj novell com>

	* camel-imap4-store.c: Define some symbols that might not exist in
	the version of camel we are linking against.
	(imap4_build_folder_info_tree): New function to build a tree
	structure of CamelFolderInfo's from an array.



Modified:
   trunk/imap4/ChangeLog
   trunk/imap4/camel-imap4-store-summary.c
   trunk/imap4/camel-imap4-store.c

Modified: trunk/imap4/camel-imap4-store-summary.c
==============================================================================
--- trunk/imap4/camel-imap4-store-summary.c	(original)
+++ trunk/imap4/camel-imap4-store-summary.c	Mon May 12 00:38:07 2008
@@ -39,7 +39,7 @@
 #include "camel-imap4-utils.h"
 
 #ifndef HAVE_CAMEL_FOLDER_INFO_NEW
-#define camel_folder_info_new() g_slice_new (CamelFolderInfo)
+#define camel_folder_info_new() g_slice_new0 (CamelFolderInfo)
 #endif
 
 #define CAMEL_IMAP4_STORE_SUMMARY_VERSION_0 (0)

Modified: trunk/imap4/camel-imap4-store.c
==============================================================================
--- trunk/imap4/camel-imap4-store.c	(original)
+++ trunk/imap4/camel-imap4-store.c	Mon May 12 00:38:07 2008
@@ -51,7 +51,7 @@
 #include "camel-imap4-utils.h"
 
 #ifndef HAVE_CAMEL_FOLDER_INFO_NEW
-#define camel_folder_info_new() g_slice_new (CamelFolderInfo)
+#define camel_folder_info_new() g_slice_new0 (CamelFolderInfo)
 
 static void
 imap4_folder_info_free (CamelFolderInfo *fi)
@@ -906,9 +906,9 @@
 	case CAMEL_IMAP4_RESULT_OK:
 		url = camel_url_copy (engine->url);
 		camel_url_set_fragment (url, folder_name);
-
+		
 		c = strrchr (folder_name, '/');
-
+		
 		fi = camel_folder_info_new ();
 		fi->full_name = g_strdup (folder_name);
 		fi->name = g_strdup (c ? c + 1: folder_name);
@@ -1363,6 +1363,73 @@
 }
 
 static CamelFolderInfo *
+imap4_build_folder_info_tree (GPtrArray *array, const char *top)
+{
+	CamelFolderInfo *cur, *fi, *root = NULL;
+	const char *p;
+	size_t n = 0;
+	char *pname;
+	int i;
+	
+	if (array->len == 0)
+		return NULL;
+	
+	if (array->len == 1)
+		return array->pdata[0];
+	
+	if (top)
+		n = strlen (top);
+	
+	cur = root = array->pdata[0];
+	
+	for (i = 1; i < array->len; i++) {
+		fi = (CamelFolderInfo *) array->pdata[i];
+		if (top && strncmp (fi->full_name, top, n) != 0) {
+			/* this folder info was not requested */
+			camel_folder_info_free (fi);
+			continue;
+		}
+		
+		if ((p = strrchr (fi->full_name, '/'))) {
+			pname = g_strndup (fi->full_name, p - fi->full_name);
+			if (!strcmp (cur->full_name, pname)) {
+				/* cur is our parent */
+				fi->parent = cur;
+				cur->child = fi;
+				cur = fi;
+			} else if (cur->parent && !strcmp (cur->parent->full_name, pname)) {
+				/* cur is our sibling */
+				fi->parent = cur->parent;
+				cur->next = fi;
+				cur = fi;
+			} else {
+				/* search back for our parent */
+				while (cur->parent) {
+					if (!strcmp (cur->parent->full_name, pname))
+						break;
+					cur = cur->parent;
+				}
+				
+				/* cur should now be our sibling */
+				fi->parent = cur->parent;
+				cur->next = fi;
+				cur = fi;
+			}
+			g_free (pname);
+		} else {
+			/* traverse back to most recent top-level fi */
+			while (cur->parent)
+				cur = cur->parent;
+			
+			cur->next = fi;
+			cur = fi;
+		}
+	}
+	
+	return root;
+}
+
+static CamelFolderInfo *
 imap4_build_folder_info (CamelStore *store, const char *top, guint32 flags, GPtrArray *array)
 {
 	CamelIMAP4Engine *engine = ((CamelIMAP4Store *) store)->engine;
@@ -1373,79 +1440,82 @@
 	char *name, *p;
 	CamelURL *url;
 	int i;
-
+	
 	if (array->len == 0) {
 		g_ptr_array_free (array, TRUE);
 		return NULL;
 	}
-
+	
 	g_ptr_array_sort (array, (GCompareFunc) list_sort);
-
+	
 	list_remove_duplicates (array);
 	list_add_ghosts (array);
 	
 	url = camel_url_copy (engine->url);
-
+	
 	if (!strcmp (top, "") && (flags & CAMEL_STORE_FOLDER_INFO_RECURSIVE)) {
 		/* clear the folder-info cache */
 		camel_store_summary_clear ((CamelStoreSummary *) ((CamelIMAP4Store *) store)->summary);
 	}
-
+	
 	for (i = 0; i < array->len; i++) {
 		list = array->pdata[i];
 		fi = camel_folder_info_new ();
-
+		
 		p = name = camel_utf7_utf8 (list->name);
 		while (*p != '\0') {
 			if (*p == list->delim)
 				*p = '/';
 			p++;
 		}
-
+		
 		p = strrchr (name, '/');
 		camel_url_set_fragment (url, name);
-
+		
 		fi->full_name = name;
 		fi->name = g_strdup (p ? p + 1: name);
 		fi->uri = camel_url_to_string (url, CAMEL_URL_HIDE_ALL);
 		fi->flags = list->flags | (lsub ? CAMEL_FOLDER_SUBSCRIBED : 0);
 		fi->unread = -1;
 		fi->total = -1;
-
+		
+		printf ("created fi = { full_name=\"%s\", name=\"%s\", uri=\"%s\" };\n",
+			fi->full_name, fi->name, fi->uri);
+		
 		if (!g_ascii_strcasecmp (fi->full_name, "INBOX"))
 			fi->flags |= CAMEL_FOLDER_SYSTEM | CAMEL_FOLDER_TYPE_INBOX;
-
+		
 		/* SELECTED folder, just get it from the folder */
 		if (folder && !strcmp (folder->full_name, fi->full_name)) {
 			camel_object_get (folder, NULL, CAMEL_FOLDER_TOTAL, &fi->total, CAMEL_FOLDER_UNREAD, &fi->unread, 0);
 		} else if (!(flags & CAMEL_STORE_FOLDER_INFO_FAST)) {
 			imap4_status (store, fi);
 		}
-
+		
 		if (!(fi->flags & CAMEL_FOLDER_SUBSCRIBED))
 			imap4_subscription_info (store, fi);
-
+		
 		array->pdata[i] = fi;
-
+		
 		camel_imap4_store_summary_note_info (((CamelIMAP4Store *) store)->summary, fi);
-
+		
 		if (!g_ascii_strcasecmp (fi->full_name, "INBOX")) {
 			g_free (fi->name);
 			fi->name = g_strdup (_("Inbox"));
 		}
-
+		
 		g_free (list->name);
 		g_free (list);
 	}
-
-	fi = camel_folder_info_build (array, top, '/', TRUE);
-
+	
+	fi = imap4_build_folder_info_tree (array, top);
+	
 	camel_url_free (url);
-
+	
 	g_ptr_array_free (array, TRUE);
-
+	
 	camel_store_summary_save ((CamelStoreSummary *) ((CamelIMAP4Store *) store)->summary);
-
+	
 	return fi;
 }
 
@@ -1618,6 +1688,14 @@
 	g_free (pattern);
 	
 	fi = imap4_build_folder_info (store, top, flags, array);
+	if (1) {
+		CamelFolderInfo *node = fi;
+		
+		while (node) {
+			printf ("fi->full_name = %s\n", node->full_name);
+			node = node->next;
+		}
+	}
 	
  done:
 	



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