2008-02-29 Cosimo Cecchi <cosimoc@gnome.org>
[nautilus.git] / libnautilus-private / nautilus-search-engine-tracker.c
blobc1ec553dd40fa0f2bcc3894249e2f4f7c15a1d3e
1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
2 /*
3 * Copyright (C) 2005 Mr Jamie McCracken
5 * Nautilus is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation; either version 2 of the
8 * License, or (at your option) any later version.
10 * Nautilus is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
15 * You should have received a copy of the GNU General Public
16 * License along with this program; see the file COPYING. If not,
17 * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
20 * Author: Jamie McCracken <jamiemcc@gnome.org>
24 #include <config.h>
25 #include "nautilus-search-engine-tracker.h"
26 #include <tracker.h>
27 #include <eel/eel-gtk-macros.h>
28 #include <eel/eel-glib-extensions.h>
32 struct NautilusSearchEngineTrackerDetails {
33 NautilusQuery *query;
34 TrackerClient *client;
35 gboolean query_pending;
39 static void nautilus_search_engine_tracker_class_init (NautilusSearchEngineTrackerClass *class);
40 static void nautilus_search_engine_tracker_init (NautilusSearchEngineTracker *engine);
42 G_DEFINE_TYPE (NautilusSearchEngineTracker,
43 nautilus_search_engine_tracker,
44 NAUTILUS_TYPE_SEARCH_ENGINE);
46 static NautilusSearchEngineClass *parent_class = NULL;
48 static void
49 finalize (GObject *object)
51 NautilusSearchEngineTracker *tracker;
53 tracker = NAUTILUS_SEARCH_ENGINE_TRACKER (object);
55 if (tracker->details->query) {
56 g_object_unref (tracker->details->query);
57 tracker->details->query = NULL;
60 tracker_disconnect (tracker->details->client);
62 g_free (tracker->details);
64 EEL_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
68 static void
69 search_callback (char **results, GError *error, gpointer user_data)
71 NautilusSearchEngineTracker *tracker;
72 char **results_p;
73 GList *hit_uris;
75 tracker = NAUTILUS_SEARCH_ENGINE_TRACKER (user_data);
76 hit_uris = NULL;
78 tracker->details->query_pending = FALSE;
80 if (error) {
81 nautilus_search_engine_error ( NAUTILUS_SEARCH_ENGINE (tracker), error->message);
82 g_error_free (error);
83 return;
86 if (!results) {
87 return;
90 for (results_p = results; *results_p; results_p++) {
92 char *uri;
94 uri = g_filename_to_uri ((char *)*results_p, NULL, NULL);
95 if (uri) {
96 hit_uris = g_list_prepend (hit_uris, (char *)uri);
100 nautilus_search_engine_hits_added (NAUTILUS_SEARCH_ENGINE (tracker), hit_uris);
101 nautilus_search_engine_finished (NAUTILUS_SEARCH_ENGINE (tracker));
102 g_strfreev (results);
103 eel_g_list_free_deep (hit_uris);
108 static void
109 nautilus_search_engine_tracker_start (NautilusSearchEngine *engine)
111 NautilusSearchEngineTracker *tracker;
112 GList *mimetypes, *l;
113 char *search_text, *location, *location_uri;
114 char **mimes;
115 int i, mime_count;
117 tracker = NAUTILUS_SEARCH_ENGINE_TRACKER (engine);
119 if (tracker->details->query_pending) {
120 return;
123 if (tracker->details->query == NULL) {
124 return;
127 search_text = nautilus_query_get_text (tracker->details->query);
129 mimetypes = nautilus_query_get_mime_types (tracker->details->query);
131 location_uri = nautilus_query_get_location (tracker->details->query);
133 if (location_uri) {
134 location = g_filename_from_uri (location_uri, NULL, NULL);
135 g_free (location_uri);
136 } else {
137 location = NULL;
140 mime_count = g_list_length (mimetypes);
142 i = 0;
144 /* convert list into array */
145 if (mime_count > 0) {
147 mimes = g_new (char *, (mime_count + 1));
149 for (l = mimetypes; l != NULL; l = l->next) {
150 mimes[i] = g_strdup (l->data);
151 i++;
154 mimes[mime_count] = NULL;
156 if (location) {
157 tracker_search_metadata_by_text_and_mime_and_location_async (tracker->details->client,
158 search_text, (const char **)mimes, location,
159 search_callback,
160 tracker);
161 g_free (location);
162 } else {
163 tracker_search_metadata_by_text_and_mime_async (tracker->details->client,
164 search_text, (const char**)mimes,
165 search_callback,
166 tracker);
169 g_strfreev (mimes);
172 } else {
173 if (location) {
174 tracker_search_metadata_by_text_and_location_async (tracker->details->client,
175 search_text,
176 location,
177 search_callback,
178 tracker);
179 g_free (location);
180 } else {
181 tracker_search_metadata_by_text_async (tracker->details->client,
182 search_text,
183 search_callback,
184 tracker);
189 tracker->details->query_pending = TRUE;
190 g_free (search_text);
191 eel_g_list_free_deep (mimetypes);
194 static void
195 nautilus_search_engine_tracker_stop (NautilusSearchEngine *engine)
197 NautilusSearchEngineTracker *tracker;
199 tracker = NAUTILUS_SEARCH_ENGINE_TRACKER (engine);
201 if (tracker->details->query && tracker->details->query_pending) {
202 tracker_cancel_last_call (tracker->details->client);
203 tracker->details->query_pending = FALSE;
207 static gboolean
208 nautilus_search_engine_tracker_is_indexed (NautilusSearchEngine *engine)
210 return TRUE;
213 static void
214 nautilus_search_engine_tracker_set_query (NautilusSearchEngine *engine, NautilusQuery *query)
216 NautilusSearchEngineTracker *tracker;
218 tracker = NAUTILUS_SEARCH_ENGINE_TRACKER (engine);
220 if (query) {
221 g_object_ref (query);
224 if (tracker->details->query) {
225 g_object_unref (tracker->details->query);
228 tracker->details->query = query;
231 static void
232 nautilus_search_engine_tracker_class_init (NautilusSearchEngineTrackerClass *class)
234 GObjectClass *gobject_class;
235 NautilusSearchEngineClass *engine_class;
237 parent_class = g_type_class_peek_parent (class);
239 gobject_class = G_OBJECT_CLASS (class);
240 gobject_class->finalize = finalize;
242 engine_class = NAUTILUS_SEARCH_ENGINE_CLASS (class);
243 engine_class->set_query = nautilus_search_engine_tracker_set_query;
244 engine_class->start = nautilus_search_engine_tracker_start;
245 engine_class->stop = nautilus_search_engine_tracker_stop;
246 engine_class->is_indexed = nautilus_search_engine_tracker_is_indexed;
249 static void
250 nautilus_search_engine_tracker_init (NautilusSearchEngineTracker *engine)
252 engine->details = g_new0 (NautilusSearchEngineTrackerDetails, 1);
256 NautilusSearchEngine *
257 nautilus_search_engine_tracker_new (void)
259 NautilusSearchEngineTracker *engine;
260 TrackerClient *tracker_client;
262 tracker_client = tracker_connect (FALSE);
264 if (!tracker_client) {
265 return NULL;
268 engine = g_object_new (NAUTILUS_TYPE_SEARCH_ENGINE_TRACKER, NULL);
270 engine->details->client = tracker_client;
272 engine->details->query_pending = FALSE;
274 return NAUTILUS_SEARCH_ENGINE (engine);