[nautilus-actions] Fix validity check of the items



commit 6cbe811556d6c7e7583b63380c33ff5bb36c7647
Author: Pierre Wieser <pwieser trychlos org>
Date:   Thu Feb 18 18:31:03 2010 +0100

    Fix validity check of the items

 ChangeLog                    |   12 +++++
 src/api/na-object-api.h      |    2 +
 src/api/na-object.h          |    2 +
 src/core/na-data-factory.c   |    7 +++
 src/core/na-io-provider.c    |    2 +-
 src/core/na-object-action.c  |   70 +++++++++++++++++++++---------
 src/core/na-object-id.c      |   44 +++++++++++++-------
 src/core/na-object-menu.c    |   60 ++++++++++++++++++--------
 src/core/na-object-profile.c |   95 +++++++++++++++++++++++++++++++-----------
 src/core/na-object.c         |   27 +++++++++++-
 10 files changed, 240 insertions(+), 81 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index b427c4d..38b01e8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2009-02-18 Pierre Wieser <pwieser trychlos org>
+
+	* src/api/na-object-api.h:
+	* src/api/na-object.h:
+	* src/core/na-data-factory.c:
+	* src/core/na-io-provider.c:
+	* src/core/na-object-action.c:
+	* src/core/na-object-id.c:
+	* src/core/na-object-menu.c:
+	* src/core/na-object-profile.c:
+	* src/core/na-object.c: Fix validity check of the items.
+
 2009-02-17 Pierre Wieser <pwieser trychlos org>
 
 	* po/POTFILES.in:
diff --git a/src/api/na-object-api.h b/src/api/na-object-api.h
index 2cd17d7..28c9dbf 100644
--- a/src/api/na-object-api.h
+++ b/src/api/na-object-api.h
@@ -73,6 +73,8 @@ G_BEGIN_DECLS
 #define na_object_ref( obj )							na_object_object_ref( NA_OBJECT( obj ))
 #define na_object_unref( obj )							na_object_object_unref( NA_OBJECT( obj ))
 
+#define na_object_debug_invalid( obj, reason )			na_object_object_debug_invalid( NA_OBJECT( obj ), ( const gchar * )( reason ))
+
 /* NAObjectId
  */
 #define na_object_get_id( obj )							(( gchar * ) na_idata_factory_get( NA_IDATA_FACTORY( obj ), NADF_DATA_ID ))
diff --git a/src/api/na-object.h b/src/api/na-object.h
index e52ab73..95b7d6c 100644
--- a/src/api/na-object.h
+++ b/src/api/na-object.h
@@ -150,6 +150,8 @@ void      na_object_object_dump_tree ( GList *tree );
 GList    *na_object_object_get_hierarchy( const NAObject *object );
 void      na_object_free_hierarchy( GList *hierarchy );
 
+void      na_object_object_debug_invalid( const NAObject *object, const gchar *reason );
+
 G_END_DECLS
 
 #endif /* __NAUTILUS_ACTIONS_API_NA_OBJECT_H__ */
diff --git a/src/core/na-data-factory.c b/src/core/na-data-factory.c
index 4521edd..6d0dd6e 100644
--- a/src/core/na-data-factory.c
+++ b/src/core/na-data-factory.c
@@ -372,10 +372,14 @@ v_are_equal( const NAIDataFactory *a, const NAIDataFactory *b )
 gboolean
 na_data_factory_is_valid( const NAIDataFactory *object )
 {
+	static const gchar *thisfn = "na_data_factory_is_valid";
 	gboolean is_valid;
 	GList *list_values, *iv;
 	NadfDataValue *a_data;
 
+	g_debug( "%s: object=%p (%s)",
+			thisfn, ( void * ) object, G_OBJECT_TYPE_NAME( object ));
+
 	g_return_val_if_fail( NA_IS_IDATA_FACTORY( object ), FALSE );
 
 	list_values = g_object_get_data( G_OBJECT( object ), NA_IDATA_FACTORY_PROP_DATA );
@@ -387,6 +391,9 @@ na_data_factory_is_valid( const NAIDataFactory *object )
 		if( a_data->iddef->mandatory ){
 
 			is_valid = na_data_element_is_valid( a_data->element );
+			if( !is_valid ){
+				g_debug( "%s: invalid element: %s", thisfn, a_data->iddef->name );
+			}
 		}
 	}
 
