From: Jean-Baptiste Mardelle Date: Fri, 13 Jan 2012 12:04:58 +0000 (+0100) Subject: * Allow opening project files manually extracted from archived project X-Git-Url: https://git.sesse.net/?p=kdenlive;a=commitdiff_plain;h=19bac60fd0734721da5e8f4734665b6091aa8383 * Allow opening project files manually extracted from archived project * Check for missing locale and ask to install instead of opening corrupted project --- diff --git a/src/documentvalidator.cpp b/src/documentvalidator.cpp index 194a55ad..898bd456 100644 --- a/src/documentvalidator.cpp +++ b/src/documentvalidator.cpp @@ -27,7 +27,6 @@ #include #include #include -#include #include #include @@ -38,11 +37,12 @@ #include -#include "locale.h" +#include -DocumentValidator::DocumentValidator(QDomDocument doc): +DocumentValidator::DocumentValidator(QDomDocument doc, KUrl documentUrl): m_doc(doc), + m_url(documentUrl), m_modified(false) {} @@ -57,20 +57,35 @@ bool DocumentValidator::validate(const double currentVersion) // Check if we're validating a Kdenlive project if (kdenliveDoc.isNull()) return false; + + QString rootDir = mlt.attribute("root"); + if (rootDir == "$CURRENTPATH") { + // The document was extracted from a Kdenlive archived project, fix root directory$ + QString playlist = m_doc.toString(); + playlist.replace("$CURRENTPATH", m_url.directory(KUrl::IgnoreTrailingSlash)); + m_doc.setContent(playlist); + mlt = m_doc.firstChildElement("mlt"); + kdenliveDoc = mlt.firstChildElement("kdenlivedoc"); + } // Previous MLT / Kdenlive versions used C locale by default QLocale documentLocale = QLocale::c(); if (mlt.hasAttribute("LC_NUMERIC")) { - // Set locale for the document - // WARNING: what should be done in case the locale does not exist on the system? - setlocale(LC_NUMERIC, mlt.attribute("LC_NUMERIC").toUtf8().constData()); + // Set locale for the document + QString newLocale = setlocale(LC_NUMERIC, mlt.attribute("LC_NUMERIC").toUtf8().constData()); documentLocale = QLocale(mlt.attribute("LC_NUMERIC")); - + // Make sure Qt locale and C++ locale have the same numeric separator, might not be the case // With some locales since C++ and Qt use a different database for locales char *separator = localeconv()->decimal_point; if (separator != documentLocale.decimalPoint()) { + if (newLocale.isEmpty()) { + // Requested locale not available, ask for install + KMessageBox::sorry(kapp->activeWindow(), i18n("The document was created in \"%1\" locale, which is not installed on your system. Please install that language pack. Until then, Kdenlive might not be able to correctly open the document.", mlt.attribute("LC_NUMERIC"))); + + } + else KMessageBox::sorry(kapp->activeWindow(), i18n("There is a locale conflict on your system. The document uses locale %1 which uses a \"%2\" as numeric separator (in system libraries) but Qt expects \"%3\". You might not be able to correctly open the project.", mlt.attribute("LC_NUMERIC"), separator, documentLocale.decimalPoint())); kDebug()<<"------\n!!! system locale is not similar to Qt's locale... be prepared for bugs!!!\n------"; // HACK: There is a locale conflict, so set locale to at least have correct decimal point if (strncmp(separator, ".", 1) == 0) documentLocale = QLocale::c(); diff --git a/src/documentvalidator.h b/src/documentvalidator.h index 5708f5fc..70766ed5 100644 --- a/src/documentvalidator.h +++ b/src/documentvalidator.h @@ -24,20 +24,22 @@ #include #include -class QScriptValue; +#include +class QScriptValue; class DocumentValidator { public: - DocumentValidator(QDomDocument doc); + DocumentValidator(QDomDocument doc, KUrl documentUrl); bool isProject() const; bool validate(const double currentVersion); bool isModified() const; private: QDomDocument m_doc; + KUrl m_url; bool m_modified; bool upgrade(double version, const double currentVersion); QStringList getInfoFromEffectName(const QString oldName); diff --git a/src/kdenlivedoc.cpp b/src/kdenlivedoc.cpp index fa243560..e31c589e 100644 --- a/src/kdenlivedoc.cpp +++ b/src/kdenlivedoc.cpp @@ -143,8 +143,7 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup else { QFile file(tmpFile); QString errorMsg; - QDomImplementation impl; - impl.setInvalidDataPolicy(QDomImplementation::DropInvalidChars); + QDomImplementation::setInvalidDataPolicy(QDomImplementation::DropInvalidChars); success = m_document.setContent(&file, false, &errorMsg); file.close(); KIO::NetAccess::removeTempFile(tmpFile); @@ -159,7 +158,7 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup else { parent->slotGotProgressInfo(i18n("Validating"), 0); qApp->processEvents(); - DocumentValidator validator(m_document); + DocumentValidator validator(m_document, url); success = validator.isProject(); if (!success) { // It is not a project file