* more robust open/save/import dialog path handling (could crash by opening file w/o extension or with illegal one)
likely fix for extensions in uppercase in OSes with case dependent FSes
This commit is contained in:
parent
a13ad776b4
commit
bbc691a07b
|
|
@ -128,8 +128,6 @@ filetype_pair_t GetTypeForGTKMask( const char *mask ) const {
|
||||||
static char g_file_dialog_file[1024];
|
static char g_file_dialog_file[1024];
|
||||||
|
|
||||||
const char* file_dialog_show( GtkWidget* parent, bool open, const char* title, const char* path, const char* pattern, bool want_load, bool want_import, bool want_save ){
|
const char* file_dialog_show( GtkWidget* parent, bool open, const char* title, const char* path, const char* pattern, bool want_load, bool want_import, bool want_save ){
|
||||||
filetype_t type;
|
|
||||||
|
|
||||||
if ( pattern == 0 ) {
|
if ( pattern == 0 ) {
|
||||||
pattern = "*";
|
pattern = "*";
|
||||||
}
|
}
|
||||||
|
|
@ -213,18 +211,26 @@ const char* file_dialog_show( GtkWidget* parent, bool open, const char* title, c
|
||||||
strcpy( g_file_dialog_file, gtk_file_chooser_get_filename( GTK_FILE_CHOOSER( dialog ) ) );
|
strcpy( g_file_dialog_file, gtk_file_chooser_get_filename( GTK_FILE_CHOOSER( dialog ) ) );
|
||||||
|
|
||||||
if ( !string_equal( pattern, "*" ) ) {
|
if ( !string_equal( pattern, "*" ) ) {
|
||||||
|
const char* extension = path_get_extension( g_file_dialog_file ); /* anything may be entered via 'location' dialog field, thus try to be safe */
|
||||||
|
if ( string_empty( extension ) ) { /* add an extension */
|
||||||
|
filetype_t type;
|
||||||
GtkFileFilter* filter = gtk_file_chooser_get_filter( GTK_FILE_CHOOSER( dialog ) );
|
GtkFileFilter* filter = gtk_file_chooser_get_filter( GTK_FILE_CHOOSER( dialog ) );
|
||||||
if ( filter != 0 && !string_equal( gtk_file_filter_get_name( filter ), "All supported formats" ) ) { // no filter set? some file-chooser implementations may allow the user to set no filter, which we treat as 'all files'
|
if ( filter != 0 // no filter set? some file-chooser implementations may allow the user to set no filter, which we treat as 'all files'
|
||||||
|
&& !string_equal( gtk_file_filter_get_name( filter ), "All supported formats" ) )
|
||||||
type = masks.GetTypeForGTKMask( gtk_file_filter_get_name( filter ) ).m_type;
|
type = masks.GetTypeForGTKMask( gtk_file_filter_get_name( filter ) ).m_type;
|
||||||
// last ext separator
|
else
|
||||||
const char* extension = path_get_extension( g_file_dialog_file );
|
type = masks.GetTypeForGTKMask( ( *masks.m_masks.begin() ).c_str() ).m_type;
|
||||||
// no extension
|
|
||||||
if ( string_empty( extension ) ) {
|
|
||||||
strcat( g_file_dialog_file, type.pattern + 1 );
|
strcat( g_file_dialog_file, type.pattern + 1 );
|
||||||
}
|
}
|
||||||
else
|
else{ /* validate extension */
|
||||||
{
|
bool valid = false;
|
||||||
strcpy( g_file_dialog_file + ( extension - g_file_dialog_file ), type.pattern + 2 );
|
for ( std::size_t i = 0; i < masks.m_filters.size(); ++i )
|
||||||
|
if( string_length( masks.m_filters[i].c_str() ) >= 2 && string_equal_nocase( extension, masks.m_filters[i].c_str() + 2 ) )
|
||||||
|
valid = true;
|
||||||
|
if( !valid ){
|
||||||
|
g_file_dialog_file[0] = '\0';
|
||||||
|
globalErrorStream() << makeQuoted( extension ) << " is unsupported file type for requested operation\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user