~ubuntu-branches/ubuntu/oneiric/brasero/oneiric

« back to all changes in this revision

Viewing changes to src/brasero-search-beagle.c

  • Committer: Package Import Robot
  • Author(s): Rodrigo Moya
  • Date: 2011-09-09 12:27:41 UTC
  • mfrom: (1.1.48 upstream)
  • Revision ID: package-import@ubuntu.com-20110909122741-j98wdzlqbbzcgwl2
Tags: 3.1.90-0ubuntu1
* New upstream release
* debian/watch:
  - Watch .bz2 tarballs
* debian/control:
  - Bump libunity-dev build requirement
* debian/patches/012_appindicator.patch:
* debian/patches/013_unity_launcher_progress.patch:
  - Rebased patches

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
2
 
/*
3
 
 * Brasero
4
 
 * Copyright (C) Philippe Rouquier 2005-2009 <bonfire-app@wanadoo.fr>
5
 
 * 
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.
10
 
 * 
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.
15
 
 * 
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.
21
 
 */
22
 
 
23
 
#ifdef HAVE_CONFIG_H
24
 
#  include <config.h>
25
 
#endif
26
 
 
27
 
#include <glib.h>
28
 
#include <glib-object.h>
29
 
#include <glib/gi18n-lib.h>
30
 
 
31
 
#include <gio/gio.h>
32
 
 
33
 
#include <gtk/gtk.h>
34
 
 
35
 
#include <beagle/beagle.h>
36
 
 
37
 
#include "brasero-search-beagle.h"
38
 
#include "brasero-search-engine.h"
39
 
 
40
 
 
41
 
typedef struct _BraseroSearchBeaglePrivate BraseroSearchBeaglePrivate;
42
 
struct _BraseroSearchBeaglePrivate
43
 
{
44
 
        BeagleClient *client;
45
 
        BeagleQuery *query;
46
 
 
47
 
        GSList *hits;
48
 
};
49
 
 
50
 
#define BRASERO_SEARCH_BEAGLE_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE ((o), BRASERO_TYPE_SEARCH_BEAGLE, BraseroSearchBeaglePrivate))
51
 
 
52
 
static void brasero_search_beagle_init_engine (BraseroSearchEngineIface *iface);
53
 
 
54
 
G_DEFINE_TYPE_WITH_CODE (BraseroSearchBeagle,
55
 
                         brasero_search_beagle,
56
 
                         G_TYPE_OBJECT,
57
 
                         G_IMPLEMENT_INTERFACE (BRASERO_TYPE_SEARCH_ENGINE,
58
 
                                                brasero_search_beagle_init_engine));
59
 
 
60
 
static gboolean
61
 
brasero_search_beagle_is_available (BraseroSearchEngine *engine)
62
 
{
63
 
        BraseroSearchBeaglePrivate *priv;
64
 
 
65
 
        priv = BRASERO_SEARCH_BEAGLE_PRIVATE (engine);
66
 
        if (priv->client)
67
 
                return TRUE;
68
 
 
69
 
        priv->client = beagle_client_new (NULL);
70
 
        return (priv->client != NULL);
71
 
}
72
 
 
73
 
static gint
74
 
brasero_search_beagle_num_hits (BraseroSearchEngine *engine)
75
 
{
76
 
        BraseroSearchBeaglePrivate *priv;
77
 
 
78
 
        priv = BRASERO_SEARCH_BEAGLE_PRIVATE (engine);
79
 
        return g_slist_length (priv->hits);
80
 
}
81
 
 
82
 
static const gchar *
83
 
brasero_search_beagle_uri_from_hit (BraseroSearchEngine *engine,
84
 
                                     gpointer hit)
85
 
{
86
 
        return beagle_hit_get_uri (BEAGLE_HIT (hit));
87
 
}
88
 
 
89
 
static const gchar *
90
 
brasero_search_beagle_mime_from_hit (BraseroSearchEngine *engine,
91
 
                                     gpointer hit)
92
 
{
93
 
        return beagle_hit_get_mime_type (BEAGLE_HIT (hit));
94
 
}
95
 
 
96
 