diff --git a/src/core/na-io-provider.c b/src/core/na-io-provider.c
index ccbd0f2..c25a93e 100644
--- a/src/core/na-io-provider.c
+++ b/src/core/na-io-provider.c
@@ -742,7 +742,7 @@ build_hierarchy( GList **tree, GSList *level_zero, gboolean list_if_empty )
 
 	if( g_slist_length( level_zero )){
 		for( ilevel = level_zero ; ilevel ; ilevel = ilevel->next ){
-			g_debug( "%s: uuid=%s", thisfn, ( gchar * ) ilevel->data );
+			/*g_debug( "%s: uuid=%s", thisfn, ( gchar * ) ilevel->data );*/
 			it = g_list_find_custom( *tree, ilevel->data, ( GCompareFunc ) search_item );
 			if( it ){
 				hierarchy = g_list_append( hierarchy, it->data );
diff --git a/src/core/na-object-action.c b/src/core/na-object-action.c
index 107add8..b4a2fa6 100644
--- a/src/core/na-object-action.c
+++ b/src/core/na-object-action.c
@@ -66,6 +66,8 @@ static void     instance_set_property( GObject *object, guint property_id, const
 static void     instance_dispose( GObject *object );
 static void     instance_finalize( GObject *object );
 
+static gboolean object_is_valid( const NAObject *object );
+
 static void     idata_factory_iface_init( NAIDataFactoryInterface *iface );
 static guint    idata_factory_get_version( const NAIDataFactory *instance );
 static gchar   *idata_factory_get_default( const NAIDataFactory *instance, const NadfIdType *iddef );
@@ -75,6 +77,7 @@ static gboolean idata_factory_is_valid( const NAIDataFactory *object );
 static void     idata_factory_read_done( NAIDataFactory *instance, const NAIIOFactory *reader, void *reader_data, GSList **messages );
 static void     idata_factory_write_done( NAIDataFactory *instance, const NAIIOFactory *writer, void *writer_data, GSList **messages );
 
+static gboolean object_object_is_valid( const NAObjectAction *action );
 static gboolean is_valid_label( const NAObjectAction *action );
 static gboolean is_valid_toolbar_label( const NAObjectAction *action );
 
@@ -147,7 +150,7 @@ class_init( NAObjectActionClass *klass )
 	naobject_class->dump = NULL;
 	naobject_class->copy = NULL;
 	naobject_class->are_equal = NULL;
-	naobject_class->is_valid = NULL;
+	naobject_class->is_valid = object_is_valid;
 
 	klass->private = g_new0( NAObjectActionClassPrivate, 1 );
 
@@ -241,6 +244,14 @@ instance_finalize( GObject *object )
 	}
 }
 
+static gboolean
+object_is_valid( const NAObject *object )
+{
+	g_return_val_if_fail( NA_IS_OBJECT_ACTION( object ), FALSE );
+
+	return( object_object_is_valid( NA_OBJECT_ACTION( object )));
+}
+
 static void
 idata_factory_iface_init( NAIDataFactoryInterface *iface )
 {
@@ -296,29 +307,49 @@ idata_factory_are_equal( const NAIDataFactory *a, const NAIDataFactory *b )
 }
 
 static gboolean
-idata_factory_is_valid( const NAIDataFactory *action )
+idata_factory_is_valid( const NAIDataFactory *object )
+{
+	g_return_val_if_fail( NA_IS_OBJECT_ACTION( object ), FALSE );
+
+	return( object_object_is_valid( NA_OBJECT_ACTION( object )));
+}
+
+static void
+idata_factory_read_done( NAIDataFactory *instance, const NAIIOFactory *reader, void *reader_data, GSList **messages )
+{
+	g_debug( "na_object_action_idata_factory_read_done: instance=%p", ( void * ) instance );
+
+	na_object_dump( instance );
+}
+
+static void
+idata_factory_write_done( NAIDataFactory *instance, const NAIIOFactory *writer, void *writer_data, GSList **messages )
+{
+
+}
+
+static gboolean
+object_object_is_valid( const NAObjectAction *action )
 {
 	gboolean is_valid;
 	GList *profiles, *ip;
 	gint valid_profiles;
 
-	g_return_val_if_fail( NA_IS_OBJECT_ACTION( action ), FALSE );
-
 	is_valid = FALSE;
 
-	if( !NA_OBJECT_ACTION( action )->private->dispose_has_run ){
+	if( !action->private->dispose_has_run ){
 
 		is_valid = TRUE;
 
 		if( is_valid ){
 			if( na_object_is_target_toolbar( action )){
-				is_valid = is_valid_toolbar_label( NA_OBJECT_ACTION( action ));
+				is_valid = is_valid_toolbar_label( action );
 			}
 		}
 
 		if( is_valid ){
 			if( na_object_is_target_selection( action ) || na_object_is_target_background( action )){
-				is_valid = is_valid_label( NA_OBJECT_ACTION( action ));
+				is_valid = is_valid_label( action );
 			}
 		}
 
@@ -331,26 +362,15 @@ idata_factory_is_valid( const NAIDataFactory *action )
 				}
 			}
 			is_valid = ( valid_profiles > 0 );
+			if( !is_valid ){
+				na_object_debug_invalid( action, "no valid profile" );
+			}
 		}
 	}
 
 	return( is_valid );
 }
 
