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
30 #include "brasero-search-engine.h"
31
32 static void brasero_search_engine_base_init (gpointer g_class);
33
34 typedef enum {
35 SEARCH_FINISHED,
36 SEARCH_ERROR,
37 HIT_REMOVED,
38 HIT_ADDED,
39 LAST_SIGNAL
40 } BraseroSearchEngineSignalType;
41
42 static guint brasero_search_engine_signals [LAST_SIGNAL] = { 0 };
43
44 gboolean
brasero_search_engine_is_available(BraseroSearchEngine * search)45 brasero_search_engine_is_available (BraseroSearchEngine *search)
46 {
47 BraseroSearchEngineIface *iface;
48
49 g_return_val_if_fail (BRASERO_IS_SEARCH_ENGINE (search), FALSE);
50
51 iface = BRASERO_SEARCH_ENGINE_GET_IFACE (search);
52 if (!iface->is_available)
53 return FALSE;
54
55 return (* iface->is_available) (search);
56 }
57
58 gboolean
brasero_search_engine_start_query(BraseroSearchEngine * search)59 brasero_search_engine_start_query (BraseroSearchEngine *search)
60 {
61 BraseroSearchEngineIface *iface;
62
63 g_return_val_if_fail (BRASERO_IS_SEARCH_ENGINE (search), FALSE);
64
65 iface = BRASERO_SEARCH_ENGINE_GET_IFACE (search);
66 if (!iface->query_start)
67 return FALSE;
68
69 return (* iface->query_start) (search);
70 }
71
72 gboolean
brasero_search_engine_new_query(BraseroSearchEngine * search,const gchar * keywords)73 brasero_search_engine_new_query (BraseroSearchEngine *search,
74 const gchar *keywords)
75 {
76 BraseroSearchEngineIface *iface;
77
78 g_return_val_if_fail (BRASERO_IS_SEARCH_ENGINE (search), FALSE);
79
80 iface = BRASERO_SEARCH_ENGINE_GET_IFACE (search);
81 if (!iface->query_new)
82 return FALSE;
83
84 return (* iface->query_new) (search, keywords);
85 }
86
87 gboolean
brasero_search_engine_set_query_scope(BraseroSearchEngine * search,BraseroSearchScope scope)88 brasero_search_engine_set_query_scope (BraseroSearchEngine *search,
89 BraseroSearchScope scope)
90 {
91 BraseroSearchEngineIface *iface;
92
93 g_return_val_if_fail (BRASERO_IS_SEARCH_ENGINE (search), FALSE);
94
95 iface = BRASERO_SEARCH_ENGINE_GET_IFACE (search);
96 if (!iface->query_set_scope)
97 return FALSE;
98
99 return (* iface->query_set_scope) (search, scope);
100 }
101
102 gboolean
brasero_search_engine_set_query_mime(BraseroSearchEngine * search,const gchar ** mimes)103 brasero_search_engine_set_query_mime (BraseroSearchEngine *search,
104 const gchar **mimes)
105 {
106 BraseroSearchEngineIface *iface;
107
108 g_return_val_if_fail (BRASERO_IS_SEARCH_ENGINE (search), FALSE);
109
110 iface = BRASERO_SEARCH_ENGINE_GET_IFACE (search);
111 if (!iface->query_set_mime)
112 return FALSE;
113
114 return (* iface->query_set_mime) (search, mimes);
115 }
116
117 gboolean
brasero_search_engine_add_hits(BraseroSearchEngine * search,GtkTreeModel * model,gint range_start,gint range_end)118 brasero_search_engine_add_hits (BraseroSearchEngine *search,
119 GtkTreeModel *model,
120 gint range_start,
121 gint range_end)
122 {
123 BraseroSearchEngineIface *iface;
124
125 g_return_val_if_fail (BRASERO_IS_SEARCH_ENGINE (search), FALSE);
126
127 iface = BRASERO_SEARCH_ENGINE_GET_IFACE (search);
128 if (!iface->add_hits)
129 return FALSE;
130
131 return iface->add_hits (search, model, range_start, range_end);
132 }
133
134 const gchar *
brasero_search_engine_uri_from_hit(BraseroSearchEngine * search,gpointer hit)135 brasero_search_engine_uri_from_hit (BraseroSearchEngine *search,
136 gpointer hit)
137 {
138 BraseroSearchEngineIface *iface;
139
140 g_return_val_if_fail (BRASERO_IS_SEARCH_ENGINE (search), NULL);
141
142 if (!hit)
143 return NULL;
144
145 iface = BRASERO_SEARCH_ENGINE_GET_IFACE (search);
146 if (!iface->uri_from_hit)
147 return FALSE;
148
149 return (* iface->uri_from_hit) (search, hit);
150 }
151
152 const gchar *
brasero_search_engine_mime_from_hit(BraseroSearchEngine * search,gpointer hit)153 brasero_search_engine_mime_from_hit (BraseroSearchEngine *search,
154 gpointer hit)
155 {
156 BraseroSearchEngineIface *iface;
157
158 g_return_val_if_fail (BRASERO_IS_SEARCH_ENGINE (search), NULL);
159
160 if (!hit)
161 return NULL;
162
163 iface = BRASERO_SEARCH_ENGINE_GET_IFACE (search);
164 if (!iface->mime_from_hit)
165 return FALSE;
166
167 return (* iface->mime_from_hit) (search, hit);
168 }
169
170 gint
brasero_search_engine_score_from_hit(BraseroSearchEngine * search,gpointer hit)171 brasero_search_engine_score_from_hit (BraseroSearchEngine *search,
172 gpointer hit)
173 {
174 BraseroSearchEngineIface *iface;
175
176 g_return_val_if_fail (BRASERO_IS_SEARCH_ENGINE (search), 0);
177
178 if (!hit)
179 return 0;
180
181 iface = BRASERO_SEARCH_ENGINE_GET_IFACE (search);
182 if (!iface->score_from_hit)
183 return FALSE;
184
185 return (* iface->score_from_hit) (search, hit);
186 }
187
188 gint
brasero_search_engine_num_hits(BraseroSearchEngine * search)189 brasero_search_engine_num_hits (BraseroSearchEngine *search)
190 {
191 BraseroSearchEngineIface *iface;
192
193 g_return_val_if_fail (BRASERO_IS_SEARCH_ENGINE (search), 0);
194
195 iface = BRASERO_SEARCH_ENGINE_GET_IFACE (search);
196 if (!iface->num_hits)
197 return FALSE;
198
199 return (* iface->num_hits) (search);
200 }
201
202 void
brasero_search_engine_query_finished(BraseroSearchEngine * search)203 brasero_search_engine_query_finished (BraseroSearchEngine *search)
204 {
205 g_signal_emit (search,
206 brasero_search_engine_signals [SEARCH_FINISHED],
207 0);
208 }
209
210 void
brasero_search_engine_hit_removed(BraseroSearchEngine * search,gpointer hit)211 brasero_search_engine_hit_removed (BraseroSearchEngine *search,
212 gpointer hit)
213 {
214 g_signal_emit (search,
215 brasero_search_engine_signals [HIT_REMOVED],
216 0,
217 hit);
218 }
219
220 void
brasero_search_engine_hit_added(BraseroSearchEngine * search,gpointer hit)221 brasero_search_engine_hit_added (BraseroSearchEngine *search,
222 gpointer hit)
223 {
224 g_signal_emit (search,
225 brasero_search_engine_signals [HIT_ADDED],
226 0,
227 hit);
228 }
229
230 void
brasero_search_engine_query_error(BraseroSearchEngine * search,GError * error)231 brasero_search_engine_query_error (BraseroSearchEngine *search,
232 GError *error)
233 {
234 g_signal_emit (search,
235 brasero_search_engine_signals [SEARCH_ERROR],
236 0,
237 error);
238 }
239
240 GType
brasero_search_engine_get_type()241 brasero_search_engine_get_type()
242 {
243 static GType type = 0;
244
245 if(type == 0) {
246 static const GTypeInfo our_info = {
247 sizeof (BraseroSearchEngineIface),
248 brasero_search_engine_base_init,
249 NULL,
250 NULL,
251 NULL,
252 NULL,
253 0,
254 0,
255 NULL
256 };
257
258 type = g_type_register_static (G_TYPE_INTERFACE,
259 "BraseroSearchEngine",
260 &our_info,
261 0);
262
263 g_type_interface_add_prerequisite (type, G_TYPE_OBJECT);
264 }
265
266 return type;
267 }
268
269 static void
brasero_search_engine_base_init(gpointer g_class)270 brasero_search_engine_base_init (gpointer g_class)
271 {
272 static gboolean initialized = FALSE;
273
274 if (initialized)
275 return;
276
277 brasero_search_engine_signals [SEARCH_ERROR] =
278 g_signal_new ("search_error",
279 BRASERO_TYPE_SEARCH_ENGINE,
280 G_SIGNAL_RUN_LAST|G_SIGNAL_ACTION|G_SIGNAL_NO_RECURSE,
281 G_STRUCT_OFFSET (BraseroSearchEngineIface, search_error),
282 NULL,
283 NULL,
284 g_cclosure_marshal_VOID__POINTER,
285 G_TYPE_NONE,
286 1,
287 G_TYPE_POINTER);
288 brasero_search_engine_signals [SEARCH_FINISHED] =
289 g_signal_new ("search_finished",
290 BRASERO_TYPE_SEARCH_ENGINE,
291 G_SIGNAL_RUN_LAST|G_SIGNAL_ACTION|G_SIGNAL_NO_RECURSE,
292 G_STRUCT_OFFSET (BraseroSearchEngineIface, search_finished),
293 NULL,
294 NULL,
295 g_cclosure_marshal_VOID__VOID,
296 G_TYPE_NONE,
297 0);
298 brasero_search_engine_signals [HIT_REMOVED] =
299 g_signal_new ("hit_removed",
300 BRASERO_TYPE_SEARCH_ENGINE,
301 G_SIGNAL_RUN_LAST|G_SIGNAL_ACTION|G_SIGNAL_NO_RECURSE,
302 G_STRUCT_OFFSET (BraseroSearchEngineIface, hit_removed),
303 NULL,
304 NULL,
305 g_cclosure_marshal_VOID__POINTER,
306 G_TYPE_NONE,
307 1,
308 G_TYPE_POINTER);
309 brasero_search_engine_signals [HIT_ADDED] =
310 g_signal_new ("hit_added",
311 BRASERO_TYPE_SEARCH_ENGINE,
312 G_SIGNAL_RUN_LAST|G_SIGNAL_ACTION|G_SIGNAL_NO_RECURSE,
313 G_STRUCT_OFFSET (BraseroSearchEngineIface, hit_added),
314 NULL,
315 NULL,
316 g_cclosure_marshal_VOID__POINTER,
317 G_TYPE_NONE,
318 1,
319 G_TYPE_POINTER);
320 initialized = TRUE;
321 }
322
323 #ifdef BUILD_SEARCH
324
325 #ifdef BUILD_TRACKER
326
327 #include "brasero-search-tracker.h"
328
329 BraseroSearchEngine *
brasero_search_engine_new_default(void)330 brasero_search_engine_new_default (void)
331 {
332 return g_object_new (BRASERO_TYPE_SEARCH_TRACKER, NULL);
333 }
334
335 #endif
336
337 #else
338
339 BraseroSearchEngine *
brasero_search_engine_new_default(void)340 brasero_search_engine_new_default (void)
341 {
342 return NULL;
343 }
344
345 #endif
346