[nautilus-actions] Convert pre-v3 parameters



commit f12b73444bd458e354f77bba0a541911dc3f034f
Author: Pierre Wieser <pwieser trychlos org>
Date:   Wed May 12 18:32:54 2010 +0200

    Convert pre-v3 parameters

 ChangeLog                          |   24 ++++++
 src/api/na-icontext.h              |    7 +-
 src/api/na-object-api.h            |    2 +
 src/core/na-icontext-factory.c     |    8 +-
 src/core/na-icontext.c             |  161 +++++++++++++++++++++++++++++-------
 src/core/na-object-action.c        |    4 +-
 src/core/na-object-item-factory.c  |    4 +-
 src/core/na-object-menu.c          |    4 +-
 src/core/na-object-profile.c       |    6 +-
 src/io-gconf/nagp-reader.c         |  102 +++++++++++++++++++++++
 src/plugin-menu/nautilus-actions.c |   52 ++++++------
 11 files changed, 303 insertions(+), 71 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 405dc75..ad99745 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -45,6 +45,30 @@
 	* src/utils/nautilus-actions-run.c:
 	Mark two new strings for translation.
 
+2010-05-12 Pierre Wieser <pwieser trychlos org>
+
+	* src/api/na-icontext.h:
+	* src/core/na-icontext.c
+	(na_icontext_have_all_mimetypes): Removed function.
+	(na_icontext_read_done): New function.
+
+	* src/core/na-object-action.c:
+	* src/core/na-object-menu.c:
+	* src/core/na-object-profile.c: Updated accordingly.
+
+	* src/api/na-object-api.h
+	(na_object_get_iversion, na_object_set_iversion): New functions.
+
+	* src/core/na-icontext-factory.c:
+	* src/core/na-object-item-factory.c:
+	Adjustments on default values.
+
+	* src/io-gconf/nagp-reader.c (read_done_profile_attach_profile):
+	Convert pre-v3 parameters.
+
+	* src/plugin-menu/nautilus-actions.c:
+	Adjust NautilusMenuProvider interface.
+
 2010-05-10 Pierre Wieser <pwieser trychlos org>
 
 	Monitor .desktop files and directories.
diff --git a/src/api/na-icontext.h b/src/api/na-icontext.h
index 49f011b..89c413f 100644
--- a/src/api/na-icontext.h
+++ b/src/api/na-icontext.h
@@ -86,9 +86,10 @@ GType    na_icontext_get_type( void );
 gboolean na_icontext_is_candidate( const NAIContext *object, guint target, GList *selection );
 gboolean na_icontext_is_valid    ( const NAIContext *object );
 
-void     na_icontext_have_all_mimetypes( NAIContext *object );
-void     na_icontext_set_scheme        ( NAIContext *object, const gchar *scheme, gboolean selected );
-void     na_icontext_replace_folder    ( NAIContext *object, const gchar *old, const gchar *new );
+void     na_icontext_read_done     ( NAIContext *object );
+
+void     na_icontext_set_scheme    ( NAIContext *object, const gchar *scheme, gboolean selected );
+void     na_icontext_replace_folder( NAIContext *object, const gchar *old, const gchar *new );
 
 G_END_DECLS
 
diff --git a/src/api/na-object-api.h b/src/api/na-object-api.h
index 95113d0..77e7891 100644
--- a/src/api/na-object-api.h
+++ b/src/api/na-object-api.h
@@ -105,6 +105,7 @@ G_BEGIN_DECLS
 #define na_object_is_readonly( obj )					(( gboolean ) GPOINTER_TO_UINT( na_ifactory_object_get_as_void( NA_IFACTORY_OBJECT( obj ), NAFO_DATA_READONLY )))
 #define na_object_get_provider( obj )					na_ifactory_object_get_as_void( NA_IFACTORY_OBJECT( obj ), NAFO_DATA_PROVIDER )
 #define na_object_get_provider_data( obj )				na_ifactory_object_get_as_void( NA_IFACTORY_OBJECT( obj ), NAFO_DATA_PROVIDER_DATA )
+#define na_object_get_iversion( obj )					GPOINTER_TO_UINT( na_ifactory_object_get_as_void( NA_IFACTORY_OBJECT( obj ), NAFO_DATA_IVERSION ))
 
 #define na_object_set_tooltip( obj, tooltip )			na_ifactory_object_set_from_void( NA_IFACTORY_OBJECT( obj ), NAFO_DATA_TOOLTIP, ( const void * )( tooltip ))
 #define na_object_set_icon( obj, icon )					na_ifactory_object_set_from_void( NA_IFACTORY_OBJECT( obj ), NAFO_DATA_ICON, ( const void * )( icon ))