-static void
-idata_factory_read_done( NAIDataFactory *instance, const NAIIOFactory *reader, void *reader_data, GSList **messages )
-{
-	g_debug( "na_object_action_idata_factory_read_done: instance=%p", ( void * ) instance );
-
-	na_object_dump( instance );
-}
-
-static void
-idata_factory_write_done( NAIDataFactory *instance, const NAIIOFactory *writer, void *writer_data, GSList **messages )
-{
-
-}
-
 static gboolean
 is_valid_label( const NAObjectAction *action )
 {
@@ -361,6 +381,10 @@ is_valid_label( const NAObjectAction *action )
 	is_valid = ( label && g_utf8_strlen( label, -1 ) > 0 );
 	g_free( label );
 
+	if( !is_valid ){
+		na_object_debug_invalid( action, "label" );
+	}
+
 	return( is_valid );
 }
 
@@ -374,6 +398,10 @@ is_valid_toolbar_label( const NAObjectAction *action )
 	is_valid = ( label && g_utf8_strlen( label, -1 ) > 0 );
 	g_free( label );
 
+	if( !is_valid ){
+		na_object_debug_invalid( action, "toolbar-label" );
+	}
+
 	return( is_valid );
 }
 
diff --git a/src/core/na-object-id.c b/src/core/na-object-id.c
index f12c176..daad211 100644
--- a/src/core/na-object-id.c
+++ b/src/core/na-object-id.c
@@ -46,21 +46,19 @@ struct NAObjectIdClassPrivate {
  */
 struct NAObjectIdPrivate {
 	gboolean   dispose_has_run;
-
-	gchar     *id;
 };
 
-#define NA_OBJECT_PROP_ID				"na-object-prop-id"
-
 static NAObjectClass *st_parent_class = NULL;
 
-static GType  register_type( void );
-static void   class_init( NAObjectIdClass *klass );
-static void   instance_init( GTypeInstance *instance, gpointer klass );
-static void   instance_dispose( GObject *object );
-static void   instance_finalize( GObject *object );
+static GType    register_type( void );
+static void     class_init( NAObjectIdClass *klass );
+static void     instance_init( GTypeInstance *instance, gpointer klass );
+static void     instance_dispose( GObject *object );
+static void     instance_finalize( GObject *object );
 
-static gchar *v_new_id( const NAObjectId *object, const NAObjectId *new_parent );
+static gboolean object_is_valid( const NAObject *object );
+
+static gchar   *v_new_id( const NAObjectId *object, const NAObjectId *new_parent );
 
 GType
 na_object_id_get_type( void )
@@ -118,9 +116,7 @@ class_init( NAObjectIdClass *klass )
 	naobject_class->dump = NULL;
 	naobject_class->copy = NULL;
 	naobject_class->are_equal = NULL;
-	naobject_class->is_valid = NULL;
-
-	klass->new_id = NULL;
+	naobject_class->is_valid = object_is_valid;
 
 	klass->private = g_new0( NAObjectIdClassPrivate, 1 );
 }
