* Fixes NB#58679
[modest] / src / modest-search.c
index a2417f5..1f5e724 100644 (file)
@@ -8,23 +8,63 @@
 
 #include <tny-shared.h>
 #include <tny-folder.h>
+#include <tny-folder-store.h>
 #include <tny-list.h>
 #include <tny-iterator.h>
 #include <tny-simple-list.h>
 
-#include "modest-text-utils.h"
+#include <libmodest-dbus-client/libmodest-dbus-client.h>
 
+#include "modest-text-utils.h"
+#include "modest-account-mgr.h"
+#include "modest-tny-account-store.h"
+#include "modest-tny-account.h"
 #include "modest-search.h"
+#include "modest-runtime.h"
+
+static char *
+g_strdup_or_null (const char *str)
+{
+       char *string = NULL;
 
+       if  (str != NULL) {
+               string = g_strdup (str);
+       }
+
+       return string;
+}
 
 static GList*
-add_header (GList *list, TnyHeader *header, TnyFolder *folder)
+add_hit (GList *list, TnyHeader *header, TnyFolder *folder)
 {
-       gchar *furl = tny_folder_get_url_string (folder);
-       const gchar *uid = tny_header_get_uid (header);
-       gchar *str  = g_strdup_printf ("%s/%s", furl, uid);
-       g_free (furl);
-       return g_list_prepend (list, str);
+       ModestSearchHit *hit;
+       TnyHeaderFlags   flags;
+       char            *furl;
+       char            *msg_url;
+       const char      *uid;
+       const char      *subject;
+       const char      *sender;
+
+       hit = g_slice_new0 (ModestSearchHit);
+
+       furl = tny_folder_get_url_string (folder);
+       uid = tny_header_get_uid (header);
+       msg_url = g_strdup_printf ("%s/%s", furl, uid);
+       subject = tny_header_get_subject (header);
+       sender = tny_header_get_from (header);
+
+       flags = tny_header_get_flags (header);
+
+       hit->msgid = msg_url;
+       hit->subject = g_strdup_or_null (subject);
+       hit->sender = g_strdup_or_null (sender);
+       hit->folder = furl;
+       hit->msize = tny_header_get_message_size (header);
+       hit->has_attachment = flags & TNY_HEADER_FLAG_ATTACHMENTS;
+       hit->is_unread = ! (flags & TNY_HEADER_FLAG_SEEN);
+       hit->timestamp = tny_header_get_date_received (header);
+
+       return g_list_prepend (list, hit);
 }
 
 static gboolean
@@ -199,6 +239,10 @@ search_string (const char      *what,
                ogs_text_searcher_reset (search->text_searcher);
        } else {
 #endif
+               if (what == NULL || where == NULL) {
+                       return FALSE;
+               }
+
                found = !modest_text_utils_utf8_strcmp (what, where, TRUE);
 #ifdef MODEST_HAVE_OGS
        }
@@ -207,6 +251,7 @@ search_string (const char      *what,
 }
 
 
+
 /**
  * modest_search:
  * @folder: a #TnyFolder instance
@@ -216,7 +261,7 @@ search_string (const char      *what,
  * It will return a doubly linked list with URIs that point to the message.
  **/
 GList *
-modest_search (TnyFolder *folder, ModestSearch *search)
+modest_search_folder (TnyFolder *folder, ModestSearch *search)
 {
        GList *retval = NULL;
        TnyIterator *iter;
@@ -226,13 +271,15 @@ modest_search (TnyFolder *folder, ModestSearch *search)
        part_search_func = search_mime_part_strcmp;
 
 #ifdef MODEST_HAVE_OGS
-       if (search->flags & MODEST_SEARCH_USE_OGS &&
-           search->text_searcher == NULL && search->query != NULL) {
-               OgsTextSearcher *text_searcher; 
+       if (search->flags & MODEST_SEARCH_USE_OGS) {
+       
+               if (search->text_searcher == NULL && search->query != NULL) {
+                       OgsTextSearcher *text_searcher; 
 
-               text_searcher = ogs_text_searcher_new (FALSE);
-               ogs_text_searcher_parse_query (text_searcher, search->query);
-               search->text_searcher = text_searcher;
+                       text_searcher = ogs_text_searcher_new (FALSE);
+                       ogs_text_searcher_parse_query (text_searcher, search->query);
+                       search->text_searcher = text_searcher;
+               }
 
                part_search_func = search_mime_part_ogs;
        }
@@ -247,7 +294,7 @@ modest_search (TnyFolder *folder, ModestSearch *search)
                TnyHeader *cur = (TnyHeader *) tny_iterator_get_current (iter);
                time_t t = tny_header_get_date_sent (cur);
                gboolean found = FALSE;
-
+               
                if (search->flags & MODEST_SEARCH_BEFORE)
                        if (!(t <= search->before))
                                goto go_next;
@@ -257,14 +304,14 @@ modest_search (TnyFolder *folder, ModestSearch *search)
                                goto go_next;
 
                if (search->flags & MODEST_SEARCH_SIZE)
-                       if (tny_header_get_message_size  (cur) < search->minsize)
+                       if (tny_header_get_message_size (cur) < search->minsize)
                                goto go_next;
 
                if (search->flags & MODEST_SEARCH_SUBJECT) {
                        const char *str = tny_header_get_subject (cur);
 
                        if ((found = search_string (search->subject, str, search))) {
-                           retval = add_header (retval, cur, folder);
+                           retval = add_hit (retval, cur, folder);
                        }
                }
                
@@ -272,7 +319,7 @@ modest_search (TnyFolder *folder, ModestSearch *search)
                        const char *str = tny_header_get_from (cur);
 
                        if ((found = search_string (search->from, str, search))) {
-                               retval = add_header (retval, cur, folder);
+                               retval = add_hit (retval, cur, folder);
                        }
                }
                
@@ -280,10 +327,10 @@ modest_search (TnyFolder *folder, ModestSearch *search)
                        const char *str = tny_header_get_to (cur);
 
                        if ((found = search_string (search->recipient, str, search))) {
-                               retval = add_header (retval, cur, folder);
+                               retval = add_hit (retval, cur, folder);
                        }
                }
