5 #include <tny-shared.h>
6 #include <tny-folder.h>
8 #include <tny-iterator.h>
9 #include <tny-simple-list.h>
11 #include "modest-search.h"
12 #include "modest-mime-part-search-stream.h"
15 add_header (GList *list, TnyHeader *header, TnyFolder *folder)
17 gchar *furl = tny_folder_get_url_string (folder);
18 const gchar *uid = tny_header_get_uid (header);
19 gchar *str = g_strdup_printf ("%s/%s", furl, uid);
21 return g_list_prepend (list, str);
28 * @folder: a #TnyFolder instance
29 * @search: a #ModestSearch query
31 * This operation will search @folder for headers that match the query @search.
32 * It will return a doubly linked list with URIs that point to the message.
35 modest_search (TnyFolder *folder, ModestSearch *search)
39 TnyList *list = tny_simple_list_new ();
40 tny_folder_get_headers (folder, list, FALSE, NULL);
42 iter = tny_list_create_iterator (list);
43 while (!tny_iterator_is_done (iter))
45 TnyHeader *cur = (TnyHeader *) tny_iterator_get_current (iter);
46 time_t t = tny_header_get_date_sent (cur);
48 if (search->flags & MODEST_SEARCH_BEFORE)
49 if (!(t <= search->before))
52 if (search->flags & MODEST_SEARCH_AFTER)
53 if (!(t >= search->after))
57 if (search->flags & MODEST_SEARCH_SIZE)
58 if (tny_header_get_message_size (cur) < search->minsize)
61 if (search->flags & MODEST_SEARCH_SUBJECT) {
62 if (strcasestr (tny_header_get_subject (cur), search->subject))
63 retval = add_header (retval, cur, folder);
64 } else if (search->flags & MODEST_SEARCH_SENDER) {
65 if (strcasestr (tny_header_get_from (cur), search->subject))
66 retval = add_header (retval, cur, folder);
67 } else if (search->flags & MODEST_SEARCH_RECIPIENT) {
68 if (strcasestr (tny_header_get_to (cur), search->subject))
69 retval = add_header (retval, cur, folder);
70 } else if (search->flags & MODEST_SEARCH_BODY)
72 TnyHeaderFlags flags = tny_header_get_flags (cur);
74 if (flags & TNY_HEADER_FLAG_CACHED)
77 TnyMsg *msg = tny_folder_get_msg (folder, cur, &err);
82 TnyList *parts = tny_simple_list_new ();
83 tny_mime_part_get_parts (TNY_MIME_PART (msg), parts);
84 piter = tny_list_create_iterator (parts);
86 while (!tny_iterator_is_done (piter))
89 TnyMimePart *pcur = (TnyMimePart *) tny_iterator_get_current (piter);
91 stream = modest_mime_part_search_stream_new (search->body);
93 tny_mime_part_decode_to_stream (pcur, stream);
95 if (((ModestMimePartSearchStream *) stream)->found)
96 retval = add_header (retval, cur, folder);
98 g_object_unref (stream);
99 g_object_unref (pcur);
100 tny_iterator_next (piter);
102 g_object_unref (piter);
103 g_object_unref (parts);
108 g_object_unref (msg);
115 g_object_unref (cur);
116 tny_iterator_next (iter);
118 g_object_unref (iter);
119 g_object_unref (list);