aboutsummaryrefslogtreecommitdiffstats
path: root/camel/camel-folder.c
diff options
context:
space:
mode:
authorNot Zed <NotZed@Ximian.com>2004-05-21 17:08:09 +0800
committerMichael Zucci <zucchi@src.gnome.org>2004-05-21 17:08:09 +0800
commit2bc97c08c1ca8057f03b3b3d872eafa306bab22c (patch)
treeb290bc21cafc1b26ac44a5296a58748c0cad439c /camel/camel-folder.c
parentcfa1f110a7dabe96457a17f0e42f632f8b111828 (diff)
downloadgsoc2013-evolution-2bc97c08c1ca8057f03b3b3d872eafa306bab22c.tar
gsoc2013-evolution-2bc97c08c1ca8057f03b3b3d872eafa306bab22c.tar.gz
gsoc2013-evolution-2bc97c08c1ca8057f03b3b3d872eafa306bab22c.tar.bz2
gsoc2013-evolution-2bc97c08c1ca8057f03b3b3d872eafa306bab22c.tar.lz
gsoc2013-evolution-2bc97c08c1ca8057f03b3b3d872eafa306bab22c.tar.xz
gsoc2013-evolution-2bc97c08c1ca8057f03b3b3d872eafa306bab22c.tar.zst
gsoc2013-evolution-2bc97c08c1ca8057f03b3b3d872eafa306bab22c.zip
added a 'domain' argument, and rearragned arguments to be prettier and
2004-05-21 Not Zed <NotZed@Ximian.com> * camel-session.c (camel_session_get_password): added a 'domain' argument, and rearragned arguments to be prettier and more consistent. Fixed all callers. (camel_session_forget_password): added a domain argument. Fixed all callers. ** See #58376. * camel-folder.c (set_message_flags): if system flags change, then don't trigger a folder changed event. * camel-folder-summary.h (CAMEL_MESSAGE_SYSTEM_MASK): added this to indicate which flags are internal/apps not interested in. * camel-folder.c (filter_free): rearrange and use some helpers. (folder_changed): if we're frozen, dont go firing off threads to do any processing on each change, wait until we're called unfrozen. Slight code rearragnement. (filter_filter): add progress to junk learn/unlearn, and separate them. svn path=/trunk/; revision=26029
Diffstat (limited to 'camel/camel-folder.c')
-rw-r--r--camel/camel-folder.c146
1 files changed, 68 insertions, 78 deletions
diff --git a/camel/camel-folder.c b/camel/camel-folder.c
index feeaab6d09..cb9cd7dda2 100644
--- a/camel/camel-folder.c
+++ b/camel/camel-folder.c
@@ -753,7 +753,7 @@ set_message_flags(CamelFolder *folder, const char *uid, guint32 flags, guint32 s
{
CamelMessageInfo *info;
CamelFolderChangeInfo *changes;
- guint32 new;
+ guint32 old;
g_return_val_if_fail(folder->summary != NULL, FALSE);
@@ -761,16 +761,19 @@ set_message_flags(CamelFolder *folder, const char *uid, guint32 flags, guint32 s
if (info == NULL)
return FALSE;
- new = (info->flags & ~flags) | (set & flags);
- if (new == info->flags) {
- camel_folder_summary_info_free(folder->summary, info);
- return FALSE;
+ old = info->flags;
+ info->flags = (old & ~flags) | (set & flags);
+ if (old != info->flags) {
+ info->flags |= CAMEL_MESSAGE_FOLDER_FLAGGED;
+ camel_folder_summary_touch(folder->summary);
}
-
- info->flags = new | CAMEL_MESSAGE_FOLDER_FLAGGED;
- camel_folder_summary_touch(folder->summary);
+
camel_folder_summary_info_free(folder->summary, info);
+ /* app or vfolders don't need to be notified of system flag changes */
+ if ((old & ~CAMEL_MESSAGE_SYSTEM_MASK) == (info->flags & ~CAMEL_MESSAGE_SYSTEM_MASK))
+ return FALSE;
+
changes = camel_folder_change_info_new();
camel_folder_change_info_change_uid(changes, uid);
camel_object_trigger_event(folder, "folder_changed", changes);
@@ -1656,38 +1659,44 @@ filter_filter(CamelSession *session, CamelSessionThreadMsg *msg)
CamelURL *uri;
char *source_url;
CamelException ex;
+ CamelJunkPlugin *csp = ((CamelService *)m->folder->parent_store)->session->junk_plugin;
- if (m->junk || m->notjunk) {
- CamelJunkPlugin *csp = ((CamelService *)m->folder->parent_store)->session->junk_plugin;
-
- camel_operation_start (NULL, _("Learning junk and/or non junk message(s)"));
+ if (m->junk) {
+ camel_operation_start (NULL, _("Learning junk"));
- if (m->junk) {
- for (i = 0; i < m->junk->len; i ++) {
- CamelMimeMessage *msg = camel_folder_get_message(m->folder, m->junk->pdata[i], NULL);
+ for (i = 0; i < m->junk->len; i ++) {
+ CamelMimeMessage *msg = camel_folder_get_message(m->folder, m->junk->pdata[i], NULL);
+ int pc = 100 * i / m->junk->len;
+
+ camel_operation_progress(NULL, pc);
- if (msg) {
- camel_junk_plugin_report_junk (csp, msg);
- camel_object_unref (msg);
- }
+ if (msg) {
+ camel_junk_plugin_report_junk (csp, msg);
+ camel_object_unref (msg);
}
}
- if (m->notjunk) {
- for (i = 0; i < m->notjunk->len; i ++) {
- CamelMimeMessage *msg = camel_folder_get_message(m->folder, m->notjunk->pdata[i], NULL);
+ camel_operation_end (NULL);
+ }
- if (msg) {
- camel_junk_plugin_report_notjunk (csp, msg);
- camel_object_unref (msg);
- }
- }
- }
+ if (m->notjunk) {
+ camel_operation_start (NULL, _("Learning non-junk"));
+ for (i = 0; i < m->notjunk->len; i ++) {
+ CamelMimeMessage *msg = camel_folder_get_message(m->folder, m->notjunk->pdata[i], NULL);
+ int pc = 100 * i / m->notjunk->len;
- camel_junk_plugin_commit_reports (csp);
+ camel_operation_progress(NULL, pc);
+ if (msg) {
+ camel_junk_plugin_report_notjunk (csp, msg);
+ camel_object_unref (msg);
+ }
+ }
camel_operation_end (NULL);
}
+ if (m->junk || m->notjunk)
+ camel_junk_plugin_commit_reports (csp);
+
if (m->driver && m->recents) {
camel_operation_start(NULL, _("Filtering new message(s)"));
@@ -1736,27 +1745,18 @@ static void
filter_free(CamelSession *session, CamelSessionThreadMsg *msg)
{
struct _folder_filter_msg *m = (struct _folder_filter_msg *)msg;
- int i;
- camel_folder_thaw(m->folder);
- camel_object_unref((CamelObject *)m->folder);
if (m->driver)
- camel_object_unref((CamelObject *)m->driver);
- if (m->recents) {
- for (i=0;i<m->recents->len;i++)
- g_free(m->recents->pdata[i]);
- g_ptr_array_free(m->recents, TRUE);
- }
- if (m->junk) {
- for (i=0;i<m->junk->len;i++)
- g_free(m->junk->pdata[i]);
- g_ptr_array_free(m->junk, TRUE);
- }
- if (m->notjunk) {
- for (i=0;i<m->notjunk->len;i++)
- g_free(m->notjunk->pdata[i]);
- g_ptr_array_free(m->notjunk, TRUE);
- }
+ camel_object_unref(m->driver);
+ if (m->recents)
+ camel_folder_free_deep(m->folder, m->recents);
+ if (m->junk)
+ camel_folder_free_deep(m->folder, m->junk);
+ if (m->notjunk)
+ camel_folder_free_deep(m->folder, m->notjunk);
+
+ camel_folder_thaw(m->folder);
+ camel_object_unref(m->folder);
}
static CamelSessionThreadOps filter_ops = {
@@ -1768,28 +1768,36 @@ static CamelSessionThreadOps filter_ops = {
static gboolean
folder_changed (CamelObject *obj, gpointer event_data)
{
- CamelFolder *folder = CAMEL_FOLDER (obj);
+ CamelFolder *folder = (CamelFolder *)obj;
CamelFolderChangeInfo *changed = event_data;
CamelSession *session = ((CamelService *)folder->parent_store)->session;
CamelFilterDriver *driver = NULL;
GPtrArray *junk = NULL;
GPtrArray *notjunk = NULL;
GPtrArray *recents = NULL;
- gboolean ret = TRUE;
+ int i;
- (printf ("folder_changed(%p, %p), frozen=%d\n", obj, event_data, folder->priv->frozen));
- (printf(" added %d remoded %d changed %d recent %d\n",
+ d(printf ("folder_changed(%p:'%s', %p), frozen=%d\n", obj, folder->full_name, event_data, folder->priv->frozen));
+ d(printf(" added %d removed %d changed %d recent %d\n",
changed->uid_added->len, changed->uid_removed->len,
changed->uid_changed->len, changed->uid_recent->len));
if (changed == NULL) {
w(g_warning ("Class %s is passing NULL to folder_changed event",
camel_type_to_name (CAMEL_OBJECT_GET_TYPE (folder))));
- return ret;
+ return TRUE;
+ }
+
+ CAMEL_FOLDER_LOCK(folder, change_lock);
+ if (folder->priv->frozen) {
+ camel_folder_change_info_cat(folder->priv->changed_frozen, changed);
+ CAMEL_FOLDER_UNLOCK(folder, change_lock);
+
+ return FALSE;
}
+ CAMEL_FOLDER_UNLOCK(folder, change_lock);
if (changed->uid_changed->len) {
- int i;
guint32 flags;
for (i = 0; i < changed->uid_changed->len; i ++) {
@@ -1808,9 +1816,6 @@ folder_changed (CamelObject *obj, gpointer event_data)
camel_folder_set_message_flags (folder, changed->uid_changed->pdata [i], CAMEL_MESSAGE_JUNK_LEARN, 0);
}
}
- ((junk || notjunk)
- && printf("** Have '%d' messages for junk filter to learn, launching thread to process them\n",
- (junk ? junk->len : 0) + (notjunk ? notjunk->len : 0)));
}
if ((folder->folder_flags & (CAMEL_FOLDER_FILTER_RECENT|CAMEL_FOLDER_FILTER_JUNK))
@@ -1819,46 +1824,31 @@ folder_changed (CamelObject *obj, gpointer event_data)
(folder->folder_flags & CAMEL_FOLDER_FILTER_RECENT)
? FILTER_SOURCE_INCOMING : FILTER_SOURCE_JUNKTEST, NULL);
- CAMEL_FOLDER_LOCK(folder, change_lock);
-
if (driver) {
- int i;
recents = g_ptr_array_new();
-
for (i=0;i<changed->uid_recent->len;i++)
g_ptr_array_add(recents, g_strdup(changed->uid_recent->pdata[i]));
-
- (printf("** Have '%d' recent messages, launching thread to process them\n", changed->uid_recent->len));
}
if (driver || junk || notjunk) {
struct _folder_filter_msg *msg;
- folder->priv->frozen++;
+ d(printf("* launching filter thread %d new mail, %d junk and %d not junk\n",
+ recents?recents->len:0, junk?junk->len:0, notjunk?notjunk->len:0));
+
msg = camel_session_thread_msg_new(session, &filter_ops, sizeof(*msg));
msg->recents = recents;
msg->junk = junk;
msg->notjunk = notjunk;
msg->folder = folder;
- camel_object_ref((CamelObject *)folder);
+ camel_object_ref(folder);
+ camel_folder_freeze(folder);
msg->driver = driver;
camel_exception_init(&msg->ex);
camel_session_thread_queue(session, &msg->msg, 0);
-
- /* zero out the recent list so we dont reprocess */
- /* this pokes past abstraction, but changeinfo is our structure anyway */
- /* the only other alternative is to recognise when trigger is called from
- thaw(), but thats a pita */
- g_ptr_array_set_size(changed->uid_recent, 0);
}
-
- if (folder->priv->frozen) {
- camel_folder_change_info_cat(folder->priv->changed_frozen, changed);
- ret = FALSE;
- }
- CAMEL_FOLDER_UNLOCK(folder, change_lock);
- return ret;
+ return TRUE;
}
/**