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