[nautilus-actions] Build the initial object hierarchy



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]