aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeffrey Stedfast <fejj@helixcode.com>2000-09-14 06:13:09 +0800
committerJeffrey Stedfast <fejj@src.gnome.org>2000-09-14 06:13:09 +0800
commit7acecd99c9998ff09bf561c211f2d3d566d384c9 (patch)
tree9cb4de444ddb9e97486b7846201da746e5985ba0
parent87c46529b837633f7bc246f26a485262742df000 (diff)
downloadgsoc2013-evolution-7acecd99c9998ff09bf561c211f2d3d566d384c9.tar.gz
gsoc2013-evolution-7acecd99c9998ff09bf561c211f2d3d566d384c9.tar.zst
gsoc2013-evolution-7acecd99c9998ff09bf561c211f2d3d566d384c9.zip
Rewrote to take a third argument (gboolean *selectable) so that we can
2000-09-13 Jeffrey Stedfast <fejj@helixcode.com> * providers/imap/camel-imap-store.c (imap_folder_exists): Rewrote to take a third argument (gboolean *selectable) so that we can find out if the folder is selectable or not as we look to see if it exists. Also, don't use EXAMINE because that will not work on non-selectable folders, so use LIST instead. (get_folder): Check to see if the folder exists even vefore calling imap_create as this will save time. If the folder does exist, find out if it's selectable. Moved the call to refresh_info here. * providers/imap/camel-imap-folder.c (imap_get_uids): Check for a NULL summary. (camel_imap_folder_new): Don't call refresh_info here - call it in get_folder() because we don't know if this folder even exists on the server yet! And even if it does, we don't know if it can hold messages or not yet. svn path=/trunk/; revision=5412
-rw-r--r--camel/ChangeLog19
-rw-r--r--camel/providers/imap/camel-imap-folder.c13
-rw-r--r--camel/providers/imap/camel-imap-store.c103
3 files changed, 114 insertions, 21 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog
index 56fd149a07..92bf1266dd 100644
--- a/camel/ChangeLog
+++ b/camel/ChangeLog
@@ -1,3 +1,22 @@
+2000-09-13 Jeffrey Stedfast <fejj@helixcode.com>
+
+ * providers/imap/camel-imap-store.c (imap_folder_exists): Rewrote
+ to take a third argument (gboolean *selectable) so that we can
+ find out if the folder is selectable or not as we look to see if
+ it exists. Also, don't use EXAMINE because that will not work on
+ non-selectable folders, so use LIST instead.
+ (get_folder): Check to see if the folder exists even vefore
+ calling imap_create as this will save time. If the folder does
+ exist, find out if it's selectable. Moved the call to refresh_info
+ here.
+
+ * providers/imap/camel-imap-folder.c (imap_get_uids): Check for a
+ NULL summary.
+ (camel_imap_folder_new): Don't call refresh_info here - call it in
+ get_folder() because we don't know if this folder even exists on
+ the server yet! And even if it does, we don't know if it can hold
+ messages or not yet.
+
2000-09-12 Jeffrey Stedfast <fejj@helixcode.com>
* camel-mime-parser.c (folder_scan_step): Make sure *datalength is
diff --git a/camel/providers/imap/camel-imap-folder.c b/camel/providers/imap/camel-imap-folder.c
index 5b55f6bf9a..643587bbe7 100644
--- a/camel/providers/imap/camel-imap-folder.c
+++ b/camel/providers/imap/camel-imap-folder.c
@@ -195,17 +195,17 @@ camel_imap_folder_new (CamelStore *parent, char *folder_name, CamelException *ex
camel_object_unref (CAMEL_OBJECT (folder));
return NULL;
}
-
+
if (!strcmp (folder_name, url->path + 1))
folder->can_hold_messages = FALSE;
- CF_CLASS (folder)->refresh_info (folder, ex);
-
+ /*CF_CLASS (folder)->refresh_info (folder, ex);*/
+
if (camel_exception_is_set (ex)) {
camel_object_unref (CAMEL_OBJECT (folder));
return NULL;
}
-
+
return folder;
}
@@ -531,7 +531,7 @@ imap_get_unread_message_count (CamelFolder *folder)
if (!imap_folder->summary)
return 0;
- infolist = imap_get_summary (folder);
+ infolist = imap_folder->summary;
for (i = 0; i < infolist->len; i++) {
info = (CamelMessageInfo *) g_ptr_array_index (infolist, i);
@@ -679,7 +679,8 @@ imap_get_uids (CamelFolder *folder)
gint i, count;
infolist = imap_get_summary (folder);
- count = infolist->len;
+
+ count = infolist ? infolist->len : 0;
array = g_ptr_array_new ();
g_ptr_array_set_size (array, count);
diff --git a/camel/providers/imap/camel-imap-store.c b/camel/providers/imap/camel-imap-store.c
index 5ffdd51d4b..209b8a6fbb 100644
--- a/camel/providers/imap/camel-imap-store.c
+++ b/camel/providers/imap/camel-imap-store.c
@@ -320,6 +320,64 @@ camel_imap_store_get_toplevel_dir (CamelImapStore *store)
}
static gboolean
+imap_folder_exists (CamelFolder *folder, gboolean *selectable, CamelException *ex)
+{
+ CamelStore *store = CAMEL_STORE (folder->parent_store);
+ CamelURL *url = CAMEL_SERVICE (store)->url;
+ gchar *result, *folder_path, *dir_sep;
+ char *flags, *sep, *dirname;
+ gint status;
+
+ dir_sep = CAMEL_IMAP_STORE (folder->parent_store)->dir_sep;
+
+ g_return_val_if_fail (dir_sep, FALSE);
+
+ if (url && url->path && *(url->path + 1) && g_strcasecmp (folder->full_name, "INBOX"))
+ folder_path = g_strdup_printf ("%s%s%s", url->path + 1, dir_sep, folder->full_name);
+ else
+ folder_path = g_strdup (folder->full_name);
+
+ if (!g_strcasecmp (folder_path, "INBOX")) {
+ g_free (folder_path);
+ if (selectable)
+ *selectable = TRUE;
+ return TRUE;
+ }
+
+ /* it's always gonna be FALSE unless it's true - how's that for a comment? ;-) */
+ if (selectable)
+ *selectable = FALSE;
+
+ status = camel_imap_command_extended (CAMEL_IMAP_STORE (store), NULL,
+ &result, ex, "LIST \"\" %s", folder_path);
+
+ g_free (folder_path);
+
+ if (status != CAMEL_IMAP_OK) {
+ g_free (result);
+ return FALSE;
+ }
+
+ if (imap_parse_list_response (result, "", &flags, &sep, &dirname)) {
+ if (selectable)
+ *selectable = !e_strstrcase (flags, "NoSelect");
+
+ g_free (flags);
+ g_free (sep);
+ g_free (dirname);
+
+ return TRUE;
+ }
+
+ g_free (flags);
+ g_free (sep);
+ g_free (dirname);
+
+ return FALSE;
+}
+
+#if 0
+static gboolean
imap_folder_exists (CamelFolder *folder, CamelException *ex)
{
CamelStore *store = CAMEL_STORE (folder->parent_store);
@@ -331,7 +389,7 @@ imap_folder_exists (CamelFolder *folder, CamelException *ex)
g_return_val_if_fail (dir_sep, FALSE);
- if (url && url->path && *(url->path + 1) && strcmp (folder->full_name, "INBOX"))
+ if (url && url->path && *(url->path + 1) && g_strcasecmp (folder->full_name, "INBOX"))
folder_path = g_strdup_printf ("%s%s%s", url->path + 1, dir_sep, folder->full_name);
else
folder_path = g_strdup (folder->full_name);
@@ -348,6 +406,7 @@ imap_folder_exists (CamelFolder *folder, CamelException *ex)
return TRUE;
}
+#endif
static gboolean
imap_create (CamelFolder *folder, CamelException *ex)
@@ -365,10 +424,10 @@ imap_create (CamelFolder *folder, CamelException *ex)
return FALSE;
}
- if (!strcmp (folder->full_name, "INBOX"))
+ if (!g_strcasecmp (folder->full_name, "INBOX"))
return TRUE;
- if (imap_folder_exists (folder, ex))
+ if (imap_folder_exists (folder, NULL, ex))
return TRUE;
/* create the directory for the subfolder */
@@ -376,7 +435,7 @@ imap_create (CamelFolder *folder, CamelException *ex)
g_return_val_if_fail (dir_sep, FALSE);
- if (url && url->path && *(url->path + 1) && strcmp (folder->full_name, "INBOX"))
+ if (url && url->path && *(url->path + 1) && g_strcasecmp (folder->full_name, "INBOX"))
folder_path = g_strdup_printf ("%s%s%s", url->path + 1, dir_sep, folder->full_name);
else
folder_path = g_strdup (folder->full_name);
@@ -391,13 +450,14 @@ imap_create (CamelFolder *folder, CamelException *ex)
return TRUE;
}
+#if 0
static gboolean
folder_is_selectable (CamelStore *store, const char *folder_path, CamelException *ex)
{
char *result, *flags, *sep, *folder;
int status;
- if (!strcmp (folder_path, "INBOX"))
+ if (!g_strcasecmp (folder_path, "INBOX"))
return TRUE;
status = camel_imap_command_extended (CAMEL_IMAP_STORE (store), NULL,
@@ -421,6 +481,7 @@ folder_is_selectable (CamelStore *store, const char *folder_path, CamelException
return FALSE;
}
+#endif
static CamelFolder *
get_folder (CamelStore *store, const char *folder_name, gboolean create, CamelException *ex)
@@ -428,6 +489,8 @@ get_folder (CamelStore *store, const char *folder_name, gboolean create, CamelEx
CamelURL *url = CAMEL_SERVICE (store)->url;
CamelFolder *new_folder;
char *folder_path, *dir_sep;
+ gboolean exists = FALSE;
+ gboolean selectable;
g_return_val_if_fail (store != NULL, NULL);
g_return_val_if_fail (folder_name != NULL, NULL);
@@ -444,23 +507,33 @@ get_folder (CamelStore *store, const char *folder_name, gboolean create, CamelEx
if (camel_exception_is_set (ex))
return NULL;
-
+
/* this is the top-level dir, we already know it exists - it has to! */
- if (!strcmp (folder_name, dir_sep))
+ if (!strcmp (folder_name, dir_sep)) {
+ camel_folder_refresh_info (new_folder, ex);
return new_folder;
+ }
- if (create && !imap_create (new_folder, ex)) {
- if (!folder_is_selectable (store, folder_path, ex)) {
+ if (imap_folder_exists (new_folder, &selectable, ex)) {
+ /* ah huh, so the folder *does* exist... */
+ exists = TRUE;
+
+ /* now lets see if it's selectable... */
+ if (!selectable) {
camel_exception_clear (ex);
new_folder->can_hold_messages = FALSE;
- return new_folder;
- } else {
- g_free (folder_path);
- camel_object_unref (CAMEL_OBJECT (new_folder));
- return NULL;
}
}
+ if (!exists && create && !imap_create (new_folder, ex)) {
+ g_free (folder_path);
+ camel_object_unref (CAMEL_OBJECT (new_folder));
+ return NULL;
+ }
+
+ /* this is where we *should refresh_info, not in imap_folder_new() */
+ camel_folder_refresh_info (new_folder, ex);
+
return new_folder;
}
@@ -535,7 +608,7 @@ check_current_folder (CamelImapStore *store, CamelFolder *folder, char *fmt, Cam
dir_sep = store->dir_sep;
- if (url && url->path && *(url->path + 1) && strcmp (folder->full_name, "INBOX"))
+ if (url && url->path && *(url->path + 1) && g_strcasecmp (folder->full_name, "INBOX"))
folder_path = g_strdup_printf ("%s%s%s", url->path + 1, dir_sep, folder->full_name);
else
folder_path = g_strdup (folder->full_name);