]> git.sesse.net Git - kdenlive/blobdiff - src/kdenlivedoc.cpp
Revert "Finally get ready for 0.9.6 release"
[kdenlive] / src / kdenlivedoc.cpp
index 269cfae41a75f2f50c1ed5fb8665931762825322..cc327d44b1db1f43a084119b42043bfda0320c56 100644 (file)
@@ -143,19 +143,52 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup
         else {
             QFile file(tmpFile);
             QString errorMsg;
+           int line;
+           int col;
             QDomImplementation::setInvalidDataPolicy(QDomImplementation::DropInvalidChars);
-            success = m_document.setContent(&file, false, &errorMsg);
-            file.close();
-            KIO::NetAccess::removeTempFile(tmpFile);
+            success = m_document.setContent(&file, false, &errorMsg, &line, &col);
+           file.close();
 
             if (!success) {
                 // It is corrupted
-                if (KMessageBox::warningContinueCancel(parent, i18n("Cannot open the project file, error is:\n%1\nDo you want to open a backup file?", errorMsg), i18n("Error opening file"), KGuiItem(i18n("Open Backup"))) == KMessageBox::Continue) {
-                *openBackup = true;
-            }
-                //KMessageBox::error(parent, errorMsg);
+               int answer = KMessageBox::warningYesNoCancel (parent, i18n("Cannot open the project file, error is:\n%1 (line %2, col %3)\nDo you want to open a backup file?", errorMsg, line, col), i18n("Error opening file"), KGuiItem(i18n("Open Backup")), KGuiItem(i18n("Recover")));
+                if (answer == KMessageBox::Yes) {
+                   *openBackup = true;
+               }
+               else if (answer == KMessageBox::No) {
+                   // Try to recover broken file produced by Kdenlive 0.9.4
+                   if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
+                       int correction = 0;
+                       QString playlist = file.readAll();
+                       while (!success && correction < 2) {
+                           int errorPos = 0;
+                           line--;
+                           col = col - 2;
+                           for (int j = 0; j < line && errorPos < playlist.length(); j++) {
+                               errorPos = playlist.indexOf("\n", errorPos);
+                               errorPos++;
+                           }
+                           errorPos += col;
+                           if (errorPos >= playlist.length()) break;
+                           playlist.remove(errorPos, 1);
+                           line = 0;
+                           col = 0;
+                           success = m_document.setContent(playlist, false, &errorMsg, &line, &col);
+                           correction++;
+                       }
+                       if (!success) {
+                           KMessageBox::sorry(parent, i18n("Cannot recover this project file"));
+                       }
+                       else {
+                           // Document was modified, ask for backup
+                           QDomElement mlt = m_document.documentElement();
+                           QDomElement info = mlt.firstChildElement("kdenlivedoc");
+                           if (!info.isNull()) info.setAttribute("modified", 1);
+                       }
+                   }
+               }
             }
-            else {
+            if (success) {
                 parent->slotGotProgressInfo(i18n("Validating"), 0);
                 qApp->processEvents();
                 DocumentValidator validator(m_document, url);
@@ -309,6 +342,7 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup
                     }
                 }
             }
+            KIO::NetAccess::removeTempFile(tmpFile);
         }
     }
     
@@ -1203,8 +1237,10 @@ bool KdenliveDoc::addClipInfo(QDomElement elem, QDomElement orig, QString clipId
         QMap<QString, QString> meta;
         for (QDomNode m = orig.firstChild(); !m.isNull(); m = m.nextSibling()) {
             QString name = m.toElement().attribute("name");
-            if (name.startsWith("meta.attr"))
+            if (name.startsWith("meta.attr")) {
+               if (name.endsWith(".markup")) name = name.section('.', 0, -2);
                 meta.insert(name.section('.', 2, -1), m.firstChild().nodeValue());
+           }
         }
         if (!meta.isEmpty()) {
             if (clip == NULL)
@@ -1816,6 +1852,7 @@ const QMap <QString, QString> KdenliveDoc::metadata() const
 
 void KdenliveDoc::setMetadata(const QMap <QString, QString> meta)
 {
+    setModified(true);
     m_documentMetadata = meta;
 }