aboutsummaryrefslogtreecommitdiffstats
path: root/mail/mail-vfolder.c
diff options
context:
space:
mode:
Diffstat (limited to 'mail/mail-vfolder.c')
-rw-r--r--mail/mail-vfolder.c84
1 files changed, 43 insertions, 41 deletions
diff --git a/mail/mail-vfolder.c b/mail/mail-vfolder.c
index c8e7babf5d..20c420a4f4 100644
--- a/mail/mail-vfolder.c
+++ b/mail/mail-vfolder.c
@@ -60,8 +60,12 @@ CamelStore *vfolder_store; /* the 1 static vfolder store */
/* lock for accessing shared resources (below) */
G_LOCK_DEFINE_STATIC (vfolder);
-static GList *source_folders_remote; /* list of source folder uri's - remote ones */
-static GList *source_folders_local; /* list of source folder uri's - local ones */
+/* list of source folder uri's - remote ones */
+static GQueue source_folders_remote = G_QUEUE_INIT;
+
+/* list of source folder uri's - local ones */
+static GQueue source_folders_local = G_QUEUE_INIT;
+
static GHashTable *vfolder_hash;
/* This is a slightly hacky solution to shutting down, we poll this variable in various
loops, and just quit processing if it is set. */
@@ -328,16 +332,21 @@ vfolder_adduri (EMailSession *session,
/* ********************************************************************** */
static GList *
-mv_find_folder (GList *l, EMailSession *session, const gchar *uri)
+mv_find_folder (GQueue *queue,
+ EMailSession *session,
+ const gchar *uri)
{
CamelSession *camel_session = CAMEL_SESSION (session);
+ GList *head, *link;
- while (l) {
- if (e_mail_folder_uri_equal (camel_session, l->data, uri))
+ head = g_queue_peek_head_link (queue);
+
+ for (link = head; link != NULL; link = g_list_next (link)) {
+ if (e_mail_folder_uri_equal (camel_session, link->data, uri))
break;
- l = l->next;
}
- return l;
+
+ return link;
}
static gint
@@ -444,6 +453,7 @@ mail_vfolder_add_folder (EMailBackend *backend,
CamelVeeFolder *vf;
CamelProvider *provider;
GList *folders = NULL, *link;
+ GQueue *queue;
gint remote;
gint is_ignore;
gchar *uri;
@@ -452,6 +462,7 @@ mail_vfolder_add_folder (EMailBackend *backend,
provider = camel_service_get_provider (CAMEL_SERVICE (store));
remote = (provider->flags & CAMEL_PROVIDER_IS_REMOTE) != 0;
+ queue = remote ? &source_folders_remote : &source_folders_local;
if (folder_is_spethal (store, folder_name))
return;
@@ -468,30 +479,15 @@ mail_vfolder_add_folder (EMailBackend *backend,
if (CAMEL_IS_VEE_STORE (store)) {
is_ignore = TRUE;
} else if (remove) {
- if (remote) {
- if ((link = mv_find_folder (source_folders_remote, session, uri)) != NULL) {
- g_free (link->data);
- source_folders_remote = g_list_remove_link (
- source_folders_remote, link);
- }
- } else {
- if ((link = mv_find_folder (source_folders_local, session, uri)) != NULL) {
- g_free (link->data);
- source_folders_local = g_list_remove_link (
- source_folders_local, link);
- }
+ link = mv_find_folder (queue, session, uri);
+ if (link != NULL) {
+ g_free (link->data);
+ g_queue_delete_link (queue, link);
}
} else if (!is_ignore) {
/* we ignore drafts/sent/outbox here */
- if (remote) {
- if (mv_find_folder (source_folders_remote, session, uri) == NULL)
- source_folders_remote = g_list_prepend (
- source_folders_remote, g_strdup (uri));
- } else {
- if (mv_find_folder (source_folders_local, session, uri) == NULL)
- source_folders_local = g_list_prepend (
- source_folders_local, g_strdup (uri));
- }
+ if (mv_find_folder (queue, session, uri) == NULL)
+ g_queue_push_tail (queue, g_strdup (uri));
}
if (context == NULL)
@@ -572,6 +568,7 @@ mail_vfolder_delete_folder (EMailBackend *backend,
const gchar *source;
CamelVeeFolder *vf;
GString *changed;
+ GQueue *queue;
guint changed_count;
gchar *uri;
GList *link;
@@ -639,14 +636,18 @@ mail_vfolder_delete_folder (EMailBackend *backend,
}
done:
- if ((link = mv_find_folder (source_folders_remote, session, uri)) != NULL) {
+ queue = &source_folders_remote;
+ link = mv_find_folder (queue, session, uri);
+ if (link != NULL) {
g_free (link->data);
- source_folders_remote = g_list_remove_link (source_folders_remote, link);
+ g_queue_delete_link (queue, link);
}
- if ((link = mv_find_folder (source_folders_local, session, uri)) != NULL) {
+ queue = &source_folders_local;
+ link = mv_find_folder (queue, session, uri);
+ if (link != NULL) {
g_free (link->data);
- source_folders_local = g_list_remove_link (source_folders_local, link);
+ g_queue_delete_link (queue, link);
}
G_UNLOCK (vfolder);
@@ -761,13 +762,13 @@ mail_vfolder_rename_folder (CamelStore *store,
GList *
mail_vfolder_get_sources_local (void)
{
- return source_folders_local;
+ return g_queue_peek_head_link (&source_folders_local);
}
GList *
mail_vfolder_get_sources_remote (void)
{
- return source_folders_remote;
+ return g_queue_peek_head_link (&source_folders_remote);
}
/* ********************************************************************** */
@@ -776,7 +777,7 @@ static void context_rule_added (ERuleContext *ctx, EFilterRule *rule);
static void
rule_add_sources (EMailSession *session,
- GList *l,
+ GQueue *queue,
GList **sources_folderp,
GList **sources_urip)
{
@@ -784,11 +785,13 @@ rule_add_sources (EMailSession *session,
GList *sources_uri = *sources_urip;
MailFolderCache *folder_cache;
CamelFolder *newfolder;
+ GList *head, *link;
folder_cache = e_mail_session_get_folder_cache (session);
- while (l) {
- const gchar *uri = l->data;
+ head = g_queue_peek_head_link (queue);
+ for (link = head; link != NULL; link = g_list_next (link)) {
+ const gchar *uri = link->data;
if (mail_folder_cache_get_folder_from_uri (
folder_cache, uri, &newfolder)) {
@@ -799,7 +802,6 @@ rule_add_sources (EMailSession *session,
sources_uri = g_list_append (
sources_uri, g_strdup (uri));
}
- l = l->next;
}
*sources_folderp = sources_folder;
@@ -849,7 +851,7 @@ rule_changed (EFilterRule *rule, CamelFolder *folder)
/* find any (currently available) folders, and add them to the ones to open */
rule_add_sources (
- session, ((EMVFolderRule *) rule)->sources,
+ session, &((EMVFolderRule *) rule)->sources,
&sources_folder, &sources_uri);
G_LOCK (vfolder);
@@ -858,14 +860,14 @@ rule_changed (EFilterRule *rule, CamelFolder *folder)
((EMVFolderRule *) rule)->with ==
EM_VFOLDER_RULE_WITH_LOCAL_REMOTE_ACTIVE)
rule_add_sources (
- session, source_folders_local,
+ session, &source_folders_local,
&sources_folder, &sources_uri);
if (((EMVFolderRule *) rule)->with ==
EM_VFOLDER_RULE_WITH_REMOTE_ACTIVE ||
((EMVFolderRule *) rule)->with ==
EM_VFOLDER_RULE_WITH_LOCAL_REMOTE_ACTIVE)
rule_add_sources (
- session, source_folders_remote,
+ session, &source_folders_remote,
&sources_folder, &sources_uri);
G_UNLOCK (vfolder);