1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
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>
25 #include "nautilus-search-engine-tracker.h"
27 #include <eel/eel-gtk-macros.h>
28 #include <eel/eel-glib-extensions.h>
32 struct NautilusSearchEngineTrackerDetails
{
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
;
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
));
69 search_callback (char **results
, GError
*error
, gpointer user_data
)
71 NautilusSearchEngineTracker
*tracker
;
75 tracker
= NAUTILUS_SEARCH_ENGINE_TRACKER (user_data
);
78 tracker
->details
->query_pending
= FALSE
;
81 nautilus_search_engine_error ( NAUTILUS_SEARCH_ENGINE (tracker
), error
->message
);
90 for (results_p
= results
; *results_p
; results_p
++) {
94 uri
= g_filename_to_uri ((char *)*results_p
, NULL
, NULL
);
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
);
109 nautilus_search_engine_tracker_start (NautilusSearchEngine
*engine
)
111 NautilusSearchEngineTracker
*tracker
;
112 GList
*mimetypes
, *l
;
113 char *search_text
, *location
, *location_uri
;
117 tracker
= NAUTILUS_SEARCH_ENGINE_TRACKER (engine
);
119 if (tracker
->details
->query_pending
) {
123 if (tracker
->details
->query
== NULL
) {
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
);
134 location
= g_filename_from_uri (location_uri
, NULL
, NULL
);
135 g_free (location_uri
);
140 mime_count
= g_list_length (mimetypes
);
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
);
154 mimes
[mime_count
] = NULL
;
157 tracker_search_metadata_by_text_and_mime_and_location_async (tracker
->details
->client
,
158 search_text
, (const char **)mimes
, location
,
163 tracker_search_metadata_by_text_and_mime_async (tracker
->details
->client
,
164 search_text
, (const char**)mimes
,
174 tracker_search_metadata_by_text_and_location_async (tracker
->details
->client
,
181 tracker_search_metadata_by_text_async (tracker
->details
->client
,
189 tracker
->details
->query_pending
= TRUE
;
190 g_free (search_text
);
191 eel_g_list_free_deep (mimetypes
);
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
;
208 nautilus_search_engine_tracker_is_indexed (NautilusSearchEngine
*engine
)
214 nautilus_search_engine_tracker_set_query (NautilusSearchEngine
*engine
, NautilusQuery
*query
)
216 NautilusSearchEngineTracker
*tracker
;
218 tracker
= NAUTILUS_SEARCH_ENGINE_TRACKER (engine
);
221 g_object_ref (query
);
224 if (tracker
->details
->query
) {
225 g_object_unref (tracker
->details
->query
);
228 tracker
->details
->query
= query
;
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
;
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
;
263 tracker_client
= tracker_connect (FALSE
);
265 if (!tracker_client
) {
269 tracker_get_version (tracker_client
, &err
);
273 tracker_disconnect (tracker_client
);
277 engine
= g_object_new (NAUTILUS_TYPE_SEARCH_ENGINE_TRACKER
, NULL
);
279 engine
->details
->client
= tracker_client
;
281 engine
->details
->query_pending
= FALSE
;
283 return NAUTILUS_SEARCH_ENGINE (engine
);