static int
97
 
brasero_search_beagle_score_from_hit (BraseroSearchEngine *engine,
98
 
                                      gpointer hit)
99
 
{
100
 
        return (int) (beagle_hit_get_score (BEAGLE_HIT (hit)) * 100);
101
 
}
102
 
 
103
 
static gboolean
104
 
brasero_search_beagle_add_hit_to_tree (BraseroSearchEngine *search,
105
 
                                       GtkTreeModel *model,
106
 
                                       gint range_start,
107
 
                                       gint range_end)
108
 
{
109
 
        BraseroSearchBeaglePrivate *priv;
110
 
        GSList *iter;
111
 
        gint num;
112
 
 
113
 
        priv = BRASERO_SEARCH_BEAGLE_PRIVATE (search);
114
 
 
115
 
        num = 0;
116
 
        iter = g_slist_nth (priv->hits, range_start);
117
 
 
118
 
        for (; iter && num < range_end - range_start; iter = iter->next, num ++) {
119
 
                BeagleHit *hit;
120
 
                GtkTreeIter row;
121
 
 
122
 
                hit = iter->data;
123
 
 
124
 
                gtk_list_store_insert_with_values (GTK_LIST_STORE (model), &row, -1,
125
 
                                                   BRASERO_SEARCH_TREE_HIT_COL, hit,
126
 
                                                   -1);
127
 
        }
128
 
 
129
 
        return TRUE;
130
 
}
131
 
 
132
 
static void
133
 
brasero_search_beagle_hit_added_cb (BeagleQuery *query,
134
 
                                    BeagleHitsAddedResponse *response,
135
 
                                    BraseroSearchBeagle *search)
136
 
{
137
 
        GSList *list;
138
 
        GSList *iter;
139
 
        BraseroSearchBeaglePrivate *priv;
140
 
 
141
 
        priv = BRASERO_SEARCH_BEAGLE_PRIVATE (search);
142
 
 
143
 
        /* NOTE : list must not be modified nor freed */
144
 
        list = beagle_hits_added_response_get_hits (response);
145
 
        list = g_slist_copy (list);
146
 
 
147
 
        if (priv->hits)
148
 
                priv->hits = g_slist_concat (priv->hits, list);
149
 
        else
150
 
                priv->hits = list;
151
 
 
152
 
        for (iter = list; iter; iter = iter->next) {
153
 
                BeagleHit *hit;
154
 
 
155
 
                hit = iter->data;
156
 
                beagle_hit_ref (hit);
157
 
 
158
 
                brasero_search_engine_hit_added (BRASERO_SEARCH_ENGINE (search), hit);
159
 
        }
160
 
}
161
 
 
162
 
static void
163
 
brasero_search_beagle_hit_substracted_cb (BeagleQuery *query,
164
 
                                          BeagleHitsSubtractedResponse *response,
165
 
                                          BraseroSearchBeagle *search)
166
 
{
167
 
        GSList *list, *iter;
168
 
        BraseroSearchBeaglePrivate *priv;
169
 
 
170
 
        priv = BRASERO_SEARCH_BEAGLE_PRIVATE (search);
171
 
 
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;
176
 
 
177
 
                removed_uri = iter->data;
178
 
 
179
 
                /* see if it isn't in the hits that are still waiting */
180
 
                for (hit_iter = priv->hits; hit_iter; hit_iter = next) {
181
 
                        BeagleHit *hit;
182
 
                        const char *hit_uri;
183
 
        
184
 
                        next = hit_iter->next;
185
 
                        hit = hit_iter->data;
186
 
 
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);
192
 
                        }
193
 
                }
194
 
        }
195
 
}
196
 
 
197
 
static void
198
 
brasero_search_beagle_finished_cb (BeagleQuery *query,
199
 
                                   BeagleFinishedResponse *response,
200
 
                                   BraseroSearchBeagle *search)
201
 
{
202
 
        brasero_search_engine_query_finished (BRASERO_SEARCH_ENGINE (search));
203
 
}
204
 
 
205
 
