fix #57511 - MusicXML pull parser crash

This commit is contained in:
Leon Vinken 2015-04-25 10:00:44 +02:00
parent b4466500d2
commit 490a2a2383

View file

@ -1476,17 +1476,15 @@ void MusicXMLParserPass1::partList(MusicXmlPartGroupList& partGroupList)
//---------------------------------------------------------
/**
Create the part and set its id and name
Create the part, set its \a id and insert it in PartMap \a pm.
Part name (if any) will be set later.
*/
static void createPart(Score* score, const QString& id, const QString& name, const bool doLong, PartMap& pm)
static void createPart(Score* score, const QString& id, PartMap& pm)
{
Part* part = new Part(score);
pm.insert(id, part);
part->setId(id);
part->setPartName(name);
if (doLong)
part->setPlainLongName(name);
score->appendPart(part);
Staff* staff = new Staff(score);
staff->setPart(part);
@ -1614,7 +1612,9 @@ void MusicXMLParserPass1::partGroup(const int scoreParts,
/**
Parse the /score-partwise/part-list/score-part node.
Create the part and sets id and name
Create the part and sets id and name.
Note that a part is created even if no part-name is present
which is invalid MusicXML but is (sometimes ?) generated by NWC2MusicXML.
*/
void MusicXMLParserPass1::scorePart()
@ -1623,6 +1623,17 @@ void MusicXMLParserPass1::scorePart()
logDebugTrace("MusicXMLParserPass1::scorePart");
QString id = _e.attributes().value("id").toString();
if (_parts.contains(id)) {
logError(QString("duplicate part id '%1'").arg(id));
skipLogCurrElem();
return;
}
else {
_parts.insert(id, MusicXmlPart(id));
_drumsets.insert(id, MusicXMLDrumset());
createPart(_score, id, _partMap);
}
while (_e.readNextStartElement()) {
if (_e.name() == "part-name") {
// Element part-name contains the displayed (full) part name
@ -1631,13 +1642,9 @@ void MusicXMLParserPass1::scorePart()
// and the formatted version in the part-name-display element
bool doLong = !(_e.attributes().value("print-object") == "no");
QString name = _e.readElementText();
if (_parts.contains(id))
logError(QString("duplicate part id '%1'").arg(id));
else {
_parts.insert(id, MusicXmlPart(id, _e.readElementText()));
_drumsets.insert(id, MusicXMLDrumset());
createPart(_score, id, name, doLong, _partMap);
}
_partMap[id]->setPartName(name);
if (doLong)
_partMap[id]->setLongName(name);
}
else if (_e.name() == "part-name-display") {
// TODO