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-client.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;
38
guint current_call_id;
41
#define BRASERO_SEARCH_TRACKER_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), BRASERO_TYPE_SEARCH_TRACKER, BraseroSearchTrackerPrivate))
43
static void brasero_search_tracker_init_engine (BraseroSearchEngineIface *iface);
45
G_DEFINE_TYPE_WITH_CODE (BraseroSearchTracker,
46
brasero_search_tracker,
48
G_IMPLEMENT_INTERFACE (BRASERO_TYPE_SEARCH_ENGINE,
49
brasero_search_tracker_init_engine));
52
brasero_search_tracker_is_available (BraseroSearchEngine *engine)
54
BraseroSearchTrackerPrivate *priv;
56
priv = BRASERO_SEARCH_TRACKER_PRIVATE (engine);
60
priv->client = tracker_client_new (1, 30000);
61
return (priv->client != NULL);
65
brasero_search_tracker_num_hits (BraseroSearchEngine *engine)
67
BraseroSearchTrackerPrivate *priv;
69
priv = BRASERO_SEARCH_TRACKER_PRIVATE (engine);
73
return priv->results->len;
77
brasero_search_tracker_uri_from_hit (BraseroSearchEngine *engine,
87
if (g_strv_length (tracker_hit) >= 2)
88
return tracker_hit [1];
94
brasero_search_tracker_mime_from_hit (BraseroSearchEngine *engine,
104
if (g_strv_length (tracker_hit) >= 3)
105
return tracker_hit [2];
111
brasero_search_tracker_score_from_hit (BraseroSearchEngine *engine,
121
if (g_strv_length (tracker_hit) >= 4)
122
return (int) strtof (tracker_hit [3], NULL);
128
brasero_search_tracker_reply (GPtrArray *results,
132
BraseroSearchEngine *search = BRASERO_SEARCH_ENGINE (user_data);
133
BraseroSearchTrackerPrivate *priv;
136
priv = BRASERO_SEARCH_TRACKER_PRIVATE (search);
139
brasero_search_engine_query_error (search, error);
144
brasero_search_engine_query_finished (search);
148
priv->results = results;
149
for (i = 0; i < results->len; i ++)
150
brasero_search_engine_hit_added (search, g_ptr_array_index (results, i));
152
brasero_search_engine_query_finished (search);
156
brasero_search_tracker_query_start_real (BraseroSearchEngine *search,
159
BraseroSearchTrackerPrivate *priv;
160
gboolean res = FALSE;
161
GString *query = NULL;
163
priv = BRASERO_SEARCH_TRACKER_PRIVATE (search);
165
query = g_string_new ("SELECT ?file ?url ?mime fts:rank(?file) " /* Which variables should be returned */
166
"WHERE {" /* Start defining the search and its scope */
167
" ?file a nfo:FileDataObject . " /* File must be a file (not a stream, ...) */
168
" ?file nie:url ?url . " /* Get the url of the file */
169
" ?file nie:mimeType ?mime . "); /* Get its mime */
174
g_string_append (query, " FILTER ( ");
175
for (i = 0; priv->mimes [i]; i ++) { /* Filter files according to their mime type */
177
g_string_append (query, " || ");
179
g_string_append_printf (query,
183
g_string_append (query, " ) ");
187
gboolean param_added = FALSE;
189
g_string_append (query,
193
if (priv->scope & BRASERO_SEARCH_SCOPE_MUSIC) {
194
query = g_string_append (query, "?type = nmm:MusicPiece");
198
if (priv->scope & BRASERO_SEARCH_SCOPE_VIDEO) {
200
g_string_append (query, " || ");
201
query = g_string_append (query, "?type = nfo:Video");
206
if (priv->scope & BRASERO_SEARCH_SCOPE_PICTURES) {
208
g_string_append (query, " || ");
209
query = g_string_append (query, "?type = nfo:Image");
214
if (priv->scope & BRASERO_SEARCH_SCOPE_DOCUMENTS) {
216
g_string_append (query, " || ");
217
query = g_string_append (query, "?type = nfo:Document");
220
g_string_append (query,
225
g_string_append_printf (query,
226
" ?file fts:match \"%s\" ", /* File must match possible keywords */
229
g_string_append (query,
231
"ORDER BY ASC(fts:rank(?file)) "
235
priv->current_call_id = tracker_resources_sparql_query_async (priv->client,
237
brasero_search_tracker_reply,
239
g_string_free (query, TRUE);
245
brasero_search_tracker_query_start (BraseroSearchEngine *search)
247
return brasero_search_tracker_query_start_real (search, 0);
251
brasero_search_tracker_add_hit_to_tree (BraseroSearchEngine *search,
256
BraseroSearchTrackerPrivate *priv;
259
priv = BRASERO_SEARCH_TRACKER_PRIVATE (search);
264
for (i = range_start; g_ptr_array_index (priv->results, i) && i < range_end; i ++) {
268
hit = g_ptr_array_index (priv->results, i);
269
gtk_list_store_insert_with_values (GTK_LIST_STORE (model), &row, -1,
270
BRASERO_SEARCH_TREE_HIT_COL, hit,
278
brasero_search_tracker_query_set_scope (BraseroSearchEngine *search,
279
BraseroSearchScope scope)
281
BraseroSearchTrackerPrivate *priv;
283
priv = BRASERO_SEARCH_TRACKER_PRIVATE (search);
289
brasero_search_tracker_set_query_mime (BraseroSearchEngine *search,
292
BraseroSearchTrackerPrivate *priv;
294
priv = BRASERO_SEARCH_TRACKER_PRIVATE (search);
297
g_strfreev (priv->mimes);
301
priv->mimes = g_strdupv ((gchar **) mimes);
306
brasero_search_tracker_clean (BraseroSearchTracker *search)
308
BraseroSearchTrackerPrivate *priv;
310
priv = BRASERO_SEARCH_TRACKER_PRIVATE (search);
312
if (priv->current_call_id)
313
tracker_cancel_call (priv->client, priv->current_call_id);
316
g_ptr_array_foreach (priv->results, (GFunc) g_strfreev, NULL);
317
g_ptr_array_free (priv->results, TRUE);
318
priv->results = NULL;
321
if (priv->keywords) {
322
g_free (priv->keywords);
323
priv->keywords = NULL;
327
g_strfreev (priv->mimes);
333
brasero_search_tracker_query_new (BraseroSearchEngine *search,
334
const gchar *keywords)
336
BraseroSearchTrackerPrivate *priv;
338
priv = BRASERO_SEARCH_TRACKER_PRIVATE (search);
340
brasero_search_tracker_clean (BRASERO_SEARCH_TRACKER (search));
341
priv->keywords = g_strdup (keywords);
347
brasero_search_tracker_init_engine (BraseroSearchEngineIface *iface)
349
iface->is_available = brasero_search_tracker_is_available;
350
iface->query_new = brasero_search_tracker_query_new;
351
iface->query_set_mime = brasero_search_tracker_set_query_mime;
352
iface->query_set_scope = brasero_search_tracker_query_set_scope;
353
iface->query_start = brasero_search_tracker_query_start;
355
iface->uri_from_hit = brasero_search_tracker_uri_from_hit;
356
iface->mime_from_hit = brasero_search_tracker_mime_from_hit;
357
iface->score_from_hit = brasero_search_tracker_score_from_hit;
359
iface->add_hits = brasero_search_tracker_add_hit_to_tree;
360
iface->num_hits = brasero_search_tracker_num_hits;
364
brasero_search_tracker_init (BraseroSearchTracker *object)
366
BraseroSearchTrackerPrivate *priv;
368
priv = BRASERO_SEARCH_TRACKER_PRIVATE (object);
369
priv->client = tracker_client_new (1, 30000);
373
brasero_search_tracker_finalize (GObject *object)
375
BraseroSearchTrackerPrivate *priv;
377
priv = BRASERO_SEARCH_TRACKER_PRIVATE (object);
379
brasero_search_tracker_clean (BRASERO_SEARCH_TRACKER (object));
382
g_object_unref (priv->client);
386
G_OBJECT_CLASS (brasero_search_tracker_parent_class)->finalize (object);
390
brasero_search_tracker_class_init (BraseroSearchTrackerClass *klass)
392
GObjectClass* object_class = G_OBJECT_CLASS (klass);
395
g_type_class_add_private (klass, sizeof (BraseroSearchTrackerPrivate));
397
object_class->finalize = brasero_search_tracker_finalize;