diff options
author | 9 <NotZed@Ximian.com> | 2001-10-10 06:26:01 +0800 |
---|---|---|
committer | Michael Zucci <zucchi@src.gnome.org> | 2001-10-10 06:26:01 +0800 |
commit | d5e090651bbd30ee761624187db6ad7920162aa8 (patch) | |
tree | 7ad7107b56496575d6e9914723ff8670a74e7351 /camel/providers/local | |
parent | 7980990c79feaa36f452d9e2f2f59e8de1b1ec5c (diff) | |
download | gsoc2013-evolution-d5e090651bbd30ee761624187db6ad7920162aa8.tar gsoc2013-evolution-d5e090651bbd30ee761624187db6ad7920162aa8.tar.gz gsoc2013-evolution-d5e090651bbd30ee761624187db6ad7920162aa8.tar.bz2 gsoc2013-evolution-d5e090651bbd30ee761624187db6ad7920162aa8.tar.lz gsoc2013-evolution-d5e090651bbd30ee761624187db6ad7920162aa8.tar.xz gsoc2013-evolution-d5e090651bbd30ee761624187db6ad7920162aa8.tar.zst gsoc2013-evolution-d5e090651bbd30ee761624187db6ad7920162aa8.zip |
Implement.
2001-10-09 <NotZed@Ximian.com>
* providers/local/camel-spool-folder.c (spool_search_by_uids):
Implement.
* providers/imap/camel-imap-search.c (imap_body_contains): If
searching a sub-set of the total message count, then use a UID
range to search only specific messages.
* camel-vee-folder.c (vee_folder_change_match): Removed.
(folder_changed_add_uid): Helper func for changed code.
(folder_changed_remove_uid): "
(folder_changed_change_uid): "
(folder_changed): Rewritten. Supports proper auto-updating of
changes, but not removals till a sync occurs.
(vee_search_by_uids): Implement.
(folder_changed): Changed to call an async threaded function to do
the actual folder updating.
* camel-folder-summary.c (camel_flag_list_copy): New func to copy
a whole list of flags.
(camel_tag_list_copy): New func to copy a whole list of flags.
* providers/imap/camel-imap-folder.c (imap_search_by_uids):
Implement.
* providers/local/camel-local-folder.c (local_search_by_uids):
Implement.
* camel-folder.c (camel_folder_search_by_uids): New function,
search a subset of uid's.
(search_by_uids): Default impl, return error.
svn path=/trunk/; revision=13532
Diffstat (limited to 'camel/providers/local')
-rw-r--r-- | camel/providers/local/camel-local-folder.c | 44 | ||||
-rw-r--r-- | camel/providers/local/camel-spool-folder.c | 43 |
2 files changed, 87 insertions, 0 deletions
diff --git a/camel/providers/local/camel-local-folder.c b/camel/providers/local/camel-local-folder.c index 43622eb23a..27b49a5c70 100644 --- a/camel/providers/local/camel-local-folder.c +++ b/camel/providers/local/camel-local-folder.c @@ -62,6 +62,7 @@ static void local_sync(CamelFolder *folder, gboolean expunge, CamelException *ex static void local_expunge(CamelFolder *folder, CamelException *ex); static GPtrArray *local_search_by_expression(CamelFolder *folder, const char *expression, CamelException *ex); +static GPtrArray *local_search_by_uids(CamelFolder *folder, const char *expression, GPtrArray *uids, CamelException *ex); static void local_search_free(CamelFolder *folder, GPtrArray * result); static void local_finalize(CamelObject * object); @@ -80,6 +81,7 @@ camel_local_folder_class_init(CamelLocalFolderClass * camel_local_folder_class) camel_folder_class->expunge = local_expunge; camel_folder_class->search_by_expression = local_search_by_expression; + camel_folder_class->search_by_uids = local_search_by_uids; camel_folder_class->search_free = local_search_free; camel_local_folder_class->lock = local_lock; @@ -334,6 +336,48 @@ local_search_by_expression(CamelFolder *folder, const char *expression, CamelExc return matches; } +static GPtrArray * +local_search_by_uids(CamelFolder *folder, const char *expression, GPtrArray *uids, CamelException *ex) +{ + CamelLocalFolder *local_folder = CAMEL_LOCAL_FOLDER(folder); + GPtrArray *summary, *matches; + int i; + + /* NOTE: could get away without the search lock by creating a new + search object each time */ + + summary = g_ptr_array_new(); + for (i=0;i<uids->len;i++) { + CamelMessageInfo *info; + + info = camel_folder_get_message_info(folder, uids->pdata[i]); + if (info) + g_ptr_array_add(summary, info); + } + + if (summary->len == 0) + return summary; + + CAMEL_LOCAL_FOLDER_LOCK(folder, search_lock); + + if (local_folder->search == NULL) + local_folder->search = camel_folder_search_new(); + + camel_folder_search_set_folder(local_folder->search, folder); + camel_folder_search_set_body_index(local_folder->search, local_folder->index); + camel_folder_search_set_summary(local_folder->search, summary); + + matches = camel_folder_search_execute_expression(local_folder->search, expression, ex); + + CAMEL_LOCAL_FOLDER_UNLOCK(folder, search_lock); + + for (i=0;i<summary->len;i++) + camel_folder_free_message_info(folder, summary->pdata[i]); + g_ptr_array_free(summary, TRUE); + + return matches; +} + static void local_search_free(CamelFolder *folder, GPtrArray * result) { diff --git a/camel/providers/local/camel-spool-folder.c b/camel/providers/local/camel-spool-folder.c index bc715e46bc..9e487dfa89 100644 --- a/camel/providers/local/camel-spool-folder.c +++ b/camel/providers/local/camel-spool-folder.c @@ -64,6 +64,7 @@ static void spool_sync(CamelFolder *folder, gboolean expunge, CamelException *ex static void spool_expunge(CamelFolder *folder, CamelException *ex); static GPtrArray *spool_search_by_expression(CamelFolder *folder, const char *expression, CamelException *ex); +static GPtrArray *spool_search_by_uids(CamelFolder *folder, const char *expression, GPtrArray *uids, CamelException *ex); static void spool_search_free(CamelFolder *folder, GPtrArray * result); static void spool_append_message(CamelFolder *folder, CamelMimeMessage * message, const CamelMessageInfo * info, CamelException *ex); @@ -87,6 +88,7 @@ camel_spool_folder_class_init(CamelSpoolFolderClass * camel_spool_folder_class) camel_folder_class->expunge = spool_expunge; camel_folder_class->search_by_expression = spool_search_by_expression; + camel_folder_class->search_by_uids = spool_search_by_uids; camel_folder_class->search_free = spool_search_free; /* virtual method overload */ @@ -363,6 +365,47 @@ spool_search_by_expression(CamelFolder *folder, const char *expression, CamelExc return matches; } +static GPtrArray * +spool_search_by_uids(CamelFolder *folder, const char *expression, GPtrArray *uids, CamelException *ex) +{ + CamelSpoolFolder *spool_folder = CAMEL_SPOOL_FOLDER(folder); + GPtrArray *summary, *matches; + int i; + + /* NOTE: could get away without the search lock by creating a new + search object each time */ + + summary = g_ptr_array_new(); + for (i=0;i<uids->len;i++) { + CamelMessageInfo *info; + + info = camel_folder_get_message_info(folder, uids->pdata[i]); + if (info) + g_ptr_array_add(summary, info); + } + + if (summary->len == 0) + return summary; + + CAMEL_SPOOL_FOLDER_LOCK(folder, search_lock); + + if (spool_folder->search == NULL) + spool_folder->search = camel_folder_search_new(); + + camel_folder_search_set_folder(spool_folder->search, folder); + camel_folder_search_set_summary(spool_folder->search, summary); + + matches = camel_folder_search_execute_expression(spool_folder->search, expression, ex); + + CAMEL_SPOOL_FOLDER_UNLOCK(folder, search_lock); + + for (i=0;i<summary->len;i++) + camel_folder_free_message_info(folder, summary->pdata[i]); + g_ptr_array_free(summary, TRUE); + + return matches; +} + static void spool_search_free(CamelFolder *folder, GPtrArray * result) { |