diff --git a/libs/ui/KisImportExportManager.cpp b/libs/ui/KisImportExportManager.cpp --- a/libs/ui/KisImportExportManager.cpp +++ b/libs/ui/KisImportExportManager.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #include @@ -607,28 +608,67 @@ return status; } +// Temporary workaround until QTBUG-57299 is fixed. +#ifdef Q_OS_WIN +#define USE_QSAVEFILE +#endif + KisImportExportFilter::ConversionStatus KisImportExportManager::doExportImpl(const QString &location, QSharedPointer filter, KisPropertiesConfigurationSP exportConfiguration) { +#ifdef USE_QSAVEFILE QSaveFile file(location); file.setDirectWriteFallback(true); - if (filter->supportsIO() && !file.open(QFile::WriteOnly)) { - m_document->setErrorMessage(file.errorString()); + +#else + QFileInfo fi(location); + QTemporaryFile file(fi.absolutePath() + ".XXXXXX.kra"); + if (filter->supportsIO() && !file.open()) { +#endif + QString error = file.errorString(); + if (error.isEmpty()) { + error = i18n("Could not open %1 for writing.", location); + } + m_document->setErrorMessage(error); +#ifdef USE_QSAVEFILE file.cancelWriting(); +#endif return KisImportExportFilter::CreationError; } - KisImportExportFilter::ConversionStatus status = - filter->convert(m_document, &file, exportConfiguration); + KisImportExportFilter::ConversionStatus status = filter->convert(m_document, &file, exportConfiguration); if (filter->supportsIO()) { if (status != KisImportExportFilter::OK) { +#ifdef USE_QSAVEFILE file.cancelWriting(); +#endif } else { +#ifdef USE_QSAVEFILE if (!file.commit()) { - m_document->setErrorMessage(file.errorString()); + QString error = file.errorString(); + if (error.isEmpty()) { + error = i18n("Could not write to %1.", location); + } + if (m_document->errorMessage().isEmpty()) { + m_document->setErrorMessage(error); + } status = KisImportExportFilter::CreationError; } +#else + file.flush(); + file.close(); + QFile target(location); + if (target.exists()) { + // There should already be a .kra~ backup + target.remove(); + } + if (!file.copy(location)) { + file.setAutoRemove(false); + m_document->setErrorMessage(i18n("Could not copy %1 to its final location %2", file.fileName(), location)); + return KisImportExportFilter::CreationError; + } +#endif } } return status;