1
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
4
* Copyright (C) Rouquier Philippe 2009 <bonfire-app@wanadoo.fr>
6
* brasero is free software: you can redistribute it and/or modify it
7
* under the terms of the GNU General Public License as published by the
8
* Free Software Foundation, either version 3 of the License, or
9
* (at your option) any later version.
11
* brasero is distributed in the hope that it will be useful, but
12
* WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14
* See the GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License along
17
* with this program. If not, see <http://www.gnu.org/licenses/>.
22
#include <libtracker-client/tracker.h>
24
#include "brasero-search-tracker.h"
25
#include "brasero-search-engine.h"
27
typedef struct _BraseroSearchTrackerPrivate BraseroSearchTrackerPrivate;
28
struct _BraseroSearchTrackerPrivate
30
TrackerClient *client;
33
BraseroSearchScope scope;
39
#define BRASERO_SEARCH_TRACKER_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), BRASERO_TYPE_SEARCH_TRACKER, BraseroSearchTrackerPrivate))
41
static void brasero_search_tracker_init_engine (BraseroSearchEngineIface *iface);
43
G_DEFINE_TYPE_WITH_CODE (BraseroSearchTracker,
44
brasero_search_tracker,
46
G_IMPLEMENT_INTERFACE (BRASERO_TYPE_SEARCH_ENGINE,
47
brasero_search_tracker_init_engine));
50
brasero_search_tracker_is_available (BraseroSearchEngine *engine)
52
BraseroSearchTrackerPrivate *priv;
54
priv = BRASERO_SEARCH_TRACKER_PRIVATE (engine);
58
priv->client = tracker_connect (TRUE, 30000);
59
return (priv->client != NULL);
63
brasero_search_tracker_num_hits (BraseroSearchEngine *engine)
65
BraseroSearchTrackerPrivate *priv;
67
priv = BRASERO_SEARCH_TRACKER_PRIVATE (engine);
71
return priv->results->len;
75
brasero_search_tracker_uri_from_hit (BraseroSearchEngine *engine,
85
if (g_strv_length (tracker_hit) >= 1)
86
return tracker_hit [0];
92
brasero_search_tracker_mime_from_hit (BraseroSearchEngine *engine,
102
if (g_strv_length (tracker_hit) >= 2)
103
return tracker_hit [1];
109
brasero_search_tracker_score_from_hit (BraseroSearchEngine *engine,
119
if (g_strv_length (tracker_hit) >= 3)
120
return (int) strtof (tracker_hit [2], NULL);
126
brasero_search_tracker_reply (GPtrArray *results,
130
BraseroSearchEngine *search = BRASERO_SEARCH_ENGINE (user_data);
131
BraseroSearchTrackerPrivate *priv;
134
priv = BRASERO_SEARCH_TRACKER_PRIVATE (search);
137
brasero_search_engine_query_error (search, error);
142
brasero_search_engine_query_finished (search);
146
priv->results = results;
147
for (i = 0; i < results->len; i ++)
148
brasero_search_engine_hit_added (search, g_ptr_array_index (results, i));
150
brasero_search_engine_query_finished (search);
154
brasero_search_tracker_query_start_real (BraseroSearchEngine *search,
157
BraseroSearchTrackerPrivate *priv;
158
gboolean res = FALSE;
159
GString *query = NULL;
161
priv = BRASERO_SEARCH_TRACKER_PRIVATE (search);
163
query = g_string_new ("SELECT ?file ?mime fts:rank(?file) " /* Which variables should be returned */
164
"WHERE {" /* Start defining the search and its scope */
165
" ?file a nfo:FileDataObject . " /* File must be a file (not a stream, ...) */
166
" ?file nie:mimeType ?mime . "); /* Get its mime */
171
g_string_append (query, " FILTER ( ");
172
for (i = 0; priv->mimes [i]; i ++) { /* Filter files according to their mime type */
174
g_string_append (query, " || ");
175
g_string_append_printf (query,
179
g_string_append (query, " ) ");
183
gboolean param_added = FALSE;
185
g_string_append (query,
189
if (priv->scope & BRASERO_SEARCH_SCOPE_MUSIC) {
190
query = g_string_append (query, "?type = nmm:MusicPiece");
194
if (priv->scope & BRASERO_SEARCH_SCOPE_VIDEO) {
196
g_string_append (query, " || ");
197
query = g_string_append (query, "?type = nfo:Video");
202
if (priv->scope & BRASERO_SEARCH_SCOPE_PICTURES) {
204
g_string_append (query, " || ");
205
query = g_string_append (query, "?type = nfo:Image");
210
if (priv->scope & BRASERO_SEARCH_SCOPE_DOCUMENTS) {
212
g_string_append (query, " || ");
213
query = g_string_append (query, "?type = nfo:Document");
216
g_string_append (query,
221
g_string_append_printf (query,
222
" ?file fts:match \"%s\" ", /* File must match possible keywords */
225
g_string_append (query,
227
"ORDER BY ASC(fts:rank(?file)) "
231
res = tracker_resources_sparql_query_async (priv->client,
233
brasero_search_tracker_reply,
235
g_string_free (query, TRUE);
241
brasero_search_tracker_query_start (BraseroSearchEngine *search)
243
return brasero_search_tracker_query_start_real (search, 0);
247
brasero_search_tracker_add_hit_to_tree (BraseroSearchEngine *search,
252
BraseroSearchTrackerPrivate *priv;
255
priv = BRASERO_SEARCH_TRACKER_PRIVATE (search);
260
for (i = range_start; g_ptr_array_index (priv->results, i) && i < range_end; i ++) {
264
hit = g_ptr_array_index (priv->results, i);
265
gtk_list_store_insert_with_values (GTK_LIST_STORE (model), &row, -1,
266
BRASERO_SEARCH_TREE_HIT_COL, hit,
274
brasero_search_tracker_query_set_scope (BraseroSearchEngine *search,
275
BraseroSearchScope scope)
277
BraseroSearchTrackerPrivate *priv;
279
priv = BRASERO_SEARCH_TRACKER_PRIVATE (search);
285
brasero_search_tracker_set_query_mime (BraseroSearchEngine *search,
288
BraseroSearchTrackerPrivate *priv;
290
priv = BRASERO_SEARCH_TRACKER_PRIVATE (search);
293
g_strfreev (priv->mimes);
297
priv->mimes = g_strdupv ((gchar **) mimes);
302
brasero_search_tracker_clean (BraseroSearchTracker *search)
304
BraseroSearchTrackerPrivate *priv;
306
priv = BRASERO_SEARCH_TRACKER_PRIVATE (search);
308
tracker_cancel_last_call (priv->client);
311
g_ptr_array_foreach (priv->results, (GFunc) g_strfreev, NULL);
312
g_ptr_array_free (priv->results, TRUE);
313
priv->results = NULL;
316
if (priv->keywords) {
317
g_free (priv->keywords);
318
priv->keywords = NULL;
322
g_strfreev (priv->mimes);
328
brasero_search_tracker_query_new (BraseroSearchEngine *search,
329
const gchar *keywords)
331
BraseroSearchTrackerPrivate *priv;
333
priv = BRASERO_SEARCH_TRACKER_PRIVATE (search);
335
brasero_search_tracker_clean (BRASERO_SEARCH_TRACKER (search));
336
priv->keywords = g_strdup (keywords);
342
brasero_search_tracker_init_engine (BraseroSearchEngineIface *iface)
344
iface->is_available = brasero_search_tracker_is_available;
345
iface->query_new = brasero_search_tracker_query_new;
346
iface->query_set_mime = brasero_search_tracker_set_query_mime;
347
iface->query_set_scope = brasero_search_tracker_query_set_scope;
348
iface->query_start = brasero_search_tracker_query_start;
350
iface->uri_from_hit = brasero_search_tracker_uri_from_hit;
351
iface->mime_from_hit = brasero_search_tracker_mime_from_hit;
352
iface->score_from_hit = brasero_search_tracker_score_from_hit;
354
iface->add_hits = brasero_search_tracker_add_hit_to_tree;
355
iface->num_hits = brasero_search_tracker_num_hits;
359
brasero_search_tracker_init (BraseroSearchTracker *object)
361
BraseroSearchTrackerPrivate *priv;
363
priv = BRASERO_SEARCH_TRACKER_PRIVATE (object);
364
priv->client = tracker_connect (TRUE, 30000);
368
brasero_search_tracker_finalize (GObject *object)
370
BraseroSearchTrackerPrivate *priv;
372
priv = BRASERO_SEARCH_TRACKER_PRIVATE (object);
374
brasero_search_tracker_clean (BRASERO_SEARCH_TRACKER (object));
377
tracker_disconnect (priv->client);
381
G_OBJECT_CLASS (brasero_search_tracker_parent_class)->finalize (object);
385
brasero_search_tracker_class_init (BraseroSearchTrackerClass *klass)
387
GObjectClass* object_class = G_OBJECT_CLASS (klass);
390
g_type_class_add_private (klass, sizeof (BraseroSearchTrackerPrivate));
392
object_class->finalize = brasero_search_tracker_finalize;