diff options
author | 6 <NotZed@Ximian.com> | 2001-09-07 09:19:47 +0800 |
---|---|---|
committer | Michael Zucci <zucchi@src.gnome.org> | 2001-09-07 09:19:47 +0800 |
commit | 8e7d0e31cb1a6ac4c0b5f58522ac6b468b872f9d (patch) | |
tree | 70c5af2a314ccc2ae6622aa1c5493f78c888f59b /camel/providers/imap/camel-imap-folder.c | |
parent | 0256665bc7e65c13b4026873f8c95fcf3d9251e3 (diff) | |
download | gsoc2013-evolution-8e7d0e31cb1a6ac4c0b5f58522ac6b468b872f9d.tar gsoc2013-evolution-8e7d0e31cb1a6ac4c0b5f58522ac6b468b872f9d.tar.gz gsoc2013-evolution-8e7d0e31cb1a6ac4c0b5f58522ac6b468b872f9d.tar.bz2 gsoc2013-evolution-8e7d0e31cb1a6ac4c0b5f58522ac6b468b872f9d.tar.lz gsoc2013-evolution-8e7d0e31cb1a6ac4c0b5f58522ac6b468b872f9d.tar.xz gsoc2013-evolution-8e7d0e31cb1a6ac4c0b5f58522ac6b468b872f9d.tar.zst gsoc2013-evolution-8e7d0e31cb1a6ac4c0b5f58522ac6b468b872f9d.zip |
Thread function to perform filtering. (filter_free): Free the filter
2001-09-06 <NotZed@Ximian.com>
* providers/imap/camel-imap-folder.c (filter_proc): Thread
function to perform filtering.
(filter_free): Free the filter object.
(camel_imap_folder_changed): If we have threads enabled, then
queue up a request to perform filtering. For bug #4422.
* providers/imap/camel-imap-store.c (camel_imap_msg_new): Create a
new 'imap msg'.
(camel_imap_msg_queue): Queue an 'imap msg'.
(async_received): Handle receiving of imap msg in async thread.
(async_destroy): Handle destroying of imap msg.
(camel_imap_store_finalize): Destroy thread when done.
(camel_imap_store_init): Setup thread.
* providers/imap/camel-imap-store.h: Added an ethread to the
store, for async processing.
svn path=/trunk/; revision=12666
Diffstat (limited to 'camel/providers/imap/camel-imap-folder.c')
-rw-r--r-- | camel/providers/imap/camel-imap-folder.c | 59 |
1 files changed, 56 insertions, 3 deletions
diff --git a/camel/providers/imap/camel-imap-folder.c b/camel/providers/imap/camel-imap-folder.c index 1e74461ba0..0e4c0dd44e 100644 --- a/camel/providers/imap/camel-imap-folder.c +++ b/camel/providers/imap/camel-imap-folder.c @@ -1797,6 +1797,44 @@ imap_update_summary (CamelFolder *folder, int exists, } } +struct _filter_msg { + CamelImapMsg msg; + + GPtrArray *recents; + CamelFolder *folder; + CamelFilterDriver *driver; +}; + +static void +filter_proc(CamelImapStore *store, CamelImapMsg *mm) +{ + struct _filter_msg *msg = (struct _filter_msg *)mm; + + printf("executing filtering %d messages folder %p\n", msg->recents->len, msg->folder); + + /* what about exceptions? */ + camel_filter_driver_filter_folder(msg->driver, msg->folder, NULL, msg->recents, FALSE, NULL); +} + +static void +filter_free(CamelImapStore *store, CamelImapMsg *mm) +{ + struct _filter_msg *msg = (struct _filter_msg *)mm; + int i; + + printf("freeing filtering %d messages folder %p\n", msg->recents->len, msg->folder); + + camel_object_unref((CamelObject *)msg->driver); + + camel_folder_thaw(msg->folder); + camel_object_unref((CamelObject *)msg->folder); + + for (i=0;i<msg->recents->len;i++) + g_free(msg->recents->pdata[i]); + + g_ptr_array_free(msg->recents, TRUE); +} + /* Called with the store's command_lock locked */ void camel_imap_folder_changed (CamelFolder *folder, int exists, @@ -1853,11 +1891,26 @@ camel_imap_folder_changed (CamelFolder *folder, int exists, driver = camel_session_get_filter_driver (CAMEL_SERVICE (folder->parent_store)->session, "incoming", ex); if (driver) { +#ifdef ENABLE_THREADS + int i; + struct _filter_msg *msg = (struct _filter_msg *)camel_imap_msg_new(filter_proc, filter_free, sizeof(*msg)); + + msg->recents = g_ptr_array_new(); + for (i=0;i<recents->len;i++) + g_ptr_array_add(msg->recents, g_strdup(recents->pdata[i])); + + camel_object_ref((CamelObject *)folder); + msg->folder = folder; + msg->driver = driver; + printf("queueing filtering %d messages folder %p\n", msg->recents->len, folder); + camel_imap_msg_queue((CamelImapStore *)folder->parent_store, (CamelImapMsg *)msg); +#else camel_filter_driver_filter_folder (driver, folder, NULL, recents, FALSE, ex); + camel_folder_thaw (folder); camel_object_unref (CAMEL_OBJECT (driver)); - } - - camel_folder_thaw (folder); +#endif + } else + camel_folder_thaw (folder); } else { if (camel_folder_change_info_changed (changes)) camel_object_trigger_event (CAMEL_OBJECT (folder), "folder_changed", changes); |