[nautilus-actions] Test if 'isfile' is set before using it when converting to v3
- From: Pierre Wieser <pwieser src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [nautilus-actions] Test if 'isfile' is set before using it when converting to v3
- Date: Sun, 3 Jul 2011 09:36:10 +0000 (UTC)
commit 0c4dcb44c099ad0557edc0c110bfbb67be575d36
Author: Pierre Wieser <pwieser trychlos org>
Date: Wed Jun 8 22:59:26 2011 +0200
Test if 'isfile' is set before using it when converting to v3
Fix #651911 3.1.2 treats isdir differently than 2.30.2
ChangeLog | 30 ++++++++++++++++
docs/reference/nautilus-actions-sections.txt | 3 --
src/api/na-object-api.h | 3 --
src/core/na-factory-object.c | 27 ++++++++++++--
src/core/na-factory-object.h | 1 +
src/core/na-icontext-factory.c | 6 ++--
src/core/na-object-action.c | 49 +++++++++++---------------
src/core/na-object-menu.c | 6 +++-
src/core/na-object-profile.c | 37 ++++++++++++++++---
src/io-desktop/nadp-reader.c | 1 +
src/io-gconf/nagp-reader.c | 3 +-
src/io-xml/naxml-reader.c | 1 +
12 files changed, 118 insertions(+), 49 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index d0d4733..84a25f3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,33 @@
+2011-06-08 Pierre Wieser <pwieser trychlos org>
+
+ * src/api/na-object-api.h:
+ * docs/reference/nautilus-actions-sections.txt
+ (na_object_is_file, na_object_is_dir, na_object_is_multiple):
+ Macros are moved from the official API as deprecated.
+
+ * src/core/na-icontext-factory.c
+ (ISFILE, ISDIR): No more declare properties for deprecated data.
+ (SCHEMES): Declare 'file' as the default.
+
+ * src/core/na-factory-object.c:
+ * src/core/na-factory-object.h (na_factory_object_is_set): New function.
+
+ * src/core/na-object-action.c (ifactory_object_read_done):
+ Dump the rough read data.
+ First create a v2 profile before converting it to last version.
+
+ * src/core/na-object-menu.c (ifactory_object_read_done):
+ Dump the rough read data.
+
+ * src/core/na-object-profile.c
+ (ifactory_object_read_done): Dump the rough read data.
+ (convert_pre_v3_isfiledir): Test if 'isfile' is set before using it.
+
+ * src/io-desktop/nadp-reader.c (nadp_iio_provider_read_items):
+ * src/io-gconf/nagp-reader.c (nagp_iio_provider_read_items):
+ * src/io-xml/naxml-reader.c (naxml_reader_import_from_uri):
+ Dump the whole read item, maybe after conversion.
+
2011-05-22 Pierre Wieser <pwieser trychlos org>
* src/core/na-iimporter.c (na_iimporter_manage_import_mode):
diff --git a/docs/reference/nautilus-actions-sections.txt b/docs/reference/nautilus-actions-sections.txt
index 0bda1e2..1062cc9 100644
--- a/docs/reference/nautilus-actions-sections.txt
+++ b/docs/reference/nautilus-actions-sections.txt
@@ -618,9 +618,6 @@ na_object_attach_profile
na_object_get_path
na_object_get_parameters
na_object_get_working_dir
-na_object_is_file
-na_object_is_dir
-na_object_is_multiple
na_object_get_execution_mode
na_object_get_startup_notify
na_object_get_startup_class
diff --git a/src/api/na-object-api.h b/src/api/na-object-api.h
index 5796232..530c490 100644
--- a/src/api/na-object-api.h
+++ b/src/api/na-object-api.h
@@ -162,9 +162,6 @@ G_BEGIN_DECLS
#define na_object_get_path( obj ) (( gchar * ) na_ifactory_object_get_as_void( NA_IFACTORY_OBJECT( obj ), NAFO_DATA_PATH ))
#define na_object_get_parameters( obj ) (( gchar * ) na_ifactory_object_get_as_void( NA_IFACTORY_OBJECT( obj ), NAFO_DATA_PARAMETERS ))
#define na_object_get_working_dir( obj ) (( gchar * ) na_ifactory_object_get_as_void( NA_IFACTORY_OBJECT( obj ), NAFO_DATA_WORKING_DIR ))
-#define na_object_is_file( obj ) (( gboolean ) GPOINTER_TO_UINT( na_ifactory_object_get_as_void( NA_IFACTORY_OBJECT( obj ), NAFO_DATA_ISFILE )))
-#define na_object_is_dir( obj ) (( gboolean ) GPOINTER_TO_UINT( na_ifactory_object_get_as_void( NA_IFACTORY_OBJECT( obj ), NAFO_DATA_ISDIR )))
-#define na_object_is_multiple( obj ) (( gboolean ) GPOINTER_TO_UINT( na_ifactory_object_get_as_void( NA_IFACTORY_OBJECT( obj ), NAFO_DATA_MULTIPLE )))
#define na_object_get_execution_mode( obj ) (( gchar * ) na_ifactory_object_get_as_void( NA_IFACTORY_OBJECT( obj ), NAFO_DATA_EXECUTION_MODE ))
#define na_object_get_startup_notify( obj ) (( gboolean ) GPOINTER_TO_UINT( na_ifactory_object_get_as_void( NA_IFACTORY_OBJECT( obj ), NAFO_DATA_STARTUP_NOTIFY )))
#define na_object_get_startup_class( obj ) (( gchar * ) na_ifactory_object_get_as_void( NA_IFACTORY_OBJECT( obj ), NAFO_DATA_STARTUP_WMCLASS ))
diff --git a/src/core/na-factory-object.c b/src/core/na-factory-object.c
index ccf6380..5161b71 100644
--- a/src/core/na-factory-object.c
+++ b/src/core/na-factory-object.c
@@ -751,10 +751,10 @@ na_factory_object_get_as_value( const NAIFactoryObject *object, const gchar *nam
*
* Returns: the searched value.
*
- * If the type of the value is NA_DATA_TYPE_STRING, NA_DATA_TYPE_LOCALE_STRING,
- * or NA_DATA_TYPE_STRING_LIST, then the returned value is a newly allocated
- * one and should be g_free() (resp. na_core_utils_slist_free()) by the
- * caller.
+ * If the type of the value is NA_DATA_TYPE_STRING or NA_DATA_TYPE_LOCALE_STRING
+ * (resp. NA_DATA_TYPE_STRING_LIST), then the returned value is a newly allocated
+ * string (resp. GSList) and should be g_free() (resp. na_core_utils_slist_free())
+ * by the caller.
*/
void *
na_factory_object_get_as_void( const NAIFactoryObject *object, const gchar *name )
@@ -775,6 +775,25 @@ na_factory_object_get_as_void( const NAIFactoryObject *object, const gchar *name
}
/*
+ * na_factory_object_is_set:
+ * @object: this #NAIFactoryObject instance.
+ * @name: the elementary data whose value is to be tested.
+ *
+ * Returns: %TRUE if the value is set (may be %NULL), %FALSE else.
+ */
+gboolean
+na_factory_object_is_set( const NAIFactoryObject *object, const gchar *name )
+{
+ NADataBoxed *boxed;
+
+ g_return_val_if_fail( NA_IS_IFACTORY_OBJECT( object ), FALSE );
+
+ boxed = na_ifactory_object_get_data_boxed( object, name );
+
+ return( boxed != NULL );
+}
+
+/*
* na_factory_object_set_from_value:
* @object: this #NAIFactoryObject instance.
* @name: the elementary data id.
diff --git a/src/core/na-factory-object.h b/src/core/na-factory-object.h
index 1ce88d1..e0e2f64 100644
--- a/src/core/na-factory-object.h
+++ b/src/core/na-factory-object.h
@@ -68,6 +68,7 @@ guint na_factory_object_write_item ( NAIFactoryObject *object, cons
void *na_factory_object_get_as_void ( const NAIFactoryObject *object, const gchar *name );
void na_factory_object_get_as_value ( const NAIFactoryObject *object, const gchar *name, GValue *value );
+gboolean na_factory_object_is_set ( const NAIFactoryObject *object, const gchar *name );
void na_factory_object_set_from_value ( NAIFactoryObject *object, const gchar *name, const GValue *value );
void na_factory_object_set_from_void ( NAIFactoryObject *object, const gchar *name, const void *data );
diff --git a/src/core/na-icontext-factory.c b/src/core/na-icontext-factory.c
index 2ba3a0d..1ce9965 100644
--- a/src/core/na-icontext-factory.c
+++ b/src/core/na-icontext-factory.c
@@ -171,7 +171,7 @@ NADataDef data_def_conditions [] = {
{ NAFO_DATA_ISFILE,
TRUE,
FALSE,
- TRUE,
+ FALSE,
N_( "Whether the profile applies to files (deprecated option, see mimetype)" ),
/* i18n: 'true' and 'false' values are taken literally, and should not be translated */
N_( "Set to 'true' if the selection can have files, to 'false' otherwise.\n" \
@@ -202,7 +202,7 @@ NADataDef data_def_conditions [] = {
{ NAFO_DATA_ISDIR,
TRUE,
FALSE,
- TRUE,
+ FALSE,
N_( "Whether the profile applies to folders (deprecated option, see mimetype)" ),
/* i18n: 'true' and 'false' values are taken literally, and should not be translated */
N_( "Set to 'true' if the selection can have folders, to 'false' otherwise.\n" \
@@ -284,7 +284,7 @@ NADataDef data_def_conditions [] = {
"or when targeting the special 'x-nautilus-desktop' scheme.\n" \
"Defaults to 'file'." ),
NA_DATA_TYPE_STRING_LIST,
- "*",
+ "file",
FALSE,
TRUE,
TRUE,
diff --git a/src/core/na-object-action.c b/src/core/na-object-action.c
index 65b69b4..4e00716 100644
--- a/src/core/na-object-action.c
+++ b/src/core/na-object-action.c
@@ -86,8 +86,8 @@ static guint ifactory_object_write_done( NAIFactoryObject *instance, cons
static void icontext_iface_init( NAIContextInterface *iface );
static gboolean icontext_is_candidate( NAIContext *object, guint target, GList *selection );
-static gboolean read_done_convert_v1_to_last( NAIFactoryObject *instance );
-static void read_done_deals_with_toolbar_label( NAIFactoryObject *instance );
+static NAObjectProfile *read_done_convert_v1_to_v2( NAIFactoryObject *instance );
+static void read_done_deals_with_toolbar_label( NAIFactoryObject *instance );
static guint write_done_write_profiles( NAIFactoryObject *instance, const NAIFactoryProvider *writer, void *writer_data, GSList **messages );
@@ -378,24 +378,28 @@ ifactory_object_get_groups( const NAIFactoryObject *instance )
/*
* at this time, we don't yet have read the profiles as this will be
- * done in ifactory_provider_read_done - we so just be able to deal with
+ * triggered by ifactory_provider_read_done - we so just be able to deal with
* action-specific properties (not check for profiles consistency)
*/
static void
ifactory_object_read_done( NAIFactoryObject *instance, const NAIFactoryProvider *reader, void *reader_data, GSList **messages )
{
guint iversion;
+ NAObjectProfile *profile;
g_debug( "na_object_action_ifactory_object_read_done: instance=%p", ( void * ) instance );
+ na_factory_object_dump( instance );
+
na_object_item_deals_with_version( NA_OBJECT_ITEM( instance ));
- /* may attach a new profile if we detect a pre-v2 action
+ /* should attach a new profile if we detect a pre-v2 action
* the v1_to_v2 conversion must be followed by a v2_to_v3 one
*/
iversion = na_object_get_iversion( instance );
if( iversion < 2 ){
- read_done_convert_v1_to_last( instance );
+ profile = read_done_convert_v1_to_v2( instance );
+ na_object_profile_convert_v2_to_last( profile );
}
/* deals with obsoleted data, i.e. data which may have been written in the past
@@ -407,9 +411,7 @@ ifactory_object_read_done( NAIFactoryObject *instance, const NAIFactoryProvider
*/
na_icontext_read_done( NA_ICONTEXT( instance ));
- na_object_dump( instance );
-
- /* last, set other action defaults
+ /* last, set action defaults
*/
na_factory_object_set_defaults( instance );
}
@@ -451,18 +453,17 @@ icontext_is_candidate( NAIContext *object, guint target, GList *selection )
}
/*
- * do we have a pre-v2 action ?
- * it is be identified by an version = "1.x"
+ * if we have a pre-v2 action
* any data found in data_def_action_v1 (defined in na-object-action-factory.c)
- * is obsoleted and moved to a new profile
+ * is obsoleted and should be moved to a new profile
*
* actions read from .desktop already have iversion=3 (cf. desktop_read_start)
- * and v1 actions may only come from xml or gconf
+ * so v1 actions may only come from xml or gconf
*
- * returns TRUE if this actually was a v1 action which has been converted to v2
+ * returns the newly defined profile
*/
-static gboolean
-read_done_convert_v1_to_last( NAIFactoryObject *instance )
+static NAObjectProfile *
+read_done_convert_v1_to_v2( NAIFactoryObject *instance )
{
static const gchar *thisfn = "na_object_action_read_done_read_done_convert_v1_to_last";
GList *to_move;
@@ -478,7 +479,7 @@ read_done_convert_v1_to_last( NAIFactoryObject *instance )
def = data_def_action_v1;
while( def->name ){
- boxed = na_ifactory_object_get_data_boxed( instance , def->name );
+ boxed = na_ifactory_object_get_data_boxed( instance, def->name );
if( boxed ){
g_debug( "%s: boxed=%p (%s) marked to be moved from action body to profile",
thisfn, ( void * ) boxed, def->name );
@@ -487,10 +488,6 @@ read_done_convert_v1_to_last( NAIFactoryObject *instance )
def++;
}
- if( !to_move ){
- return( FALSE );
- }
-
/* now create a new profile
*/
profile = na_object_profile_new();
@@ -498,16 +495,12 @@ read_done_convert_v1_to_last( NAIFactoryObject *instance )
na_object_set_label( profile, _( "Profile automatically created from pre-v2 action" ));
na_object_attach_profile( instance, profile );
- if( to_move ){
- for( ibox = to_move ; ibox ; ibox = ibox->next ){
- na_factory_object_move_boxed(
- NA_IFACTORY_OBJECT( profile ), instance, NA_DATA_BOXED( ibox->data ));
- }
+ for( ibox = to_move ; ibox ; ibox = ibox->next ){
+ na_factory_object_move_boxed(
+ NA_IFACTORY_OBJECT( profile ), instance, NA_DATA_BOXED( ibox->data ));
}
- na_factory_object_set_defaults( NA_IFACTORY_OBJECT( profile ));
- na_object_profile_convert_v2_to_last( profile );
- return( TRUE );
+ return( profile );
}
/*
diff --git a/src/core/na-object-menu.c b/src/core/na-object-menu.c
index 7c1d86a..588924e 100644
--- a/src/core/na-object-menu.c
+++ b/src/core/na-object-menu.c
@@ -295,13 +295,17 @@ ifactory_object_get_groups( const NAIFactoryObject *instance )
static void
ifactory_object_read_done( NAIFactoryObject *instance, const NAIFactoryProvider *reader, void *reader_data, GSList **messages )
{
+ g_debug( "na_object_menu_ifactory_object_read_done: instance=%p", ( void * ) instance );
+
+ na_factory_object_dump( instance );
+
na_object_item_deals_with_version( NA_OBJECT_ITEM( instance ));
/* prepare the context after the reading
*/
na_icontext_read_done( NA_ICONTEXT( instance ));
- /* last, set other menu defaults
+ /* last, set menu defaults
*/
na_factory_object_set_defaults( instance );
}
diff --git a/src/core/na-object-profile.c b/src/core/na-object-profile.c
index 8f2edd9..2627f89 100644
--- a/src/core/na-object-profile.c
+++ b/src/core/na-object-profile.c
@@ -61,6 +61,10 @@ struct _NAObjectProfilePrivate {
#define PROFILE_NAME_PREFIX "profile-"
+#define na_object_is_file( obj ) (( gboolean ) GPOINTER_TO_UINT( na_ifactory_object_get_as_void( NA_IFACTORY_OBJECT( obj ), NAFO_DATA_ISFILE )))
+#define na_object_is_dir( obj ) (( gboolean ) GPOINTER_TO_UINT( na_ifactory_object_get_as_void( NA_IFACTORY_OBJECT( obj ), NAFO_DATA_ISDIR )))
+#define na_object_is_multiple( obj ) (( gboolean ) GPOINTER_TO_UINT( na_ifactory_object_get_as_void( NA_IFACTORY_OBJECT( obj ), NAFO_DATA_MULTIPLE )))
+
extern NADataGroup profile_data_groups []; /* defined in na-item-profile-factory.c */
static NAObjectIdClass *st_parent_class = NULL;
@@ -344,7 +348,9 @@ ifactory_object_read_done( NAIFactoryObject *instance, const NAIFactoryProvider
NAObjectAction *action;
guint iversion;
- g_debug( "%s: profile=%p", thisfn, ( void * ) instance );
+ g_debug( "%s: instance=%p", thisfn, ( void * ) instance );
+
+ na_factory_object_dump( instance );
/* converts pre-v3 data
*/
@@ -354,9 +360,12 @@ ifactory_object_read_done( NAIFactoryObject *instance, const NAIFactoryProvider
if( iversion < 3 ){
na_object_profile_convert_v2_to_last( NA_OBJECT_PROFILE( instance ));
- }
- read_done_ending( NA_OBJECT_PROFILE( instance ));
+ /* must be always called, but is called when converting profile, anyway
+ */
+ } else {
+ read_done_ending( NA_OBJECT_PROFILE( instance ));
+ }
}
static guint
@@ -577,7 +586,13 @@ convert_pre_v3_isfiledir( NAObjectProfile *profile )
mimetypes = NULL;
before_list = na_object_get_mimetypes( profile );
- isfile = na_object_is_file( profile );
+ /* this is needed because na_object_is_file() does not return the default
+ * value when the data is not set (see #651911)
+ */
+ isfile = TRUE;
+ if( na_factory_object_is_set( NA_IFACTORY_OBJECT( profile ), NAFO_DATA_ISFILE )){
+ isfile = na_object_is_file( profile );
+ }
isdir = na_object_is_dir( profile );
if( isfile ){
@@ -633,11 +648,17 @@ read_done_ending( NAObjectProfile *profile )
*/
na_icontext_read_done( NA_ICONTEXT( profile ));
- /* last, set other action defaults
+ /* last, set profile defaults
*/
na_factory_object_set_defaults( NA_IFACTORY_OBJECT( profile ));
}
+/*
+ * GConf used to store command path and parameters as two separated fields
+ * Desktop store them as one field
+ * NACT displays and edits them as two fields (this let us have Browse and Legend buttons)
+ * => so we definitively keep them as separated boxed in our internal objects
+ */
static void
split_path_parameters( NAObjectProfile *profile )
{
@@ -757,7 +778,11 @@ na_object_profile_new_with_defaults( void )
* na_object_profile_convert_v2_to_last:
* @profile: the #NAObjectProfile profile to be converted.
*
- * Converts to v3 a @profile which has just been created from a pre-v2 action.
+ * Converts a v2 profile to the last version, setting the defaults as needed.
+ *
+ * This is called after having converted a pre-v2 action on the newly created
+ * profile, or just after having read a v2 profile.
+ * In all situations, defaults are supposed to have been set.
*
* Since: 2.30
*/
diff --git a/src/io-desktop/nadp-reader.c b/src/io-desktop/nadp-reader.c
index 8f2bb6c..26bbcd9 100644
--- a/src/io-desktop/nadp-reader.c
+++ b/src/io-desktop/nadp-reader.c
@@ -105,6 +105,7 @@ nadp_iio_provider_read_items( const NAIIOProvider *provider, GSList **messages )
if( item ){
items = g_list_prepend( items, item );
+ na_object_dump( item );
}
}
diff --git a/src/io-gconf/nagp-reader.c b/src/io-gconf/nagp-reader.c
index 50e85cf..f8fdc23 100644
--- a/src/io-gconf/nagp-reader.c
+++ b/src/io-gconf/nagp-reader.c
@@ -95,6 +95,7 @@ nagp_iio_provider_read_items( const NAIIOProvider *provider, GSList **messages )
item = read_item( self, ( const gchar * ) ip->data, messages );
if( item ){
items_list = g_list_prepend( items_list, item );
+ na_object_dump( item );
}
}
@@ -357,11 +358,11 @@ get_boxed_from_path( const NagpGConfProvider *provider, const gchar *path, Reade
gint int_value;
boxed = NULL;
+ boxed = na_data_boxed_new( def );
have_entry = na_gconf_utils_has_entry( reader_data->entries, def->gconf_entry );
g_debug( "%s: entry=%s, have_entry=%s", thisfn, def->gconf_entry, have_entry ? "True":"False" );
if( have_entry ){
- boxed = na_data_boxed_new( def );
gchar *entry_path = gconf_concat_dir_and_key( path, def->gconf_entry );
switch( def->type ){
diff --git a/src/io-xml/naxml-reader.c b/src/io-xml/naxml-reader.c
index 13d21c4..0ee1fe6 100644
--- a/src/io-xml/naxml-reader.c
+++ b/src/io-xml/naxml-reader.c
@@ -352,6 +352,7 @@ naxml_reader_import_from_uri( const NAIImporter *instance, NAIImporterImportFrom
if( code == IMPORTER_CODE_OK ){
publish_undealt_nodes( reader );
+ na_object_dump( reader->private->parms->imported );
}
g_object_unref( reader );
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]