@@ -115,6 +116,7 @@ G_BEGIN_DECLS
 #define na_object_set_readonly( obj, readonly )			na_ifactory_object_set_from_void( NA_IFACTORY_OBJECT( obj ), NAFO_DATA_READONLY, ( const void * ) GUINT_TO_POINTER( readonly ))
 #define na_object_set_provider( obj, provider )			na_ifactory_object_set_from_void( NA_IFACTORY_OBJECT( obj ), NAFO_DATA_PROVIDER, ( const void * )( provider ))
 #define na_object_set_provider_data( obj, data )		na_ifactory_object_set_from_void( NA_IFACTORY_OBJECT( obj ), NAFO_DATA_PROVIDER_DATA, ( const void * )( data ))
+#define na_object_set_iversion( obj, version )			na_ifactory_object_set_from_void( NA_IFACTORY_OBJECT( obj ), NAFO_DATA_IVERSION, ( const void * ) GUINT_TO_POINTER( version ))
 
 #define na_object_get_item( obj, id )					na_object_item_get_item( NA_OBJECT_ITEM( obj ),( const gchar * )( id ))
 #define na_object_get_position( obj, child )			na_object_item_get_position( NA_OBJECT_ITEM( obj ), NA_OBJECT_ID( child ))
diff --git a/src/core/na-icontext-factory.c b/src/core/na-icontext-factory.c
index 726c505..6fa272d 100644
--- a/src/core/na-icontext-factory.c
+++ b/src/core/na-icontext-factory.c
@@ -103,9 +103,9 @@ NADataDef data_def_conditions [] = {
 					"selected file(s)/folder(s). Each selected items must match at least one of " \
 					"the mimetype patterns for the action to appear.\n" \
 					"This obviously only applies when there is a selection.\n" \
-					"Defaults to '*'." ),
+					"Defaults to '*/*'." ),
 				NAFD_TYPE_STRING_LIST,
-				"[*]",
+				"[*/*]",
 				TRUE,
 				TRUE,
 				FALSE,