@@ -173,8 +169,6 @@ instance_finalize( GObject *object )
 
 	self = NA_OBJECT_ID( object );
 
-	g_free( self->private->id );
-
 	g_free( self->private );
 
 	/* chain call to parent class */
@@ -183,6 +177,26 @@ instance_finalize( GObject *object )
 	}
 }
 
+/*
+ * a NAObjectId is valid if it has a non-null id
+ */
+static gboolean
+object_is_valid( const NAObject *object )
+{
+	gboolean is_valid;
+	gchar *id;
+
+	is_valid = TRUE;
+
+	if( is_valid ){
+		id = na_object_get_id( object );
+		is_valid = ( id != NULL && strlen( id ) > 0 );
+		g_free( id );
+	}
+
+	return( is_valid );
+}
+
 /**
  * na_object_id_sort_alpha_asc:
  * @a: first #NAObjectId.
diff --git a/src/core/na-object-menu.c b/src/core/na-object-menu.c
index 7fb0637..7a57ca4 100644
--- a/src/core/na-object-menu.c
+++ b/src/core/na-object-menu.c
@@ -67,6 +67,8 @@ static void     instance_set_property( GObject *object, guint property_id, const
 static void     instance_dispose( GObject *object );
 static void     instance_finalize( GObject *object );
 
+static gboolean object_is_valid( const NAObject *object );
+
 static void     idata_factory_iface_init( NAIDataFactoryInterface *iface );
 static guint    idata_factory_get_version( const NAIDataFactory *instance );
 static gchar   *idata_factory_get_default( const NAIDataFactory *instance, const NadfIdType *iddef );
@@ -76,6 +78,7 @@ static gboolean idata_factory_is_valid( const NAIDataFactory *object );
 static void     idata_factory_read_done( NAIDataFactory *instance, const NAIIOFactory *reader, void *reader_data, GSList **messages );
 static void     idata_factory_write_done( NAIDataFactory *instance, const NAIIOFactory *writer, void *writer_data, GSList **messages );
 
+static gboolean menu_is_valid( const NAObjectMenu *menu );
 static gboolean is_valid_label( const NAObjectMenu *menu );
 
 GType
@@ -147,7 +150,7 @@ class_init( NAObjectMenuClass *klass )
 	naobject_class->dump = NULL;
 	naobject_class->copy = NULL;
 	naobject_class->are_equal = NULL;
-	naobject_class->is_valid = NULL;
+	naobject_class->is_valid = object_is_valid;
 
 	klass->private = g_new0( NAObjectMenuClassPrivate, 1 );
 
@@ -241,6 +244,14 @@ instance_finalize( GObject *object )
 	}
 }
 
+static gboolean
+object_is_valid( const NAObject *object )
+{
+	g_return_val_if_fail( NA_IS_OBJECT_MENU( object ), FALSE );
+
+	return( menu_is_valid( NA_OBJECT_MENU( object )));
+}
+
 static void
 idata_factory_iface_init( NAIDataFactoryInterface *iface )
 {
@@ -295,22 +306,40 @@ idata_factory_are_equal( const NAIDataFactory *a, const NAIDataFactory *b )
 }
 
 static gboolean
-idata_factory_is_valid( const NAIDataFactory *menu )
+idata_factory_is_valid( const NAIDataFactory *object )
+{
+	g_return_val_if_fail( NA_IS_OBJECT_MENU( object ), FALSE );
+
+	return( menu_is_valid( NA_OBJECT_MENU( object )));
+}
+
+static void
+idata_factory_read_done( NAIDataFactory *instance, const NAIIOFactory *reader, void *reader_data, GSList **messages )
+{
+
+}
+
+static void
+idata_factory_write_done( NAIDataFactory *instance, const NAIIOFactory *writer, void *writer_data, GSList **messages )
+{
+
+}
+
+static gboolean
+menu_is_valid( const NAObjectMenu *menu )
 {
 	gboolean is_valid;
 	gint valid_subitems;
 	GList *subitems, *ip;
 
-	g_return_val_if_fail( NA_IS_OBJECT_MENU( menu ), FALSE );
-
 	is_valid = FALSE;
 
-	if( !NA_OBJECT_MENU( menu )->private->dispose_has_run ){
+	if( !menu->private->dispose_has_run ){
 
 		is_valid = TRUE;
 
 		if( is_valid ){
-			is_valid = is_valid_label( NA_OBJECT_MENU( menu ));
+			is_valid = is_valid_label( menu );
 		}
 
 		if( is_valid ){
@@ -322,24 +351,15 @@ idata_factory_is_valid( const NAIDataFactory *menu )
 				}
 			}
 			is_valid = ( valid_subitems > 0 );
+			if( !is_valid ){
+				na_object_debug_invalid( menu, "no valid subitem" );
+			}
 		}
 	}
 
 	return( is_valid );
 }
 
-static void
-idata_factory_read_done( NAIDataFactory *instance, const NAIIOFactory *reader, void *reader_data, GSList **messages )
-{
-
-}
-
-static void
-idata_factory_write_done( NAIDataFactory *instance, const NAIIOFactory *writer, void *writer_data, GSList **messages )
-{
-
-}
-
 static gboolean
 is_valid_label( const NAObjectMenu *menu )
 {
@@ -350,6 +370,10 @@ is_valid_label( const NAObjectMenu *menu )
 	is_valid = ( label && g_utf8_strlen( label, -1 ) > 0 );
 	g_free( label );
 
+	if( !is_valid ){
+		na_object_debug_invalid( menu, "label" );
+	}
+
 	return( is_valid );
 }
 
diff --git a/src/core/na-object-profile.c b/src/core/na-object-profile.c
index 90df5d6..019ea80 100644
--- a/src/core/na-object-profile.c
+++ b/src/core/na-object-profile.c
@@ -76,12 +76,16 @@ static void     instance_set_property( GObject *object, guint property_id, const
 static void     instance_dispose( GObject *object );
 static void     instance_finalize( GObject *object );
 
+static gboolean object_is_valid( const NAObject *object );
+
 static void     idata_factory_iface_init( NAIDataFactoryInterface *iface );
 static guint    idata_factory_get_version( const NAIDataFactory *instance );
 static gchar   *idata_factory_get_default( const NAIDataFactory *instance, const NadfIdType *iddef );
 static gboolean idata_factory_is_valid( const NAIDataFactory *object );
 static void     idata_factory_read_done( NAIDataFactory *instance, const NAIIOFactory *reader, void *reader_data, GSList **messages );
 static void     idata_factory_write_done( NAIDataFactory *instance, const NAIIOFactory *writer, void *writer_data, GSList **messages );
+
+static gboolean profile_is_valid( const NAObjectProfile *profile );
 static gboolean is_valid_path_parameters( const NAObjectProfile *profile );
 static gboolean is_valid_basenames( const NAObjectProfile *profile );
 static gboolean is_valid_mimetypes( const NAObjectProfile *profile );
@@ -174,7 +178,7 @@ class_init( NAObjectProfileClass *klass )
 	naobject_class->dump = NULL;
 	naobject_class->copy = NULL;
 	naobject_class->are_equal = NULL;
-	naobject_class->is_valid = NULL;
+	naobject_class->is_valid = object_is_valid;
 
 	naobjectid_class = NA_OBJECT_ID_CLASS( klass );
 	naobjectid_class->new_id = object_id_new_id;
@@ -273,6 +277,14 @@ instance_finalize( GObject *object )
 	}
 }
 
+static gboolean
+object_is_valid( const NAObject *object )
+{
+	g_return_val_if_fail( NA_IS_OBJECT_PROFILE( object ), FALSE );
+
+	return( profile_is_valid( NA_OBJECT_PROFILE( object )));
+}
+
 static void
 idata_factory_iface_init( NAIDataFactoryInterface *iface )
 {
@@ -319,34 +331,57 @@ idata_factory_get_default( const NAIDataFactory *instance, const NadfIdType *idd
 }
 
 static gboolean
-idata_factory_is_valid( const NAIDataFactory *profile )
+idata_factory_is_valid( const NAIDataFactory *object )
+{
+	static const gchar *thisfn = "na_object_profile_idata_factory_is_valid: object";
+
+	g_debug( "%s: object=%p (%s)",
+			thisfn, ( void * ) object, G_OBJECT_TYPE_NAME( object ));
+
+	g_return_val_if_fail( NA_IS_OBJECT_PROFILE( object ), FALSE );
+
+	return( profile_is_valid( NA_OBJECT_PROFILE( object )));
+}
+
+static void
+idata_factory_read_done( NAIDataFactory *instance, const NAIIOFactory *reader, void *reader_data, GSList **messages )
+{
+
+}
+
+static void
+idata_factory_write_done( NAIDataFactory *instance, const NAIIOFactory *writer, void *writer_data, GSList **messages )
+{
+
+}
+
+static gboolean
+profile_is_valid( const NAObjectProfile *profile )
 {
 	gboolean is_valid;
 	NAObjectItem *parent;
 
-	g_return_val_if_fail( NA_IS_OBJECT_PROFILE( profile ), FALSE );
-
 	is_valid = FALSE;
 
-	if( !NA_OBJECT_PROFILE( profile )->private->dispose_has_run ){
+	if( !profile->private->dispose_has_run ){
 
 		is_valid = TRUE;
 		parent = na_object_get_parent( profile );
 
 		if( is_valid && na_object_is_target_background( parent )){
 			is_valid =
-					is_valid_path_parameters( NA_OBJECT_PROFILE( profile )) &&
-					is_valid_folders( NA_OBJECT_PROFILE( profile ));
+					is_valid_path_parameters( profile ) &&
+					is_valid_folders( profile );
 		}
 
 		if( is_valid ){
 			if( na_object_is_target_selection( parent ) || na_object_is_target_toolbar( parent )){
 				is_valid =
-					is_valid_path_parameters( NA_OBJECT_PROFILE( profile )) &&
-					is_valid_basenames( NA_OBJECT_PROFILE( profile )) &&
-					is_valid_mimetypes( NA_OBJECT_PROFILE( profile )) &&
-					is_valid_isfiledir( NA_OBJECT_PROFILE( profile )) &&
-					is_valid_schemes( NA_OBJECT_PROFILE( profile ));
+					is_valid_path_parameters( profile ) &&
+					is_valid_basenames( profile ) &&
+					is_valid_mimetypes( profile ) &&
+					is_valid_isfiledir( profile ) &&
+					is_valid_schemes( profile );
 			}
 		}
 	}
@@ -354,18 +389,6 @@ idata_factory_is_valid( const NAIDataFactory *profile )
 	return( is_valid );
 }
 
-static void
-idata_factory_read_done( NAIDataFactory *instance, const NAIIOFactory *reader, void *reader_data, GSList **messages )
-{
-
-}
-
-static void
-idata_factory_write_done( NAIDataFactory *instance, const NAIIOFactory *writer, void *writer_data, GSList **messages )
-{
-
-}
-
 static gboolean
 is_valid_path_parameters( const NAObjectProfile *profile )
 {
@@ -389,6 +412,10 @@ is_valid_path_parameters( const NAObjectProfile *profile )
 	g_free( parameters );
 	g_free( path );
 
+	if( !valid ){
+		na_object_debug_invalid( profile, "command" );
+	}
+
 	return( valid );
 }
 
@@ -402,6 +429,10 @@ is_valid_basenames( const NAObjectProfile *profile )
 	valid = basenames && g_slist_length( basenames ) > 0;
 	na_core_utils_slist_free( basenames );
 
+	if( !valid ){
+		na_object_debug_invalid( profile, "basenames" );
+	}
+
 	return( valid );
 }
 
@@ -415,6 +446,10 @@ is_valid_mimetypes( const NAObjectProfile *profile )
 	valid = mimetypes && g_slist_length( mimetypes ) > 0;
 	na_core_utils_slist_free( mimetypes );
 
+	if( !valid ){
+		na_object_debug_invalid( profile, "mimetypes" );
+	}
+
 	return( valid );
 }
 
@@ -429,6 +464,10 @@ is_valid_isfiledir( const NAObjectProfile *profile )
 
 	valid = isfile || isdir;
 
+	if( !valid ){
+		na_object_debug_invalid( profile, "isfiledir" );
+	}
+
 	return( valid );
 }
 
@@ -442,6 +481,10 @@ is_valid_schemes( const NAObjectProfile *profile )
 	valid = schemes && g_slist_length( schemes ) > 0;
 	na_core_utils_slist_free( schemes );
 
+	if( !valid ){
+		na_object_debug_invalid( profile, "schemes" );
+	}
+
 	return( valid );
 }
 
@@ -455,6 +498,10 @@ is_valid_folders( const NAObjectProfile *profile )
 	valid = folders && g_slist_length( folders ) > 0;
 	na_core_utils_slist_free( folders );
 
+	if( !valid ){
+		na_object_debug_invalid( profile, "folders" );
+	}
+
 	return( valid );
 }
 
diff --git a/src/core/na-object.c b/src/core/na-object.c
index 25390f5..911921f 100644
--- a/src/core/na-object.c
+++ b/src/core/na-object.c
@@ -295,17 +295,26 @@ iduplicable_are_equal_iter( GObjectClass *class, const NAObject *a, HierarchyIte
 static gboolean
 iduplicable_is_valid( const NAIDuplicable *object )
 {
+	static const gchar *thisfn = "na_object_iduplicable_is_valid";
 	gboolean is_valid;
 	HierarchyIter *str;
 
+	g_debug( "%s: object=%p (%s)",
+			thisfn, ( void * ) object, G_OBJECT_TYPE_NAME( object ));
+
+	g_return_val_if_fail( NA_IS_OBJECT( object ), FALSE );
+
 	is_valid = FALSE;
 
 	if( !NA_OBJECT( object )->private->dispose_has_run ){
 
 		if( NA_IS_IDATA_FACTORY( object )){
-			na_data_factory_is_valid( NA_IDATA_FACTORY( object ));
+			is_valid = na_data_factory_is_valid( NA_IDATA_FACTORY( object ));
 
 		} else {
+			g_debug( "%s: object=%p (%s): iterating on class hierarchy",
+					thisfn, ( void * ) object, G_OBJECT_TYPE_NAME( object ));
+
 			str = g_new0( HierarchyIter, 1 );
 			str->result = TRUE;
 			iter_on_class_hierarchy( NA_OBJECT( object ), ( HierarchyIterFunc ) &iduplicable_is_valid_iter, str );
@@ -356,7 +365,7 @@ object_dump( const NAObject *object )
  * Internally set some properties which may be requested later. This
  * two-steps check-request let us optimize some work in the UI.
  *
- * na_object_editable_check_status( object )
+ * na_object_object_check_status( object )
  *  +- na_iduplicable_check_status( object )
  *      +- get_origin( object )
  *      +- modified_status = v_are_equal( origin, object ) -> interface are_equal()
@@ -737,3 +746,17 @@ na_object_free_hierarchy( GList *hierarchy )
 {
 	g_list_free( hierarchy );
 }
+
+/**
+ * na_object_object_debug_invalid:
+ * @object: the #NAObject-derived object which is invalid.
+ * @reason: the reason.
+ *
+ * Dump the object with the invalidity reason.
+ */
+void
+na_object_object_debug_invalid( const NAObject *object, const gchar *reason )
+{
+	g_debug( "na_object_object_debug_invalid: object is marked invalid for reason \"%s\"", reason );
+	na_object_dump_norec( object );
+}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]