[gtk+/wip/matthiasc/local-search: 1/2] wip



commit ee1269a45e4666b262af1ae57cc7eeced622713d
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri Jul 24 00:01:51 2015 -0400

    wip
    
    Non-recursive search on remote locations
    Fixes for model search engine

 gtk/gtkfilechooserwidget.c   |    7 ++---
 gtk/gtkquery.c               |   15 ++++++-------
 gtk/gtkquery.h               |    6 ++--
 gtk/gtksearchengine.c        |    1 +
 gtk/gtksearchenginemodel.c   |   32 +++++++++++++-----------------
 gtk/gtksearchenginesimple.c  |   44 +++++++++++++++++++++++++++++++++--------
 gtk/gtksearchenginetracker.c |    8 ++++--
 7 files changed, 68 insertions(+), 45 deletions(-)
---
diff --git a/gtk/gtkfilechooserwidget.c b/gtk/gtkfilechooserwidget.c
index fa58375..14b62c1 100644
--- a/gtk/gtkfilechooserwidget.c
+++ b/gtk/gtkfilechooserwidget.c
@@ -7212,12 +7212,11 @@ search_start_query (GtkFileChooserWidget *impl,
   file = gtk_places_sidebar_get_location (GTK_PLACES_SIDEBAR (priv->places_sidebar));
   if (file)
     {
-      gchar *location;
-      location = g_file_get_uri (file);
-      gtk_query_set_location (priv->search_query, location);
-      g_free (location);
+      gtk_query_set_location (priv->search_query, file);
       g_object_unref (file);
     }
+  else
+    gtk_query_set_location (priv->search_query, priv->current_folder);
 
   _gtk_search_engine_set_model (priv->search_engine, priv->model_for_search);
   _gtk_search_engine_set_query (priv->search_engine, priv->search_query);
diff --git a/gtk/gtkquery.c b/gtk/gtkquery.c
index bc81b7d..d7eca90 100644
--- a/gtk/gtkquery.c
+++ b/gtk/gtkquery.c
@@ -27,7 +27,7 @@
 struct _GtkQueryPrivate
 {
   gchar *text;
-  gchar *location_uri;
+  GFile *location;
   GList *mime_types;
   gchar **words;
 };
@@ -41,8 +41,8 @@ finalize (GObject *object)
 
   query = GTK_QUERY (object);
 
+  g_clear_object (&query->priv->location);
   g_free (query->priv->text);
-  g_free (query->priv->location_uri);
   g_strfreev (query->priv->words);
 
   G_OBJECT_CLASS (gtk_query_parent_class)->finalize (object);
@@ -87,18 +87,17 @@ gtk_query_set_text (GtkQuery    *query,
   query->priv->words = NULL;
 }
 
-const gchar *
+GFile *
 gtk_query_get_location (GtkQuery *query)
 {
-  return query->priv->location_uri;
+  return query->priv->location;
 }
 
 void
-gtk_query_set_location (GtkQuery    *query,
-                        const gchar *uri)
+gtk_query_set_location (GtkQuery *query,
+                        GFile    *file)
 {
-  g_free (query->priv->location_uri);
-  query->priv->location_uri = g_strdup (uri);
+  g_set_object (&query->priv->location, file);
 }
 
 static gchar *
diff --git a/gtk/gtkquery.h b/gtk/gtkquery.h
index 5027505..0aa5ff9 100644
--- a/gtk/gtkquery.h
+++ b/gtk/gtkquery.h
@@ -22,7 +22,7 @@
 #ifndef __GTK_QUERY_H__
 #define __GTK_QUERY_H__
 
-#include <glib-object.h>
+#include <gio/gio.h>
 
 G_BEGIN_DECLS
 
@@ -57,9 +57,9 @@ const gchar *gtk_query_get_text       (GtkQuery    *query);
 void         gtk_query_set_text       (GtkQuery    *query,
                                        const gchar *text);
 
-const gchar *gtk_query_get_location   (GtkQuery    *query);
+GFile       *gtk_query_get_location   (GtkQuery    *query);
 void         gtk_query_set_location   (GtkQuery    *query,
-                                       const gchar *uri);
+                                       GFile       *file);
 
 gboolean     gtk_query_matches_string (GtkQuery    *query,
                                        const gchar *string);
diff --git a/gtk/gtksearchengine.c b/gtk/gtksearchengine.c
index f11ce73..eff9692 100644
--- a/gtk/gtksearchengine.c
+++ b/gtk/gtksearchengine.c
@@ -481,6 +481,7 @@ _gtk_search_engine_set_model (GtkSearchEngine    *engine,
   if (model)
     {
       engine->priv->model = _gtk_search_engine_model_new (model);
+      connect_engine_signals (engine->priv->model, engine);
       if (engine->priv->query)
         _gtk_search_engine_set_query (engine->priv->model, engine->priv->query);
     }
diff --git a/gtk/gtksearchenginemodel.c b/gtk/gtksearchenginemodel.c
index 93003b5..7bfc87c 100644
--- a/gtk/gtksearchenginemodel.c
+++ b/gtk/gtksearchenginemodel.c
@@ -90,23 +90,27 @@ do_search (gpointer data)
       do
         {
           GFileInfo *info;
-          GFile *file;
-          gchar *uri;
 
           info = _gtk_file_system_model_get_info (model->model, &iter);
           if (info_matches_query (model->query, info))
             {
+              GFile *file;
+              GtkSearchHit *hit;
+
               file = _gtk_file_system_model_get_file (model->model, &iter);
-              uri = g_file_get_uri (file);
-              hits = g_list_prepend (hits, uri);
+
+              hit = g_new (GtkSearchHit, 1);
+              hit->uri = g_file_get_uri (file);
+              hit->info = g_object_ref (info);
+              hits = g_list_prepend (hits, hit);
             }
-          }
-        while (gtk_tree_model_iter_next (GTK_TREE_MODEL (model->model), &iter));
+        }
+      while (gtk_tree_model_iter_next (GTK_TREE_MODEL (model->model), &iter));
 
       if (hits)
         {
           _gtk_search_engine_hits_added (GTK_SEARCH_ENGINE (model), hits);
-          g_list_free_full (hits, g_free);
+          g_list_free_full (hits, (GDestroyNotify)_gtk_search_hit_free);
         }
     }
 
