From a36425f78f04b46c186cbd3b16730b1e2bae02e2 Mon Sep 17 00:00:00 2001 From: Pierre Wieser Date: Tue, 29 Nov 2011 20:50:37 +0100 Subject: [PATCH] NadpDesktopFile: do not try to import empty or not DES-EMA files --- ChangeLog | 4 +++ src/io-desktop/nadp-desktop-file.c | 65 ++++++++++++++++++++++++++------------ src/io-desktop/nadp-reader.c | 2 +- 3 files changed, 50 insertions(+), 21 deletions(-) diff --git a/ChangeLog b/ChangeLog index 30f0ab66..0b274510 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2011-11-28 Pierre Wieser + * src/io-desktop/nadp-desktop-file.c (check_key_file): + - Do not even try to read zero byte length files. + - Check Type key before trying to import the file. + * src/core/na-importer-ask.c: * src/core/na-importer-ask.ui: Make NAImporterAsk normally answer to response codes, and quit on Esc. diff --git a/src/io-desktop/nadp-desktop-file.c b/src/io-desktop/nadp-desktop-file.c index 04102187..50d83c00 100644 --- a/src/io-desktop/nadp-desktop-file.c +++ b/src/io-desktop/nadp-desktop-file.c @@ -53,6 +53,7 @@ struct _NadpDesktopFilePrivate { gboolean dispose_has_run; gchar *id; gchar *uri; + gchar *type; GKeyFile *key_file; }; @@ -178,6 +179,7 @@ instance_finalize( GObject *object ) g_free( self->private->id ); g_free( self->private->uri ); + g_free( self->private->type ); if( self->private->key_file ){ g_key_file_free( self->private->key_file ); @@ -280,10 +282,14 @@ nadp_desktop_file_new_from_uri( const gchar *uri ) g_debug( "%s: uri=%s", thisfn, uri ); g_return_val_if_fail( uri && g_utf8_strlen( uri, -1 ), ndf ); - ndf = ndf_new( uri ); data = na_core_utils_file_load_from_uri( uri, &length ); + if( !length ){ + g_debug( "%s: file is empty", thisfn ); + return( NULL ); + } error = NULL; + ndf = ndf_new( uri ); g_key_file_load_from_data( ndf->private->key_file, data, length, G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, &error ); g_free( data ); @@ -439,6 +445,7 @@ check_key_file( NadpDesktopFile *ndf ) gchar *start_group; gboolean has_key; gboolean hidden; + gchar *type; GError *error; ret = TRUE; @@ -472,6 +479,42 @@ check_key_file( NadpDesktopFile *ndf ) } } + /* must have no Type (which defaults to Action) + * or a known one (Action or Menu) + */ + if( ret ){ + type = NULL; + has_key = g_key_file_has_key( ndf->private->key_file, start_group, NADP_KEY_TYPE, &error ); + if( error ){ + g_debug( "%s: %s", thisfn, error->message ); + g_error_free( error ); + ret = FALSE; + + } else if( has_key ){ + type = g_key_file_get_string( ndf->private->key_file, start_group, NADP_KEY_TYPE, &error ); + if( error ){ + g_debug( "%s: %s", thisfn, error->message ); + g_free( type ); + g_error_free( error ); + ret = FALSE; + } + } + if( ret ){ + if( !type || !strlen( type )){ + type = g_strdup( NADP_VALUE_TYPE_ACTION ); + + } else if( strcmp( type, NADP_VALUE_TYPE_MENU ) && strcmp( type, NADP_VALUE_TYPE_ACTION )){ + g_debug( "%s: unmanaged type: %s", thisfn, type ); + g_free( type ); + ret = FALSE; + } + } + if( ret ){ + g_return_val_if_fail( type && strlen( type ), FALSE ); + ndf->private->type = type; + } + } + g_free( start_group ); return( ret ); @@ -487,10 +530,7 @@ check_key_file( NadpDesktopFile *ndf ) gchar * nadp_desktop_file_get_file_type( const NadpDesktopFile *ndf ) { - static const gchar *thisfn = "nadp_desktop_file_get_file_type"; gchar *type; - gboolean has_key; - GError *error; g_return_val_if_fail( NADP_IS_DESKTOP_FILE( ndf ), NULL ); @@ -498,22 +538,7 @@ nadp_desktop_file_get_file_type( const NadpDesktopFile *ndf ) if( !ndf->private->dispose_has_run ){ - error = NULL; - - has_key = g_key_file_has_key( ndf->private->key_file, NADP_GROUP_DESKTOP, NADP_KEY_TYPE, &error ); - if( error ){ - g_warning( "%s: %s", thisfn, error->message ); - g_error_free( error ); - - } else if( has_key ){ - type = g_key_file_get_string( ndf->private->key_file, NADP_GROUP_DESKTOP, NADP_KEY_TYPE, &error ); - if( error ){ - g_warning( "%s: %s", thisfn, error->message ); - g_error_free( error ); - g_free( type ); - type = NULL; - } - } + type = g_strdup( ndf->private->type ); } return( type ); diff --git a/src/io-desktop/nadp-reader.c b/src/io-desktop/nadp-reader.c index 7fee9633..f2037df7 100644 --- a/src/io-desktop/nadp-reader.c +++ b/src/io-desktop/nadp-reader.c @@ -279,7 +279,7 @@ item_from_desktop_file( const NadpDesktopProvider *provider, NadpDesktopFile *nd item = NULL; type = nadp_desktop_file_get_file_type( ndf ); - if( !type || !strlen( type ) || !strcmp( type, NADP_VALUE_TYPE_ACTION )){ + if( !strcmp( type, NADP_VALUE_TYPE_ACTION )){ item = NA_IFACTORY_OBJECT( na_object_action_new()); } else if( !strcmp( type, NADP_VALUE_TYPE_MENU )){ -- 2.11.4.GIT