[nautilus-actions] Rewrite copy stack to get ride of iteration on class hierarchy
- From: Pierre Wieser <pwieser src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [nautilus-actions] Rewrite copy stack to get ride of iteration on class hierarchy
- Date: Mon, 21 Feb 2011 22:33:55 +0000 (UTC)
commit 4c750a945f3e02239ed874733cf7af9e8f4730ce
Author: Pierre Wieser <pwieser trychlos org>
Date: Mon Feb 21 23:18:15 2011 +0100
Rewrite copy stack to get ride of iteration on class hierarchy
ChangeLog | 14 +++++
src/api/na-icontext.h | 2 +-
src/api/na-object-api.h | 2 -
src/api/na-object.h | 4 +-
src/core/na-icontext.c | 15 +++++
src/core/na-object-action.c | 15 -----
src/core/na-object-item.c | 5 ++
src/core/na-object-menu.c | 15 -----
src/core/na-object-profile.c | 23 +------
src/core/na-object.c | 126 ++++++++++++------------------------------
10 files changed, 76 insertions(+), 145 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index da3d550..334e8ae 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,19 @@
2011-02-21 Pierre Wieser <pwieser trychlos org>
+ Rewrite copy stack to get ride of iteration on class hierarchy
+
+ * src/api/na-object-api.h
+ (na_object_copy, na_object_get_hierarchy): Removed macros.
+
+ * src/api/na-icontext.h:
+ * src/core/na-icontext.c (na_icontext_copy): New function.
+
+ * src/core/na-object.c (object_copy_iter, iter_on_class_hierarchy):
+ * src/core/na-object-item.c (object_copy):
+ * src/core/na-object-action.c (object_copy):
+ * src/core/na-object-profile.c (object_copy):
+ * src/core/na-object-menu.c (object_copy): Updated accordingly.
+
Rewrite validity status check stack
* src/api/na-icontext.h:
diff --git a/src/api/na-icontext.h b/src/api/na-icontext.h
index b3f0147..bc87176 100644
--- a/src/api/na-icontext.h
+++ b/src/api/na-icontext.h
@@ -101,8 +101,8 @@ gboolean na_icontext_is_valid ( const NAIContext *context );
void na_icontext_check_mimetypes ( const NAIContext *context );
+void na_icontext_copy ( NAIContext *context, const NAIContext *source );
void na_icontext_read_done ( NAIContext *context );
-
void na_icontext_set_scheme ( NAIContext *context, const gchar *scheme, gboolean selected );
void na_icontext_set_only_desktop( NAIContext *context, const gchar *desktop, gboolean selected );
void na_icontext_set_not_desktop ( NAIContext *context, const gchar *desktop, gboolean selected );
diff --git a/src/api/na-object-api.h b/src/api/na-object-api.h
index e2e74fe..5796232 100644
--- a/src/api/na-object-api.h
+++ b/src/api/na-object-api.h
@@ -66,11 +66,9 @@ G_BEGIN_DECLS
/* NAObject
*/
-#define na_object_copy( tgt, src, rec ) na_object_object_copy( NA_OBJECT( tgt ), NA_OBJECT( src ), ( rec ))
#define na_object_dump( obj ) na_object_object_dump( NA_OBJECT( obj ))
#define na_object_dump_norec( obj ) na_object_object_dump_norec( NA_OBJECT( obj ))
#define na_object_dump_tree( tree ) na_object_object_dump_tree( tree )
-#define na_object_get_hierarchy( obj ) na_object_object_get_hierarchy( NA_OBJECT( obj ))
#define na_object_ref( obj ) na_object_object_ref( NA_OBJECT( obj ))
#define na_object_unref( obj ) na_object_object_unref( NA_OBJECT( obj ))
diff --git a/src/api/na-object.h b/src/api/na-object.h
index 7547b4b..1e3a919 100644
--- a/src/api/na-object.h
+++ b/src/api/na-object.h
@@ -170,13 +170,11 @@ void na_object_object_reset_origin ( NAObject *object, const NAObject *or
NAObject *na_object_object_ref ( NAObject *object );
void na_object_object_unref( NAObject *object );
-void na_object_object_copy ( NAObject *target, const NAObject *source, gboolean recursive );
-
void na_object_object_dump ( const NAObject *object );
void na_object_object_dump_norec( const NAObject *object );
void na_object_object_dump_tree ( GList *tree );
-GList *na_object_object_get_hierarchy( const NAObject *object );
+GList *na_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 );
diff --git a/src/core/na-icontext.c b/src/core/na-icontext.c
index 36d1de0..55af2bc 100644
--- a/src/core/na-icontext.c
+++ b/src/core/na-icontext.c
@@ -317,6 +317,21 @@ na_icontext_check_mimetypes( const NAIContext *context )
}
/**
+ * na_icontext_copy:
+ * @context: the target #NAIContext context.
+ * @source: the source #NAIContext context.
+ *
+ * Copy specific data from @source to @context.
+ *
+ * Since: 3.1.0
+ */
+void
+na_icontext_copy( NAIContext *context, const NAIContext *source )
+{
+ /* nothing to do for now */
+}
+
+/**
* na_icontext_read_done:
* @context: the #NAIContext to be prepared.
*
diff --git a/src/core/na-object-action.c b/src/core/na-object-action.c
index 2d8f84f..65b69b4 100644
--- a/src/core/na-object-action.c
+++ b/src/core/na-object-action.c
@@ -73,7 +73,6 @@ static void instance_dispose( GObject *object );
static void instance_finalize( GObject *object );
static void object_dump( const NAObject *object );
-static void object_copy( NAObject *target, const NAObject *source, gboolean recursive );
static gboolean object_are_equal( const NAObject *a, const NAObject *b );
static gboolean object_is_valid( const NAObject *object );
@@ -168,7 +167,6 @@ class_init( NAObjectActionClass *klass )
naobject_class = NA_OBJECT_CLASS( klass );
naobject_class->dump = object_dump;
- naobject_class->copy = object_copy;
naobject_class->are_equal = object_are_equal;
naobject_class->is_valid = object_is_valid;
@@ -282,19 +280,6 @@ object_dump( const NAObject *object )
}
}
-static void
-object_copy( NAObject *target, const NAObject *source, gboolean recursive )
-{
- g_return_if_fail( NA_IS_OBJECT_ACTION( target ));
- g_return_if_fail( NA_IS_OBJECT_ACTION( source ));
-
- if( !NA_OBJECT_ACTION( target )->private->dispose_has_run &&
- !NA_OBJECT_ACTION( source )->private->dispose_has_run ){
-
- na_factory_object_copy( NA_IFACTORY_OBJECT( target ), NA_IFACTORY_OBJECT( source ));
- }
-}
-
/*
* @a is the original object
* @b is the current one
diff --git a/src/core/na-object-item.c b/src/core/na-object-item.c
index 7c49b87..b36bfbe 100644
--- a/src/core/na-object-item.c
+++ b/src/core/na-object-item.c
@@ -259,6 +259,11 @@ object_copy( NAObject *target, const NAObject *source, gboolean recursive )
dest->private->writable = src->private->writable;
dest->private->reason = src->private->reason;
+
+ /* chain up to the parent class */
+ if( NA_OBJECT_CLASS( st_parent_class )->copy ){
+ NA_OBJECT_CLASS( st_parent_class )->copy( target, source, recursive );
+ }
}
}
diff --git a/src/core/na-object-menu.c b/src/core/na-object-menu.c
index c474ed0..7c1d86a 100644
--- a/src/core/na-object-menu.c
+++ b/src/core/na-object-menu.c
@@ -69,7 +69,6 @@ static void instance_set_property( GObject *object, guint property_id, c
static void instance_dispose( GObject *object );
static void instance_finalize( GObject *object );
-static void object_copy( NAObject *target, const NAObject *source, gboolean recursive );
static void object_dump( const NAObject *object );
static void ifactory_object_iface_init( NAIFactoryObjectInterface *iface );
@@ -155,7 +154,6 @@ class_init( NAObjectMenuClass *klass )
naobject_class = NA_OBJECT_CLASS( klass );
naobject_class->dump = object_dump;
- naobject_class->copy = object_copy;
klass->private = g_new0( NAObjectMenuClassPrivate, 1 );
@@ -246,19 +244,6 @@ instance_finalize( GObject *object )
}
static void
-object_copy( NAObject *target, const NAObject *source, gboolean recursive )
-{
- g_return_if_fail( NA_IS_OBJECT_MENU( target ));
- g_return_if_fail( NA_IS_OBJECT_MENU( source ));
-
- if( !NA_OBJECT_MENU( target )->private->dispose_has_run &&
- !NA_OBJECT_MENU( source )->private->dispose_has_run ){
-
- na_factory_object_copy( NA_IFACTORY_OBJECT( target ), NA_IFACTORY_OBJECT( source ));
- }
-}
-
-static void
object_dump( const NAObject *object )
{
static const char *thisfn = "na_object_menu_object_dump";
diff --git a/src/core/na-object-profile.c b/src/core/na-object-profile.c
index 5087376..8f2edd9 100644
--- a/src/core/na-object-profile.c
+++ b/src/core/na-object-profile.c
@@ -73,7 +73,6 @@ static void instance_set_property( GObject *object, guint property_id, c
static void instance_dispose( GObject *object );
static void instance_finalize( GObject *object );
-static void object_copy( NAObject *target, const NAObject *source, gboolean recursive );
static void object_dump( const NAObject *object );
static gboolean object_is_valid( const NAObject *object );
@@ -169,7 +168,6 @@ class_init( NAObjectProfileClass *klass )
naobject_class = NA_OBJECT_CLASS( klass );
naobject_class->dump = object_dump;
- naobject_class->copy = object_copy;
naobject_class->is_valid = object_is_valid;
naobjectid_class = NA_OBJECT_ID_CLASS( klass );
@@ -266,19 +264,6 @@ instance_finalize( GObject *object )
}
static void
-object_copy( NAObject *target, const NAObject *source, gboolean recursive )
-{
- g_return_if_fail( NA_IS_OBJECT_PROFILE( target ));
- g_return_if_fail( NA_IS_OBJECT_PROFILE( source ));
-
- if( !NA_OBJECT_PROFILE( target )->private->dispose_has_run &&
- !NA_OBJECT_PROFILE( source )->private->dispose_has_run ){
-
- na_factory_object_copy( NA_IFACTORY_OBJECT( target ), NA_IFACTORY_OBJECT( source ));
- }
-}
-
-static void
object_dump( const NAObject *object )
{
static const char *thisfn = "na_object_profile_object_dump";
@@ -317,11 +302,11 @@ object_is_valid( const NAObject *object )
g_debug( "%s: profile=%p (%s)", thisfn, ( void * ) profile, G_OBJECT_TYPE_NAME( profile ));
is_valid = is_valid_path_parameters( profile );
- }
- /* chain up to the parent class */
- if( NA_OBJECT_CLASS( st_parent_class )->is_valid ){
- is_valid &= NA_OBJECT_CLASS( st_parent_class )->is_valid( object );
+ /* chain up to the parent class */
+ if( NA_OBJECT_CLASS( st_parent_class )->is_valid ){
+ is_valid &= NA_OBJECT_CLASS( st_parent_class )->is_valid( object );
+ }
}
return( is_valid );
diff --git a/src/core/na-object.c b/src/core/na-object.c
index 38d95c6..13e44ce 100644
--- a/src/core/na-object.c
+++ b/src/core/na-object.c
@@ -48,24 +48,6 @@ struct _NAObjectPrivate {
gboolean dispose_has_run;
};
-/* while iterating on the class hierarchy for are_equal() and is_valid()
- */
-typedef struct {
- NAObject *object;
- gboolean result;
-}
- HierarchyIter;
-
-/* while iterating on the class hierarchy for object_copy()
- */
-typedef struct {
- NAObject *target;
- gboolean recursive;
-}
- CopyIter;
-
-typedef gboolean ( *HierarchyIterFunc )( GObjectClass *class, const NAObject *object, void *user_data );
-
static GObjectClass *st_parent_class = NULL;
static GType register_type( void );
@@ -83,11 +65,10 @@ static gboolean iduplicable_is_valid( const NAIDuplicable *object );
static void check_status_down_rec( const NAObject *object );
static void check_status_up_rec( const NAObject *object, gboolean was_modified, gboolean was_valid );
+static void v_copy( NAObject *target, const NAObject *source, gboolean recursive );
static gboolean v_are_equal( const NAObject *a, const NAObject *b );
static gboolean v_is_valid( const NAObject *a );
-static gboolean object_copy_iter( GObjectClass *class, const NAObject *source, CopyIter *data );
static void dump_tree( GList *tree, gint level );
-static void iter_on_class_hierarchy( const NAObject *object, HierarchyIterFunc pfn, void *user_data );
static GList *build_class_hierarchy( const NAObject *object );
GType
@@ -255,7 +236,31 @@ iduplicable_iface_init( NAIDuplicableInterface *iface )
static void
iduplicable_copy( NAIDuplicable *target, const NAIDuplicable *source )
{
- na_object_copy( NA_OBJECT( target ), NA_OBJECT( source ), TRUE );
+ static const gchar *thisfn = "na_object_iduplicable_copy";
+ NAObject *dest, *src;
+
+ g_return_if_fail( NA_IS_OBJECT( target ));
+ g_return_if_fail( NA_IS_OBJECT( source ));
+
+ dest = NA_OBJECT( target );
+ src = NA_OBJECT( source );
+
+ if( !dest->private->dispose_has_run &&
+ !src->private->dispose_has_run ){
+
+ g_debug( "%s: target=%p (%s), source=%p (%s)",
+ thisfn, ( void * ) dest, G_OBJECT_TYPE_NAME( dest ), ( void * ) src, G_OBJECT_TYPE_NAME( src ));
+
+ if( NA_IS_IFACTORY_OBJECT( target )){
+ na_factory_object_copy( NA_IFACTORY_OBJECT( target ), NA_IFACTORY_OBJECT( source ));
+ }
+
+ if( NA_IS_ICONTEXT( target )){
+ na_icontext_copy( NA_ICONTEXT( target ), NA_ICONTEXT( source ));
+ }
+
+ v_copy( dest, src, TRUE );
+ }
}
static gboolean
@@ -417,6 +422,14 @@ check_status_up_rec( const NAObject *object, gboolean was_modified, gboolean was
}
}
+static void
+v_copy( NAObject *target, const NAObject *source, gboolean recursive )
+{
+ if( NA_OBJECT_GET_CLASS( target )->copy ){
+ NA_OBJECT_GET_CLASS( target )->copy( target, source, recursive );
+ }
+}
+
static gboolean
v_are_equal( const NAObject *a, const NAObject *b )
{
@@ -438,50 +451,6 @@ v_is_valid( const NAObject *a )
}
/**
- * na_object_object_copy:
- * @target: the target #NAObject -derived object.
- * @source: the source #NAObject -derived object.
- * @recursive: whether the copy should be recursive.
- *
- * Copies @source to @target.
- *
- * Since: 2.30
- */
-void
-na_object_object_copy( NAObject *target, const NAObject *source, gboolean recursive )
-{
- CopyIter *data;
-
- g_return_if_fail( NA_IS_OBJECT( target ));
- g_return_if_fail( NA_IS_OBJECT( source ));
-
- if( !NA_OBJECT( source )->private->dispose_has_run &&
- !NA_OBJECT( target )->private->dispose_has_run ){
-
- data = g_new0( CopyIter, 1 );
- data->target = target;
- data->recursive = recursive;
-
- iter_on_class_hierarchy( NA_OBJECT( source ),
- ( HierarchyIterFunc ) object_copy_iter, ( void * ) data );
-
- g_free( data );
- }
-}
-
-static gboolean
-object_copy_iter( GObjectClass *class, const NAObject *source, CopyIter *data )
-{
- gboolean stop = FALSE;
-
- if( NA_OBJECT_CLASS( class )->copy ){
- NA_OBJECT_CLASS( class )->copy( data->target, source, data->recursive );
- }
-
- return( stop );
-}
-
-/**
* na_object_object_dump:
* @object: the #NAObject -derived object to be dumped.
*
@@ -679,29 +648,6 @@ na_object_object_unref( NAObject *object )
}
/*
- * iter on the whole class hierarchy
- * starting with NAObject, and to the most derived up to NAObjectAction..
- */
-static void
-iter_on_class_hierarchy( const NAObject *object, HierarchyIterFunc pfn, void *user_data )
-{
- gboolean stop;
- GObjectClass *class;
- GList *hierarchy, *ih;
-
- stop = FALSE;
- hierarchy = build_class_hierarchy( object );
-
- for( ih = hierarchy ; ih && !stop ; ih = ih->next ){
- class = ( GObjectClass * ) ih->data;
- /*g_debug( "iter_on_class_hierarchy: class=%s", G_OBJECT_CLASS_NAME( class ));*/
- stop = ( *pfn )( class, object, user_data );
- }
-
- g_list_free( hierarchy );
-}
-
-/*
* build the class hierarchy
* returns a list of GObjectClass, which starts with NAObject,
* and to with the most derived class (e.g. NAObjectAction or so)
@@ -727,7 +673,7 @@ build_class_hierarchy( const NAObject *object )
}
/**
- * na_object_object_get_hierarchy:
+ * na_object_get_hierarchy:
* @object: the #NAObject -derived object.
*
* Returns: the class hierarchy,
@@ -736,7 +682,7 @@ build_class_hierarchy( const NAObject *object )
* Since: 2.30
*/
GList *
-na_object_object_get_hierarchy( const NAObject *object )
+na_object_get_hierarchy( const NAObject *object )
{
GList *hierarchy;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]