-               
+       
                if (!found && search->flags & MODEST_SEARCH_BODY) {
                        TnyHeaderFlags flags;
                        GError      *err = NULL;
@@ -316,7 +363,7 @@ modest_search (TnyFolder *folder, ModestSearch *search)
                                TnyMimePart *pcur = (TnyMimePart *) tny_iterator_get_current (piter);
 
                                if ((found = part_search_func (pcur, search))) {
-                                       retval = add_header (retval, cur, folder);                              
+                                       retval = add_hit (retval, cur, folder);                         
                                }
 
                                g_object_unref (pcur);
@@ -328,6 +375,7 @@ modest_search (TnyFolder *folder, ModestSearch *search)
                        g_object_unref (msg);
 
                }
+
 go_next:
                g_object_unref (cur);
                tny_iterator_next (iter);
@@ -338,3 +386,98 @@ go_next:
        return retval;
 }
 
+GList *
+modest_search_account (TnyAccount *account, ModestSearch *search)
+{
+       TnyFolderStore      *store;
+       TnyIterator         *iter;
+       TnyList             *folders;
+       GList               *hits;
+       GError              *error;
+
+       error = NULL;
+       hits = NULL;
+
+       store = TNY_FOLDER_STORE (account);
+
+       folders = tny_simple_list_new ();
+       tny_folder_store_get_folders (store, folders, NULL, &error);
+       
+       if (error != NULL) {
+               g_object_unref (folders);
+               return NULL;
+       }
+
+       iter = tny_list_create_iterator (folders);
+       while (!tny_iterator_is_done (iter)) {
+               TnyFolder *folder;
+               GList     *res;
+
+               folder = TNY_FOLDER (tny_iterator_get_current (iter));
+               
+               res = modest_search_folder (folder, search);
+
+               if (res != NULL) {
+                       if (hits == NULL) {
+                               hits = res;
+                       } else {
+                               hits = g_list_concat (hits, res);
+                       }
+               }
+
+               g_object_unref (folder);
+               tny_iterator_next (iter);
+       }
+
+       g_object_unref (iter);
+       g_object_unref (folders);
+
+       return hits;
+}
+
+GList *
+modest_search_all_accounts (ModestSearch *search)
+{
+       ModestTnyAccountStore *astore;
+       TnyList               *accounts;
+       TnyIterator           *iter;
+       GList                 *hits;
+
+       hits = NULL;
+       astore = modest_runtime_get_account_store ();
+
+       accounts = tny_simple_list_new ();
+       tny_account_store_get_accounts (TNY_ACCOUNT_STORE (astore),
+                                       accounts,
+                                       TNY_ACCOUNT_STORE_STORE_ACCOUNTS);
+
+       iter = tny_list_create_iterator (accounts);
+       while (!tny_iterator_is_done (iter)) {
+               TnyAccount *account;
+               GList      *res;
+
+               account = TNY_ACCOUNT (tny_iterator_get_current (iter));
+
+               g_debug ("Searching account %s",
+                        tny_account_get_name (account));
+               res = modest_search_account (account, search);
+               
+               if (res != NULL) {
+
+                       if (hits == NULL) {
+                               hits = res;
+                       } else {
+                               hits = g_list_concat (hits, res);
+                       }
+               }
+
+               g_object_unref (account);
+               tny_iterator_next (iter);
+       }
+
+       g_object_unref (accounts);
+
+       return hits;
+}
+
+