* plugins/profiler/gprof-view.c,
[anjuta-git-plugin.git] / plugins / symbol-db / symbol-db-engine-iterator-node.c
blob63e8e433bcad5d877d482bd98a2fb2c6d7a884a6
1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
2 /*
3 * anjuta
4 * Copyright (C) Massimo Cora' 2007 <maxcvs@email.it>
5 *
6 * anjuta is free software.
7 *
8 * You may redistribute it and/or modify it under the terms of the
9 * GNU General Public License, as published by the Free Software
10 * Foundation; either version 2 of the License, or (at your option)
11 * any later version.
13 * anjuta is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
16 * See the GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with anjuta. If not, write to:
20 * The Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor
22 * Boston, MA 02110-1301, USA.
25 #include <libanjuta/interfaces/ianjuta-symbol.h>
26 #include <libanjuta/anjuta-utils.h>
27 #include <libanjuta/anjuta-debug.h>
29 #include "symbol-db-engine-iterator-node.h"
30 #include "symbol-db-engine.h"
31 #include "symbol-db-view.h"
33 struct _SymbolDBEngineIteratorNodePriv
35 GdaDataModelIter *data_iter;
36 const GHashTable *sym_type_conversion_hash;
37 gchar *uri;
40 static GObjectClass* parent_class = NULL;
43 SymbolDBEngineIteratorNode *
44 symbol_db_engine_iterator_node_new (const GdaDataModelIter *data)
46 /* DEBUG_PRINT ("sdb_engine_iterator_node_new ()");*/
47 SymbolDBEngineIteratorNode *s;
48 s = g_object_new (SYMBOL_TYPE_DB_ENGINE_ITERATOR_NODE, NULL);
49 s->priv->data_iter = (GdaDataModelIter *)data;
50 s->priv->uri = NULL;
52 return s;
55 static void
56 sdb_engine_iterator_node_instance_init (SymbolDBEngineIteratorNode *object)
58 SymbolDBEngineIteratorNode *sdbin;
59 /* DEBUG_PRINT ("sdb_engine_iterator_node_instance_init ()");*/
61 sdbin = SYMBOL_DB_ENGINE_ITERATOR_NODE (object);
63 sdbin->priv = g_new0 (SymbolDBEngineIteratorNodePriv, 1);
64 sdbin->priv->sym_type_conversion_hash = NULL;
65 sdbin->priv->uri = NULL;
68 static void
69 sdb_engine_iterator_node_finalize (GObject *object)
71 /* TODO: Add deinitalization code here */
72 SymbolDBEngineIteratorNode *dbin;
73 SymbolDBEngineIteratorNodePriv *priv;
75 /* DEBUG_PRINT ("sdb_engine_iterator_node_finalize ()");*/
77 dbin = SYMBOL_DB_ENGINE_ITERATOR_NODE (object);
78 priv = dbin->priv;
79 if (priv->uri)
80 g_free (priv->uri);
82 g_free (priv);
84 G_OBJECT_CLASS (parent_class)->finalize (object);
87 static void
88 sdb_engine_iterator_node_class_init (SymbolDBEngineIteratorNodeClass *klass)
90 GObjectClass* object_class = G_OBJECT_CLASS (klass);
91 parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (klass));
93 object_class->finalize = sdb_engine_iterator_node_finalize;
96 /**
97 * Symbol name must be always on column 0
99 gint
100 symbol_db_engine_iterator_node_get_symbol_id (SymbolDBEngineIteratorNode *dbin)
102 SymbolDBEngineIteratorNodePriv *priv;
103 const GValue* value;
104 GdaParameter *par;
106 g_return_val_if_fail (dbin != NULL, -1);
107 priv = dbin->priv;
109 par = gda_data_model_iter_get_param_for_column (priv->data_iter, 0);
110 value = gda_parameter_get_value (par);
112 return value != NULL && G_VALUE_HOLDS_INT (value)
113 ? g_value_get_int (value) : -1;
117 * Symbol name must be always on column 1
119 const gchar*
120 symbol_db_engine_iterator_node_get_symbol_name (SymbolDBEngineIteratorNode *dbin)
122 SymbolDBEngineIteratorNodePriv *priv;
123 const GValue* value;
124 GdaParameter *par;
126 g_return_val_if_fail (dbin != NULL, NULL);
127 priv = dbin->priv;
129 par = gda_data_model_iter_get_param_for_column (priv->data_iter, 1);
130 value = gda_parameter_get_value (par);
132 return value != NULL && G_VALUE_HOLDS_STRING (value)
133 ? g_value_get_string (value) : NULL;
137 * File pos must be always on column 2
139 gint
140 symbol_db_engine_iterator_node_get_symbol_file_pos (SymbolDBEngineIteratorNode *dbin)
142 SymbolDBEngineIteratorNodePriv *priv;
143 const GValue* value;
144 GdaParameter *par;
146 g_return_val_if_fail (dbin != NULL, -1);
147 priv = dbin->priv;
149 par = gda_data_model_iter_get_param_for_column (priv->data_iter, 2);
150 value = gda_parameter_get_value (par);
152 return value != NULL && G_VALUE_HOLDS_INT (value)
153 ? g_value_get_int (value) : -1;
157 * 'Is File Scope' must be always on column 3
159 gboolean
160 symbol_db_engine_iterator_node_get_symbol_is_file_scope (SymbolDBEngineIteratorNode *dbin)
162 SymbolDBEngineIteratorNodePriv *priv;
163 const GValue* value;
165 GdaParameter *par;
167 g_return_val_if_fail (dbin != NULL, FALSE);
168 priv = dbin->priv;
170 par = gda_data_model_iter_get_param_for_column (priv->data_iter, 3);
171 value = gda_parameter_get_value (par);
173 if (value != NULL)
174 return g_value_get_int (value) == 1 ? TRUE : FALSE;
176 return FALSE;
180 * Signature must be always on column 4
182 const gchar*
183 symbol_db_engine_iterator_node_get_symbol_signature (SymbolDBEngineIteratorNode *dbin)
185 SymbolDBEngineIteratorNodePriv *priv;
186 const GValue* value;
187 GdaParameter *par;
189 g_return_val_if_fail (dbin != NULL, NULL);
190 priv = dbin->priv;
192 par = gda_data_model_iter_get_param_for_column (priv->data_iter, 4);
193 value = gda_parameter_get_value (par);
195 return value != NULL && G_VALUE_HOLDS_STRING (value)
196 ? g_value_get_string (value) : NULL;
199 const gchar*
200 symbol_db_engine_iterator_node_get_symbol_extra_string (SymbolDBEngineIteratorNode *dbin,
201 gint sym_info)
203 SymbolDBEngineIteratorNodePriv *priv;
204 GdaParameter *par = NULL;
205 GdaParameter *res = NULL;
206 gint column = -1;
208 g_return_val_if_fail (dbin != NULL, NULL);
209 priv = dbin->priv;
210 #if 0
211 DEBUG_PRINT ("symbol_db_engine_iterator_node_get_symbol_extra_string () for %d",
212 sym_info);
214 if (GDA_PARAMETER_LIST(priv->data_iter)) {
215 g_print ("-Parameter(s):\n");
216 GSList *params;
217 for (params = GDA_PARAMETER_LIST(priv->data_iter)->parameters; params;
218 params = params->next) {
219 GdaParameter *parameter = GDA_PARAMETER (params->data);
220 g_print (" - name:%s type:%s\n",
221 gda_object_get_name (GDA_OBJECT (parameter)),
222 g_type_name (gda_parameter_get_g_type (parameter)));
225 #endif
226 if (sym_info & SYMINFO_FILE_PATH)
228 par = gda_parameter_list_find_param (GDA_PARAMETER_LIST(priv->data_iter),
229 "file_path");
231 else if (sym_info & SYMINFO_LANGUAGE)
233 par = gda_parameter_list_find_param (GDA_PARAMETER_LIST(priv->data_iter),
234 "language_name");
236 else if (sym_info & SYMINFO_IMPLEMENTATION)
238 par = gda_parameter_list_find_param (GDA_PARAMETER_LIST(priv->data_iter),
239 "implementation_name");
241 else if (sym_info & SYMINFO_ACCESS)
243 par = gda_parameter_list_find_param (GDA_PARAMETER_LIST(priv->data_iter),
244 "access_name");
246 else if (sym_info & SYMINFO_KIND)
248 par = gda_parameter_list_find_param (GDA_PARAMETER_LIST(priv->data_iter),
249 "kind_name");
251 else if (sym_info & SYMINFO_TYPE)
253 par = gda_parameter_list_find_param (GDA_PARAMETER_LIST(priv->data_iter),
254 "type");
256 else if (sym_info & SYMINFO_TYPE_NAME)
258 par = gda_parameter_list_find_param (GDA_PARAMETER_LIST(priv->data_iter),
259 "type_name");
261 else if (sym_info & SYMINFO_PROJECT_NAME)
263 par = gda_parameter_list_find_param (GDA_PARAMETER_LIST(priv->data_iter),
264 "project_name");
266 else if (sym_info & SYMINFO_FILE_IGNORE)
268 par = gda_parameter_list_find_param (GDA_PARAMETER_LIST(priv->data_iter),
269 "file_ignore_type");
271 else if (sym_info & SYMINFO_FILE_INCLUDE)
273 par = gda_parameter_list_find_param (GDA_PARAMETER_LIST(priv->data_iter),
274 "file_include_type");
277 if (par != NULL)
279 column = gda_data_model_iter_get_column_for_param (priv->data_iter, par);
280 res = gda_data_model_iter_get_param_for_column (priv->data_iter, column);
281 return gda_parameter_get_value_str (res);
283 else
284 return NULL;
287 void
288 symbol_db_engine_iterator_node_set_conversion_hash (SymbolDBEngineIteratorNode *dbin,
289 const GHashTable *sym_type_conversion_hash)
291 g_return_if_fail (dbin != NULL);
292 g_return_if_fail (SYMBOL_IS_DB_ENGINE_ITERATOR_NODE (dbin));
294 SymbolDBEngineIteratorNodePriv *priv;
296 priv = dbin->priv;
297 priv->sym_type_conversion_hash = sym_type_conversion_hash;
300 void
301 symbol_db_engine_iterator_node_set_data (SymbolDBEngineIteratorNode *dbin,
302 const GdaDataModelIter *data)
304 g_return_if_fail (dbin != NULL);
305 g_return_if_fail (SYMBOL_IS_DB_ENGINE_ITERATOR_NODE (dbin));
307 SymbolDBEngineIteratorNodePriv *priv;
309 priv = dbin->priv;
310 priv->data_iter = GDA_DATA_MODEL_ITER (data);
311 if (priv->uri != NULL)
313 g_free (priv->uri);
314 priv->uri = NULL;
319 /* IAnjutaSymbol implementation */
320 static IAnjutaSymbolType
321 isymbol_type (IAnjutaSymbol *isymbol, GError **err)
323 SymbolDBEngineIteratorNode *s;
324 SymbolDBEngineIteratorNodePriv *priv;
325 gpointer tag_found;
326 const gchar* find_str;
328 g_return_val_if_fail (SYMBOL_IS_DB_ENGINE_ITERATOR_NODE (isymbol),
329 IANJUTA_SYMBOL_TYPE_UNDEF);
331 s = SYMBOL_DB_ENGINE_ITERATOR_NODE (isymbol);
332 priv = s->priv;
334 find_str = symbol_db_engine_iterator_node_get_symbol_extra_string (s,
335 SYMINFO_TYPE);
336 if (find_str == NULL) {
337 DEBUG_PRINT ("isymbol_type (): find_str is NULL");
338 return IANJUTA_SYMBOL_TYPE_UNDEF;
341 tag_found = g_hash_table_lookup (priv->sym_type_conversion_hash, find_str);
343 if (tag_found == NULL) {
344 DEBUG_PRINT ("isymbol_type (): nothing matching ");
345 return IANJUTA_SYMBOL_TYPE_UNDEF;
348 return (IAnjutaSymbolType)tag_found;
352 static const gchar*
353 isymbol_type_str (IAnjutaSymbol *isymbol, GError **err)
355 SymbolDBEngineIteratorNode *s;
357 g_return_val_if_fail (SYMBOL_IS_DB_ENGINE_ITERATOR (isymbol), NULL);
358 s = SYMBOL_DB_ENGINE_ITERATOR_NODE (isymbol);
359 return symbol_db_engine_iterator_node_get_symbol_extra_string (s,
360 SYMINFO_TYPE);
363 static const gchar*
364 isymbol_type_name (IAnjutaSymbol *isymbol, GError **err)
366 SymbolDBEngineIteratorNode *s;
368 g_return_val_if_fail (SYMBOL_IS_DB_ENGINE_ITERATOR (isymbol), NULL);
369 s = SYMBOL_DB_ENGINE_ITERATOR_NODE (isymbol);
370 return symbol_db_engine_iterator_node_get_symbol_extra_string (s,
371 SYMINFO_TYPE_NAME);
375 static const gchar*
376 isymbol_name (IAnjutaSymbol *isymbol, GError **err)
378 SymbolDBEngineIteratorNode *s;
380 g_return_val_if_fail (SYMBOL_IS_DB_ENGINE_ITERATOR (isymbol), NULL);
381 s = SYMBOL_DB_ENGINE_ITERATOR_NODE (isymbol);
383 return symbol_db_engine_iterator_node_get_symbol_name (s);
386 static const gchar*
387 isymbol_args (IAnjutaSymbol *isymbol, GError **err)
389 SymbolDBEngineIteratorNode *s;
391 g_return_val_if_fail (SYMBOL_IS_DB_ENGINE_ITERATOR (isymbol), NULL);
392 s = SYMBOL_DB_ENGINE_ITERATOR_NODE (isymbol);
393 return symbol_db_engine_iterator_node_get_symbol_signature (s);
396 static const gchar*
397 isymbol_scope (IAnjutaSymbol *isymbol, GError **err)
399 SymbolDBEngineIteratorNode *s;
401 g_return_val_if_fail (SYMBOL_IS_DB_ENGINE_ITERATOR (isymbol), NULL);
402 s = SYMBOL_DB_ENGINE_ITERATOR_NODE (isymbol);
403 // g_return_val_if_fail (s->priv->tm_tag != NULL, NULL);
404 // return s->priv->tm_tag->atts.entry.scope;
405 return NULL;
408 static const gchar*
409 isymbol_inheritance (IAnjutaSymbol *isymbol, GError **err)
411 SymbolDBEngineIteratorNode *s;
413 g_return_val_if_fail (SYMBOL_IS_DB_ENGINE_ITERATOR (isymbol), NULL);
414 s = SYMBOL_DB_ENGINE_ITERATOR_NODE (isymbol);
415 // g_return_val_if_fail (s->priv->tm_tag != NULL, NULL);
416 // return s->priv->tm_tag->atts.entry.inheritance;
417 // return
418 return NULL;
421 static const gchar*
422 isymbol_access (IAnjutaSymbol *isymbol, GError **err)
424 SymbolDBEngineIteratorNode *s;
426 g_return_val_if_fail (SYMBOL_IS_DB_ENGINE_ITERATOR (isymbol), NULL);
427 s = SYMBOL_DB_ENGINE_ITERATOR_NODE (isymbol);
428 return symbol_db_engine_iterator_node_get_symbol_extra_string (s,
429 SYMINFO_ACCESS);
432 static const gchar*
433 isymbol_impl (IAnjutaSymbol *isymbol, GError **err)
435 SymbolDBEngineIteratorNode *s;
437 g_return_val_if_fail (SYMBOL_IS_DB_ENGINE_ITERATOR (isymbol), NULL);
438 s = SYMBOL_DB_ENGINE_ITERATOR_NODE (isymbol);
439 return symbol_db_engine_iterator_node_get_symbol_extra_string (s,
440 SYMINFO_IMPLEMENTATION);
443 static const gchar*
444 isymbol_uri (IAnjutaSymbol *isymbol, GError **err)
446 SymbolDBEngineIteratorNode *s;
448 g_return_val_if_fail (SYMBOL_IS_DB_ENGINE_ITERATOR (isymbol), NULL);
449 s = SYMBOL_DB_ENGINE_ITERATOR_NODE (isymbol);
450 if (s->priv->uri == NULL)
452 const cgchar* file_path;
453 file_path = symbol_db_engine_iterator_node_get_symbol_extra_string (s,
454 SYMINFO_FILE_PATH);
455 s->priv->uri = gnome_vfs_get_uri_from_local_path (file_path);
457 return s->priv->uri;
460 static gulong
461 isymbol_line (IAnjutaSymbol *isymbol, GError **err)
463 SymbolDBEngineIteratorNode *s;
465 g_return_val_if_fail (SYMBOL_IS_DB_ENGINE_ITERATOR (isymbol), 0);
466 s = SYMBOL_DB_ENGINE_ITERATOR_NODE (isymbol);
467 return symbol_db_engine_iterator_node_get_symbol_file_pos (s);
470 static gboolean
471 isymbol_is_local (IAnjutaSymbol *isymbol, GError **err)
473 SymbolDBEngineIteratorNode *s;
475 g_return_val_if_fail (SYMBOL_IS_DB_ENGINE_ITERATOR (isymbol), FALSE);
476 s = SYMBOL_DB_ENGINE_ITERATOR_NODE (isymbol);
477 return symbol_db_engine_iterator_node_get_symbol_is_file_scope (s);
480 static const GdkPixbuf*
481 isymbol_icon (IAnjutaSymbol *isymbol, GError **err)
483 SymbolDBEngineIteratorNode *s;
485 g_return_val_if_fail (SYMBOL_IS_DB_ENGINE_ITERATOR (isymbol), FALSE);
486 s = SYMBOL_DB_ENGINE_ITERATOR_NODE (isymbol);
488 return symbol_db_view_get_pixbuf (
489 symbol_db_engine_iterator_node_get_symbol_extra_string (s,
490 SYMINFO_TYPE),
491 symbol_db_engine_iterator_node_get_symbol_extra_string (s,
492 SYMINFO_ACCESS));
495 static void
496 isymbol_iface_init (IAnjutaSymbolIface *iface)
498 iface->type = isymbol_type;
499 iface->type_str = isymbol_type_str;
500 iface->type_name = isymbol_type_name;
501 iface->name = isymbol_name;
502 iface->args = isymbol_args;
503 iface->scope = isymbol_scope;
504 iface->inheritance = isymbol_inheritance;
505 iface->access = isymbol_access;
506 iface->impl = isymbol_impl;
507 iface->uri = isymbol_uri;
508 iface->line = isymbol_line;
509 iface->is_local = isymbol_is_local;
510 iface->icon = isymbol_icon;
513 ANJUTA_TYPE_BEGIN (SymbolDBEngineIteratorNode, sdb_engine_iterator_node, G_TYPE_OBJECT);
514 ANJUTA_TYPE_ADD_INTERFACE (isymbol, IANJUTA_TYPE_SYMBOL);
515 ANJUTA_TYPE_END;