static void
206
 
brasero_search_beagle_error_cb (BeagleRequest *request,
207
 
                                GError *error,
208
 
                                BraseroSearchEngine *search)
209
 
{
210
 
        brasero_search_engine_query_error (BRASERO_SEARCH_ENGINE (search), error);
211
 
}
212
 
 
213
 
static gboolean
214
 
brasero_search_beagle_query_start (BraseroSearchEngine *search)
215
 
{
216
 
        BraseroSearchBeaglePrivate *priv;
217
 
        GError *error = NULL;
218
 
 
219
 
        priv = BRASERO_SEARCH_BEAGLE_PRIVATE (search);
220
 
 
221
 
        /* search itself */
222
 
        if (!priv->query) {
223
 
                g_warning ("No query");
224
 
                return FALSE;
225
 
        }
226
 
 
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),
230
 
                          search);
231
 
        g_signal_connect (G_OBJECT (priv->query), "hits-subtracted",
232
 
                          G_CALLBACK
233
 
                          (brasero_search_beagle_hit_substracted_cb),
234
 
                          search);
235
 
        g_signal_connect (G_OBJECT (priv->query), "finished",
236
 
                          G_CALLBACK (brasero_search_beagle_finished_cb),
237
 
                          search);
238
 
        g_signal_connect (G_OBJECT (priv->query), "error",
239
 
                          G_CALLBACK (brasero_search_beagle_error_cb),
240
 
                          search);
241
 
 
242
 
        beagle_client_send_request_async (priv->client,
243
 
                                          BEAGLE_REQUEST (priv->query),
244
 
                                          &error);
245
 
        if (error) {
246
 
                brasero_search_engine_query_error (BRASERO_SEARCH_ENGINE (search), error);
247
 
                g_error_free (error);
248
 
                return FALSE;
249
 
        }
250
 
 
251
 
        return TRUE;
252
 
}
253
 
 
254
 
static void
255
 
brasero_search_beagle_clean (BraseroSearchBeagle *beagle)
256
 
{
257
 
        BraseroSearchBeaglePrivate *priv;
258
 
 
259
 
        priv = BRASERO_SEARCH_BEAGLE_PRIVATE (beagle);
260
 
 
261
 
        if (priv->query) {
262
 
                g_object_unref (priv->query);
263
 
                priv->query = NULL;
264
 
        }
265
 
 
266
 
        if (priv->hits) {
267
 
                g_slist_foreach (priv->hits, (GFunc) beagle_hit_unref, NULL);
268
 
                g_slist_free (priv->hits);
269
 
                priv->hits = NULL;
270
 
        }
271
 
}
272
 
 
273
 
static gboolean
274
 
brasero_search_beagle_query_new (BraseroSearchEngine *search,
275
 
                                 const gchar *keywords)
276
 
{
277
 
        BraseroSearchBeaglePrivate *priv;
278
 
        BeagleQueryPartHuman *text;
279
 
 
280
 
        priv = BRASERO_SEARCH_BEAGLE_PRIVATE (search);
281
 
 
282
 
        brasero_search_beagle_clean (BRASERO_SEARCH_BEAGLE (search));
283
 
        priv->query = beagle_query_new ();
284
 
 
285
 
        if (keywords) {
286
 
                BeagleQueryPartHuman *text;
287
 
 
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);
292
 
 
293
 
                beagle_query_add_part (priv->query, BEAGLE_QUERY_PART (text));
294
 
        }
295
 
 
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));
299
 
 
300
 
        return TRUE;
301
 
}
302
 
 
303
 
static gboolean
304
 
brasero_search_beagle_query_set_scope (BraseroSearchEngine *search,
305
 
                                       BraseroSearchScope scope)
306
 
{
307
 
        BeagleQueryPartOr *or_part = NULL;
308
 
        BraseroSearchBeaglePrivate *priv;
309
 
 
310
 
        priv = BRASERO_SEARCH_BEAGLE_PRIVATE (search);
311
 
 
312
 
        if (!priv->query)
313
 
                return FALSE;
314
 
 
315
 
        if (scope & BRASERO_SEARCH_SCOPE_DOCUMENTS) {
316
 
                BeagleQueryPartProperty *filetype;
317
 
 
318
 
                if (!or_part)
319
 
                        or_part = beagle_query_part_or_new ();
320
 
 
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));
326
 
        }
