[nautilus-actions] a_factory_object_copy(): remove target data before copying source ones



commit 97b19bf5694290793fdb4479de74d85af841b48e
Author: Pierre Wieser <pwieser trychlos org>
Date:   Mon Jan 16 07:20:29 2012 +0100

    a_factory_object_copy(): remove target data before copying source ones

 ChangeLog                    |    3 +++
 src/core/na-factory-object.c |   29 +++++++++++++++++++++++------
 2 files changed, 26 insertions(+), 6 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 51799f5..4d7cbbb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,9 @@
 	* docs/nact/C/nact-conditions.xml: Embeds literal values between
 	<literal>..</literal> tags.
 
+	* src/core/na-factory-object.c (na_factory_object_copy):
+	Removes target copyable data before copying source copyable data.
+
 	* src/nact/nact-icommand-tab.c (parse_parameters): Uses internal data.
 
 	* src/core/na-desktop-environment.c
diff --git a/src/core/na-factory-object.c b/src/core/na-factory-object.c
index c0f53fb..955ec9d 100644
--- a/src/core/na-factory-object.c
+++ b/src/core/na-factory-object.c
@@ -357,7 +357,10 @@ void
 na_factory_object_copy( NAIFactoryObject *target, const NAIFactoryObject *source )
 {
 	static const gchar *thisfn = "na_factory_object_copy";
+	GList *dest_list, *idest, *inext;
 	GList *src_list, *isrc;
+	NADataBoxed *boxed;
+	const NADataDef *def;
 
 	g_return_if_fail( NA_IS_IFACTORY_OBJECT( target ));
 	g_return_if_fail( NA_IS_IFACTORY_OBJECT( source ));
@@ -367,20 +370,34 @@ na_factory_object_copy( NAIFactoryObject *target, const NAIFactoryObject *source
 			( void * ) target, G_OBJECT_TYPE_NAME( target ),
 			( void * ) source, G_OBJECT_TYPE_NAME( source ));
 
-	src_list = g_object_get_data( G_OBJECT( source ), NA_IFACTORY_OBJECT_PROP_DATA );
+	/* first remove copyable data from target
+	 */
+	idest = dest_list = g_object_get_data( G_OBJECT( target ), NA_IFACTORY_OBJECT_PROP_DATA );
+	while( idest ){
+		boxed = NA_DATA_BOXED( idest->data );
+		inext = idest->next;
+		def = na_data_boxed_get_data_def( boxed );
+		if( def->copyable ){
+			dest_list = g_list_remove_link( dest_list, idest );
+			g_object_unref( idest->data );
+		}
+		idest = inext;
+	}
+	g_object_set_data( G_OBJECT( target ), NA_IFACTORY_OBJECT_PROP_DATA, dest_list );
 
+	/* only then copy copyable data from source
+	 */
+	src_list = g_object_get_data( G_OBJECT( source ), NA_IFACTORY_OBJECT_PROP_DATA );
 	for( isrc = src_list ; isrc ; isrc = isrc->next ){
-
-		NADataBoxed *src_boxed = NA_DATA_BOXED( isrc->data );
-		const NADataDef *def = na_data_boxed_get_data_def( src_boxed );
-
+		boxed = NA_DATA_BOXED( isrc->data );
+		def = na_data_boxed_get_data_def( boxed );
 		if( def->copyable ){
 			NADataBoxed *tgt_boxed = na_ifactory_object_get_data_boxed( target, def->name );
 			if( !tgt_boxed ){
 				tgt_boxed = na_data_boxed_new( def );
 				attach_boxed_to_object( target, tgt_boxed );
 			}
-			na_boxed_set_from_boxed( NA_BOXED( tgt_boxed ), NA_BOXED( src_boxed ));
+			na_boxed_set_from_boxed( NA_BOXED( tgt_boxed ), NA_BOXED( boxed ));
 		}
 	}
 



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