diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..071994eddd64b4c1a3dd80aa9bdff3bb87a56bd7
--- /dev/null
+++ b/src/libs/utils/fileutils.cpp
@@ -0,0 +1,247 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (info@qt.nokia.com)
+**
+**
+** GNU Lesser General Public License Usage
+**
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this file.
+** Please review the following information to ensure the GNU Lesser General
+** Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** Other Usage
+**
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**************************************************************************/
+
+#include "fileutils.h"
+#include "savefile.h"
+
+#include "qtcassert.h"
+
+#include <QtCore/QDir>
+#include <QtCore/QFileInfo>
+#include <QtCore/QTemporaryFile>
+#include <QtCore/QDataStream>
+#include <QtCore/QTextStream>
+#include <QtCore/QXmlStreamWriter>
+#include <QtGui/QMessageBox>
+
+namespace Utils {
+
+QByteArray FileReader::fetchQrc(const QString &fileName)
+{
+ QTC_ASSERT(fileName.startsWith(QLatin1Char(':')), return QByteArray())
+ QFile file(fileName);
+ bool ok = file.open(QIODevice::ReadOnly);
+ QTC_ASSERT(ok, qWarning() << fileName << "not there!"; return QByteArray())
+ return file.readAll();
+}
+
+bool FileReader::fetch(const QString &fileName, QIODevice::OpenMode mode)
+{
+ QTC_ASSERT(!(mode & ~(QIODevice::ReadOnly | QIODevice::Text)), return false)
+
+ QFile file(fileName);
+ if (!file.open(QIODevice::ReadOnly | mode)) {
+ m_errorString = tr("Cannot open %1 for reading: %2").arg(
+ QDir::toNativeSeparators(fileName), file.errorString());
+ return false;
+ }
+ m_data = file.readAll();
+ if (file.error() != QFile::NoError) {
+ m_errorString = tr("Cannot read %1: %2").arg(
+ QDir::toNativeSeparators(fileName), file.errorString());
+ return false;
+ }
+ return true;
+}
+
+bool FileReader::fetch(const QString &fileName, QIODevice::OpenMode mode, QString *errorString)
+{
+ if (fetch(fileName, mode))
+ return true;
+ if (errorString)
+ *errorString = m_errorString;
+ return false;
+}
+
+bool FileReader::fetch(const QString &fileName, QIODevice::OpenMode mode, QWidget *parent)
+{
+ if (fetch(fileName, mode))
+ return true;
+ if (parent)
+ QMessageBox::critical(parent, tr("File Error"), m_errorString);
+ return false;
+}
+
+
+FileSaverBase::FileSaverBase()
+ : m_hasError(false)
+{
+}
+
+FileSaverBase::~FileSaverBase()
+{
+ delete m_file;
+}
+
+bool FileSaverBase::finalize()
+{
+ m_file->close();
+ setResult(m_file->error() == QFile::NoError);
+ // We delete the object, so it is really closed even if it is a QTemporaryFile.
+ delete m_file;
+ m_file = 0;
+ return !m_hasError;
+}
+
+bool FileSaverBase::finalize(QString *errStr)
+{
+ if (finalize())
+ return true;
+ if (errStr)
+ *errStr = errorString();
+ return false;
+}
+
+bool FileSaverBase::finalize(QWidget *parent)
+{
+ if (finalize())
+ return true;
+ QMessageBox::critical(parent, tr("File Error"), errorString());
+ return false;
+}
+
+bool FileSaverBase::write(const char *data, int len)
+{
+ if (m_hasError)
+ return false;
+ return setResult(m_file->write(data, len) == len);
+}
+
+bool FileSaverBase::write(const QByteArray &bytes)
+{
+ if (m_hasError)
+ return false;
+ return setResult(m_file->write(bytes) == bytes.count());
+}
+
+bool FileSaverBase::setResult(bool ok)
+{
+ if (!ok && !m_hasError) {
+ m_errorString = tr("Cannot write file %1. Disk full?").arg(
+ QDir::toNativeSeparators(m_fileName));
+ m_hasError = true;
+ }
+ return ok;
+}
+
+bool FileSaverBase::setResult(QTextStream *stream)
+{
+#if QT_VERSION >= QT_VERSION_CHECK(4, 8, 0)
+ stream->flush();
+ return setResult(stream->status() == QTextStream::Ok);
+#else
+ Q_UNUSED(stream)
+ return true;
+#endif
+}
+
+bool FileSaverBase::setResult(QDataStream *stream)
+{
+#if QT_VERSION >= QT_VERSION_CHECK(4, 8, 0)
+ stream->flush();
+ return setResult(stream->status() == QTextStream::Ok);
+#else
+ Q_UNUSED(stream)
+ return true;
+#endif
+}
+
+bool FileSaverBase::setResult(QXmlStreamWriter *stream)
+{
+#if QT_VERSION >= QT_VERSION_CHECK(4, 8, 0)
+ return setResult(!stream->hasError());
+#else
+ Q_UNUSED(stream)
+ return true;
+#endif
+}
+
+
+FileSaver::FileSaver(const QString &filename, QIODevice::OpenMode mode)
+{
+ m_fileName = filename;
+ if (mode & (QIODevice::ReadOnly | QIODevice::Append)) {
+ m_file = new QFile(filename);
+ m_isSafe = false;
+ } else {
+ m_file = new SaveFile(filename);
+ m_isSafe = true;
+ }
+ if (!m_file->open(QIODevice::WriteOnly | mode)) {
+ QString err = QFile::exists(filename) ?
+ tr("Cannot overwrite file %1: %2") : tr("Cannot create file %1: %2");
+ m_errorString = err.arg(QDir::toNativeSeparators(filename), m_file->errorString());
+ m_hasError = true;
+ }
+}
+
+bool FileSaver::finalize()
+{
+ if (!m_isSafe)
+ return FileSaverBase::finalize();
+
+ SaveFile *sf = static_cast<SaveFile *>(m_file);
+ if (m_hasError)
+ sf->rollback();
+ else
+ setResult(sf->commit());
+ delete sf;
+ m_file = 0;
+ return !m_hasError;
+}
+
+TempFileSaver::TempFileSaver(const QString &templ)
+ : m_autoRemove(true)
+{
+ QTemporaryFile *tempFile = new QTemporaryFile();
+ if (!templ.isEmpty())
+ tempFile->setFileTemplate(templ);
+ tempFile->setAutoRemove(false);
+ if (!tempFile->open()) {
+ m_errorString = tr("Cannot create temporary file in %1: %2").arg(
+ QDir::toNativeSeparators(QFileInfo(tempFile->fileTemplate()).absolutePath()),
+ tempFile->errorString());
+ m_hasError = true;
+ }
+ m_file = tempFile;
+ m_fileName = tempFile->fileName();
+}
+
+TempFileSaver::~TempFileSaver()
+{
+ delete m_file;
+ m_file = 0;
+ if (m_autoRemove)
+ QFile::remove(m_fileName);
+}
+
+} // namespace Utils
diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h
new file mode 100644
index 0000000000000000000000000000000000000000..a4efecab42078c0e452315bf9de31f16c8021d08
--- /dev/null
+++ b/src/libs/utils/fileutils.h
@@ -0,0 +1,133 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (info@qt.nokia.com)
+**
+**
+** GNU Lesser General Public License Usage
+**
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this file.
+** Please review the following information to ensure the GNU Lesser General
+** Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** Other Usage
+**
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**************************************************************************/
+
+#ifndef FILEUTILS_H
+#define FILEUTILS_H
+
+#include "utils_global.h"
+
+#include <QtCore/QCoreApplication>
+#include <QtCore/QIODevice>
+
+QT_BEGIN_NAMESPACE
+class QFile;
+class QTemporaryFile;
+class QWidget;
+class QTextStream;
+class QDataStream;
+class QXmlStreamWriter;
+QT_END_NAMESPACE
+
+namespace Utils {
+
+class QTCREATOR_UTILS_EXPORT FileReader
+{
+ Q_DECLARE_TR_FUNCTIONS(FileUtils) // sic!
+public:
+ static QByteArray fetchQrc(const QString &fileName); // Only for internal resources
+ bool fetch(const QString &fileName, QIODevice::OpenMode mode = QIODevice::NotOpen); // QIODevice::ReadOnly is implicit
+ bool fetch(const QString &fileName, QIODevice::OpenMode mode, QString *errorString);
+ bool fetch(const QString &fileName, QString *errorString)
+ { return fetch(fileName, QIODevice::NotOpen, errorString); }
+ bool fetch(const QString &fileName, QIODevice::OpenMode mode, QWidget *parent);
+ bool fetch(const QString &fileName, QWidget *parent)
+ { return fetch(fileName, QIODevice::NotOpen, parent); }
+ const QByteArray &data() const { return m_data; }
+ const QString &errorString() const { return m_errorString; }
+private:
+ QByteArray m_data;
+ QString m_errorString;
+};
+
+class QTCREATOR_UTILS_EXPORT FileSaverBase
+{
+ Q_DECLARE_TR_FUNCTIONS(FileUtils) // sic!
+public:
+ FileSaverBase();
+ virtual ~FileSaverBase();
+
+ QString fileName() const { return m_fileName; }
+ bool hasError() const { return m_hasError; }
+ QString errorString() const { return m_errorString; }
+ virtual bool finalize();
+ bool finalize(QString *errStr);
+ bool finalize(QWidget *parent);
+
+ bool write(const char *data, int len);
+ bool write(const QByteArray &bytes);
+ bool setResult(QTextStream *stream);
+ bool setResult(QDataStream *stream);
+ bool setResult(QXmlStreamWriter *stream);
+ bool setResult(bool ok);
+
+protected:
+ QFile *m_file;
+ QString m_fileName;
+ QString m_errorString;
+ bool m_hasError;
+
+private:
+ Q_DISABLE_COPY(FileSaverBase)
+};
+
+class QTCREATOR_UTILS_EXPORT FileSaver : public FileSaverBase
+{
+public:
+ explicit FileSaver(const QString &filename, QIODevice::OpenMode mode = QIODevice::NotOpen); // QIODevice::WriteOnly is implicit
+
+ virtual bool finalize();
+ using FileSaverBase::finalize;
+ QFile *file() { return m_file; }
+
+private:
+ Q_DISABLE_COPY(FileSaver)
+ bool m_isSafe;
+};
+
+class QTCREATOR_UTILS_EXPORT TempFileSaver : public FileSaverBase
+{
+public:
+ explicit TempFileSaver(const QString &templ = QString());
+ ~TempFileSaver();
+
+ QTemporaryFile *file() { return reinterpret_cast<QTemporaryFile *>(m_file); }
+
+ void setAutoRemove(bool on) { m_autoRemove = on; }
+
+private:
+ Q_DISABLE_COPY(TempFileSaver)
+ bool m_autoRemove;
+};
+
+}
+
+#endif // FILEUTILS_H
diff --git a/src/libs/utils/utils-lib.pri b/src/libs/utils/utils-lib.pri
index 9f42979a13c437506a51389f264f1015ad354b51..616a344a10d42b9491a18ceb2f0d9e2e1799ece0 100644
--- a/src/libs/utils/utils-lib.pri
+++ b/src/libs/utils/utils-lib.pri
@@ -34,6 +34,7 @@ SOURCES += $$PWD/environment.cpp \
$$PWD/submiteditorwidget.cpp \
$$PWD/synchronousprocess.cpp \
$$PWD/savefile.cpp \
+ $$PWD/fileutils.cpp \
$$PWD/submitfieldwidget.cpp \
$$PWD/consoleprocess.cpp \
$$PWD/uncommentselection.cpp \
@@ -124,6 +125,7 @@ HEADERS += $$PWD/environment.h \
$$PWD/consoleprocess.h \
$$PWD/synchronousprocess.h \
$$PWD/savefile.h \
+ $$PWD/fileutils.h \
$$PWD/submitfieldwidget.h \
$$PWD/uncommentselection.h \
$$PWD/parameteraction.h \