From ad9dfd853d6c350932773ba65a289884b88ba784 Mon Sep 17 00:00:00 2001 From: Dave French Date: Wed, 25 Feb 2015 21:30:45 +0000 Subject: [PATCH] Begginings of XML validation --- include/DataFile.h | 7 +-- include/PresetPreviewPlayHandle.h | 2 +- src/core/DataFile.cpp | 87 +++++++++++++++------------- src/core/PresetPreviewPlayHandle.cpp | 22 +++++-- src/gui/FileBrowser.cpp | 15 ++++- 5 files changed, 80 insertions(+), 53 deletions(-) diff --git a/include/DataFile.h b/include/DataFile.h index 86dee8675..6f01ffc5e 100644 --- a/include/DataFile.h +++ b/include/DataFile.h @@ -56,13 +56,10 @@ public: DataFile( const QByteArray& data ); DataFile( Type type ); - /// \brief fileTypeFromData - /// Reads the given file and checks the xml for the type - /// returns UnknownType if the file is not reconised - static DataFile::Type fileTypeFromData( const QString fileName); - virtual ~DataFile(); + 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 2be3f0377..85d7f0e35 100644 --- a/src/core/DataFile.cpp +++ b/src/core/DataFile.cpp @@ -114,45 +114,6 @@ DataFile::DataFile( Type type ) : } -DataFile::Type DataFile::fileTypeFromData(const QString fileName) -{ - QString errorMsg; - DataFile::Type t; - QDomDocument doc; - - QFile inFile( fileName ); - if( !inFile.open( QIODevice::ReadOnly ) ) - { - return DataFile::Type::UnknownType; - } - - QByteArray data = inFile.readAll(); - inFile.close(); - - int line = -1, col = -1; - if( !doc.setContent( data, &errorMsg, &line, &col ) ) - { - // parsing failed? then try to uncompress data - QByteArray uncompressed = qUncompress( data ); - if( !uncompressed.isEmpty() ) - { - if( doc.setContent( uncompressed, &errorMsg, &line, &col ) ) - { - line = col = -1; - } - } - if( line >= 0 && col >= 0 ) - { - return DataFile::Type::UnknownType; - } - } - - QDomElement root = doc.documentElement(); - t = type( root.attribute( "type" ) ); - - return t; -} - @@ -202,6 +163,54 @@ DataFile::~DataFile() +bool DataFile::validate( QString extension ) +{ + bool result = false; + switch( m_type ) + { + case Type::SongProject: + if( extension == "mmp" || extension == "mmpz" ) + { + result = true; + } + break; + case Type::SongProjectTemplate: + if( extension == "mpt" ) + { + result = true; + } + break; + case Type::InstrumentTrackSettings: + if ( extension == "xpf" || extension == "xml" ) + { + result = 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" + ) ) + { + result = true; + } + if( extension == "wav" || extension == "ogg" || + extension == "ds" ) + { + result = true; + } + break; + default: + return true; + } + return result; +} + + + + QString DataFile::nameWithExtension( const QString & _fn ) const { switch( type() ) diff --git a/src/core/PresetPreviewPlayHandle.cpp b/src/core/PresetPreviewPlayHandle.cpp index 09ebaca16..658160098 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,34 @@ PresetPreviewPlayHandle::PresetPreviewPlayHandle( const QString & _preset_file, } else { - DataFile dataFile( _preset_file ); + bool dataFileCreated = false; + if( dataFile == 0 ) + { + dataFile = new DataFile( _preset_file ); + dataFileCreated = true; + } + + DataFile data(*dataFile); + // 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(data.content().elementsByTagName( "vestige" ).length() == 0 ) { s_previewTC->previewInstrumentTrack()-> loadTrackSpecificSettings( - dataFile.content().firstChild().toElement() ); + data.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/gui/FileBrowser.cpp b/src/gui/FileBrowser.cpp index 4253ce55d..f865fab19 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" @@ -459,10 +460,18 @@ void FileBrowserTreeWidget::mousePressEvent(QMouseEvent * me ) } else if( f->type() != FileItem::VstPluginFile && ( f->handling() == FileItem::LoadAsPreset || - f->handling() == FileItem::LoadByPlugin ) - && DataFile::fileTypeFromData( f->fullName() ) == DataFile::Type::InstrumentTrackSettings ) + 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, "Corrupt File", + "File : " + f->fullName() + " contains invalid data", + QMessageBox::Ok, QMessageBox::NoButton ); + m_pphMutex.unlock(); + return; + } + m_previewPlayHandle = new PresetPreviewPlayHandle( f->fullName(), f->handling() == FileItem::LoadByPlugin, &dataFile ); } if( m_previewPlayHandle != NULL ) {