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
This commit is contained in:
Jeffrey Stedfast
2000-09-13 22:13:09 +00:00
committed by Jeffrey Stedfast
parent 87c46529b8
commit 7acecd99c9
3 changed files with 116 additions and 23 deletions

View File

@ -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

View File

@ -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);

View File

@ -319,6 +319,64 @@ camel_imap_store_get_toplevel_dir (CamelImapStore *store)
return url->path;
}
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)
{
@ -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))
return new_folder;
if (create && !imap_create (new_folder, ex)) {
if (!folder_is_selectable (store, folder_path, ex)) {
/* this is the top-level dir, we already know it exists - it has to! */
if (!strcmp (folder_name, dir_sep)) {
camel_folder_refresh_info (new_folder, ex);
return new_folder;
}
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);