diff --git a/include/DataFile.h b/include/DataFile.h index 1d5f71f78..c8586fd9d 100644 --- a/include/DataFile.h +++ b/include/DataFile.h @@ -58,6 +58,12 @@ public: virtual ~DataFile(); + /// + /// \brief validate + /// performs basic validation, compared to file extension. + /// + bool validate( QString extension ); + QString nameWithExtension( const QString& fn ) const; void write( QTextStream& strm ); diff --git a/include/PresetPreviewPlayHandle.h b/include/PresetPreviewPlayHandle.h index 6dd8c8e19..0ebed9c89 100644 --- a/include/PresetPreviewPlayHandle.h +++ b/include/PresetPreviewPlayHandle.h @@ -35,7 +35,7 @@ class PreviewTrackContainer; class EXPORT PresetPreviewPlayHandle : public PlayHandle { public: - PresetPreviewPlayHandle( const QString& presetFile, bool loadByPlugin = false ); + PresetPreviewPlayHandle( const QString& presetFile, bool loadByPlugin = false, DataFile *dataFile = 0 ); virtual ~PresetPreviewPlayHandle(); virtual void play( sampleFrame* buffer ); diff --git a/src/core/DataFile.cpp b/src/core/DataFile.cpp index 1e79b0c08..15fa5abde 100644 --- a/src/core/DataFile.cpp +++ b/src/core/DataFile.cpp @@ -163,6 +163,53 @@ DataFile::~DataFile() +bool DataFile::validate( QString extension ) +{ + switch( m_type ) + { + case Type::SongProject: + if( extension == "mmp" || extension == "mmpz" ) + { + return true; + } + break; + case Type::SongProjectTemplate: + if( extension == "mpt" ) + { + return true; + } + break; + case Type::InstrumentTrackSettings: + if ( extension == "xpf" || extension == "xml" ) + { + return true; + } + break; + case Type::UnknownType: + if (! ( extension == "mmp" || extension == "mpt" || extension == "mmpz" || + extension == "xpf" || extension == "xml" || + ( extension == "xiz" && Engine::pluginFileHandling().contains( extension ) ) || + extension == "sf2" || extension == "pat" || extension == "mid" || + extension == "flp" || extension == "dll" + ) ) + { + return true; + } + if( extension == "wav" || extension == "ogg" || + extension == "ds" ) + { + return true; + } + break; + default: + return false; + } + return false; +} + + + + QString DataFile::nameWithExtension( const QString & _fn ) const { switch( type() ) diff --git a/src/core/PresetPreviewPlayHandle.cpp b/src/core/PresetPreviewPlayHandle.cpp index 09ebaca16..a91681758 100644 --- a/src/core/PresetPreviewPlayHandle.cpp +++ b/src/core/PresetPreviewPlayHandle.cpp @@ -111,7 +111,7 @@ PreviewTrackContainer * PresetPreviewPlayHandle::s_previewTC; -PresetPreviewPlayHandle::PresetPreviewPlayHandle( const QString & _preset_file, bool _load_by_plugin ) : +PresetPreviewPlayHandle::PresetPreviewPlayHandle( const QString & _preset_file, bool _load_by_plugin, DataFile *dataFile ) : PlayHandle( TypePresetPreviewHandle ), m_previewNote( NULL ) { @@ -144,22 +144,32 @@ PresetPreviewPlayHandle::PresetPreviewPlayHandle( const QString & _preset_file, } else { - DataFile dataFile( _preset_file ); + bool dataFileCreated = false; + if( dataFile == 0 ) + { + dataFile = new DataFile( _preset_file ); + dataFileCreated = true; + } + // vestige previews are bug prone; fallback on 3xosc with volume of 0 // without an instrument in preview track, it will segfault - if(dataFile.content().elementsByTagName( "vestige" ).length() == 0 ) + if(dataFile->content().elementsByTagName( "vestige" ).length() == 0 ) { s_previewTC->previewInstrumentTrack()-> loadTrackSpecificSettings( - dataFile.content().firstChild().toElement() ); + dataFile->content().firstChild().toElement() ); } else { s_previewTC->previewInstrumentTrack()->loadInstrument("tripleoscillator"); s_previewTC->previewInstrumentTrack()->setVolume( 0 ); } + if( dataFileCreated ) + { + delete dataFile; + } } - + dataFile = 0; // make sure, our preset-preview-track does not appear in any MIDI- // devices list, so just disable receiving/sending MIDI-events at all s_previewTC->previewInstrumentTrack()-> diff --git a/src/core/Song.cpp b/src/core/Song.cpp index 6759abb4b..0f688a1b1 100644 --- a/src/core/Song.cpp +++ b/src/core/Song.cpp @@ -942,7 +942,7 @@ void Song::loadProject( const QString & fileName ) DataFile dataFile( m_fileName ); // if file could not be opened, head-node is null and we create // new project - if( dataFile.head().isNull() ) + if( dataFile.validate( fileName.right( fileName.lastIndexOf(".") ) ) ) { return; } diff --git a/src/gui/FileBrowser.cpp b/src/gui/FileBrowser.cpp index 0d19ec6aa..942e1f360 100644 --- a/src/gui/FileBrowser.cpp +++ b/src/gui/FileBrowser.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include "FileBrowser.h" #include "BBTrackContainer.h" @@ -461,7 +462,17 @@ void FileBrowserTreeWidget::mousePressEvent(QMouseEvent * me ) ( f->handling() == FileItem::LoadAsPreset || f->handling() == FileItem::LoadByPlugin ) ) { - m_previewPlayHandle = new PresetPreviewPlayHandle( f->fullName(), f->handling() == FileItem::LoadByPlugin ); + DataFile dataFile( f->fullName() ); + if( !dataFile.validate( f->extension() ) ) + { + QMessageBox::warning( 0, tr ( "Error" ), + f->fullName() + " " + tr( "does not appear to be a valid" ) + " " + f->extension() + + " " + tr( "file" ), + QMessageBox::Ok, QMessageBox::NoButton ); + m_pphMutex.unlock(); + return; + } + m_previewPlayHandle = new PresetPreviewPlayHandle( f->fullName(), f->handling() == FileItem::LoadByPlugin, &dataFile ); } if( m_previewPlayHandle != NULL ) {