Mercurial > hg > svapp
diff framework/MainWindowBase.cpp @ 217:64dfa7d6171d sv_v1.8
Use TempWriteFile when saving session files, to avoid clobbering until file save complete
author | Chris Cannam |
---|---|
date | Tue, 29 Mar 2011 17:56:32 +0100 |
parents | b96d90975f7c |
children | 85e59c901de9 |
line wrap: on
line diff
--- a/framework/MainWindowBase.cpp Tue Mar 08 11:31:24 2011 +0000 +++ b/framework/MainWindowBase.cpp Tue Mar 29 17:56:32 2011 +0100 @@ -66,6 +66,8 @@ #include "base/XmlExportable.h" #include "base/Profiler.h" #include "base/Preferences.h" +#include "base/TempWriteFile.h" +#include "base/Exceptions.h" #include "data/osc/OSCQueue.h" #include "data/midi/MIDIInput.h" @@ -1890,32 +1892,46 @@ bool MainWindowBase::saveSessionFile(QString path) { - BZipFileDevice bzFile(path); - if (!bzFile.open(QIODevice::WriteOnly)) { - std::cerr << "Failed to open session file \"" << path.toStdString() - << "\" for writing: " - << bzFile.errorString().toStdString() << std::endl; + try { + + TempWriteFile temp(path); + + BZipFileDevice bzFile(temp.getTemporaryFilename()); + if (!bzFile.open(QIODevice::WriteOnly)) { + std::cerr << "Failed to open session file \"" + << temp.getTemporaryFilename().toStdString() + << "\" for writing: " + << bzFile.errorString().toStdString() << std::endl; + return false; + } + + QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); + + QTextStream out(&bzFile); + toXml(out); + out.flush(); + + QApplication::restoreOverrideCursor(); + + if (!bzFile.isOK()) { + QMessageBox::critical(this, tr("Failed to write file"), + tr("<b>Save failed</b><p>Failed to write to file \"%1\": %2") + .arg(path).arg(bzFile.errorString())); + bzFile.close(); + return false; + } + + bzFile.close(); + temp.moveToTarget(); + return true; + + } catch (FileOperationFailed &f) { + + QMessageBox::critical(this, tr("Failed to write file"), + tr("<b>Save failed</b><p>Failed to write to file \"%1\": %2") + .arg(path).arg(f.what())); return false; } - - QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); - - QTextStream out(&bzFile); - toXml(out); - out.flush(); - - QApplication::restoreOverrideCursor(); - - if (!bzFile.isOK()) { - QMessageBox::critical(this, tr("Failed to write file"), - tr("<b>Save failed</b><p>Failed to write to file \"%1\": %2") - .arg(path).arg(bzFile.errorString())); - bzFile.close(); - return false; - } - - bzFile.close(); - return true; } void