327
 
 
328
 
        if (scope & BRASERO_SEARCH_SCOPE_PICTURES) {
329
 
                BeagleQueryPartProperty *filetype;
330
 
 
331
 
                if (!or_part)
332
 
                        or_part = beagle_query_part_or_new ();
333
 
 
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));
339
 
        }
340
 
 
341
 
        if (scope & BRASERO_SEARCH_SCOPE_MUSIC) {
342
 
                BeagleQueryPartProperty *filetype;
343
 
 
344
 
                if (!or_part)
345
 
                        or_part = beagle_query_part_or_new ();
346
 
 
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));
352
 
        }
353
 
 
354
 
        if (scope & BRASERO_SEARCH_SCOPE_VIDEO) {
355
 
                BeagleQueryPartProperty *filetype;
356
 
 
357
 
                if (!or_part)
358
 
                        or_part = beagle_query_part_or_new ();
359
 
 
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));
365
 
        }
366
 
 
367
 
        if (!or_part)
368
 
                return FALSE;
369
 
 
370
 
        beagle_query_add_part (priv->query, BEAGLE_QUERY_PART (or_part));
371
 
        return TRUE;
372
 
}
373
 
 
374
 
static gboolean
375
 
brasero_search_beagle_set_query_mime (BraseroSearchEngine *search,
376
 
                                      const gchar **mimes)
377
 
{
378
 
        int i;
379
 
        BeagleQueryPartOr *or_part;
380
 
        BraseroSearchBeaglePrivate *priv;
381
 
 
382
 
        priv = BRASERO_SEARCH_BEAGLE_PRIVATE (search);
383
 
 
384
 
        if (!priv->query)
385
 
                return FALSE;
386
 
 
387
 
        or_part = beagle_query_part_or_new ();
388
 
        for (i = 0; mimes [i]; i ++) {
389
 
                BeagleQueryPartProperty *filetype;
390
 
 
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));
396
 
        }
397
 
 
398
 
        beagle_query_add_part (priv->query, BEAGLE_QUERY_PART (or_part));
399
 
 
400
 
        return TRUE;
401
 
}
402
 
 
403
 
static void
404
 
brasero_search_beagle_init_engine (BraseroSearchEngineIface *iface)
405
 
{
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;
416
 
}
417
 
 
418
 
static void
419
 
brasero_search_beagle_init (BraseroSearchBeagle *object)
420
 
{
421
 
        BraseroSearchBeaglePrivate *priv;
422
 
 
423
 
        priv = BRASERO_SEARCH_BEAGLE_PRIVATE (object);
424
 
 
425
 
        priv->client = beagle_client_new (NULL);
426
 
}
427
 
 
428
 
static void
429
 
brasero_search_beagle_finalize (GObject *object)
430
 
{
431
 
        BraseroSearchBeaglePrivate *priv;
432
 
 
433
 
        priv = BRASERO_SEARCH_BEAGLE_PRIVATE (object);
434
 
 
435
 
        if (priv->client) {
436
 
                g_object_unref (priv->client);
437
 
                priv->client = NULL;
438
 
        }
439
 
 
440
 
        brasero_search_beagle_clean (BRASERO_SEARCH_BEAGLE (object));
441
 
        G_OBJECT_CLASS (brasero_search_beagle_parent_class)->finalize (object);
442
 
}
443
 
 
444
 
static void
445
 
brasero_search_beagle_class_init (BraseroSearchBeagleClass *klass)
446
 
{
447
 
        GObjectClass* object_class = G_OBJECT_CLASS (klass);
448
 
 
449
 
        g_type_class_add_private (klass, sizeof (BraseroSearchBeaglePrivate));
450
 
 
451
 
        object_class->finalize = brasero_search_beagle_finalize;
452
 
}
453