diff options
author | Oswald Buddenhagen <[email protected]> | 2011-03-30 13:45:16 +0200 |
---|---|---|
committer | Oswald Buddenhagen <[email protected]> | 2011-04-18 14:10:13 +0200 |
commit | f1f9904d3578fd6790f0598e58cf6e2b5628eb50 (patch) | |
tree | fb6acc20015abb95462801c2a640db9b34fa24f1 /src/plugins | |
parent | 469199e7a549086059ce1d7a6600ea3fdd317c80 (diff) |
add errorString output argument to IFile::save()
this centralizes error reporting (in fact, in most cases it adds any in
the first place).
Task-number: QTCREATORBUG-1619
Diffstat (limited to 'src/plugins')
33 files changed, 107 insertions, 101 deletions
diff --git a/src/plugins/bineditor/bineditor.cpp b/src/plugins/bineditor/bineditor.cpp index 3eb31098018..070140a4c5c 100644 --- a/src/plugins/bineditor/bineditor.cpp +++ b/src/plugins/bineditor/bineditor.cpp @@ -35,6 +35,7 @@ #include <texteditor/fontsettings.h> #include <texteditor/texteditorconstants.h> #include <coreplugin/editormanager/ieditor.h> +#include <utils/fileutils.h> #include <QtCore/QByteArrayMatcher> #include <QtCore/QDebug> @@ -337,7 +338,7 @@ bool BinEditor::isReadOnly() const return m_readOnly; } -bool BinEditor::save(const QString &oldFileName, const QString &newFileName) +bool BinEditor::save(QString *errorString, const QString &oldFileName, const QString &newFileName) { if (oldFileName != newFileName) { QString tmpName; @@ -354,21 +355,26 @@ bool BinEditor::save(const QString &oldFileName, const QString &newFileName) if (!QFile::rename(tmpName, newFileName)) return false; } - QFile output(newFileName); - if (!output.open(QIODevice::ReadWrite)) // QtBug: WriteOnly truncates. - return false; - const qint64 size = output.size(); - for (BlockMap::const_iterator it = m_modifiedData.constBegin(); - it != m_modifiedData.constEnd(); ++it) { - if (!output.seek(it.key() * m_blockSize)) - return false; - if (output.write(it.value()) < m_blockSize) - return false; - } + Utils::FileSaver saver(newFileName, QIODevice::ReadWrite); // QtBug: WriteOnly truncates. + if (!saver.hasError()) { + QFile *output = saver.file(); + const qint64 size = output->size(); + for (BlockMap::const_iterator it = m_modifiedData.constBegin(); + it != m_modifiedData.constEnd(); ++it) { + if (!saver.setResult(output->seek(it.key() * m_blockSize))) + break; + if (!saver.write(it.value())) + break; + if (!saver.setResult(output->flush())) + break; + } - // We may have padded the displayed data, so we have to make sure - // changes to that area are not actually written back to disk. - if (!output.resize(size)) + // We may have padded the displayed data, so we have to make sure + // changes to that area are not actually written back to disk. + if (!saver.hasError()) + saver.setResult(output->resize(size)); + } + if (!saver.finalize(errorString)) return false; setModified(false); diff --git a/src/plugins/bineditor/bineditor.h b/src/plugins/bineditor/bineditor.h index 49a51ae15a9..10125b364ed 100644 --- a/src/plugins/bineditor/bineditor.h +++ b/src/plugins/bineditor/bineditor.h @@ -72,7 +72,7 @@ public: Q_INVOKABLE void addData(quint64 block, const QByteArray &data); Q_INVOKABLE void setNewWindowRequestAllowed(); Q_INVOKABLE void updateContents(); - bool save(const QString &oldFileName, const QString &newFileName); + bool save(QString *errorString, const QString &oldFileName, const QString &newFileName); void zoomIn(int range = 1); void zoomOut(int range = 1); diff --git a/src/plugins/bineditor/bineditorplugin.cpp b/src/plugins/bineditor/bineditorplugin.cpp index f76e8589f8c..1b00d8a4d52 100644 --- a/src/plugins/bineditor/bineditorplugin.cpp +++ b/src/plugins/bineditor/bineditorplugin.cpp @@ -199,10 +199,11 @@ public: return QLatin1String(Constants::C_BINEDITOR_MIMETYPE); } - bool save(const QString &fileName = QString()) { + bool save(QString *errorString, const QString &fileName = QString()) + { const QString fileNameToUse = fileName.isEmpty() ? m_fileName : fileName; - if (m_editor->save(m_fileName, fileNameToUse)) { + if (m_editor->save(errorString, m_fileName, fileNameToUse)) { m_fileName = fileNameToUse; m_editor->editor()->setDisplayName(QFileInfo(fileNameToUse).fileName()); emit changed(); diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index 28886c55865..3cb0ae49f7c 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -735,10 +735,11 @@ CMakeFile::CMakeFile(CMakeProject *parent, QString fileName) } -bool CMakeFile::save(const QString &fileName) +bool CMakeFile::save(QString *errorString, const QString &fileName) { // Once we have an texteditor open for this file, we probably do // need to implement this, don't we. + Q_UNUSED(errorString) Q_UNUSED(fileName) return false; } diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h index c9867a0adb9..d5a536c8ec1 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.h +++ b/src/plugins/cmakeprojectmanager/cmakeproject.h @@ -199,7 +199,7 @@ class CMakeFile : public Core::IFile public: CMakeFile(CMakeProject *parent, QString fileName); - bool save(const QString &fileName = QString()); + bool save(QString *errorString, const QString &fileName = QString()); QString fileName() const; QString defaultPath() const; diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index 2b8445ccda5..26ee9bab80c 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -1373,11 +1373,12 @@ bool EditorManager::saveFile(IFile *fileParam) return saveFileAs(file); bool success = false; + bool isReadOnly; // try saving, no matter what isReadOnly tells us - success = m_d->m_core->fileManager()->saveFile(file); + success = m_d->m_core->fileManager()->saveFile(file, QString(), &isReadOnly); - if (!success) { + if (!success && isReadOnly) { MakeWritableResult answer = makeFileWritable(file); if (answer == Failed) diff --git a/src/plugins/coreplugin/filemanager.cpp b/src/plugins/coreplugin/filemanager.cpp index 085c434b9d9..54aa9319896 100644 --- a/src/plugins/coreplugin/filemanager.cpp +++ b/src/plugins/coreplugin/filemanager.cpp @@ -638,9 +638,24 @@ QList<IFile *> FileManager::saveModifiedFiles(const QList<IFile *> &files, return notSaved; } -bool FileManager::saveFile(IFile *file, const QString &fileName) +bool FileManager::saveFile(IFile *file, const QString &fileName, bool *isReadOnly) { - const bool success = file->save(fileName); + QString effName = fileName.isEmpty() ? file->fileName() : fileName; + QString errorString; + if (!file->save(&errorString, fileName)) { + if (isReadOnly) { + QFile ofi(effName); + // Check whether the existing file is writable + if (ofi.exists() && !ofi.open(QIODevice::ReadWrite) + && ofi.error() == QFile::PermissionsError) { + *isReadOnly = true; + return false; + } + *isReadOnly = false; + } + QMessageBox::critical(d->m_mainWindow, tr("File Error"), errorString); + return false; + } // We are updating the lastUpdated time to the current modification time // in changedFile we'll compare the modification time with the last updated @@ -655,7 +670,7 @@ bool FileManager::saveFile(IFile *file, const QString &fileName) foreach (const QString &fileName, d->m_filesWithWatch.value(file)) updateExpectedState(fileName); - return success; + return true; } QString FileManager::getSaveFileName(const QString &title, const QString &pathIn, diff --git a/src/plugins/coreplugin/filemanager.h b/src/plugins/coreplugin/filemanager.h index fba547d6816..8e54145eb84 100644 --- a/src/plugins/coreplugin/filemanager.h +++ b/src/plugins/coreplugin/filemanager.h @@ -94,7 +94,7 @@ public: // helper methods static QString fixFileName(const QString &fileName, FixMode fixmode); - bool saveFile(IFile *file, const QString &fileName = QString()); + bool saveFile(IFile *file, const QString &fileName = QString(), bool *isReadOnly = 0); QStringList getOpenFileNames(const QString &filters, const QString path = QString(), diff --git a/src/plugins/coreplugin/ifile.h b/src/plugins/coreplugin/ifile.h index bd307e51a2d..9983736b552 100644 --- a/src/plugins/coreplugin/ifile.h +++ b/src/plugins/coreplugin/ifile.h @@ -83,7 +83,7 @@ public: IFile(QObject *parent = 0) : QObject(parent) {} virtual ~IFile() {} - virtual bool save(const QString &fileName = QString()) = 0; + virtual bool save(QString *errorString, const QString &fileName = QString()) = 0; virtual QString fileName() const = 0; virtual QString defaultPath() const = 0; diff --git a/src/plugins/designer/formwindowfile.cpp b/src/plugins/designer/formwindowfile.cpp index 7b752f51452..8955eee9a52 100644 --- a/src/plugins/designer/formwindowfile.cpp +++ b/src/plugins/designer/formwindowfile.cpp @@ -35,6 +35,7 @@ #include <coreplugin/icore.h> #include <utils/reloadpromptutils.h> +#include <utils/fileutils.h> #include <utils/qtcassert.h> #include <QtDesigner/QDesignerFormWindowInterface> @@ -62,7 +63,7 @@ FormWindowFile::FormWindowFile(QDesignerFormWindowInterface *form, QObject *pare this, SLOT(slotFormWindowRemoved(QDesignerFormWindowInterface*))); } -bool FormWindowFile::save(const QString &name /* = QString() */) +bool FormWindowFile::save(QString *errorString, const QString &name /* = QString() */) { const QString actualName = name.isEmpty() ? fileName() : name; @@ -79,12 +80,10 @@ bool FormWindowFile::save(const QString &name /* = QString() */) const QString formName = fi.absoluteFilePath(); m_formWindow->setFileName(formName); - QString errorString; const bool warningsEnabled = qdesigner_internal::QSimpleResource::setWarningsEnabled(false); const bool writeOK = writeFile(actualName, errorString); qdesigner_internal::QSimpleResource::setWarningsEnabled(warningsEnabled); if (!writeOK) { - QMessageBox::critical(0, tr("Error saving %1").arg(formName), errorString); m_formWindow->setFileName(oldFormName); return false; } @@ -178,29 +177,14 @@ QString FormWindowFile::mimeType() const return m_mimeType; } -bool FormWindowFile::writeFile(const QString &fileName, QString &errorString) const +bool FormWindowFile::writeFile(const QString &fileName, QString *errorString) const { if (Designer::Constants::Internal::debug) qDebug() << Q_FUNC_INFO << m_fileName << fileName; - QFile file(fileName); - if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)) { - errorString = tr("Unable to open %1: %2").arg(fileName, file.errorString()); - return false; - } - const bool rc = writeFile(file, errorString); - file.close(); - return rc; -} - -bool FormWindowFile::writeFile(QFile &file, QString &errorString) const -{ - const QByteArray content = m_formWindow->contents().toUtf8(); - if (!file.write(content)) { - errorString = tr("Unable to write to %1: %2").arg(file.fileName(), file.errorString()); - return false; - } - return true; + Utils::FileSaver saver(fileName, QIODevice::Text); + saver.write(m_formWindow->contents().toUtf8()); + return saver.finalize(errorString); } void FormWindowFile::setFileName(const QString &fname) diff --git a/src/plugins/designer/formwindowfile.h b/src/plugins/designer/formwindowfile.h index 9d491a9e76f..b120701631f 100644 --- a/src/plugins/designer/formwindowfile.h +++ b/src/plugins/designer/formwindowfile.h @@ -53,7 +53,7 @@ public: explicit FormWindowFile(QDesignerFormWindowInterface *form, QObject *parent = 0); // IFile - virtual bool save(const QString &fileName = QString()); + virtual bool save(QString *errorString, const QString &fileName = QString()); virtual QString fileName() const; virtual bool isModified() const; virtual bool isReadOnly() const; @@ -68,8 +68,7 @@ public: // Internal void setSuggestedFileName(const QString &fileName); - bool writeFile(const QString &fileName, QString &errorString) const; - bool writeFile(QFile &file, QString &errorString) const; + bool writeFile(const QString &fileName, QString *errorString) const; QDesignerFormWindowInterface *formWindow() const; diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp index 9d4d1ee5b12..c1bab06f6f4 100644 --- a/src/plugins/genericprojectmanager/genericproject.cpp +++ b/src/plugins/genericprojectmanager/genericproject.cpp @@ -565,7 +565,7 @@ GenericProjectFile::GenericProjectFile(GenericProject *parent, QString fileName) GenericProjectFile::~GenericProjectFile() { } -bool GenericProjectFile::save(const QString &) +bool GenericProjectFile::save(QString *, const QString &) { return false; } diff --git a/src/plugins/genericprojectmanager/genericproject.h b/src/plugins/genericprojectmanager/genericproject.h index f5c58caeefb..ce2746dcd04 100644 --- a/src/plugins/genericprojectmanager/genericproject.h +++ b/src/plugins/genericprojectmanager/genericproject.h @@ -159,7 +159,7 @@ public: GenericProjectFile(GenericProject *parent, QString fileName); virtual ~GenericProjectFile(); - virtual bool save(const QString &fileName = QString()); + virtual bool save(QString *errorString, const QString &fileName = QString()); virtual QString fileName() const; virtual QString defaultPath() const; diff --git a/src/plugins/genericprojectmanager/genericprojectfileseditor.cpp b/src/plugins/genericprojectmanager/genericprojectfileseditor.cpp index 14bde8135bc..7d851b8a780 100644 --- a/src/plugins/genericprojectmanager/genericprojectfileseditor.cpp +++ b/src/plugins/genericprojectmanager/genericprojectfileseditor.cpp @@ -173,9 +173,9 @@ ProjectFilesDocument::ProjectFilesDocument(Manager *manager) ProjectFilesDocument::~ProjectFilesDocument() { } -bool ProjectFilesDocument::save(const QString &name) +bool ProjectFilesDocument::save(QString *errorString, const QString &name) { - if (! BaseTextDocument::save(name)) + if (! BaseTextDocument::save(errorString, name)) return false; m_manager->notifyChanged(name); diff --git a/src/plugins/genericprojectmanager/genericprojectfileseditor.h b/src/plugins/genericprojectmanager/genericprojectfileseditor.h index d9d56d9cc01..cc071986b06 100644 --- a/src/plugins/genericprojectmanager/genericprojectfileseditor.h +++ b/src/plugins/genericprojectmanager/genericprojectfileseditor.h @@ -113,7 +113,7 @@ public: ProjectFilesDocument(Manager *manager); virtual ~ProjectFilesDocument(); - virtual bool save(const QString &name); + virtual bool save(QString *errorString, const QString &name); private: Manager *m_manager; diff --git a/src/plugins/imageviewer/imageviewerfile.cpp b/src/plugins/imageviewer/imageviewerfile.cpp index 452664f12b3..a993d00fa12 100644 --- a/src/plugins/imageviewer/imageviewerfile.cpp +++ b/src/plugins/imageviewer/imageviewerfile.cpp @@ -86,8 +86,9 @@ void ImageViewerFile::reload(Core::IFile::ReloadFlag flag, } } -bool ImageViewerFile::save(const QString &fileName) +bool ImageViewerFile::save(QString *errorString, const QString &fileName) { + Q_UNUSED(errorString) Q_UNUSED(fileName); return false; } diff --git a/src/plugins/imageviewer/imageviewerfile.h b/src/plugins/imageviewer/imageviewerfile.h index 16af5525d41..b4ee14baa99 100644 --- a/src/plugins/imageviewer/imageviewerfile.h +++ b/src/plugins/imageviewer/imageviewerfile.h @@ -49,7 +49,7 @@ public: explicit ImageViewerFile(ImageViewer *parent = 0); ~ImageViewerFile(); - bool save(const QString &fileName = QString()); + bool save(QString *errorString, const QString &fileName = QString()); void rename(const QString &newName); QString fileName() const; diff --git a/src/plugins/qmlprojectmanager/qmlprojectfile.cpp b/src/plugins/qmlprojectmanager/qmlprojectfile.cpp index 96595d019bb..bcaf5323c58 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectfile.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectfile.cpp @@ -46,7 +46,7 @@ QmlProjectFile::QmlProjectFile(QmlProject *parent, QString fileName) QmlProjectFile::~QmlProjectFile() { } -bool QmlProjectFile::save(const QString &) +bool QmlProjectFile::save(QString *, const QString &) { return false; } diff --git a/src/plugins/qmlprojectmanager/qmlprojectfile.h b/src/plugins/qmlprojectmanager/qmlprojectfile.h index dae7c95f6db..9f30d092ce9 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectfile.h +++ b/src/plugins/qmlprojectmanager/qmlprojectfile.h @@ -49,7 +49,7 @@ public: QmlProjectFile(QmlProject *parent, QString fileName); virtual ~QmlProjectFile(); - virtual bool save(const QString &fileName = QString()); + virtual bool save(QString *errorString, const QString &fileName = QString()); virtual QString fileName() const; virtual void rename(const QString &newName); diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp index fedf0972b39..8406644147f 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.cpp +++ b/src/plugins/qt4projectmanager/qt4nodes.cpp @@ -175,8 +175,9 @@ Qt4PriFile::Qt4PriFile(Qt4PriFileNode *qt4PriFile) } -bool Qt4PriFile::save(const QString &fileName) +bool Qt4PriFile::save(QString *errorString, const QString &fileName) { + Q_UNUSED(errorString); Q_UNUSED(fileName); return false; } diff --git a/src/plugins/qt4projectmanager/qt4nodes.h b/src/plugins/qt4projectmanager/qt4nodes.h index aeaa8d54700..7edf9abfc87 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.h +++ b/src/plugins/qt4projectmanager/qt4nodes.h @@ -115,7 +115,7 @@ class Qt4PriFile : public Core::IFile Q_OBJECT public: Qt4PriFile(Qt4PriFileNode *qt4PriFile); - virtual bool save(const QString &fileName = QString()); + virtual bool save(QString *errorString, const QString &fileName = QString()); virtual QString fileName() const; virtual void rename(const QString &newName); diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp index 3a96a3be4ac..173bebacfe2 100644 --- a/src/plugins/qt4projectmanager/qt4project.cpp +++ b/src/plugins/qt4projectmanager/qt4project.cpp @@ -182,7 +182,7 @@ Qt4ProjectFile::Qt4ProjectFile(Qt4Project *project, const QString &filePath, QOb { } -bool Qt4ProjectFile::save(const QString &) +bool Qt4ProjectFile::save(QString *, const QString &) { // This is never used return false; diff --git a/src/plugins/qt4projectmanager/qt4project.h b/src/plugins/qt4projectmanager/qt4project.h index 97e290dd595..5c9b487eb0b 100644 --- a/src/plugins/qt4projectmanager/qt4project.h +++ b/src/plugins/qt4projectmanager/qt4project.h @@ -79,7 +79,7 @@ class Qt4ProjectFile : public Core::IFile public: Qt4ProjectFile(Qt4Project *project, const QString &filePath, QObject *parent = 0); - bool save(const QString &fileName = QString()); + bool save(QString *errorString, const QString &fileName = QString()); QString fileName() const; virtual void rename(const QString &newName); diff --git a/src/plugins/resourceeditor/resourceeditorw.cpp b/src/plugins/resourceeditor/resourceeditorw.cpp index a74735636cc..65f1f121219 100644 --- a/src/plugins/resourceeditor/resourceeditorw.cpp +++ b/src/plugins/resourceeditor/resourceeditorw.cpp @@ -138,7 +138,7 @@ bool ResourceEditorW::open(const QString &fileName /* = QString() */) return true; } -bool ResourceEditorFile::save(const QString &name /* = QString() */) +bool ResourceEditorFile::save(QString *errorString, const QString &name /* = QString() */) { if (debugResourceEditorW) qDebug(">ResourceEditorW::save: %s", qPrintable(name)); @@ -150,6 +150,7 @@ bool ResourceEditorFile::save(const QString &name /* = QString() */) m_parent->m_resourceEditor->setFileName(actualName); if (!m_parent->m_resourceEditor->save()) { + *errorString = m_parent->m_resourceEditor->errorMessage(); m_parent->m_resourceEditor->setFileName(oldFileName); return false; } diff --git a/src/plugins/resourceeditor/resourceeditorw.h b/src/plugins/resourceeditor/resourceeditorw.h index cd017b44cfc..075dece673e 100644 --- a/src/plugins/resourceeditor/resourceeditorw.h +++ b/src/plugins/resourceeditor/resourceeditorw.h @@ -57,7 +57,7 @@ public: ResourceEditorFile(ResourceEditorW *parent = 0); //IFile - bool save(const QString &fileName = QString()); + bool save(QString *errorString, const QString &fileName = QString()); QString fileName() const; bool isModified() const; bool isReadOnly() const; diff --git a/src/plugins/tasklist/taskfile.cpp b/src/plugins/tasklist/taskfile.cpp index 0664201ba93..7c0b5429ac6 100644 --- a/src/plugins/tasklist/taskfile.cpp +++ b/src/plugins/tasklist/taskfile.cpp @@ -48,8 +48,9 @@ TaskFile::TaskFile(QObject *parent) : Core::IFile(parent), TaskFile::~TaskFile() { } -bool TaskFile::save(const QString &fileName) +bool TaskFile::save(QString *errorString, const QString &fileName) { + Q_UNUSED(errorString) Q_UNUSED(fileName); return false; } diff --git a/src/plugins/tasklist/taskfile.h b/src/plugins/tasklist/taskfile.h index 111b7e5af03..0626fd64984 100644 --- a/src/plugins/tasklist/taskfile.h +++ b/src/plugins/tasklist/taskfile.h @@ -48,7 +48,7 @@ public: TaskFile(QObject *parent); ~TaskFile(); - bool save(const QString &fileName = QString()); + bool save(QString *errorString, const QString &fileName = QString()); QString fileName() const; QString defaultPath() const; diff --git a/src/plugins/texteditor/basetextdocument.cpp b/src/plugins/texteditor/basetextdocument.cpp index ecad01b2ac9..f555cd549a5 100644 --- a/src/plugins/texteditor/basetextdocument.cpp +++ b/src/plugins/texteditor/basetextdocument.cpp @@ -55,6 +55,7 @@ #include <coreplugin/icore.h> #include <coreplugin/progressmanager/progressmanager.h> #include <utils/qtcassert.h> +#include <utils/fileutils.h> #include <utils/reloadpromptutils.h> namespace { @@ -362,7 +363,7 @@ ITextMarkable *BaseTextDocument::documentMarker() const return d->m_documentMarker; } -bool BaseTextDocument::save(const QString &fileName) +bool BaseTextDocument::save(QString *errorString, const QString &fileName) { QTextCursor cursor(d->m_document); @@ -386,26 +387,24 @@ bool BaseTextDocument::save(const QString &fileName) if (!fileName.isEmpty()) fName = fileName; - QFile file(fName); - if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) - return false; + Utils::FileSaver saver(fName); + if (!saver.hasError()) { + QString plainText = d->m_document->toPlainText(); - QString plainText = d->m_document->toPlainText(); + if (d->m_lineTerminatorMode == BaseTextDocumentPrivate::CRLFLineTerminator) + plainText.replace(QLatin1Char('\n'), QLatin1String("\r\n")); - if (d->m_lineTerminatorMode == BaseTextDocumentPrivate::CRLFLineTerminator) - plainText.replace(QLatin1Char('\n'), QLatin1String("\r\n")); + if (d->m_codec->name() == "UTF-8" + && (d->m_extraEncodingSettings.m_utf8BomSetting == ExtraEncodingSettings::AlwaysAdd + || (d->m_extraEncodingSettings.m_utf8BomSetting == ExtraEncodingSettings::OnlyKeep + && d->m_fileHasUtf8Bom))) { + saver.write("\xef\xbb\xbf", 3); + } - if (d->m_codec->name() == "UTF-8" - && (d->m_extraEncodingSettings.m_utf8BomSetting == ExtraEncodingSettings::AlwaysAdd - || (d->m_extraEncodingSettings.m_utf8BomSetting == ExtraEncodingSettings::OnlyKeep - && d->m_fileHasUtf8Bom))) { - file.write("\xef\xbb\xbf", 3); + saver.write(d->m_codec->fromUnicode(plainText)); } - - file.write(d->m_codec->fromUnicode(plainText)); - if (!file.flush()) + if (!saver.finalize(errorString)) return false; - file.close(); const QFileInfo fi(fName); d->m_fileName = QDir::cleanPath(fi.absoluteFilePath()); diff --git a/src/plugins/texteditor/basetextdocument.h b/src/plugins/texteditor/basetextdocument.h index 8c8e3fb5aac..f08c1dd09df 100644 --- a/src/plugins/texteditor/basetextdocument.h +++ b/src/plugins/texteditor/basetextdocument.h @@ -70,7 +70,7 @@ public: ITextMarkable *documentMarker() const; // IFile implementation. - virtual bool save(const QString &fileName = QString()); + virtual bool save(QString *errorString, const QString &fileName = QString()); virtual QString fileName() const; virtual bool isReadOnly() const; virtual bool isModified() const; diff --git a/src/plugins/vcsbase/submiteditorfile.cpp b/src/plugins/vcsbase/submiteditorfile.cpp index 47e6a629e25..6555131b8bd 100644 --- a/src/plugins/vcsbase/submiteditorfile.cpp +++ b/src/plugins/vcsbase/submiteditorfile.cpp @@ -69,9 +69,9 @@ void SubmitEditorFile::setModified(bool modified) emit changed(); } -bool SubmitEditorFile::save(const QString &fileName) +bool SubmitEditorFile::save(QString *errorString, const QString &fileName) { - emit saveMe(fileName); + emit saveMe(errorString, fileName); emit changed(); return true; } diff --git a/src/plugins/vcsbase/submiteditorfile.h b/src/plugins/vcsbase/submiteditorfile.h index ad22240f7af..9987c71006e 100644 --- a/src/plugins/vcsbase/submiteditorfile.h +++ b/src/plugins/vcsbase/submiteditorfile.h @@ -53,7 +53,7 @@ public: virtual QString mimeType() const; bool isReadOnly() const { return false; } bool isSaveAsAllowed() const { return false; } - bool save(const QString &fileName); + bool save(QString *errorString, const QString &fileName); ReloadBehavior reloadBehavior(ChangeTrigger state, ChangeType type) const; void reload(ReloadFlag flag, ChangeType type); void rename(const QString &newName); @@ -62,7 +62,7 @@ public: void setModified(bool modified = true); signals: - void saveMe(const QString &fileName); + void saveMe(QString *errorString, const QString &fileName); private: const QString m_mimeType; diff --git a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp index 79ded14dba1..66eb7e9fd50 100644 --- a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp +++ b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp @@ -48,6 +48,7 @@ #include <utils/checkablemessagebox.h> #include <utils/synchronousprocess.h> #include <utils/submitfieldwidget.h> +#include <utils/fileutils.h> #include <find/basetextfind.h> #include <texteditor/fontsettings.h> #include <texteditor/texteditorsettings.h> @@ -164,7 +165,7 @@ VCSBaseSubmitEditor::VCSBaseSubmitEditor(const VCSBaseSubmitEditorParameters *pa m_d->m_file->setModified(false); // We are always clean to prevent the editor manager from asking to save. - connect(m_d->m_file, SIGNAL(saveMe(QString)), this, SLOT(save(QString))); + connect(m_d->m_file, SIGNAL(saveMe(QString*, QString)), this, SLOT(save(QString*, QString))); connect(m_d->m_widget, SIGNAL(diffSelected(QStringList)), this, SLOT(slotDiffSelectedVCSFiles(QStringList))); connect(m_d->m_widget->descriptionEdit(), SIGNAL(textChanged()), this, SLOT(slotDescriptionChanged())); @@ -457,18 +458,13 @@ void VCSBaseSubmitEditor::slotDiffSelectedVCSFiles(const QStringList &rawList) emit diffSelectedFiles(rawList); } -bool VCSBaseSubmitEditor::save(const QString &fileName) +bool VCSBaseSubmitEditor::save(QString *errorString, const QString &fileName) { const QString fName = fileName.isEmpty() ? m_d->m_file->fileName() : fileName; - QFile file(fName); - if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text)) { - qWarning("Unable to open %s: %s", qPrintable(fName), qPrintable(file.errorString())); + Utils::FileSaver saver(fName, QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text); + saver.write(fileContents().toLocal8Bit()); + if (!saver.finalize(errorString)) return false; - } - file.write(fileContents().toLocal8Bit()); - if (!file.flush()) - return false; - file.close(); const QFileInfo fi(fName); m_d->m_file->setFileName(fi.absoluteFilePath()); m_d->m_file->setModified(false); diff --git a/src/plugins/vcsbase/vcsbasesubmiteditor.h b/src/plugins/vcsbase/vcsbasesubmiteditor.h index 47f3ef3129e..1273a00918a 100644 --- a/src/plugins/vcsbase/vcsbasesubmiteditor.h +++ b/src/plugins/vcsbase/vcsbasesubmiteditor.h @@ -159,7 +159,7 @@ signals: private slots: void slotDiffSelectedVCSFiles(const QStringList &rawList); - bool save(const QString &fileName); + bool save(QString *errorString, const QString &fileName); void slotDescriptionChanged(); void slotCheckSubmitMessage(); void slotInsertNickName(); |