@@ -131,11 +131,11 @@ NADataDef data_def_conditions [] = {
 				FALSE,
 				TRUE,
 				"Does the mimetypes list is generic ?",
-				"The generic wildcard may be coded as '*', or '*/*' or 'all' or 'all/*'."
+				"The generic wildcard may be coded as '*', or '*/*' or 'all' or 'all/*' or 'all/all'."
 				"In each case, we will try to spend as less time as possible to check " \
 				"selection mimetypes",
 				NAFD_TYPE_BOOLEAN,
-				"false",
+				"true",
 				TRUE,
 				TRUE,
 				FALSE,
diff --git a/src/core/na-icontext.c b/src/core/na-icontext.c
index 5c132f4..a5ae98d 100644
--- a/src/core/na-icontext.c
+++ b/src/core/na-icontext.c
@@ -83,6 +83,7 @@ static gboolean is_valid_isfiledir( const NAIContext *object );
 static gboolean is_valid_schemes( const NAIContext *object );
 static gboolean is_valid_folders( const NAIContext *object );
 
+static void     check_for_all_mimetypes( NAIContext *context );
 static gboolean is_positive_assertion( const gchar *assertion );
 static gboolean validate_schemes( GSList *object_schemes, NASelectedInfo *iter );
 
@@ -175,6 +176,10 @@ interface_base_finalize( NAIContextInterface *klass )
  * the Nautilus context menu, depending of the list of currently selected
  * items.
  *
+ * This function is called by nautilus-actions::build_nautilus_menus()
+ * for each item found in NAPivot items list, and, when this an action,
+ * for each profile of this action.
+ *
  * Returns: %TRUE if this object succeeds to all tests and is so a
  * valid candidate to be displayed in Nautilus context menu, %FALSE
  * else.
@@ -182,10 +187,14 @@ interface_base_finalize( NAIContextInterface *klass )
 gboolean
 na_icontext_is_candidate( const NAIContext *object, guint target, GList *files )
 {
+	static const gchar *thisfn = "na_icontext_is_candidate";
 	gboolean is_candidate;
 
 	g_return_val_if_fail( NA_IS_ICONTEXT( object ), FALSE );
 
+	g_debug( "%s: object=%p (%s), target=%d, files=%p (count=%d)",
+			thisfn, ( void * ) object, G_OBJECT_TYPE_NAME( object ), target, (void * ) files, g_list_length( files ));
+
 	is_candidate = v_is_candidate( NA_ICONTEXT( object ), target, files );
 
 	if( is_candidate ){
@@ -253,37 +262,15 @@ na_icontext_is_valid( const NAIContext *object )
 }
 
 /**
- * na_icontext_have_all_mimetypes:
- * @context: the #NAIContext object to be checked.
+ * na_icontext_read_done:
+ * @context: the #NAIContext to be prepared.
  *
- * Check if this object is valid for all mimetypes. This is done at load
- * time, and let us spend as less time as possible when testing for
- * candidates.
+ * Prepares the specified #NAIContext just after it has been readen.
  */
 void
-na_icontext_have_all_mimetypes( NAIContext *object )
+na_icontext_read_done( NAIContext *context )
 {
-	gboolean all = TRUE;
-	GSList *mimetypes = na_object_get_mimetypes( object );
-	GSList *im;
-
-	for( im = mimetypes ; im ; im = im->next ){
-		if( !im->data || !strlen( im->data )){
-			continue;
-		}
-		const gchar *imtype = ( const gchar * ) im->data;
-		if( !strcmp( imtype, "*" ) ||
-			!strcmp( imtype, "*/*" ) ||
-			!strcmp( imtype, "all" ) ||
-			!strcmp( imtype, "all/*" ) ||
-			!strcmp( imtype, "all/all" )){
-				continue;
-		}
-		all = FALSE;
-		break;
-	}
-
-	na_object_set_all_mimetypes( object, all );
+	check_for_all_mimetypes( context );
 }
 
 /**
@@ -380,9 +367,14 @@ is_candidate_for_target( const NAIContext *object, guint target, GList *files )
 
 			default:
 				g_warning( "%s: unknonw target=%d", thisfn, target );
+				ok = FALSE;
 		}
 	}
 
+	if( !ok ){
+		g_debug( "%s: object is not candidate because target doesn't match (asked=%d)", thisfn, target );
+	}
+
 	return( ok );
 }
 
@@ -393,10 +385,24 @@ is_candidate_for_target( const NAIContext *object, guint target, GList *files )
 static gboolean
 is_candidate_for_show_in( const NAIContext *object, guint target, GList *files )
 {
+	static const gchar *thisfn = "na_icontext_is_candidate_for_show_in";
 	gboolean ok = TRUE;
+	GSList *only_in = na_object_get_only_show_in( object );
+	GSList *not_in = na_object_get_not_show_in( object );
 
 	/* TODO: how-to get current running environment ? */
 
+	if( !ok ){
+		gchar *only_str = na_core_utils_slist_to_text( only_in );
+		gchar *not_str = na_core_utils_slist_to_text( not_in );
+		g_debug( "%s: object is not candidate because OnlyShowIn=%s, NotShowIn=%s", thisfn, only_str, not_str );
+		g_free( not_str );
+		g_free( only_str );
+	}
+
+	na_core_utils_slist_free( not_in );
+	na_core_utils_slist_free( only_in );
+
 	return( ok );
 }
 
@@ -406,6 +412,7 @@ is_candidate_for_show_in( const NAIContext *object, guint target, GList *files )
 static gboolean
 is_candidate_for_try_exec( const NAIContext *object, guint target, GList *files )
 {
+	static const gchar *thisfn = "na_icontext_is_candidate_for_try_exec";
 	gboolean ok = TRUE;
 	gchar *tryexec = na_object_get_try_exec( object );
 
@@ -418,6 +425,10 @@ is_candidate_for_try_exec( const NAIContext *object, guint target, GList *files
 		g_object_unref( file );
 	}
 
+	if( !ok ){
+		g_debug( "%s: object is not candidate because TryExec=%s", thisfn, tryexec );
+	}
+
 	g_free( tryexec );
 
 	return( ok );
@@ -448,6 +459,10 @@ is_candidate_for_show_if_registered( const NAIContext *object, guint target, GLi
 		}
 	}
 
+	if( !ok ){
+		g_debug( "%s: object is not candidate because ShowIfRegistered=%s", thisfn, name );
+	}
+
 	g_free( name );
 
 	return( ok );
@@ -456,6 +471,7 @@ is_candidate_for_show_if_registered( const NAIContext *object, guint target, GLi
 static gboolean
 is_candidate_for_show_if_true( const NAIContext *object, guint target, GList *files )
 {
+	static const gchar *thisfn = "na_icontext_is_candidate_for_show_if_true";
 	gboolean ok = TRUE;
 	gchar *command = na_object_get_show_if_true( object );
 
@@ -471,6 +487,10 @@ is_candidate_for_show_if_true( const NAIContext *object, guint target, GList *fi
 		g_free( stdout );
 	}
 
+	if( !ok ){
+		g_debug( "%s: object is not candidate because ShowIfTrue=%s", thisfn, command );
+	}
+
 	g_free( command );
 
 	return( ok );
@@ -479,6 +499,7 @@ is_candidate_for_show_if_true( const NAIContext *object, guint target, GList *fi
 static gboolean
 is_candidate_for_show_if_running( const NAIContext *object, guint target, GList *files )
 {
+	static const gchar *thisfn = "na_icontext_is_candidate_for_show_if_running";
 	gboolean ok = TRUE;
 	gchar *running = na_object_get_show_if_running( object );
 
@@ -488,6 +509,10 @@ is_candidate_for_show_if_running( const NAIContext *object, guint target, GList
 		 */
 	}
 
+	if( !ok ){
+		g_debug( "%s: object is not candidate because ShowIfRunning=%s", thisfn, running );
+	}
+
 	g_free( running );
 
 	return( ok );
@@ -509,10 +534,13 @@ is_candidate_for_show_if_running( const NAIContext *object, guint target, GList
 static gboolean
 is_candidate_for_mimetypes( const NAIContext *object, guint target, GList *files )
 {
+	static const gchar *thisfn = "na_icontext_is_candidate_for_mimetypes";
 	gboolean ok = TRUE;
 	gboolean all = na_object_get_all_mimetypes( object );
 	GList *it;
 
+	g_debug( "%s: all=%s", thisfn, all ? "True":"False" );
+
 	if( !all ){
 		GSList *mimetypes = na_object_get_mimetypes( object );
 		GSList *im;
@@ -520,7 +548,7 @@ is_candidate_for_mimetypes( const NAIContext *object, guint target, GList *files
 		guint count_positive = 0;
 		guint count_compatible = 0;
 
-		for( im = mimetypes ; im && ok ; im = im->data ){
+		for( im = mimetypes ; im && ok ; im = im->next ){
 			const gchar *imtype = ( const gchar * ) im->data;
 			positive = is_positive_assertion( imtype );
 			if( positive ){
@@ -555,6 +583,12 @@ is_candidate_for_mimetypes( const NAIContext *object, guint target, GList *files
 			ok = FALSE;
 		}
 
+		if( !ok ){
+			gchar *mimetypes_str = na_core_utils_slist_to_text( mimetypes );
+			g_debug( "%s: object is not candidate because Mimetypes=%s", thisfn, mimetypes_str );
+			g_free( mimetypes_str );
+		}
+
 		na_core_utils_slist_free( mimetypes );
 	}
 
@@ -601,6 +635,7 @@ split_mimetype( const gchar *mimetype, gchar **group, gchar **subgroup )
 static gboolean
 is_candidate_for_basenames( const NAIContext *object, guint target, GList *files )
 {
+	static const gchar *thisfn = "na_icontext_is_candidate_for_basenames";
 	gboolean ok = TRUE;
 	GSList *basenames = na_object_get_basenames( object );
 
@@ -608,6 +643,12 @@ is_candidate_for_basenames( const NAIContext *object, guint target, GList *files
 		gboolean matchcase = na_object_get_matchcase( object );
 		matchcase = FALSE;
 
+		if( !ok ){
+			gchar *basenames_str = na_core_utils_slist_to_text( basenames );
+			g_debug( "%s: object is not candidate because Basenames=%s", thisfn, basenames_str );
+			g_free( basenames_str );
+		}
+
 		na_core_utils_slist_free( basenames );
 	}
 
@@ -617,6 +658,7 @@ is_candidate_for_basenames( const NAIContext *object, guint target, GList *files
 static gboolean
 is_candidate_for_selection_count( const NAIContext *object, guint target, GList *files )
 {
+	static const gchar *thisfn = "na_icontext_is_candidate_for_selection_count";
 	gboolean ok = TRUE;
 	gchar *selection_count = na_object_get_selection_count( object );
 
@@ -624,6 +666,10 @@ is_candidate_for_selection_count( const NAIContext *object, guint target, GList
 
 	}
 
+	if( !ok ){
+		g_debug( "%s: object is not candidate because SelectionCount=%s", thisfn, selection_count );
+	}
+
 	g_free( selection_count );
 
 	return( ok );
@@ -632,11 +678,18 @@ is_candidate_for_selection_count( const NAIContext *object, guint target, GList
 static gboolean
 is_candidate_for_schemes( const NAIContext *object, guint target, GList *files )
 {
+	static const gchar *thisfn = "na_icontext_is_candidate_for_schemes";
 	gboolean ok = TRUE;
 	GSList *schemes = na_object_get_schemes( object );
 
 	if( schemes ){
 
+		if( !ok ){
+			gchar *schemes_str = na_core_utils_slist_to_text( schemes );
+			g_debug( "%s: object is not candidate because Schemes=%s", thisfn, schemes_str );
+			g_free( schemes_str );
+		}
+
 		na_core_utils_slist_free( schemes );
 	}
 
@@ -646,11 +699,18 @@ is_candidate_for_schemes( const NAIContext *object, guint target, GList *files )
 static gboolean
 is_candidate_for_folders( const NAIContext *object, guint target, GList *files )
 {
+	static const gchar *thisfn = "na_icontext_is_candidate_for_folders";
 	gboolean ok = TRUE;
 	GSList *folders = na_object_get_folders( object );
 
 	if( folders ){
 
+		if( !ok ){
+			gchar *folders_str = na_core_utils_slist_to_text( folders );
+			g_debug( "%s: object is not candidate because Folders=%s", thisfn, folders_str );
+			g_free( folders_str );
+		}
+
 		na_core_utils_slist_free( folders );
 	}
 
@@ -660,11 +720,18 @@ is_candidate_for_folders( const NAIContext *object, guint target, GList *files )
 static gboolean
 is_candidate_for_capabilities( const NAIContext *object, guint target, GList *files )
 {
+	static const gchar *thisfn = "na_icontext_is_candidate_for_capabilities";
 	gboolean ok = TRUE;
 	GSList *capabilities = na_object_get_capabilities( object );
 
 	if( capabilities ){
 
+		if( !ok ){
+			gchar *capabilities_str = na_core_utils_slist_to_text( capabilities );
+			g_debug( "%s: object is not candidate because Capabilities=%s", thisfn, capabilities_str );
+			g_free( capabilities_str );
+		}
+
 		na_core_utils_slist_free( capabilities );
 	}
 
@@ -819,7 +886,6 @@ is_target_selection_candidate( const NAIContext *object, GList *files )
 			tmp_mimetype2 = g_ascii_strdown( tmp_mimetype, strlen( tmp_mimetype ));
 			g_free( tmp_mimetype );
 			tmp_mimetype = tmp_mimetype2;
-			g_debug( "mimetype=%s", tmp_mimetype );
 
 			if( na_selected_info_is_directory( NA_SELECTED_INFO( iter1->data ))){
 				dir_count++;
@@ -1005,6 +1071,39 @@ is_valid_folders( const NAIContext *object )
 }
 
 /*
+ * @context: the #NAIContext object to be checked.
+ *
+ * Check if this object is valid for all mimetypes. This is done at load
+ * time, and let us spend as less time as possible when testing for
+ * candidates.
+ */
+static void
+check_for_all_mimetypes( NAIContext *context )
+{
+	gboolean all = TRUE;
+	GSList *mimetypes = na_object_get_mimetypes( context );
+	GSList *im;
+
+	for( im = mimetypes ; im ; im = im->next ){
+		if( !im->data || !strlen( im->data )){
+			continue;
+		}
+		const gchar *imtype = ( const gchar * ) im->data;
+		if( !strcmp( imtype, "*" ) ||
+			!strcmp( imtype, "*/*" ) ||
+			!strcmp( imtype, "all" ) ||
+			!strcmp( imtype, "all/*" ) ||
+			!strcmp( imtype, "all/all" )){
+				continue;
+		}
+		all = FALSE;
+		break;
+	}
+
+	na_object_set_all_mimetypes( context, all );
+}
+
+/*
  * "image/ *" is a positive assertion
  * "!image/jpeg" is a negative one
  */
@@ -1014,10 +1113,12 @@ is_positive_assertion( const gchar *assertion )
 	gboolean positive = TRUE;
 
 	if( assertion ){
-		const gchar *stripped = g_strstrip(( gchar * ) assertion );
+		gchar *dupped = g_strdup( assertion );
+		const gchar *stripped = g_strstrip( dupped );
 		if( stripped ){
 			positive = ( stripped[0] != '!' );
 		}
+		g_free( dupped );
 	}
 
 	return( positive );
diff --git a/src/core/na-object-action.c b/src/core/na-object-action.c
index c86d232..c69794b 100644
--- a/src/core/na-object-action.c
+++ b/src/core/na-object-action.c
@@ -348,9 +348,9 @@ ifactory_object_read_done( NAIFactoryObject *instance, const NAIFactoryProvider
 	 */
 	deals_with_toolbar_label( instance );
 
-	/* test for all mimetypes
+	/* prepare the context after the reading
 	 */
-	na_icontext_have_all_mimetypes( NA_ICONTEXT( instance ));
+	na_icontext_read_done( NA_ICONTEXT( instance ));
 
 	/* last, set other action defaults
 	 */
diff --git a/src/core/na-object-item-factory.c b/src/core/na-object-item-factory.c
index 7f06fee..180df74 100644
--- a/src/core/na-object-item-factory.c
+++ b/src/core/na-object-item-factory.c
@@ -348,7 +348,7 @@ NADataDef data_def_item [] = {
 
 	/* this integer version number is introduced with .desktop files and obsoletes
 	 * the previous string version number which was only set on actions
-	 * we so have: "1.0" < "1.1" < "2.0" < 1
+	 * we so have: "1.0" < "1.1" < "2.0" < 3
 	 */
 	{ NAFO_DATA_IVERSION,
 				TRUE,
@@ -357,7 +357,7 @@ NADataDef data_def_item [] = {
 				N_( "Version of the format" ),
 				N_( "The version of the configuration format that will be used to manage backward compatibility." ),
 				NAFD_TYPE_UINT,
-				"1",
+				"3",
 				TRUE,
 				TRUE,
 				FALSE,
diff --git a/src/core/na-object-menu.c b/src/core/na-object-menu.c
index 76e19c2..ce24546 100644
--- a/src/core/na-object-menu.c
+++ b/src/core/na-object-menu.c
@@ -326,9 +326,9 @@ ifactory_object_read_start( NAIFactoryObject *instance, const NAIFactoryProvider
 static void
 ifactory_object_read_done( NAIFactoryObject *instance, const NAIFactoryProvider *reader, void *reader_data, GSList **messages )
 {
-	/* test for all mimetypes
+	/* prepare the context after the reading
 	 */
-	na_icontext_have_all_mimetypes( NA_ICONTEXT( instance ));
+	na_icontext_read_done( NA_ICONTEXT( instance ));
 
 	/* last, set other action defaults
 	 */
diff --git a/src/core/na-object-profile.c b/src/core/na-object-profile.c
index ff7b1eb..42146c6 100644
--- a/src/core/na-object-profile.c
+++ b/src/core/na-object-profile.c
@@ -328,9 +328,11 @@ ifactory_object_is_valid( const NAIFactoryObject *object )
 static void
 ifactory_object_read_done( NAIFactoryObject *instance, const NAIFactoryProvider *reader, void *reader_data, GSList **messages )
 {
-	/* test for all mimetypes
+	g_debug( "na_object_profile_ifactory_object_read_done: profile=%p", ( void * ) instance );
+
+	/* prepare the context after the reading
 	 */
-	na_icontext_have_all_mimetypes( NA_ICONTEXT( instance ));
+	na_icontext_read_done( NA_ICONTEXT( instance ));
 
 	/* last, set other action defaults
 	 */
diff --git a/src/io-gconf/nagp-reader.c b/src/io-gconf/nagp-reader.c
index 489d274..626e17c 100644
--- a/src/io-gconf/nagp-reader.c
+++ b/src/io-gconf/nagp-reader.c
@@ -60,6 +60,8 @@ static void          read_done_action_load_profiles_from_list( const NAIFactoryP
 static void          read_done_action_load_profile( const NAIFactoryProvider *provider, ReaderData *data, const gchar *path, GSList **messages );
 static void          read_done_profile_attach_profile( const NAIFactoryProvider *provider, NAObjectProfile *profile, ReaderData *data, GSList **messages );
 
+static void          convert_pre_v3_parameters( NAObjectProfile *profile );
+static void          convert_pre_v3_parameters_str( gchar *str );
 static NADataBoxed  *get_boxed_from_path( const NagpGConfProvider *provider, const gchar *path, ReaderData *reader_data, const NADataDef *def );
 static gboolean      is_key_writable( NagpGConfProvider *gconf, const gchar *key );
 
@@ -315,7 +317,107 @@ read_done_action_load_profile( const NAIFactoryProvider *provider, ReaderData *d
 static void
 read_done_profile_attach_profile( const NAIFactoryProvider *provider, NAObjectProfile *profile, ReaderData *data, GSList **messages )
 {
+	guint iversion;
+
+	g_debug( "nagp_reader_read_done_attach_profile: profile=%p", ( void * ) profile );
+
 	na_object_attach_profile( data->parent, profile );
+
+	/* converts pre-v3 parameters
+	 */
+	iversion = na_object_get_iversion( data->parent );
+	if( iversion < 3 ){
+		convert_pre_v3_parameters( profile );
+	}
+}
+
+/*
+ * starting wih v3, parameters are relabeled
+ *   pre-v3 parameters					post-v3 parameters
+ *   ----------------------------		-----------------------------------
+ *   									%b: (first) basename	(new)
+ *   									%B: list of basenames	(was %m)
+ *   									%c: count				(new)
+ * 	 %d: (first) base directory			...................		(unchanged)
+ * 										%D: list of base dir	(new)
+ *   %f: (first) pathname				...................		(unchanged)
+ *   									%F: list of pathnames	(was %M)
+ *   %h: (first) hostname				...................		(unchanged)
+ *   %m: list of basenames	-> %B		-						(removed)
+ *   %M: list of pathnames	-> %F		-						(removed)
+ *   									%n: (first) username	(was %U)
+ *   %p: (first) port number			...................		(unchanged)
+ *   %R: list of URIs		-> %U		-						(removed)
+ *   %s: (first) scheme					...................		(unchanged)
+ *   %u: (first) URI					...................		(unchanged)
+ *   %U: (first) username	-> %n		%U: list of URIs		(was %R)
+ *   									%w: (first) basename w/o ext.	(new)
+ *   									%W: list of basenames w/o ext.	(new)
+ *   									%x: (first) extension	(new)
+ *   									%X: list of extensions	(new)
+ *   %%: %								...................		(unchanged)
+ *
+ * For pre-v3 items,
+ * - substitute %m with %B
+ * - substitute %M with %F
+ * - substitute %U with %n
+ * - substitute %R with %U
+ *
+ * Note that pre-v3 items only have parameters in the command and path fields.
+ * Are only located in 'profile' objects.
+ * Are only found in GConf provider, as .desktop files have been simultaneously
+ * introduced.
+ */
+static void
+convert_pre_v3_parameters( NAObjectProfile *profile )
+{
+	gchar *path = na_object_get_path( profile );
+	convert_pre_v3_parameters_str( path );
+	na_object_set_path( profile, path );
+	g_free( path );
+
+	gchar *parms = na_object_get_parameters( profile );
+	convert_pre_v3_parameters_str( parms );
+	na_object_set_parameters( profile, parms );
+	g_free( parms );
+}
+
+static void
+convert_pre_v3_parameters_str( gchar *str )
+{
+	gchar *iter = str;
+
+	while(( iter = g_strstr_len( iter, strlen( iter ), "%" )) != NULL ){
+
+		switch( iter[1] ){
+
+			/* %m (list of basenames) becomes %B
+			 */
+			case 'm':
+				iter[1] = 'B';
+				break;
+
+			/* %M (list of filenames) becomes %F
+			 */
+			case 'M':
+				iter[1] = 'F';
+				break;
+
+			/* %U ((first) username) becomes %n
+			 */
+			case 'U':
+				iter[1] = 'n';
+				break;
+
+			/* %R (list of URIs) becomes %U
+			 */
+			case 'R':
+				iter[1] = 'U';
+				break;
+		}
+
+		iter += 2;
+	}
 }
 
 static NADataBoxed *
diff --git a/src/plugin-menu/nautilus-actions.c b/src/plugin-menu/nautilus-actions.c
index b78f915..5e1bccc 100644
--- a/src/plugin-menu/nautilus-actions.c
+++ b/src/plugin-menu/nautilus-actions.c
@@ -86,7 +86,7 @@ static GList            *menu_provider_get_background_items( NautilusMenuProvide
 static GList            *menu_provider_get_file_items( NautilusMenuProvider *provider, GtkWidget *window, GList *files );
 static GList            *menu_provider_get_toolbar_items( NautilusMenuProvider *provider, GtkWidget *window, NautilusFileInfo *current_folder );
 
-static GList            *get_file_or_background_items( NautilusActions *plugin, guint target, void *selection );
+static GList            *get_file_or_background_items( NautilusActions *plugin, guint target, GList *selection );
 static GList            *build_nautilus_menus( NautilusActions *plugin, GList *tree, guint target, GList *files );
 static NAObjectProfile  *get_candidate_profile( NautilusActions *plugin, NAObjectAction *action, guint target, GList *files );
 static NautilusMenuItem *create_item_from_profile( NAObjectProfile *profile, guint target, GList *files );
@@ -404,6 +404,9 @@ menu_provider_get_background_items( NautilusMenuProvider *provider, GtkWidget *w
 	static const gchar *thisfn = "nautilus_actions_menu_provider_get_background_items";
 	GList *nautilus_menus_list = NULL;
 	gchar *uri;
+	GList *selected;
+
+	g_return_val_if_fail( NAUTILUS_IS_ACTIONS( provider ), NULL );
 
 	if( !NAUTILUS_ACTIONS( provider )->private->dispose_has_run ){
 
@@ -412,8 +415,12 @@ menu_provider_get_background_items( NautilusMenuProvider *provider, GtkWidget *w
 				thisfn, ( void * ) provider, ( void * ) window, ( void * ) current_folder, uri );
 		g_free( uri );
 
+		selected = na_selected_info_get_list_from_item( current_folder );
+
 		nautilus_menus_list = get_file_or_background_items(
-				NAUTILUS_ACTIONS( provider ), ITEM_TARGET_LOCATION, ( void * ) current_folder );
+				NAUTILUS_ACTIONS( provider ), ITEM_TARGET_LOCATION, selected );
+
+		na_selected_info_free_list( selected );
 	}
 
 	return( nautilus_menus_list );
@@ -430,9 +437,7 @@ menu_provider_get_file_items( NautilusMenuProvider *provider, GtkWidget *window,
 {
 	static const gchar *thisfn = "nautilus_actions_menu_provider_get_file_items";
 	GList *nautilus_menus_list = NULL;
-
-	g_debug( "%s: provider=%p, window=%p, files=%p, count=%d",
-			thisfn, ( void * ) provider, ( void * ) window, ( void * ) files, g_list_length( files ));
+	GList *selected;
 
 	g_return_val_if_fail( NAUTILUS_IS_ACTIONS( provider ), NULL );
 
@@ -443,8 +448,15 @@ menu_provider_get_file_items( NautilusMenuProvider *provider, GtkWidget *window,
 
 	if( !NAUTILUS_ACTIONS( provider )->private->dispose_has_run ){
 
+		g_debug( "%s: provider=%p, window=%p, files=%p, count=%d",
+				thisfn, ( void * ) provider, ( void * ) window, ( void * ) files, g_list_length( files ));
+
+		selected = na_selected_info_get_list_from_list(( GList * ) files );
+
 		nautilus_menus_list = get_file_or_background_items(
-				NAUTILUS_ACTIONS( provider ), ITEM_TARGET_SELECTION, ( void * ) files );
+				NAUTILUS_ACTIONS( provider ), ITEM_TARGET_SELECTION, selected );
+
+		na_selected_info_free_list( selected );
 	}
 
 	return( nautilus_menus_list );
@@ -464,13 +476,15 @@ menu_provider_get_toolbar_items( NautilusMenuProvider *provider, GtkWidget *wind
 	GList *selected;
 	GList *pivot_tree;
 
-	uri = nautilus_file_info_get_uri( current_folder );
-	g_debug( "%s: provider=%p, window=%p, current_folder=%p (%s)",
-			thisfn, ( void * ) provider, ( void * ) window, ( void * ) current_folder, uri );
-	g_free( uri );
+	g_return_val_if_fail( NAUTILUS_IS_ACTIONS( provider ), NULL );
 
 	if( !NAUTILUS_ACTIONS( provider )->private->dispose_has_run ){
 
+		uri = nautilus_file_info_get_uri( current_folder );
+		g_debug( "%s: provider=%p, window=%p, current_folder=%p (%s)",
+				thisfn, ( void * ) provider, ( void * ) window, ( void * ) current_folder, uri );
+		g_free( uri );
+
 		pivot_tree = na_pivot_get_items( NAUTILUS_ACTIONS( provider )->private->pivot );
 
 		selected = na_selected_info_get_list_from_item( current_folder );
@@ -485,11 +499,10 @@ menu_provider_get_toolbar_items( NautilusMenuProvider *provider, GtkWidget *wind
 }
 
 static GList *
-get_file_or_background_items( NautilusActions *plugin, guint target, void *selection )
+get_file_or_background_items( NautilusActions *plugin, guint target, GList *selection )
 {
 	GList *menus_list;
 	GList *pivot_tree;
-	GList *selected;
 	gboolean root_menu;
 	gboolean add_about;
 
@@ -497,19 +510,7 @@ get_file_or_background_items( NautilusActions *plugin, guint target, void *selec
 
 	pivot_tree = na_pivot_get_items( plugin->private->pivot );
 
-	if( target == ITEM_TARGET_LOCATION ){
-		g_return_val_if_fail( NAUTILUS_IS_FILE_INFO( selection ), NULL );
-		selected = na_selected_info_get_list_from_item( NAUTILUS_FILE_INFO( selection ));
-
-	} else {
-		g_return_val_if_fail( target == ITEM_TARGET_SELECTION, NULL );
-		selected = na_selected_info_get_list_from_list(( GList * ) selection );
-	}
-
-	menus_list = build_nautilus_menus( plugin, pivot_tree, target, selected );
-	/*g_debug( "%s: menus has %d level zero items", thisfn, g_list_length( menus_list ));*/
-
-	na_selected_info_free_list( selected );
+	menus_list = build_nautilus_menus( plugin, pivot_tree, target, selection );
 
 	root_menu = na_iprefs_read_bool( NA_IPREFS( plugin->private->pivot ), IPREFS_CREATE_ROOT_MENU, FALSE );
 	if( root_menu ){
@@ -517,7 +518,6 @@ get_file_or_background_items( NautilusActions *plugin, guint target, void *selec
 	}
 
 	add_about = na_iprefs_read_bool( NA_IPREFS( plugin->private->pivot ), IPREFS_ADD_ABOUT_ITEM, TRUE );
-	/*g_debug( "%s: add_about=%s", thisfn, add_about ? "True":"False" );*/
 	if( add_about ){
 		menus_list = add_about_item( plugin, menus_list );
 	}



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