1
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
4
* Copyright (C) Philippe Rouquier 2005-2009 <bonfire-app@wanadoo.fr>
6
* Brasero is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
11
* brasero is distributed in the hope that it will be useful,
12
* but 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
17
* along with brasero. If not, write to:
18
* The Free Software Foundation, Inc.,
19
* 51 Franklin Street, Fifth Floor
20
* Boston, MA 02110-1301, USA.
28
#include <glib-object.h>
29
#include <glib/gi18n-lib.h>
35
#include <beagle/beagle.h>
37
#include "brasero-search-beagle.h"
38
#include "brasero-search-engine.h"
41
typedef struct _BraseroSearchBeaglePrivate BraseroSearchBeaglePrivate;
42
struct _BraseroSearchBeaglePrivate
50
#define BRASERO_SEARCH_BEAGLE_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), BRASERO_TYPE_SEARCH_BEAGLE, BraseroSearchBeaglePrivate))
52
static void brasero_search_beagle_init_engine (BraseroSearchEngineIface *iface);
54
G_DEFINE_TYPE_WITH_CODE (BraseroSearchBeagle,
55
brasero_search_beagle,
57
G_IMPLEMENT_INTERFACE (BRASERO_TYPE_SEARCH_ENGINE,
58
brasero_search_beagle_init_engine));
61
brasero_search_beagle_is_available (BraseroSearchEngine *engine)
63
BraseroSearchBeaglePrivate *priv;
65
priv = BRASERO_SEARCH_BEAGLE_PRIVATE (engine);
69
priv->client = beagle_client_new (NULL);
70
return (priv->client != NULL);
74
brasero_search_beagle_num_hits (BraseroSearchEngine *engine)
76
BraseroSearchBeaglePrivate *priv;
78
priv = BRASERO_SEARCH_BEAGLE_PRIVATE (engine);
79
return g_slist_length (priv->hits);
83
brasero_search_beagle_uri_from_hit (BraseroSearchEngine *engine,
86
return beagle_hit_get_uri (BEAGLE_HIT (hit));
90
brasero_search_beagle_mime_from_hit (BraseroSearchEngine *engine,
93
return beagle_hit_get_mime_type (BEAGLE_HIT (hit));
97
brasero_search_beagle_score_from_hit (BraseroSearchEngine *engine,
100
return (int) (beagle_hit_get_score (BEAGLE_HIT (hit)) * 100);
104
brasero_search_beagle_add_hit_to_tree (BraseroSearchEngine *search,
109
BraseroSearchBeaglePrivate *priv;
113
priv = BRASERO_SEARCH_BEAGLE_PRIVATE (search);
116
iter = g_slist_nth (priv->hits, range_start);
118
for (; iter && num < range_end - range_start; iter = iter->next, num ++) {
124
gtk_list_store_insert_with_values (GTK_LIST_STORE (model), &row, -1,
125
BRASERO_SEARCH_TREE_HIT_COL, hit,
133
brasero_search_beagle_hit_added_cb (BeagleQuery *query,
134
BeagleHitsAddedResponse *response,
135
BraseroSearchBeagle *search)
139
BraseroSearchBeaglePrivate *priv;
141
priv = BRASERO_SEARCH_BEAGLE_PRIVATE (search);
143
/* NOTE : list must not be modified nor freed */
144
list = beagle_hits_added_response_get_hits (response);
145
list = g_slist_copy (list);
148
priv->hits = g_slist_concat (priv->hits, list);
152
for (iter = list; iter; iter = iter->next) {
156
beagle_hit_ref (hit);
158
brasero_search_engine_hit_added (BRASERO_SEARCH_ENGINE (search), hit);
163
brasero_search_beagle_hit_substracted_cb (BeagleQuery *query,
164
BeagleHitsSubtractedResponse *response,
165
BraseroSearchBeagle *search)
168
BraseroSearchBeaglePrivate *priv;
170
priv = BRASERO_SEARCH_BEAGLE_PRIVATE (search);
172
list = beagle_hits_subtracted_response_get_uris (response);
173
for (iter = list; iter; iter = iter->next) {
174
GSList *next, *hit_iter;
175
const gchar *removed_uri;
177
removed_uri = iter->data;
179
/* see if it isn't in the hits that are still waiting */
180
for (hit_iter = priv->hits; hit_iter; hit_iter = next) {
184
next = hit_iter->next;
185
hit = hit_iter->data;
187
hit_uri = beagle_hit_get_uri (hit);
188
if (!strcmp (hit_uri, removed_uri)) {
189
priv->hits = g_slist_remove (priv->hits, hit);
190
brasero_search_engine_hit_removed (BRASERO_SEARCH_ENGINE (search), hit);
191
beagle_hit_unref (hit);
198
brasero_search_beagle_finished_cb (BeagleQuery *query,
199
BeagleFinishedResponse *response,
200
BraseroSearchBeagle *search)
202
brasero_search_engine_query_finished (BRASERO_SEARCH_ENGINE (search));
206
brasero_search_beagle_error_cb (BeagleRequest *request,
208
BraseroSearchEngine *search)
210
brasero_search_engine_query_error (BRASERO_SEARCH_ENGINE (search), error);
214
brasero_search_beagle_query_start (BraseroSearchEngine *search)
216
BraseroSearchBeaglePrivate *priv;
217
GError *error = NULL;
219
priv = BRASERO_SEARCH_BEAGLE_PRIVATE (search);
223
g_warning ("No query");
227
beagle_query_set_max_hits (priv->query, 10000);
228
g_signal_connect (G_OBJECT (priv->query), "hits-added",
229
G_CALLBACK (brasero_search_beagle_hit_added_cb),
231
g_signal_connect (G_OBJECT (priv->query), "hits-subtracted",
233
(brasero_search_beagle_hit_substracted_cb),
235
g_signal_connect (G_OBJECT (priv->query), "finished",
236
G_CALLBACK (brasero_search_beagle_finished_cb),
238
g_signal_connect (G_OBJECT (priv->query), "error",
239
G_CALLBACK (brasero_search_beagle_error_cb),
242
beagle_client_send_request_async (priv->client,
243
BEAGLE_REQUEST (priv->query),
246
brasero_search_engine_query_error (BRASERO_SEARCH_ENGINE (search), error);
247
g_error_free (error);
255
brasero_search_beagle_clean (BraseroSearchBeagle *beagle)
257
BraseroSearchBeaglePrivate *priv;
259
priv = BRASERO_SEARCH_BEAGLE_PRIVATE (beagle);
262
g_object_unref (priv->query);
267
g_slist_foreach (priv->hits, (GFunc) beagle_hit_unref, NULL);
268
g_slist_free (priv->hits);
274
brasero_search_beagle_query_new (BraseroSearchEngine *search,
275
const gchar *keywords)
277
BraseroSearchBeaglePrivate *priv;
278
BeagleQueryPartHuman *text;
280
priv = BRASERO_SEARCH_BEAGLE_PRIVATE (search);
282
brasero_search_beagle_clean (BRASERO_SEARCH_BEAGLE (search));
283
priv->query = beagle_query_new ();
286
BeagleQueryPartHuman *text;
288
text = beagle_query_part_human_new ();
289
beagle_query_part_human_set_string (text, keywords);
290
beagle_query_part_set_logic (BEAGLE_QUERY_PART (text),
291
BEAGLE_QUERY_PART_LOGIC_REQUIRED);
293
beagle_query_add_part (priv->query, BEAGLE_QUERY_PART (text));
296
text = beagle_query_part_human_new ();
297
beagle_query_part_human_set_string (text, "type:File");
298
beagle_query_add_part (priv->query, BEAGLE_QUERY_PART (text));
304
brasero_search_beagle_query_set_scope (BraseroSearchEngine *search,
305
BraseroSearchScope scope)
307
BeagleQueryPartOr *or_part = NULL;
308
BraseroSearchBeaglePrivate *priv;
310
priv = BRASERO_SEARCH_BEAGLE_PRIVATE (search);
315
if (scope & BRASERO_SEARCH_SCOPE_DOCUMENTS) {
316
BeagleQueryPartProperty *filetype;
319
or_part = beagle_query_part_or_new ();
321
filetype = beagle_query_part_property_new ();
322
beagle_query_part_property_set_property_type (filetype, BEAGLE_PROPERTY_TYPE_KEYWORD);
323
beagle_query_part_property_set_key (filetype, "beagle:FileType");
324
beagle_query_part_property_set_value (filetype, "document");
325
beagle_query_part_or_add_subpart (or_part, BEAGLE_QUERY_PART (filetype));
328
if (scope & BRASERO_SEARCH_SCOPE_PICTURES) {
329
BeagleQueryPartProperty *filetype;
332
or_part = beagle_query_part_or_new ();
334
filetype = beagle_query_part_property_new ();
335
beagle_query_part_property_set_property_type (filetype, BEAGLE_PROPERTY_TYPE_KEYWORD);
336
beagle_query_part_property_set_key (filetype, "beagle:FileType");
337
beagle_query_part_property_set_value (filetype, "image");
338
beagle_query_part_or_add_subpart (or_part, BEAGLE_QUERY_PART (filetype));
341
if (scope & BRASERO_SEARCH_SCOPE_MUSIC) {
342
BeagleQueryPartProperty *filetype;
345
or_part = beagle_query_part_or_new ();
347
filetype = beagle_query_part_property_new ();
348
beagle_query_part_property_set_property_type (filetype, BEAGLE_PROPERTY_TYPE_KEYWORD);
349
beagle_query_part_property_set_key (filetype, "beagle:FileType");
350
beagle_query_part_property_set_value (filetype, "audio");
351
beagle_query_part_or_add_subpart (or_part, BEAGLE_QUERY_PART (filetype));
354
if (scope & BRASERO_SEARCH_SCOPE_VIDEO) {
355
BeagleQueryPartProperty *filetype;
358
or_part = beagle_query_part_or_new ();
360
filetype = beagle_query_part_property_new ();
361
beagle_query_part_property_set_property_type (filetype, BEAGLE_PROPERTY_TYPE_KEYWORD);
362
beagle_query_part_property_set_key (filetype, "beagle:FileType");
363
beagle_query_part_property_set_value (filetype, "video");
364
beagle_query_part_or_add_subpart (or_part, BEAGLE_QUERY_PART (filetype));
370
beagle_query_add_part (priv->query, BEAGLE_QUERY_PART (or_part));
375
brasero_search_beagle_set_query_mime (BraseroSearchEngine *search,
379
BeagleQueryPartOr *or_part;
380
BraseroSearchBeaglePrivate *priv;
382
priv = BRASERO_SEARCH_BEAGLE_PRIVATE (search);
387
or_part = beagle_query_part_or_new ();
388
for (i = 0; mimes [i]; i ++) {
389
BeagleQueryPartProperty *filetype;
391
filetype = beagle_query_part_property_new ();
392
beagle_query_part_property_set_property_type (filetype, BEAGLE_PROPERTY_TYPE_KEYWORD);
393
beagle_query_part_property_set_key (filetype, "beagle:MimeType");
394
beagle_query_part_property_set_value (filetype, mimes [i]);
395
beagle_query_part_or_add_subpart (or_part, BEAGLE_QUERY_PART (filetype));
398
beagle_query_add_part (priv->query, BEAGLE_QUERY_PART (or_part));
404
brasero_search_beagle_init_engine (BraseroSearchEngineIface *iface)
406
iface->is_available = brasero_search_beagle_is_available;
407
iface->uri_from_hit = brasero_search_beagle_uri_from_hit;
408
iface->score_from_hit = brasero_search_beagle_score_from_hit;
409
iface->mime_from_hit = brasero_search_beagle_mime_from_hit;
410
iface->query_new = brasero_search_beagle_query_new;
411
iface->query_set_scope = brasero_search_beagle_query_set_scope;
412
iface->query_set_mime = brasero_search_beagle_set_query_mime;
413
iface->query_start = brasero_search_beagle_query_start;
414
iface->add_hits = brasero_search_beagle_add_hit_to_tree;
415
iface->num_hits = brasero_search_beagle_num_hits;
419
brasero_search_beagle_init (BraseroSearchBeagle *object)
421
BraseroSearchBeaglePrivate *priv;
423
priv = BRASERO_SEARCH_BEAGLE_PRIVATE (object);
425
priv->client = beagle_client_new (NULL);
429
brasero_search_beagle_finalize (GObject *object)
431
BraseroSearchBeaglePrivate *priv;
433
priv = BRASERO_SEARCH_BEAGLE_PRIVATE (object);
436
g_object_unref (priv->client);
440
brasero_search_beagle_clean (BRASERO_SEARCH_BEAGLE (object));
441
G_OBJECT_CLASS (brasero_search_beagle_parent_class)->finalize (object);
445
brasero_search_beagle_class_init (BraseroSearchBeagleClass *klass)
447
GObjectClass* object_class = G_OBJECT_CLASS (klass);
449
g_type_class_add_private (klass, sizeof (BraseroSearchBeaglePrivate));
451
object_class->finalize = brasero_search_beagle_finalize;