Begginings of XML validation

This commit is contained in:
Dave French
2015-02-25 21:30:45 +00:00
parent 7e2bb36104
commit 09232ce6e8
5 changed files with 80 additions and 53 deletions

View File

@@ -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 );

View File

@@ -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 );

View File

@@ -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() )

View File

@@ -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()->

View File

@@ -31,6 +31,7 @@
#include <QPushButton>
#include <QMdiArea>
#include <QMdiSubWindow>
#include <QMessageBox>
#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 )
{