aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorOswald Buddenhagen <[email protected]>2011-03-30 13:45:16 +0200
committerOswald Buddenhagen <[email protected]>2011-04-18 14:10:13 +0200
commitf1f9904d3578fd6790f0598e58cf6e2b5628eb50 (patch)
treefb6acc20015abb95462801c2a640db9b34fa24f1 /src/plugins
parent469199e7a549086059ce1d7a6600ea3fdd317c80 (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')
-rw-r--r--src/plugins/bineditor/bineditor.cpp36
-rw-r--r--src/plugins/bineditor/bineditor.h2
-rw-r--r--src/plugins/bineditor/bineditorplugin.cpp5
-rw-r--r--src/plugins/cmakeprojectmanager/cmakeproject.cpp3
-rw-r--r--src/plugins/cmakeprojectmanager/cmakeproject.h2
-rw-r--r--src/plugins/coreplugin/editormanager/editormanager.cpp5
-rw-r--r--src/plugins/coreplugin/filemanager.cpp21
-rw-r--r--src/plugins/coreplugin/filemanager.h2
-rw-r--r--src/plugins/coreplugin/ifile.h2
-rw-r--r--src/plugins/designer/formwindowfile.cpp28
-rw-r--r--src/plugins/designer/formwindowfile.h5
-rw-r--r--src/plugins/genericprojectmanager/genericproject.cpp2
-rw-r--r--src/plugins/genericprojectmanager/genericproject.h2
-rw-r--r--src/plugins/genericprojectmanager/genericprojectfileseditor.cpp4
-rw-r--r--src/plugins/genericprojectmanager/genericprojectfileseditor.h2
-rw-r--r--src/plugins/imageviewer/imageviewerfile.cpp3
-rw-r--r--src/plugins/imageviewer/imageviewerfile.h2
-rw-r--r--src/plugins/qmlprojectmanager/qmlprojectfile.cpp2
-rw-r--r--src/plugins/qmlprojectmanager/qmlprojectfile.h2
-rw-r--r--src/plugins/qt4projectmanager/qt4nodes.cpp3
-rw-r--r--src/plugins/qt4projectmanager/qt4nodes.h2
-rw-r--r--src/plugins/qt4projectmanager/qt4project.cpp2
-rw-r--r--src/plugins/qt4projectmanager/qt4project.h2
-rw-r--r--src/plugins/resourceeditor/resourceeditorw.cpp3
-rw-r--r--src/plugins/resourceeditor/resourceeditorw.h2
-rw-r--r--src/plugins/tasklist/taskfile.cpp3
-rw-r--r--src/plugins/tasklist/taskfile.h2
-rw-r--r--src/plugins/texteditor/basetextdocument.cpp31
-rw-r--r--src/plugins/texteditor/basetextdocument.h2
-rw-r--r--src/plugins/vcsbase/submiteditorfile.cpp4
-rw-r--r--src/plugins/vcsbase/submiteditorfile.h4
-rw-r--r--src/plugins/vcsbase/vcsbasesubmiteditor.cpp16
-rw-r--r--src/plugins/vcsbase/vcsbasesubmiteditor.h2
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();