@@ -144,19 +148,11 @@ gtk_search_engine_model_stop (GtkSearchEngine *engine)
 
 static void
 gtk_search_engine_model_set_query (GtkSearchEngine *engine,
-                                   GtkQuery        *query)
+                                   GtkQuery        *query)
 {
-  GtkSearchEngineModel *model;
-
-  model = GTK_SEARCH_ENGINE_MODEL (engine);
-
-  if (query)
-    g_object_ref (query);
-
-  if (model->query)
-    g_object_unref (model->query);
+  GtkSearchEngineModel *model = GTK_SEARCH_ENGINE_MODEL (engine);
 
-  model->query = query;
+  g_set_object (&model->query, query);
 }
 
 static void
diff --git a/gtk/gtksearchenginesimple.c b/gtk/gtksearchenginesimple.c
index def577a..7510cee 100644
--- a/gtk/gtksearchenginesimple.c
+++ b/gtk/gtksearchenginesimple.c
@@ -87,13 +87,44 @@ gtk_search_engine_simple_dispose (GObject *object)
   G_OBJECT_CLASS (_gtk_search_engine_simple_parent_class)->dispose (object);
 }
 
+static const gchar * const remote_types[] = {
+  "sftp",
+  "webdav",
+  "ftp",
+  "nfs",
+  "cifs",
+  NULL
+};
+
+static void
+queue_if_local (SearchThreadData *data,
+                GFile            *file)
+{
+  GFileInfo *info;
+  gboolean is_remote;
+
+  info = g_file_query_filesystem_info (file, "filesystem::type", NULL, NULL);
+  if (info)
+    {
+      const gchar *type;
+
+      type = g_file_info_get_attribute_string (info, "filesystem::type");
+      is_remote = g_strv_contains (remote_types, type);
+
+      g_object_unref (info);
+    }
+  else
+    is_remote = FALSE;
+
+  if (!is_remote)
+    g_queue_push_tail (data->directories, g_object_ref (file));
+}
+
 static SearchThreadData *
 search_thread_data_new (GtkSearchEngineSimple *engine,
                        GtkQuery              *query)
 {
   SearchThreadData *data;
-  const gchar *uri;
-  GFile *location;
 
   data = g_new0 (SearchThreadData, 1);
 
@@ -101,12 +132,7 @@ search_thread_data_new (GtkSearchEngineSimple *engine,
   data->directories = g_queue_new ();
   data->query = g_object_ref (query);
   data->recursive = _gtk_search_engine_get_recursive (GTK_SEARCH_ENGINE (engine));
-  uri = gtk_query_get_location (query);
-  if (uri != NULL)
-    location = g_file_new_for_uri (uri);
-  else
-    location = g_file_new_for_path (g_get_home_dir ());
-  g_queue_push_tail (data->directories, location);
+  queue_if_local (data, gtk_query_get_location (query));
 
   data->cancellable = g_cancellable_new ();
 
@@ -258,7 +284,7 @@ visit_directory (GFile *dir, SearchThreadData *data)
       if (data->recursive &&
           g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY &&
           !is_indexed (data->engine, child))
-        g_queue_push_tail (data->directories, g_object_ref (child));
+        queue_if_local (data, child);
     }
 
   g_object_unref (enumerator);
diff --git a/gtk/gtksearchenginetracker.c b/gtk/gtksearchenginetracker.c
index 29edb7f..7c4e063 100644
--- a/gtk/gtksearchenginetracker.c
+++ b/gtk/gtksearchenginetracker.c
@@ -321,7 +321,7 @@ gtk_search_engine_tracker_start (GtkSearchEngine *engine)
 {
   GtkSearchEngineTracker *tracker;
   const gchar *search_text;
-  const gchar *location_uri;
+  GFile *location;
   GString *sparql;
   gboolean recursive;
 
@@ -340,7 +340,7 @@ gtk_search_engine_tracker_start (GtkSearchEngine *engine)
     }
 
   search_text = gtk_query_get_text (tracker->query);
-  location_uri = gtk_query_get_location (tracker->query);
+  location = gtk_query_get_location (tracker->query);
   recursive = _gtk_search_engine_get_recursive (engine);
 
   sparql = g_string_new ("SELECT nie:url(?urn) "
@@ -360,8 +360,9 @@ gtk_search_engine_tracker_start (GtkSearchEngine *engine)
   sparql_append_string_literal_lower_case (sparql, search_text);
   g_string_append (sparql, ")");
 
-  if (location_uri)
+  if (location)
     {
+      gchar *location_uri = g_file_get_uri (location);
       g_string_append (sparql, " && ");
       if (recursive)
         g_string_append (sparql, "tracker:uri-is-descendant(");
@@ -369,6 +370,7 @@ gtk_search_engine_tracker_start (GtkSearchEngine *engine)
         g_string_append (sparql, "tracker:uri-is-parent(");
       sparql_append_string_literal (sparql, location_uri, FALSE);
       g_string_append (sparql, ",nie:url(?urn))");
+      g_free (location_uri);
     }
 
   g_string_append (sparql, ")");


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]