fix #57511 - MusicXML pull parser crash
This commit is contained in:
parent
b4466500d2
commit
490a2a2383
1 changed files with 20 additions and 13 deletions
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue