From 9907bf2f3763c46da5543e39b34f6c22d578af8f Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Mon, 12 Oct 2009 23:06:42 +0000 Subject: [PATCH] =?utf8?q?Fix=20crash=20when=20loading=20document=20with?= =?utf8?q?=20invalid=20transition,=20based=20on=20patch=20from=20Mariusz?= =?utf8?q?=20Pluci=C5=84ski?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit svn path=/trunk/kdenlive/; revision=4033 --- src/effectslist.cpp | 26 ++++++++++++++++++++++++++ src/effectslist.h | 2 ++ src/trackview.cpp | 20 ++++++++++++++++++-- 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/effectslist.cpp b/src/effectslist.cpp index a509cfb5..490f2f39 100644 --- a/src/effectslist.cpp +++ b/src/effectslist.cpp @@ -188,6 +188,32 @@ QString EffectsList::parameter(QDomElement effect, const QString &name) return QString(); } +// static +void EffectsList::setProperty(QDomElement effect, const QString &name, const QString &value) +{ + QDomNodeList params = effect.elementsByTagName("property"); + for (int i = 0; i < params.count(); i++) { + QDomElement e = params.item(i).toElement(); + if (e.attribute("name") == name) { + e.firstChild().setNodeValue(value); + break; + } + } +} + +// static +QString EffectsList::property(QDomElement effect, const QString &name) +{ + QDomNodeList params = effect.elementsByTagName("property"); + for (int i = 0; i < params.count(); i++) { + QDomElement e = params.item(i).toElement(); + if (e.attribute("name") == name) { + return e.firstChild().nodeValue(); + } + } + return QString(); +} + void EffectsList::append(QDomElement e) { m_baseElement.appendChild(importNode(e, true)); diff --git a/src/effectslist.h b/src/effectslist.h index 6c57f12c..a9de689c 100644 --- a/src/effectslist.h +++ b/src/effectslist.h @@ -53,6 +53,8 @@ public: static bool hasKeyFrames(QDomElement effect); static void setParameter(QDomElement effect, const QString &name, const QString &value); static QString parameter(QDomElement effect, const QString &name); + static void setProperty(QDomElement effect, const QString &name, const QString &value); + static QString property(QDomElement effect, const QString &name); void clearList(); private: diff --git a/src/trackview.cpp b/src/trackview.cpp index 569a356b..cb997d90 100644 --- a/src/trackview.cpp +++ b/src/trackview.cpp @@ -271,8 +271,24 @@ void TrackView::parseDocument(QDomDocument doc) transitionAdd = false; //kDebug() << "// TRANSITRION " << i << " IS NOT VALID (INTERN ADDED)"; //break; - } else if (paramName == "a_track") a_track = p.text().toInt(); - else if (paramName == "b_track") b_track = p.text().toInt(); + } else if (paramName == "a_track") { + a_track = qMax(0, p.text().toInt()); + a_track = qMin(m_projectTracks - 1, a_track); + if (a_track != p.text().toInt()) { + // the transition track was out of bounds + m_documentErrors.append(i18n("Transition %1 had an invalid track: %2 > %3", e.attribute("id"), p.text().toInt(), a_track) + '\n'); + EffectsList::setProperty(e, "a_track", QString::number(a_track)); + } + } + else if (paramName == "b_track") { + b_track = qMax(0, p.text().toInt()); + b_track = qMin(m_projectTracks - 1, b_track); + if (b_track != p.text().toInt()) { + // the transition track was out of bounds + m_documentErrors.append(i18n("Transition %1 had an invalid track: %2 > %3", e.attribute("id"), p.text().toInt(), b_track) + '\n'); + EffectsList::setProperty(e, "b_track", QString::number(b_track)); + } + } else if (paramName == "mlt_service") mlt_service = p.text(); else if (paramName == "kdenlive_id") transitionId = p.text(); else if (paramName == "geometry") mlt_geometry = p.text(); -- 2.39.2