camel-imap4 r8 - trunk/imap4
- From: fejj svn gnome org
- To: svn-commits-list gnome org
- Subject: camel-imap4 r8 - trunk/imap4
- Date: Mon, 12 May 2008 04:03:13 +0100 (BST)
Author: fejj
Date: Mon May 12 03:03:13 2008
New Revision: 8
URL: http://svn.gnome.org/viewvc/camel-imap4?rev=8&view=rev
Log:
2008-05-11 Jeffrey Stedfast <fejj novell com>
* camel-imap4-store-summary.c (camel_imap4_store_summary_get_folder_info):
Use a custom imap4 routine to create a folderinfo tree.
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 03:03:13 2008
@@ -357,14 +357,14 @@
{
CamelFolderInfo *fi;
const char *name;
-
+
fi = camel_folder_info_new ();
fi->full_name = g_strdup (camel_store_info_path (s, si));
fi->uri = g_strdup (camel_store_info_uri (s, si));
fi->flags = si->flags;
fi->unread = si->unread;
fi->total = si->total;
-
+
name = camel_store_info_name (s, si);
if (!g_ascii_strcasecmp (fi->full_name, "INBOX")) {
fi->flags |= CAMEL_FOLDER_SYSTEM | CAMEL_FOLDER_TYPE_INBOX;
@@ -376,6 +376,73 @@
return fi;
}
+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;
+}
+
CamelFolderInfo *
camel_imap4_store_summary_get_folder_info (CamelIMAP4StoreSummary *s, const char *top, guint32 flags)
{
@@ -408,7 +475,7 @@
g_ptr_array_add (folders, store_info_to_folder_info (ss, si));
}
- fi = camel_folder_info_build (folders, top, '/', TRUE);
+ fi = imap4_build_folder_info_tree (folders, top);
g_ptr_array_free (folders, TRUE);
return fi;
Modified: trunk/imap4/camel-imap4-store.c
==============================================================================
--- trunk/imap4/camel-imap4-store.c (original)
+++ trunk/imap4/camel-imap4-store.c Mon May 12 03:03:13 2008
@@ -886,22 +886,22 @@
CamelURL *url;
const char *c;
int id;
-
+
CAMEL_SERVICE_REC_LOCK (store, connect_lock);
-
+
utf7_name = imap4_folder_utf7_name (store, folder_name, '\0');
ic = camel_imap4_engine_queue (engine, NULL, "CREATE %S%s\r\n", utf7_name, subfolder_hint);
g_free (utf7_name);
-
+
while ((id = camel_imap4_engine_iterate (engine)) < ic->id && id != -1)
;
-
+
if (id == -1 || ic->status != CAMEL_IMAP4_COMMAND_COMPLETE) {
camel_exception_xfer (ex, &ic->ex);
camel_imap4_command_unref (ic);
goto done;
}
-
+
switch (ic->result) {
case CAMEL_IMAP4_RESULT_OK:
url = camel_url_copy (engine->url);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]