Begginings of XML validation
This commit is contained in:
@@ -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 );
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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() )
|
||||
|
||||
@@ -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()->
|
||||
|
||||
@@ -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 )
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user