diff --git a/simgear/misc/sgstream.cxx b/simgear/misc/sgstream.cxx index 59f756d5..9a1dd95b 100644 --- a/simgear/misc/sgstream.cxx +++ b/simgear/misc/sgstream.cxx @@ -43,10 +43,11 @@ sg_gzifstream::sg_gzifstream() // // Open a possibly gzipped file for reading. // -sg_gzifstream::sg_gzifstream( const SGPath& name, ios_openmode io_mode ) +sg_gzifstream::sg_gzifstream( const SGPath& name, ios_openmode io_mode, + bool use_exact_name ) : istream(&gzbuf) { - this->open( name, io_mode ); + this->open( name, io_mode, use_exact_name ); } //----------------------------------------------------------------------------- @@ -62,17 +63,20 @@ sg_gzifstream::sg_gzifstream( int fd, ios_openmode io_mode ) //----------------------------------------------------------------------------- // // Open a possibly gzipped file for reading. -// If the initial open fails and the filename has a ".gz" extension then -// remove the extension and try again. -// If the initial open fails and the filename doesn't have a ".gz" extension -// then append ".gz" and try again. +// If 'use_exact_name' is true, just try to open the indicated file, nothing +// else. Otherwise: +// - if the initial open fails and the filename has a ".gz" extension, then +// remove it and try again; +// - if the initial open fails and the filename doesn't have a ".gz" +// extension, then append ".gz" and try again. // void -sg_gzifstream::open( const SGPath& name, ios_openmode io_mode ) +sg_gzifstream::open( const SGPath& name, ios_openmode io_mode, + bool use_exact_name ) { std::string s = name.utf8Str(); gzbuf.open( s.c_str(), io_mode ); - if ( ! gzbuf.is_open() ) + if ( ! (gzbuf.is_open() || use_exact_name) ) { if ( s.substr( s.length() - 3, 3 ) == ".gz" ) { diff --git a/simgear/misc/sgstream.hxx b/simgear/misc/sgstream.hxx index edd6fd43..66fc8cbd 100644 --- a/simgear/misc/sgstream.hxx +++ b/simgear/misc/sgstream.hxx @@ -54,13 +54,15 @@ public: sg_gzifstream(); /** - * Constructor that attempt to open a file with and without - * ".gz" extension. + * Constructor that attempts to open a file. * @param name name of file * @param io_mode file open mode(s) "or'd" together + * @param use_exact_name if false, try to add or remove a ".gz" extension + * in case the indicated file can't be opened */ sg_gzifstream( const SGPath& name, - ios_openmode io_mode = ios_in | ios_binary ); + ios_openmode io_mode = ios_in | ios_binary, + bool use_exact_name = false ); /** * Constructor that attaches itself to an existing file descriptor. @@ -70,12 +72,15 @@ public: sg_gzifstream( int fd, ios_openmode io_mode = ios_in|ios_binary ); /** - * Attempt to open a file with and without ".gz" extension. + * Attempt to open a file. * @param name name of file * @param io_mode file open mode(s) "or'd" together + * @param use_exact_name if false, try to add or remove a ".gz" extension + * in case the indicated file can't be opened */ void open( const SGPath& name, - ios_openmode io_mode = ios_in|ios_binary ); + ios_openmode io_mode = ios_in|ios_binary, + bool use_exact_name = false ); /** * Attach to an existing file descriptor.