[nautilus-actions] Build the initial object hierarchy
- From: Pierre Wieser <pwieser src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [nautilus-actions] Build the initial object hierarchy
- Date: Sat, 26 Sep 2009 22:47:50 +0000 (UTC)
commit 4104ea1de5681176981c6a862e282e69b36614f0
Author: Pierre Wieser <pwieser trychlos org>
Date: Sat Sep 19 18:53:58 2009 +0200
Build the initial object hierarchy
ChangeLog | 8 +++++
src/common/na-gconf-provider.c | 5 ++-
src/common/na-iio-provider.c | 66 +++++++++++++++++++++++++++++++++++----
src/common/na-obj-menu.c | 34 +++++++++++++++++++-
src/common/na-obj-menu.h | 1 +
5 files changed, 104 insertions(+), 10 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 12e0cc6..2d5598f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,12 +1,20 @@
2009-09-19 Pierre Wieser <pwieser trychlos org>
+ * src/common/na-gconf-provider.c:
+ Use na_object_menu_rebuild_items_list() and fix memory leak.
+
+ * src/common/na-iio-provider.c:
+ Build the object hierarchy, eventually alphabetically sorted.
+
* src/common/na-object.c b:
Add class name in instance_dipose() trace.
* src/common/na-obj-action.c (are_equal): Remove trace.
* src/common/na-obj-menu.c:
+ * src/common/na-obj-menu.h:
Remove traces at instance_dispose() and instance_finalize().
+ na_object_menu_rebuild_items_list(): New function.
* src/nact/nact-clipboard.c:
* src/nact/nact-clipboard.h:
diff --git a/src/common/na-gconf-provider.c b/src/common/na-gconf-provider.c
index bdaea71..5b6c124 100644
--- a/src/common/na-gconf-provider.c
+++ b/src/common/na-gconf-provider.c
@@ -835,13 +835,16 @@ write_item_menu( NAGConfProvider *provider, const NAObjectMenu *menu, gchar **me
{
gchar *uuid;
gboolean ret;
+ GSList *ids;
if( !write_object_item( provider, NA_OBJECT_ITEM( menu ), message )){
return( FALSE );
}
uuid = na_object_get_id( NA_OBJECT( menu ));
- ret = write_list( provider, uuid, NULL, MENU_ITEMS_ENTRY, na_object_menu_get_items_list( menu ), message );
+ ids = na_object_menu_rebuild_items_list( menu );
+ ret = write_list( provider, uuid, NULL, MENU_ITEMS_ENTRY, ids, message );
+ na_utils_free_string_list( ids );
g_free( uuid );
return( ret );
diff --git a/src/common/na-iio-provider.c b/src/common/na-iio-provider.c
index a4e023c..1c31793 100644
--- a/src/common/na-iio-provider.c
+++ b/src/common/na-iio-provider.c
@@ -52,6 +52,8 @@ static GType register_type( void );
static void interface_base_init( NAIIOProviderInterface *klass );
static void interface_base_finalize( NAIIOProviderInterface *klass );
+static GList *build_hierarchy( GList *tree, GSList *level_zero );
+static gint search_item( const NAObject *obj, const gchar *uuid );
static GList *get_merged_items_list( const NAPivot *pivot, GSList *providers );
static guint try_write_item( const NAIIOProvider *instance, NAObject *item, gchar **message );
@@ -154,9 +156,8 @@ na_iio_provider_get_items_tree( const NAPivot *pivot )
{
static const gchar *thisfn = "na_iio_provider_get_items_tree";
GSList *providers;
- GList *merged;
+ GList *merged, *hierarchy;
GSList *level_zero;
- gboolean alpha_order;
g_debug( "%s: pivot=%p", thisfn, ( void * ) pivot );
@@ -169,15 +170,66 @@ na_iio_provider_get_items_tree( const NAPivot *pivot )
na_pivot_free_providers( providers );
level_zero = na_iprefs_get_level_zero_items( NA_IPREFS( pivot ));
- alpha_order = na_iprefs_is_alphabetical_order( NA_IPREFS( pivot ));
+ hierarchy = build_hierarchy( merged, level_zero );
+ na_utils_free_string_list( level_zero );
- if( alpha_order ){
- merged = sort_tree( pivot, merged );
+ if( na_iprefs_is_alphabetical_order( NA_IPREFS( pivot ))){
+ hierarchy = sort_tree( pivot, hierarchy );
}
- na_utils_free_string_list( level_zero );
+ return( hierarchy );
+}
- return( merged );
+/*
+ * recursively builds the hierarchy
+ */
+static GList *
+build_hierarchy( GList *tree, GSList *level_zero )
+{
+ GList *hierarchy, *it;
+ GSList *ilevel;
+ GSList *subitems_ids;
+ GList *subitems;
+
+ hierarchy = NULL;
+
+ for( ilevel = level_zero ; ilevel ; ilevel = ilevel->next ){
+ g_debug( "na_iio_provider_build_hierarchy: next_level_zero uuid is %s", ( gchar * ) ilevel->data );
+ it = g_list_find_custom( tree, ilevel->data, ( GCompareFunc ) search_item );
+ if( it ){
+ hierarchy = g_list_append( hierarchy, it->data );
+ g_debug( "na_iio_provider_build_hierarchy: appending %s at %p to hierarchy %p",
+ G_OBJECT_TYPE_NAME( it->data ), ( void * ) it->data, ( void * ) hierarchy );
+
+ if( NA_IS_OBJECT_MENU( it->data )){
+ subitems_ids = na_object_menu_get_items_list( NA_OBJECT_MENU( it->data ));
+ subitems = build_hierarchy( tree, subitems_ids );
+ na_object_set_items( it->data, subitems );
+ na_object_free_items( subitems );
+ na_utils_free_string_list( subitems_ids );
+ }
+ }
+ }
+
+ return( hierarchy );
+}
+
+/*
+ * returns zero when obj has the required uuid
+ */
+static gint
+search_item( const NAObject *obj, const gchar *uuid )
+{
+ gchar *obj_id;
+ gint ret = 1;
+
+ if( NA_IS_OBJECT_ITEM( obj )){
+ obj_id = na_object_get_id( obj );
+ ret = strcmp( obj_id, uuid );
+ g_free( obj_id );
+ }
+
+ return( ret );
}
/*
diff --git a/src/common/na-obj-menu.c b/src/common/na-obj-menu.c
index 460fbc9..6cab221 100644
--- a/src/common/na-obj-menu.c
+++ b/src/common/na-obj-menu.c
@@ -211,13 +211,36 @@ na_object_menu_new( void )
}
/**
- * Build a string list which contains the ordered list of ids of subitems.
+ * na_object_menu_get_items_list:
+ * @menu: this #NAObjectMenu object.
*
- * The list must be na_utils_free_string_list().
+ * Returns: the current state of intern items_ids string list.
+ *
+ * The returned list should be na_utils_free_string_list() by the caller.
*/
GSList *
na_object_menu_get_items_list( const NAObjectMenu *menu )
{
+ g_return_val_if_fail( NA_IS_OBJECT_MENU( menu ), NULL );
+
+ return( na_utils_duplicate_string_list( menu->private->items_ids ));
+}
+
+/**
+ * na_object_menu_rebuild_items_list:
+ * @menu: this #NAObjectMenu object.
+ *
+ * Returns: a string list which contains the ordered list of ids of
+ * subitems.
+ *
+ * Note that the returned list is built on each call to this function,
+ * and is so an exact image of the current situation.
+ *
+ * The returned list should be na_utils_free_string_list() by the caller.
+ */
+GSList *
+na_object_menu_rebuild_items_list( const NAObjectMenu *menu )
+{
GSList *list = NULL;
GList *items, *it;
gchar *uuid;
@@ -239,7 +262,14 @@ na_object_menu_get_items_list( const NAObjectMenu *menu )
}
/**
+ * na_object_menu_set_items_list:
+ * @menu: this #NAObjectMenu object.
+ * @items: an ordered list of UUID of subitems.
+ *
+ * Set the internal list of uuids of subitems.
*
+ * This function takes a copy of the provided list. This later may so
+ * be safely released by the caller after this function has returned.
*/
void
na_object_menu_set_items_list( NAObjectMenu *menu, GSList *items )
diff --git a/src/common/na-obj-menu.h b/src/common/na-obj-menu.h
index 7552f2a..dabf2c6 100644
--- a/src/common/na-obj-menu.h
+++ b/src/common/na-obj-menu.h
@@ -74,6 +74,7 @@ GType na_object_menu_get_type( void );
NAObjectMenu *na_object_menu_new( void );
GSList *na_object_menu_get_items_list( const NAObjectMenu *menu );
+GSList *na_object_menu_rebuild_items_list( const NAObjectMenu *menu );
void na_object_menu_set_items_list( NAObjectMenu *menu, GSList *items );
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]