diff --git a/src/libs/extensionsystem/pluginspec.cpp b/src/libs/extensionsystem/pluginspec.cpp index 36aa586e69d0448c261addeb279c907471659ab5..41e06d273beec07c47ca4fa037413e81f2e281e4 100644 --- a/src/libs/extensionsystem/pluginspec.cpp +++ b/src/libs/extensionsystem/pluginspec.cpp @@ -489,10 +489,9 @@ bool PluginSpecPrivate::read(const QString &fileName) errorString = ""; dependencies.clear(); QFile file(fileName); - if (!file.exists()) - return reportError(tr("File does not exist: %1").arg(file.fileName())); if (!file.open(QIODevice::ReadOnly)) - return reportError(tr("Could not open file for read: %1").arg(file.fileName())); + return reportError(tr("Could not open file %1 for read: %2") + .arg(QDir::toNativeSeparators(file.fileName()), file.errorString())); QFileInfo fileInfo(file); location = fileInfo.absolutePath(); filePath = fileInfo.absoluteFilePath(); diff --git a/src/libs/utils/ssh/sshconnection.cpp b/src/libs/utils/ssh/sshconnection.cpp index e9416896206cec08bb5fd561a8bdd0cf7fec1814..27501a6f91a818cca5102d1373fcd56007053cd0 100644 --- a/src/libs/utils/ssh/sshconnection.cpp +++ b/src/libs/utils/ssh/sshconnection.cpp @@ -41,6 +41,7 @@ #include "sshkeyexchange_p.h" #include +#include #include #include @@ -410,18 +411,12 @@ void SshConnectionPrivate::handleServiceAcceptPacket() m_sendFacility.sendUserAuthByPwdRequestPacket(m_connParams.userName.toUtf8(), SshCapabilities::SshConnectionService, m_connParams.password.toUtf8()); } else { - QFile privKeyFile(m_connParams.privateKeyFile); - bool couldOpen = privKeyFile.open(QIODevice::ReadOnly); - QByteArray contents; - if (couldOpen) - contents = privKeyFile.readAll(); - if (!couldOpen || privKeyFile.error() != QFile::NoError) { + Utils::FileReader reader; + if (!reader.fetch(m_connParams.privateKeyFile)) throw SshClientException(SshKeyFileError, - tr("Could not read private key file: %1") - .arg(privKeyFile.errorString())); - } + tr("Private key error: %1").arg(reader.errorString())); - m_sendFacility.createAuthenticationKey(contents); + m_sendFacility.createAuthenticationKey(reader.data()); m_sendFacility.sendUserAuthByKeyRequestPacket(m_connParams.userName.toUtf8(), SshCapabilities::SshConnectionService); } diff --git a/src/plugins/coreplugin/actionmanager/commandsfile.cpp b/src/plugins/coreplugin/actionmanager/commandsfile.cpp index 9f15973f78b062cbcd695a4bc0a18f6716c55828..9108dcc4d143b6f047ad29f0475048ff4c6a5341 100644 --- a/src/plugins/coreplugin/actionmanager/commandsfile.cpp +++ b/src/plugins/coreplugin/actionmanager/commandsfile.cpp @@ -39,6 +39,8 @@ #include +#include + #include #include #include @@ -134,37 +136,37 @@ bool CommandsFile::exportCommands(const QList &items) { const UniqueIDManager *idmanager = UniqueIDManager::instance(); - QFile file(m_filename); - if (!file.open(QIODevice::WriteOnly|QIODevice::Text)) - return false; - - const Context ctx; - QXmlStreamWriter w(&file); - w.setAutoFormatting(true); - w.setAutoFormattingIndent(1); // Historical, used to be QDom. - w.writeStartDocument(); - w.writeDTD(QLatin1String("")); - w.writeComment(QString::fromAscii(" Written by Qt Creator %1, %2. "). - arg(QLatin1String(Core::Constants::IDE_VERSION_LONG), - QDateTime::currentDateTime().toString(Qt::ISODate))); - w.writeStartElement(ctx.mappingElement); - foreach (const ShortcutItem *item, items) { - const QString id = idmanager->stringForUniqueIdentifier(item->m_cmd->id()); - if (item->m_key.isEmpty()) { - w.writeEmptyElement(ctx.shortCutElement); - w.writeAttribute(ctx.idAttribute, id); - } else { - w.writeStartElement(ctx.shortCutElement); - w.writeAttribute(ctx.idAttribute, id); - w.writeEmptyElement(ctx.keyElement); - w.writeAttribute(ctx.valueAttribute, item->m_key.toString()); - w.writeEndElement(); // Shortcut + Utils::FileSaver saver(m_filename, QIODevice::Text); + if (!saver.hasError()) { + const Context ctx; + QXmlStreamWriter w(saver.file()); + w.setAutoFormatting(true); + w.setAutoFormattingIndent(1); // Historical, used to be QDom. + w.writeStartDocument(); + w.writeDTD(QLatin1String("")); + w.writeComment(QString::fromAscii(" Written by Qt Creator %1, %2. "). + arg(QLatin1String(Core::Constants::IDE_VERSION_LONG), + QDateTime::currentDateTime().toString(Qt::ISODate))); + w.writeStartElement(ctx.mappingElement); + foreach (const ShortcutItem *item, items) { + const QString id = idmanager->stringForUniqueIdentifier(item->m_cmd->id()); + if (item->m_key.isEmpty()) { + w.writeEmptyElement(ctx.shortCutElement); + w.writeAttribute(ctx.idAttribute, id); + } else { + w.writeStartElement(ctx.shortCutElement); + w.writeAttribute(ctx.idAttribute, id); + w.writeEmptyElement(ctx.keyElement); + w.writeAttribute(ctx.valueAttribute, item->m_key.toString()); + w.writeEndElement(); // Shortcut + } } + w.writeEndElement(); + w.writeEndDocument(); + + saver.setResult(&w); } - w.writeEndElement(); - w.writeEndDocument(); - file.close(); - return true; + return saver.finalize(); } } // namespace Internal diff --git a/src/plugins/coreplugin/basefilewizard.cpp b/src/plugins/coreplugin/basefilewizard.cpp index 741e3e2650b3bfc402f4b438647f8eef1034f929..62d3fe6c922d97034077809b803d2631c208e076 100644 --- a/src/plugins/coreplugin/basefilewizard.cpp +++ b/src/plugins/coreplugin/basefilewizard.cpp @@ -42,6 +42,7 @@ #include #include #include +#include #include #include @@ -179,23 +180,15 @@ bool GeneratedFile::write(QString *errorMessage) const return false; } } - // Write out - QFile file(m_d->path); + // Write out QIODevice::OpenMode flags = QIODevice::WriteOnly|QIODevice::Truncate; if (!isBinary()) flags |= QIODevice::Text; - if (!file.open(flags)) { - *errorMessage = BaseFileWizard::tr("Unable to open %1 for writing: %2").arg(m_d->path, file.errorString()); - return false; - } - if (file.write(m_d->contents) == -1) { - *errorMessage = BaseFileWizard::tr("Error while writing to %1: %2").arg(m_d->path, file.errorString()); - return false; - } - file.close(); - return true; + Utils::FileSaver saver(m_d->path, flags); + saver.write(m_d->contents); + return saver.finalize(errorMessage); } GeneratedFile::Attributes GeneratedFile::attributes() const diff --git a/src/plugins/coreplugin/externaltool.cpp b/src/plugins/coreplugin/externaltool.cpp index 9acbb591e3a327415c1c2efb058d1f8c7d266ea0..04107dd87dcc86317be9e7f1792a48de1c60113e 100644 --- a/src/plugins/coreplugin/externaltool.cpp +++ b/src/plugins/coreplugin/externaltool.cpp @@ -43,6 +43,7 @@ #include #include #include +#include #include #include @@ -432,21 +433,15 @@ ExternalTool * ExternalTool::createFromXml(const QByteArray &xml, QString *error ExternalTool * ExternalTool::createFromFile(const QString &fileName, QString *errorMessage, const QString &locale) { - QFileInfo info(fileName); - QFile file(info.absoluteFilePath()); - if (!file.open(QIODevice::ReadOnly)) { - if (errorMessage) - *errorMessage = tr("Could not open tool specification %1 for reading: %2"). - arg(fileName, file.errorString()); + QString absFileName = QFileInfo(fileName).absoluteFilePath(); + Utils::FileReader reader; + if (!reader.fetch(absFileName, errorMessage)) return 0; - } - const QByteArray &bytes = file.readAll(); - file.close(); - ExternalTool *tool = ExternalTool::createFromXml(bytes, errorMessage, locale); + ExternalTool *tool = ExternalTool::createFromXml(reader.data(), errorMessage, locale); if (!tool) { return 0; } - tool->m_fileName = file.fileName(); + tool->m_fileName = absFileName; return tool; } @@ -467,43 +462,40 @@ bool ExternalTool::save(QString *errorMessage) const { if (m_fileName.isEmpty()) return false; - QFile file(m_fileName); - if (!file.open(QIODevice::WriteOnly)) { - if (errorMessage) - *errorMessage = tr("Could not write tool specification %1: %2"). - arg(m_fileName, file.errorString()); - return false; + Utils::FileSaver saver(m_fileName); + if (!saver.hasError()) { + QXmlStreamWriter out(saver.file()); + out.setAutoFormatting(true); + out.writeStartDocument(QLatin1String("1.0")); + out.writeComment(QString::fromLatin1("Written on %1 by Qt Creator %2") + .arg(QDateTime::currentDateTime().toString(), QLatin1String(Constants::IDE_VERSION_LONG))); + out.writeStartElement(QLatin1String(kExternalTool)); + out.writeAttribute(QLatin1String(kId), m_id); + out.writeTextElement(QLatin1String(kDescription), m_description); + out.writeTextElement(QLatin1String(kDisplayName), m_displayName); + out.writeTextElement(QLatin1String(kCategory), m_displayCategory); + if (m_order != -1) + out.writeTextElement(QLatin1String(kOrder), QString::number(m_order)); + + out.writeStartElement(QLatin1String(kExecutable)); + out.writeAttribute(QLatin1String(kOutput), stringForOutputHandling(m_outputHandling)); + out.writeAttribute(QLatin1String(kError), stringForOutputHandling(m_errorHandling)); + out.writeAttribute(QLatin1String(kModifiesDocument), m_modifiesCurrentDocument ? QLatin1String(kYes) : QLatin1String(kNo)); + foreach (const QString &executable, m_executables) + out.writeTextElement(QLatin1String(kPath), executable); + if (!m_arguments.isEmpty()) + out.writeTextElement(QLatin1String(kArguments), m_arguments); + if (!m_input.isEmpty()) + out.writeTextElement(QLatin1String(kInput), m_input); + if (!m_workingDirectory.isEmpty()) + out.writeTextElement(QLatin1String(kWorkingDirectory), m_workingDirectory); + out.writeEndElement(); + + out.writeEndDocument(); + + saver.setResult(&out); } - QXmlStreamWriter out(&file); - out.setAutoFormatting(true); - out.writeStartDocument(QLatin1String("1.0")); - out.writeComment(QString::fromLatin1("Written on %1 by Qt Creator %2") - .arg(QDateTime::currentDateTime().toString(), QLatin1String(Constants::IDE_VERSION_LONG))); - out.writeStartElement(QLatin1String(kExternalTool)); - out.writeAttribute(QLatin1String(kId), m_id); - out.writeTextElement(QLatin1String(kDescription), m_description); - out.writeTextElement(QLatin1String(kDisplayName), m_displayName); - out.writeTextElement(QLatin1String(kCategory), m_displayCategory); - if (m_order != -1) - out.writeTextElement(QLatin1String(kOrder), QString::number(m_order)); - - out.writeStartElement(QLatin1String(kExecutable)); - out.writeAttribute(QLatin1String(kOutput), stringForOutputHandling(m_outputHandling)); - out.writeAttribute(QLatin1String(kError), stringForOutputHandling(m_errorHandling)); - out.writeAttribute(QLatin1String(kModifiesDocument), m_modifiesCurrentDocument ? QLatin1String(kYes) : QLatin1String(kNo)); - foreach (const QString &executable, m_executables) - out.writeTextElement(QLatin1String(kPath), executable); - if (!m_arguments.isEmpty()) - out.writeTextElement(QLatin1String(kArguments), m_arguments); - if (!m_input.isEmpty()) - out.writeTextElement(QLatin1String(kInput), m_input); - if (!m_workingDirectory.isEmpty()) - out.writeTextElement(QLatin1String(kWorkingDirectory), m_workingDirectory); - out.writeEndElement(); - - out.writeEndDocument(); - file.close(); - return true; + return saver.finalize(errorMessage); } bool ExternalTool::operator==(const ExternalTool &other) const diff --git a/src/plugins/cpaster/cpasterplugin.cpp b/src/plugins/cpaster/cpasterplugin.cpp index 3d69d802ad95ff4dbecb504095226a2cbbc3d25e..c1953a97d66f98a068f1e21480d6a79f865c6d4e 100644 --- a/src/plugins/cpaster/cpasterplugin.cpp +++ b/src/plugins/cpaster/cpasterplugin.cpp @@ -52,6 +52,7 @@ #include #include #include +#include #include #include @@ -277,23 +278,6 @@ static inline QString tempFilePattern(const QString &prefix, const QString &exte return pattern; } -typedef QSharedPointer TemporaryFilePtr; - -// Write an a temporary file. -TemporaryFilePtr writeTemporaryFile(const QString &namePattern, - const QString &contents, - QString *errorMessage) -{ - TemporaryFilePtr tempFile(new QTemporaryFile(namePattern)); - if (!tempFile->open()) { - *errorMessage = QString::fromLatin1("Unable to open temporary file %1").arg(tempFile->errorString()); - return TemporaryFilePtr(); - } - tempFile->write(contents.toUtf8()); - tempFile->close(); - return tempFile; -} - void CodepasterPlugin::finishFetch(const QString &titleDescription, const QString &content, bool error) @@ -313,23 +297,21 @@ void CodepasterPlugin::finishFetch(const QString &titleDescription, // for the user and also to be able to tell a patch or diff in the VCS plugins // by looking at the file name of FileManager::currentFile() without expensive checking. // Default to "txt". + QByteArray byteContent = content.toUtf8(); QString suffix; - if (const Core::MimeType mimeType = Core::ICore::instance()->mimeDatabase()->findByData(content.toUtf8())) + if (const Core::MimeType mimeType = Core::ICore::instance()->mimeDatabase()->findByData(byteContent)) suffix = mimeType.preferredSuffix(); if (suffix.isEmpty()) suffix = QLatin1String("txt"); const QString filePrefix = filePrefixFromTitle(titleDescription); - QString errorMessage; - TemporaryFilePtr tempFile = writeTemporaryFile(tempFilePattern(filePrefix, suffix), content, &errorMessage); - if (tempFile.isNull()) { - messageManager->printToOutputPane(errorMessage); + Utils::TempFileSaver saver(tempFilePattern(filePrefix, suffix)); + saver.setAutoRemove(false); + saver.write(byteContent); + if (!saver.finalize()) { + messageManager->printToOutputPane(saver.errorString()); return; } - // Keep the file and store in list of files to be removed. - tempFile->setAutoRemove(false); - const QString fileName = tempFile->fileName(); - // Discard to temporary file to make sure it is closed and no changes are triggered. - tempFile = TemporaryFilePtr(); + const QString fileName = saver.fileName(); m_fetchedSnippets.push_back(fileName); // Open editor with title. Core::IEditor* editor = EditorManager::instance()->openEditor(fileName, QString(), EditorManager::ModeSwitch); diff --git a/src/plugins/cpaster/fileshareprotocol.cpp b/src/plugins/cpaster/fileshareprotocol.cpp index 968a1753e5aa135d94ea0b982fca41ac5a157b15..a20173bc8251312d3cf452f24da803a812d2caba 100644 --- a/src/plugins/cpaster/fileshareprotocol.cpp +++ b/src/plugins/cpaster/fileshareprotocol.cpp @@ -38,6 +38,7 @@ #include #include +#include #include #include @@ -195,27 +196,29 @@ void FileShareProtocol::paste(const QString &text, const QString &description) { // Write out temp XML file - QTemporaryFile tempFile(m_settings->path + QLatin1Char('/') + QLatin1String(tempPatternC)); - tempFile.setAutoRemove(false); - if (!tempFile.open()) { - const QString msg = tr("Unable to open a file for writing in %1: %2").arg(m_settings->path, tempFile.errorString()); - Core::ICore::instance()->messageManager()->printToOutputPanePopup(msg); + Utils::TempFileSaver saver(m_settings->path + QLatin1Char('/') + QLatin1String(tempPatternC)); + saver.setAutoRemove(false); + if (!saver.hasError()) { + // Flat text sections embedded into pasterElement + QXmlStreamWriter writer(saver.file()); + writer.writeStartDocument(); + writer.writeStartElement(QLatin1String(pasterElementC)); + + writer.writeTextElement(QLatin1String(userElementC), username); + writer.writeTextElement(QLatin1String(descriptionElementC), description); + writer.writeTextElement(QLatin1String(textElementC), text); + + writer.writeEndElement(); + writer.writeEndDocument(); + + saver.setResult(&writer); + } + if (!saver.finalize()) { + Core::ICore::instance()->messageManager()->printToOutputPanePopup(saver.errorString()); return; } - // Flat text sections embedded into pasterElement - QXmlStreamWriter writer(&tempFile); - writer.writeStartDocument(); - writer.writeStartElement(QLatin1String(pasterElementC)); - - writer.writeTextElement(QLatin1String(userElementC), username); - writer.writeTextElement(QLatin1String(descriptionElementC), description); - writer.writeTextElement(QLatin1String(textElementC), text); - - writer.writeEndElement(); - writer.writeEndDocument(); - tempFile.close(); - const QString msg = tr("Pasted: %1").arg(tempFile.fileName()); + const QString msg = tr("Pasted: %1").arg(saver.fileName()); Core::ICore::instance()->messageManager()->printToOutputPanePopup(msg); } } // namespace CodePaster diff --git a/src/plugins/cpptools/cppfilesettingspage.cpp b/src/plugins/cpptools/cppfilesettingspage.cpp index 94d64250b8fd5bbdcdf2f743e957ac3ad3063d1c..e864af51539fd0e74267eb1524c30855917424d2 100644 --- a/src/plugins/cpptools/cppfilesettingspage.cpp +++ b/src/plugins/cpptools/cppfilesettingspage.cpp @@ -41,6 +41,8 @@ #include +#include + #include #include #include @@ -301,25 +303,18 @@ void CppFileSettingsWidget::setSettings(const CppFileSettings &s) void CppFileSettingsWidget::slotEdit() { QString path = licenseTemplatePath(); - // Edit existing file with C++ - if (!path.isEmpty()) { - Core::EditorManager::instance()->openEditor(path, QLatin1String(CppEditor::Constants::CPPEDITOR_ID), - Core::EditorManager::ModeSwitch); - return; - } - // Pick a file name and write new template, edit with C++ - path = QFileDialog::getSaveFileName(this, tr("Choose Location for New License Template File")); - if (path.isEmpty()) - return; - QFile file(path); - if (!file.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Truncate)) { - QMessageBox::warning(this, tr("Template write error"), - tr("Cannot write to %1: %2").arg(path, file.errorString())); - return; + if (path.isEmpty()) { + // Pick a file name and write new template, edit with C++ + path = QFileDialog::getSaveFileName(this, tr("Choose Location for New License Template File")); + if (path.isEmpty()) + return; + Utils::FileSaver saver(path, QIODevice::Text); + saver.write(tr(licenseTemplateTemplate).toUtf8()); + if (!saver.finalize(this)) + return; + setLicenseTemplatePath(path); } - file.write(tr(licenseTemplateTemplate).toUtf8()); - file.close(); - setLicenseTemplatePath(path); + // Edit (now) existing file with C++ Core::EditorManager::instance()->openEditor(path, QLatin1String(CppEditor::Constants::CPPEDITOR_ID), Core::EditorManager::ModeSwitch); } diff --git a/src/plugins/cpptools/cppfindreferences.cpp b/src/plugins/cpptools/cppfindreferences.cpp index 4d31f954faee3217d8a7dc269c115a06e4b677e6..c3cc29a986a11f329af44188b464e1335bcb2759 100644 --- a/src/plugins/cpptools/cppfindreferences.cpp +++ b/src/plugins/cpptools/cppfindreferences.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include @@ -76,11 +77,11 @@ static QString getSource(const QString &fileName, if (workingCopy.contains(fileName)) { return workingCopy.source(fileName); } else { - QFile file(fileName); - if (! file.open(QFile::ReadOnly)) + Utils::FileReader reader; + if (!reader.fetch(fileName)) // ### FIXME error reporting return QString(); - return QTextStream(&file).readAll(); // ### FIXME + return QString::fromLocal8Bit(reader.data()); // ### FIXME encoding } } diff --git a/src/plugins/cvs/cvsplugin.cpp b/src/plugins/cvs/cvsplugin.cpp index 61b0b045e1d77e73cf646fccb404593bf911371f..345769b847eb026e4bd79c0a4418502d7af285bd 100644 --- a/src/plugins/cvs/cvsplugin.cpp +++ b/src/plugins/cvs/cvsplugin.cpp @@ -60,6 +60,7 @@ #include #include #include +#include #include #include @@ -68,7 +69,6 @@ #include #include #include -#include #include #include #include @@ -805,19 +805,17 @@ void CVSPlugin::startCommit(const QString &workingDir, const QStringList &files) m_commitRepository = workingDir; // Create a new submit change file containing the submit template - QTemporaryFile changeTmpFile; - changeTmpFile.setAutoRemove(false); - if (!changeTmpFile.open()) { - VCSBase::VCSBaseOutputWindow::instance()->appendError(tr("Cannot create temporary file: %1").arg(changeTmpFile.errorString())); - return; - } + Utils::TempFileSaver saver; + saver.setAutoRemove(false); // TODO: Retrieve submit template from const QString submitTemplate; - m_commitMessageFileName = changeTmpFile.fileName(); // Create a submit - changeTmpFile.write(submitTemplate.toUtf8()); - changeTmpFile.flush(); - changeTmpFile.close(); + saver.write(submitTemplate.toUtf8()); + if (!saver.finalize()) { + VCSBase::VCSBaseOutputWindow::instance()->appendError(saver.errorString()); + return; + } + m_commitMessageFileName = saver.fileName(); // Create a submit editor and set file list CVSSubmitEditor *editor = openCVSSubmitEditor(m_commitMessageFileName); editor->setCheckScriptWorkingDirectory(m_commitRepository); diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 2874bd41b814114120604977276762f22a31104c..4f6cce47d4e4af4e863ce458fd1de69e6430527c 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -106,6 +106,7 @@ #include #include #include +#include #include @@ -2100,13 +2101,15 @@ void DebuggerPluginPrivate::dumpLog() tr("Save Debugger Log"), QDir::tempPath()); if (fileName.isEmpty()) return; - QFile file(fileName); - if (!file.open(QIODevice::WriteOnly)) - return; - QTextStream ts(&file); - ts << m_logWindow->inputContents(); - ts << "\n\n=======================================\n\n"; - ts << m_logWindow->combinedContents(); + Utils::FileSaver saver(fileName); + if (!saver.hasError()) { + QTextStream ts(saver.file()); + ts << m_logWindow->inputContents(); + ts << "\n\n=======================================\n\n"; + ts << m_logWindow->combinedContents(); + saver.setResult(&ts); + } + saver.finalize(mainWindow()); } /*! Activates the previous mode when the current mode is the debug mode. */ diff --git a/src/plugins/debugger/gdb/classicgdbengine.cpp b/src/plugins/debugger/gdb/classicgdbengine.cpp index c9aa896661b988c8bca5eb4da25720158f04c985..c1c4265f25accf5ad4fcd3a53f411ed23a33ba46 100644 --- a/src/plugins/debugger/gdb/classicgdbengine.cpp +++ b/src/plugins/debugger/gdb/classicgdbengine.cpp @@ -44,6 +44,7 @@ #include #include +#include #include #include @@ -1085,11 +1086,8 @@ void GdbEngine::tryLoadDebuggingHelpersClassic() PRECONDITION; if (m_gdbAdapter->dumperHandling() == AbstractGdbAdapter::DumperNotAvailable) { // Load at least gdb macro based dumpers. - QFile file(_(":/gdb/gdbmacros.txt")); - file.open(QIODevice::ReadOnly); - QByteArray contents = file.readAll(); m_debuggingHelperState = DebuggingHelperLoadTried; - postCommand(contents); + postCommand(Utils::FileReader::fetchQrc(_(":/gdb/gdbmacros.txt"))); return; } diff --git a/src/plugins/debugger/logwindow.cpp b/src/plugins/debugger/logwindow.cpp index efc727ee16e34ee5ce1e2d0be45fce4ec64bda3f..6c3e9c77c78a526489cdce4589df6401f18087b1 100644 --- a/src/plugins/debugger/logwindow.cpp +++ b/src/plugins/debugger/logwindow.cpp @@ -57,6 +57,7 @@ #include #include +#include namespace Debugger { namespace Internal { @@ -501,16 +502,10 @@ bool LogWindow::writeLogContents(const QPlainTextEdit *editor, QWidget *parent) const QString fileName = QFileDialog::getSaveFileName(parent, tr("Log File")); if (fileName.isEmpty()) break; - QFile file(fileName); - if (file.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Truncate)) { - file.write(editor->toPlainText().toUtf8()); - file.close(); + Utils::FileSaver saver(fileName, QIODevice::Text); + saver.write(editor->toPlainText().toUtf8()); + if (saver.finalize(parent)) success = true; - } else { - QMessageBox::warning(parent, tr("Write Failure"), - tr("Unable to write log contents to '%1': %2"). - arg(fileName, file.errorString())); - } } return success; } diff --git a/src/plugins/designer/qtcreatorintegration.cpp b/src/plugins/designer/qtcreatorintegration.cpp index 138e4e942e92ca3cbf06a2fec9cd232a4e97c79c..368dcdc381cc7fa6b85881dbaff956603f15af70 100644 --- a/src/plugins/designer/qtcreatorintegration.cpp +++ b/src/plugins/designer/qtcreatorintegration.cpp @@ -60,6 +60,7 @@ #include #include #include +#include #include #include @@ -488,9 +489,9 @@ static Document::Ptr getParsedDocument(const QString &fileName, CppModelManagerI if (workingCopy.contains(fileName)) { src = workingCopy.source(fileName); } else { - QFile file(fileName); - if (file.open(QFile::ReadOnly)) - src = QTextStream(&file).readAll(); // ### FIXME + Utils::FileReader reader; + if (reader.fetch(fileName)) // ### FIXME error reporting + src = QString::fromLocal8Bit(reader.data()); // ### FIXME encoding } QByteArray source = snapshot.preprocessedCode(src, fileName); diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp index ebec74a6e935acf126fab8f9f7082044db915f5c..32659e1743d99dff3dbae8d89a07ef935e62bba2 100644 --- a/src/plugins/genericprojectmanager/genericproject.cpp +++ b/src/plugins/genericprojectmanager/genericproject.cpp @@ -45,6 +45,7 @@ #include #include #include +#include #include #include @@ -141,15 +142,15 @@ static QStringList readLines(const QString &absoluteFileName) bool GenericProject::saveRawFileList(const QStringList &rawFileList) { // Make sure we can open the file for writing - QFile file(filesFileName()); - if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) + Utils::FileSaver saver(filesFileName(), QIODevice::Text); + if (!saver.hasError()) { + QTextStream stream(saver.file()); + foreach (const QString &filePath, rawFileList) + stream << filePath << QLatin1Char('\n'); + saver.setResult(&stream); + } + if (!saver.finalize(Core::ICore::instance()->mainWindow())) return false; - - QTextStream stream(&file); - foreach (const QString &filePath, rawFileList) - stream << filePath << QLatin1Char('\n'); - - file.close(); refresh(GenericProject::Files); return true; } diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 6e770b832e3b58ab847503a5b01b8674917ac5de..b57cfb84d0e22f93e0edc29d455f8ae7a59f4307 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -55,6 +55,7 @@ #include #include #include +#include #include #include #include @@ -1784,9 +1785,10 @@ bool GitClient::getCommitData(const QString &workingDirectory, // Read description const QString descriptionFile = gitDir.absoluteFilePath(QLatin1String("description")); if (QFileInfo(descriptionFile).isFile()) { - QFile file(descriptionFile); - if (file.open(QIODevice::ReadOnly|QIODevice::Text)) - commitData->panelInfo.description = commandOutputFromLocal8Bit(file.readAll()).trimmed(); + Utils::FileReader reader; + if (!reader.fetch(descriptionFile, QIODevice::Text, errorMessage)) + return false; + commitData->panelInfo.description = commandOutputFromLocal8Bit(reader.data()).trimmed(); } // Run status. Note that it has exitcode 1 if there are no added files. @@ -1868,14 +1870,10 @@ bool GitClient::getCommitData(const QString &workingDirectory, const QFileInfo templateFileInfo(templateFilename); if (templateFileInfo.isRelative()) templateFilename = repoDirectory + QLatin1Char('/') + templateFilename; - QFile templateFile(templateFilename); - if (templateFile.open(QIODevice::ReadOnly|QIODevice::Text)) { - *commitTemplate = QString::fromLocal8Bit(templateFile.readAll()); - } else { - qWarning("Unable to read commit template %s: %s", - qPrintable(templateFilename), - qPrintable(templateFile.errorString())); - } + Utils::FileReader reader; + if (!reader.fetch(templateFilename, QIODevice::Text, errorMessage)) + return false; + *commitTemplate = QString::fromLocal8Bit(reader.data()); } } return true; diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp index 23dede0ee5183e7756e9c6fe23453a8c308ca515..1ebdf4cc6ae71fd2307c956ff185d122f36f707b 100644 --- a/src/plugins/git/gitplugin.cpp +++ b/src/plugins/git/gitplugin.cpp @@ -58,6 +58,7 @@ #include #include +#include #include #include @@ -693,18 +694,15 @@ void GitPlugin::startCommit(bool amend) qDebug() << Q_FUNC_INFO << data << commitTemplate; // Start new temp file with message template - QTemporaryFile changeTmpFile; - changeTmpFile.setAutoRemove(false); - if (!changeTmpFile.open()) { - VCSBase::VCSBaseOutputWindow::instance()->append(tr("Cannot create temporary file: %1").arg(changeTmpFile.errorString())); + Utils::TempFileSaver saver; + // Keep the file alive, else it removes self and forgets its name + saver.setAutoRemove(false); + saver.write(commitTemplate.toLocal8Bit()); + if (!saver.finalize()) { + VCSBase::VCSBaseOutputWindow::instance()->append(saver.errorString()); return; } - m_commitMessageFileName = changeTmpFile.fileName(); - changeTmpFile.write(commitTemplate.toLocal8Bit()); - changeTmpFile.flush(); - // Keep the file alive, else it removes self and forgets - // its name - changeTmpFile.close(); + m_commitMessageFileName = saver.fileName(); openSubmitEditor(m_commitMessageFileName, data, amend); } diff --git a/src/plugins/help/generalsettingspage.cpp b/src/plugins/help/generalsettingspage.cpp index 222717a97ee28a5b2d0f0fcf28ead64d5cabd7fc..668a86dae3c54e1444317b7b2c88e46bc5e52fa0 100644 --- a/src/plugins/help/generalsettingspage.cpp +++ b/src/plugins/help/generalsettingspage.cpp @@ -43,6 +43,8 @@ #include #include +#include + #include #include #include @@ -267,10 +269,15 @@ void GeneralSettingsPage::exportBookmarks() if (!fileName.endsWith(suffix)) fileName.append(suffix); - QFile file(fileName); - if (file.open(QIODevice::WriteOnly)) { + Utils::FileSaver saver(fileName); + if (!saver.hasError()) { XbelWriter writer(LocalHelpManager::bookmarkManager().treeBookmarkModel()); - writer.writeToFile(&file); + writer.writeToFile(saver.file()); + saver.setResult(&writer); + } + if (!saver.finalize()) { + m_ui->errorLabel->setVisible(true); + m_ui->errorLabel->setText(saver.errorString()); } } diff --git a/src/plugins/help/helpviewer.cpp b/src/plugins/help/helpviewer.cpp index 6877cb3d98e51c4dead96ca2e082b99c218b54d0..856c9080af47d9b798839b7005644701303b5ed0 100644 --- a/src/plugins/help/helpviewer.cpp +++ b/src/plugins/help/helpviewer.cpp @@ -34,13 +34,18 @@ #include "helpconstants.h" #include "localhelpmanager.h" +#include + +#include + #include #include -#include +#include #include #include #include +#include #include #include @@ -131,19 +136,12 @@ bool HelpViewer::launchWithExternalApp(const QUrl &url) const QString& path = resolvedUrl.path(); if (!canOpenPage(path)) { - QTemporaryFile tmpTmpFile; - if (!tmpTmpFile.open()) - return false; - - const QString &extension = QFileInfo(path).completeSuffix(); - QFile actualTmpFile(tmpTmpFile.fileName() % QLatin1String(".") - % extension); - if (!actualTmpFile.open(QIODevice::ReadWrite | QIODevice::Truncate)) - return false; - - actualTmpFile.write(helpEngine.fileData(resolvedUrl)); - actualTmpFile.close(); - return QDesktopServices::openUrl(QUrl(actualTmpFile.fileName())); + Utils::TempFileSaver saver(QDir::tempPath() + + QLatin1String("/qtchelp_XXXXXX.") + QFileInfo(path).completeSuffix()); + if (!saver.hasError()) + saver.write(helpEngine.fileData(resolvedUrl)); + if (saver.finalize(Core::ICore::instance()->mainWindow())) + return QDesktopServices::openUrl(QUrl(saver.fileName())); } } return false; diff --git a/src/plugins/macros/macro.cpp b/src/plugins/macros/macro.cpp index 5c9f7996ceac42b9535a0a095e2b73e25c3348de..81ddda58224722c7d717dc895bef0d66c6e1a816 100644 --- a/src/plugins/macros/macro.cpp +++ b/src/plugins/macros/macro.cpp @@ -35,6 +35,8 @@ #include +#include + #include #include @@ -101,10 +103,10 @@ Macro& Macro::operator=(const Macro &other) return *this; } -void Macro::load(QString fileName) +bool Macro::load(QString fileName) { if (d->events.count()) - return; // the macro is not empty + return true; // the macro is not empty // Take the current filename if the parameter is null if (fileName.isNull()) @@ -123,10 +125,12 @@ void Macro::load(QString fileName) macroEvent.load(stream); append(macroEvent); } + return true; } + return false; } -void Macro::loadHeader(const QString &fileName) +bool Macro::loadHeader(const QString &fileName) { d->fileName = fileName; QFile file(fileName); @@ -134,21 +138,27 @@ void Macro::loadHeader(const QString &fileName) QDataStream stream(&file); stream >> d->version; stream >> d->description; + return true; } + return false; } -void Macro::save(const QString &fileName) +bool Macro::save(const QString &fileName, QWidget *parent) { - QFile file(fileName); - if (file.open(QFile::WriteOnly)) { - QDataStream stream(&file); + Utils::FileSaver saver(fileName); + if (!saver.hasError()) { + QDataStream stream(saver.file()); stream << d->version; stream << d->description; foreach (const MacroEvent &event, d->events) { event.save(stream); } - d->fileName = fileName; + saver.setResult(&stream); } + if (!saver.finalize(parent)) + return false; + d->fileName = fileName; + return true; } QString Macro::displayName() const diff --git a/src/plugins/macros/macro.h b/src/plugins/macros/macro.h index 9849103dad3389ed8200887765553cec60d86c01..8775b9837c988fd217174910a9b3a1211c898b72 100644 --- a/src/plugins/macros/macro.h +++ b/src/plugins/macros/macro.h @@ -38,6 +38,10 @@ #include #include +QT_BEGIN_NAMESPACE +class QWidget; +QT_END_NAMESPACE + namespace Macros { class MacroEvent; @@ -50,9 +54,9 @@ public: ~Macro(); Macro& operator=(const Macro& other); - void load(QString fileName = QString()); - void loadHeader(const QString &fileName); - void save(const QString &fileName); + bool load(QString fileName = QString()); + bool loadHeader(const QString &fileName); + bool save(const QString &fileName, QWidget *parent); const QString &description() const; void setDescription(const QString &text); diff --git a/src/plugins/macros/macromanager.cpp b/src/plugins/macros/macromanager.cpp index 4320a9a86265126cedf9c367969d2aef175c3836..a801478d865fd253884a3c14b87579c22c5e961b 100644 --- a/src/plugins/macros/macromanager.cpp +++ b/src/plugins/macros/macromanager.cpp @@ -152,8 +152,10 @@ void MacroManager::MacroManagerPrivate::initialize() foreach (const QString &name, files) { QString fileName = dir.absolutePath() + '/' + name; Macro *macro = new Macro; - macro->loadHeader(fileName); - addMacro(macro); + if (macro->loadHeader(fileName)) + addMacro(macro); + else + delete macro; } } @@ -190,9 +192,10 @@ void MacroManager::MacroManagerPrivate::removeMacro(const QString &name) void MacroManager::MacroManagerPrivate::changeMacroDescription(Macro *macro, const QString &description) { - macro->load(); + if (!macro->load()) + return; macro->setDescription(description); - macro->save(macro->fileName()); + macro->save(macro->fileName(), Core::ICore::instance()->mainWindow()); // Change shortcut what's this Core::ICore *core = Core::ICore::instance(); @@ -205,9 +208,10 @@ void MacroManager::MacroManagerPrivate::changeMacroDescription(Macro *macro, con bool MacroManager::MacroManagerPrivate::executeMacro(Macro *macro) { - macro->load(); - bool error = false; + bool error = !macro->load(); foreach (const MacroEvent ¯oEvent, macro->events()) { + if (error) + break; foreach (IMacroHandler *handler, handlers) { if (handler->canExecuteEvent(macroEvent)) { if (!handler->executeEvent(macroEvent)) @@ -215,8 +219,6 @@ bool MacroManager::MacroManagerPrivate::executeMacro(Macro *macro) break; } } - if (error) - break; } if (error) { @@ -246,7 +248,7 @@ void MacroManager::MacroManagerPrivate::showSaveDialog() QString fileName = q->macrosDirectory() + '/' + dialog.name() + '.' + Constants::M_EXTENSION; currentMacro->setDescription(dialog.description()); - currentMacro->save(fileName); + currentMacro->save(fileName, mainWindow); addMacro(currentMacro); } } diff --git a/src/plugins/memcheck/suppressiondialog.cpp b/src/plugins/memcheck/suppressiondialog.cpp index 2830491fc0bbc966182c565a46cd2972b4764ad9..805a85a4cf5cfcdecdf18b7affe4292020800a9e 100644 --- a/src/plugins/memcheck/suppressiondialog.cpp +++ b/src/plugins/memcheck/suppressiondialog.cpp @@ -45,6 +45,7 @@ #include #include +#include #include #include @@ -187,13 +188,12 @@ void SuppressionDialog::accept() QTC_ASSERT(!path.isEmpty(), return); QTC_ASSERT(!m_ui->suppressionEdit->toPlainText().trimmed().isEmpty(), return); - QFile file(path); - bool opened = file.open(QIODevice::WriteOnly | QIODevice::Append); - QTC_ASSERT(opened, return); - - QTextStream stream(&file); + Utils::FileSaver saver(path, QIODevice::Append); + QTextStream stream(saver.file()); stream << m_ui->suppressionEdit->toPlainText(); - file.close(); + saver.setResult(&stream); + if (!saver.finalize(this)) + return; // add file to project (if there is a project that contains this file on the file system) ProjectExplorer::SessionManager *session = ProjectExplorer::ProjectExplorerPlugin::instance()->session(); diff --git a/src/plugins/mercurial/mercurialclient.cpp b/src/plugins/mercurial/mercurialclient.cpp index f85cdc5bc94d7b04f870c34e948e8928e5f33083..9cc1193098c5c646301fe4f5ecbfef29019820f5 100644 --- a/src/plugins/mercurial/mercurialclient.cpp +++ b/src/plugins/mercurial/mercurialclient.cpp @@ -39,6 +39,7 @@ #include #include #include +#include #include #include @@ -105,10 +106,12 @@ bool MercurialClient::synchronousClone(const QString &workingDir, } // By now, there is no hgrc file -> create it - QFile hgrc(workingDirectory.path()+"/.hg/hgrc"); - hgrc.open(QIODevice::WriteOnly); - hgrc.write(QString("[paths]\ndefault = %1\n").arg(dstLocation).toUtf8()); - hgrc.close(); + Utils::FileSaver saver(workingDirectory.path()+"/.hg/hgrc"); + saver.write(QString("[paths]\ndefault = %1\n").arg(dstLocation).toUtf8()); + if (!saver.finalize()) { + VCSBase::VCSBaseOutputWindow::instance()->appendError(saver.errorString()); + return false; + } // And last update repository arguments.clear(); diff --git a/src/plugins/perforce/perforceplugin.cpp b/src/plugins/perforce/perforceplugin.cpp index 1794dadbc26662ad4008d3d1fc03af2a2f91a50d..ba58083a3a37d4700f3af38f3023ea0c48691585 100644 --- a/src/plugins/perforce/perforceplugin.cpp +++ b/src/plugins/perforce/perforceplugin.cpp @@ -55,6 +55,7 @@ #include #include #include +#include #include #include #include @@ -66,7 +67,6 @@ #include #include #include -#include #include #include @@ -625,13 +625,6 @@ void PerforcePlugin::startSubmitProject() const VCSBase::VCSBasePluginState state = currentState(); QTC_ASSERT(state.hasProject(), return) - QTemporaryFile changeTmpFile; - changeTmpFile.setAutoRemove(false); - if (!changeTmpFile.open()) { - VCSBase::VCSBaseOutputWindow::instance()->appendError(tr("Cannot create temporary file.")); - cleanCommitMessageFile(); - return; - } // Revert all unchanged files. if (!revertProject(state.currentProjectTopLevel(), perforceRelativeProjectDirectory(state), true)) return; @@ -646,9 +639,15 @@ void PerforcePlugin::startSubmitProject() return; } - m_commitMessageFileName = changeTmpFile.fileName(); - changeTmpFile.write(result.stdOut.toAscii()); - changeTmpFile.close(); + Utils::TempFileSaver saver; + saver.setAutoRemove(false); + saver.write(result.stdOut.toAscii()); + if (!saver.finalize()) { + VCSBase::VCSBaseOutputWindow::instance()->appendError(saver.errorString()); + cleanCommitMessageFile(); + return; + } + m_commitMessageFileName = saver.fileName(); args.clear(); args << QLatin1String("fstat"); @@ -949,11 +948,12 @@ bool PerforcePlugin::vcsMove(const QString &workingDir, const QString &from, con } // Write extra args to temporary file -QSharedPointer - PerforcePlugin::createTemporaryArgumentFile(const QStringList &extraArgs) const +QSharedPointer + PerforcePlugin::createTemporaryArgumentFile(const QStringList &extraArgs, + QString *errorString) const { if (extraArgs.isEmpty()) - return QSharedPointer(); + return QSharedPointer(); // create pattern if (m_tempFilePattern.isEmpty()) { m_tempFilePattern = QDir::tempPath(); @@ -961,20 +961,16 @@ QSharedPointer m_tempFilePattern += QDir::separator(); m_tempFilePattern += QLatin1String("qtc_p4_XXXXXX.args"); } - QSharedPointer rc(new QTemporaryFile(m_tempFilePattern)); + QSharedPointer rc(new Utils::TempFileSaver(m_tempFilePattern)); rc->setAutoRemove(true); - if (!rc->open()) { - qWarning("Could not create temporary file: %s. Appending all file names to command line.", - qPrintable(rc->errorString())); - return QSharedPointer(); - } const int last = extraArgs.size() - 1; for (int i = 0; i <= last; i++) { rc->write(extraArgs.at(i).toLocal8Bit()); if (i != last) - rc->write("\n"); + rc->write("\n", 1); } - rc->close(); + if (!rc->finalize(errorString)) + return QSharedPointer(); return rc; } @@ -1153,9 +1149,16 @@ PerforceResponse PerforcePlugin::runP4Cmd(const QString &workingDir, return invalidConfigResponse; } QStringList actualArgs = m_settings.commonP4Arguments(workingDir); - QSharedPointer tempFile = createTemporaryArgumentFile(extraArgs); - if (!tempFile.isNull()) + QString errorMessage; + QSharedPointer tempFile = createTemporaryArgumentFile(extraArgs, &errorMessage); + if (!tempFile.isNull()) { actualArgs << QLatin1String("-x") << tempFile->fileName(); + } else if (!errorMessage.isEmpty()) { + PerforceResponse tempFailResponse; + tempFailResponse.error = true; + tempFailResponse.message = errorMessage; + return tempFailResponse; + } actualArgs.append(args); if (flags & CommandToWindow) @@ -1372,19 +1375,17 @@ bool PerforcePlugin::submitEditorAboutToClose(VCSBase::VCSBaseSubmitEditor *subm return true; } // Pipe file into p4 submit -i - QFile commitMessageFile(m_commitMessageFileName); - if (!commitMessageFile.open(QIODevice::ReadOnly|QIODevice::Text)) { - VCSBase::VCSBaseOutputWindow::instance()->appendError(tr("Cannot open temporary file.")); + Utils::FileReader reader; + if (!reader.fetch(m_commitMessageFileName, QIODevice::Text)) { + VCSBase::VCSBaseOutputWindow::instance()->appendError(reader.errorString()); return false; } - const QByteArray changeDescription = commitMessageFile.readAll(); - commitMessageFile.close(); QStringList submitArgs; submitArgs << QLatin1String("submit") << QLatin1String("-i"); const PerforceResponse submitResponse = runP4Cmd(m_settings.topLevelSymLinkTarget(), submitArgs, LongTimeOut|RunFullySynchronous|CommandToWindow|StdErrToWindow|ErrorToWindow|ShowBusyCursor, - QStringList(), changeDescription); + QStringList(), reader.data()); if (submitResponse.error) { VCSBase::VCSBaseOutputWindow::instance()->appendError(tr("p4 submit failed: %1").arg(submitResponse.message)); return false; diff --git a/src/plugins/perforce/perforceplugin.h b/src/plugins/perforce/perforceplugin.h index 0e1ba0dbda2b3153ae96ec9fb4d9d911b55eb206..69bb1f66bdce036f40b8b7e576d6db1d7d1d14eb 100644 --- a/src/plugins/perforce/perforceplugin.h +++ b/src/plugins/perforce/perforceplugin.h @@ -54,6 +54,7 @@ QT_END_NAMESPACE namespace Utils { class ParameterAction; + class TempFileSaver; } namespace Locator { @@ -190,7 +191,8 @@ private: bool enableAnnotationContextMenu = false); void cleanCommitMessageFile(); bool isCommitEditorOpen() const; - QSharedPointer createTemporaryArgumentFile(const QStringList &extraArgs) const; + QSharedPointer createTemporaryArgumentFile(const QStringList &extraArgs, + QString *errorString) const; void getTopLevel(); QString pendingChangesData(); diff --git a/src/plugins/projectexplorer/customwizard/customwizard.cpp b/src/plugins/projectexplorer/customwizard/customwizard.cpp index e11aa38d38297ae93ccd9fbbc2abe462c78327e3..4e30197f998b52738cf9227c60c715ef381ea465 100644 --- a/src/plugins/projectexplorer/customwizard/customwizard.cpp +++ b/src/plugins/projectexplorer/customwizard/customwizard.cpp @@ -40,6 +40,7 @@ #include #include #include +#include #include #include @@ -182,23 +183,19 @@ static inline bool createFile(Internal::CustomWizardFile cwFile, // Read contents of source file const QFile::OpenMode openMode = cwFile.binary ? QIODevice::ReadOnly : (QIODevice::ReadOnly|QIODevice::Text); - QFile file(sourcePath); - if (!file.open(openMode)) { - *errorMessage = QString::fromLatin1("Cannot open %1: %2").arg(sourcePath, file.errorString()); + Utils::FileReader reader; + if (!reader.fetch(sourcePath, openMode, errorMessage)) return false; - } - const QByteArray contentData = file.readAll(); - file.close(); Core::GeneratedFile generatedFile; generatedFile.setPath(targetPath); if (cwFile.binary) { // Binary file: Set data. generatedFile.setBinary(true); - generatedFile.setBinaryContents(contentData); + generatedFile.setBinaryContents(reader.data()); } else { // Template file: Preprocess. - const QString contentsIn = QString::fromLocal8Bit(contentData); + const QString contentsIn = QString::fromLocal8Bit(reader.data()); generatedFile.setContents(Internal::CustomWizardContext::processFile(fm, contentsIn)); } diff --git a/src/plugins/projectexplorer/msvctoolchain.cpp b/src/plugins/projectexplorer/msvctoolchain.cpp index a2e27f9c43a91074e67f4552ce27d69daa3861a5..8da566198ade543dfbbaf086c3cf4deefa147a80 100644 --- a/src/plugins/projectexplorer/msvctoolchain.cpp +++ b/src/plugins/projectexplorer/msvctoolchain.cpp @@ -39,6 +39,7 @@ #include #include +#include #include #include #include @@ -176,16 +177,11 @@ static QByteArray msvcPredefinedMacros(const Utils::Environment &env) "#define __ptr32\n" "#define __ptr64\n"; - QString tmpFilePath; - { - // QTemporaryFile is buggy and will not unlock the file for cl.exe - QTemporaryFile tmpFile(QDir::tempPath()+"/envtestXXXXXX.cpp"); - tmpFile.setAutoRemove(false); - if (!tmpFile.open()) - return predefinedMacros; - tmpFilePath = QFileInfo(tmpFile).canonicalFilePath(); - tmpFile.write(msvcCompilationFile()); - tmpFile.close(); + Utils::TempFileSaver saver(QDir::tempPath()+"/envtestXXXXXX.cpp"); + saver.write(msvcCompilationFile()); + if (!saver.finalize()) { + qWarning("%s: %s", Q_FUNC_INFO, qPrintable(saver.errorString())); + return predefinedMacros; } QProcess cpp; cpp.setEnvironment(env.toStringList()); @@ -197,7 +193,7 @@ static QByteArray msvcPredefinedMacros(const Utils::Environment &env) return predefinedMacros; } - arguments << QLatin1String("/EP") << QDir::toNativeSeparators(tmpFilePath); + arguments << QLatin1String("/EP") << QDir::toNativeSeparators(saver.fileName()); cpp.start(binary, arguments); if (!cpp.waitForStarted()) { qWarning("%s: Cannot start '%s': %s", Q_FUNC_INFO, qPrintable(binary), @@ -231,7 +227,6 @@ static QByteArray msvcPredefinedMacros(const Utils::Environment &env) predefinedMacros += '\n'; } } - QFile::remove(tmpFilePath); if (debug) qDebug() << "msvcPredefinedMacros" << predefinedMacros; return predefinedMacros; @@ -269,13 +264,7 @@ static Utils::Environment msvcReadEnvironmentSetting(const QString &varsBat, return result; const QString tempOutputFileName = QDir::tempPath() + QLatin1String("\\qtcreator-msvc-environment.txt"); - QTemporaryFile tf(QDir::tempPath() + "\\XXXXXX.bat"); - tf.setAutoRemove(true); - if (!tf.open()) - return result; - - const QString filename = tf.fileName(); - + Utils::TempFileSaver saver(QDir::tempPath() + "\\XXXXXX.bat"); QByteArray call = "call "; call += Utils::QtcProcess::quoteArg(varsBat).toLocal8Bit(); if (!args.isEmpty()) { @@ -283,19 +272,21 @@ static Utils::Environment msvcReadEnvironmentSetting(const QString &varsBat, call += args.toLocal8Bit(); } call += "\r\n"; - tf.write(call); + saver.write(call); const QByteArray redirect = "set > " + Utils::QtcProcess::quoteArg( QDir::toNativeSeparators(tempOutputFileName)).toLocal8Bit() + "\r\n"; - tf.write(redirect); - tf.flush(); - tf.waitForBytesWritten(30000); + saver.write(redirect); + if (!saver.finalize()) { + qWarning("%s: %s", Q_FUNC_INFO, qPrintable(saver.errorString())); + return result; + } Utils::QtcProcess run; run.setEnvironment(env); const QString cmdPath = QString::fromLocal8Bit(qgetenv("COMSPEC")); // Windows SDK setup scripts require command line switches for environment expansion. QString cmdArguments = QLatin1String(" /E:ON /V:ON /c \""); - cmdArguments += QDir::toNativeSeparators(filename); + cmdArguments += QDir::toNativeSeparators(saver.fileName()); cmdArguments += QLatin1Char('"'); run.setCommand(cmdPath, cmdArguments); if (debug) @@ -313,7 +304,6 @@ static Utils::Environment msvcReadEnvironmentSetting(const QString &varsBat, Utils::SynchronousProcess::stopProcess(run); return result; } - tf.close(); QFile varsFile(tempOutputFileName); if (!varsFile.open(QIODevice::ReadOnly|QIODevice::Text)) diff --git a/src/plugins/projectexplorer/persistentsettings.cpp b/src/plugins/projectexplorer/persistentsettings.cpp index 9516dfa2fc97da144a9eebed5d03ab359c0ac89d..b02fe20a46131257cc20b1c928b01af68a7bb6be 100644 --- a/src/plugins/projectexplorer/persistentsettings.cpp +++ b/src/plugins/projectexplorer/persistentsettings.cpp @@ -34,6 +34,8 @@ #include +#include + #include #include #include @@ -376,31 +378,32 @@ void PersistentSettingsWriter::saveValue(const QString & variable, const QVarian m_valueMap.insert(variable, value); } -bool PersistentSettingsWriter::save(const QString & fileName, const QString &docType) const +bool PersistentSettingsWriter::save(const QString & fileName, const QString &docType, + QWidget *parent) const { - QFile file(fileName); - if (!file.open(QIODevice::WriteOnly|QIODevice::Text)) - return false; + Utils::FileSaver saver(fileName, QIODevice::Text); + if (!saver.hasError()) { + const Context ctx; + QXmlStreamWriter w(saver.file()); + w.setAutoFormatting(true); + w.setAutoFormattingIndent(1); // Historical, used to be QDom. + w.writeStartDocument(); + w.writeDTD(QLatin1String("')); + w.writeComment(QString::fromAscii(" Written by Qt Creator %1, %2. "). + arg(QLatin1String(Core::Constants::IDE_VERSION_LONG), + QDateTime::currentDateTime().toString(Qt::ISODate))); + w.writeStartElement(ctx.qtCreatorElement); + const QVariantMap::const_iterator cend = m_valueMap.constEnd(); + for (QVariantMap::const_iterator it = m_valueMap.constBegin(); it != cend; ++it) { + w.writeStartElement(ctx.dataElement); + w.writeTextElement(ctx.variableElement, it.key()); + writeVariantValue(w, ctx, it.value()); + w.writeEndElement(); + } + w.writeEndDocument(); - const Context ctx; - QXmlStreamWriter w(&file); - w.setAutoFormatting(true); - w.setAutoFormattingIndent(1); // Historical, used to be QDom. - w.writeStartDocument(); - w.writeDTD(QLatin1String("')); - w.writeComment(QString::fromAscii(" Written by Qt Creator %1, %2. "). - arg(QLatin1String(Core::Constants::IDE_VERSION_LONG), - QDateTime::currentDateTime().toString(Qt::ISODate))); - w.writeStartElement(ctx.qtCreatorElement); - const QVariantMap::const_iterator cend = m_valueMap.constEnd(); - for (QVariantMap::const_iterator it = m_valueMap.constBegin(); it != cend; ++it) { - w.writeStartElement(ctx.dataElement); - w.writeTextElement(ctx.variableElement, it.key()); - writeVariantValue(w, ctx, it.value()); - w.writeEndElement(); + saver.setResult(&w); } - w.writeEndDocument(); - file.close(); - return true; + return saver.finalize(parent); } } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/persistentsettings.h b/src/plugins/projectexplorer/persistentsettings.h index daf65e7ed4668b3242082bb65bed6a00c51e5829..879f918158c16920e7f58392a1998e54b1bb55bf 100644 --- a/src/plugins/projectexplorer/persistentsettings.h +++ b/src/plugins/projectexplorer/persistentsettings.h @@ -38,6 +38,10 @@ #include #include +QT_BEGIN_NAMESPACE +class QWidget; +QT_END_NAMESPACE + namespace ProjectExplorer { class PROJECTEXPLORER_EXPORT PersistentSettingsReader @@ -57,7 +61,7 @@ class PROJECTEXPLORER_EXPORT PersistentSettingsWriter public: PersistentSettingsWriter(); void saveValue(const QString & variable, const QVariant &value); - bool save(const QString & fileName, const QString & docType) const; + bool save(const QString &fileName, const QString &docType, QWidget *parent) const; private: QMap m_valueMap; diff --git a/src/plugins/projectexplorer/session.cpp b/src/plugins/projectexplorer/session.cpp index 7c96b0f48271ee01a14e0f91c767882206b206da..a95889eacdac248fa66efaefd27d57f144466b11 100644 --- a/src/plugins/projectexplorer/session.cpp +++ b/src/plugins/projectexplorer/session.cpp @@ -279,7 +279,7 @@ bool SessionFile::save() writer.saveValue("valueKeys", keys); - if (writer.save(m_fileName, "QtCreatorSession")) + if (writer.save(m_fileName, "QtCreatorSession", Core::ICore::instance()->mainWindow())) return true; return false; diff --git a/src/plugins/projectexplorer/toolchainmanager.cpp b/src/plugins/projectexplorer/toolchainmanager.cpp index ada08f87e612ba51625e211fbf0d37cf841a16bb..1c8ad72efe2613ae8c2baa392dc7f2efd5c7e9b4 100644 --- a/src/plugins/projectexplorer/toolchainmanager.cpp +++ b/src/plugins/projectexplorer/toolchainmanager.cpp @@ -42,6 +42,7 @@ #include #include #include +#include static const char *const TOOLCHAIN_DATA_KEY = "ToolChain."; static const char *const TOOLCHAIN_COUNT_KEY = "ToolChain.Count"; @@ -150,7 +151,7 @@ void ToolChainManager::saveToolChains() } } writer.saveValue(QLatin1String(TOOLCHAIN_COUNT_KEY), count); - writer.save(settingsFileName(), "QtCreatorToolChains"); + writer.save(settingsFileName(), "QtCreatorToolChains", Core::ICore::instance()->mainWindow()); // Do not save default debuggers! Those are set by the SDK! } diff --git a/src/plugins/projectexplorer/userfileaccessor.cpp b/src/plugins/projectexplorer/userfileaccessor.cpp index 0dd784503b359e18759a70e48c07533804dd10c1..791746e792e09f02535c508175f7b34a413e0439 100644 --- a/src/plugins/projectexplorer/userfileaccessor.cpp +++ b/src/plugins/projectexplorer/userfileaccessor.cpp @@ -527,7 +527,7 @@ bool UserFileAccessor::saveSettings(Project *project, const QVariantMap &map) QString fileName = project->property(USERFILE_PROP).toString(); return writer.save(fileName.isEmpty() ? fileNameFor(project->file()->fileName()) : fileName, - "QtCreatorProject"); + "QtCreatorProject", Core::ICore::instance()->mainWindow()); } void UserFileAccessor::addVersionHandler(UserFileVersionHandler *handler) diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp index 344259927580438e65cd2c9858187b605851975f..b7f5057674acc61f567432c78a72be602b76ff63 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp @@ -49,16 +49,15 @@ #include #include +#include + namespace QmlDesigner { FormEditorWidget::FormEditorWidget(FormEditorView *view) : QWidget(), m_formEditorView(view) { - QFile file(":/qmldesigner/formeditorstylesheet.css"); - file.open(QFile::ReadOnly); - QString styleSheet = QLatin1String(file.readAll()); - setStyleSheet(styleSheet); + setStyleSheet(QLatin1String(Utils::FileReader::fetchQrc(":/qmldesigner/formeditorstylesheet.css"))); QVBoxLayout *fillLayout = new QVBoxLayout(this); fillLayout->setMargin(0); @@ -152,11 +151,8 @@ FormEditorWidget::FormEditorWidget(FormEditorView *view) m_graphicsView = new FormEditorGraphicsView(this); fillLayout->addWidget(m_graphicsView.data()); - { - QFile file(":/qmldesigner/scrollbar.css"); - file.open(QFile::ReadOnly); - m_graphicsView.data()->setStyleSheet(file.readAll()); - } + m_graphicsView.data()->setStyleSheet( + QLatin1String(Utils::FileReader::fetchQrc(":/qmldesigner/scrollbar.css"))); QList lowerActions; diff --git a/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp b/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp index ba70659bd8574d8db981572800cb6206bd4c92ff..9aa259ad84e9df410b70f5a21b6541a3587be1c9 100644 --- a/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp @@ -57,6 +57,8 @@ #include #include +#include + #include #include #include @@ -768,27 +770,17 @@ bool DesignDocumentController::save(QWidget *parent) saveAs(parent); return true; } - QFile file(m_d->fileName); - if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { - showError(tr("Cannot write file: \"%1\".").arg(m_d->fileName), parent); + Utils::FileSaver saver(m_d->fileName, QIODevice::Text); + if (m_d->model) + saver.write(m_d->textEdit->toPlainText().toLatin1()); + if (!saver.finalize()) { + showError(saver.errorString(), parent); return false; } - - QString errorMessage; - bool result = save(&file, &errorMessage); - if (!result) - showError(errorMessage, parent); - return result; -} - -bool DesignDocumentController::save(QIODevice *device, QString * /*errorMessage*/) -{ - if (m_d->model) { - QByteArray data = m_d->textEdit->toPlainText().toLatin1(); - device->write(data); + if (m_d->model) m_d->textEdit->setPlainText(m_d->textEdit->toPlainText()); // clear undo/redo history - } - return false; + + return true; } diff --git a/src/plugins/qmldesigner/components/integration/designdocumentcontroller.h b/src/plugins/qmldesigner/components/integration/designdocumentcontroller.h index 83b532f419da735115e8647ce937cdeb411e5c98..eff24623fc6b08af44baa37c84f9679ecbe74782 100644 --- a/src/plugins/qmldesigner/components/integration/designdocumentcontroller.h +++ b/src/plugins/qmldesigner/components/integration/designdocumentcontroller.h @@ -136,7 +136,6 @@ private: void attachNodeInstanceView(); QWidget *centralWidget() const; class DesignDocumentControllerPrivate *m_d; - bool save(QIODevice *device, QString *errorMessage); }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp index 7049cb266eaed5fae45a43c2f91a50bd41419967..7ddb2f461d0568a07572802e6e7997b1b7b7213d 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp @@ -33,6 +33,7 @@ #include "itemlibrarywidget.h" #include +#include #include #include "itemlibrarycomponents.h" #include "itemlibrarymodel.h" @@ -227,19 +228,9 @@ ItemLibraryWidget::ItemLibraryWidget(QWidget *parent) : setSearchFilter(QString()); /* style sheets */ - { - QFile file(":/qmldesigner/stylesheet.css"); - file.open(QFile::ReadOnly); - QString styleSheet = QLatin1String(file.readAll()); - setStyleSheet(styleSheet); - } - - { - QFile file(":/qmldesigner/scrollbar.css"); - file.open(QFile::ReadOnly); - QString styleSheet = QLatin1String(file.readAll()); - m_d->m_resourcesView->setStyleSheet(styleSheet); - } + setStyleSheet(QLatin1String(Utils::FileReader::fetchQrc(":/qmldesigner/stylesheet.css"))); + m_d->m_resourcesView->setStyleSheet( + QLatin1String(Utils::FileReader::fetchQrc(":/qmldesigner/scrollbar.css"))); } ItemLibraryWidget::~ItemLibraryWidget() diff --git a/src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp b/src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp index f2273358324b98b65b78617b18bbde4d71a17561..59d6297c664279a4b63dd274c25a8f14100473d2 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp @@ -33,11 +33,12 @@ #include #include #include -#include #include #include "navigatorwidget.h" +#include + namespace QmlDesigner { @@ -63,17 +64,9 @@ NavigatorWidget::NavigatorWidget(QWidget* parent) : setWindowTitle(tr("Navigator", "Title of navigator view")); - { - QFile file(":/qmldesigner/stylesheet.css"); - file.open(QFile::ReadOnly); - setStyleSheet(file.readAll()); - } - - { - QFile file(":/qmldesigner/scrollbar.css"); - file.open(QFile::ReadOnly); - m_treeView->setStyleSheet(file.readAll()); - } + setStyleSheet(QLatin1String(Utils::FileReader::fetchQrc(":/qmldesigner/stylesheet.css"))); + m_treeView->setStyleSheet( + QLatin1String(Utils::FileReader::fetchQrc(":/qmldesigner/scrollbar.css"))); } NavigatorWidget::~NavigatorWidget() diff --git a/src/plugins/qmldesigner/components/propertyeditor/basicwidgets.cpp b/src/plugins/qmldesigner/components/propertyeditor/basicwidgets.cpp index 44156912653e35a9bdd5c28084a14640ba1b42aa..48dd3e8361173b0e4fb586fd1be3905d0813b373 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/basicwidgets.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/basicwidgets.cpp @@ -31,6 +31,7 @@ **************************************************************************/ #include "basicwidgets.h" +#include #include #include #include @@ -442,13 +443,11 @@ public: fileName = (QLatin1Char(':') + _styleSheetFile.toLocalFile().split(QLatin1Char(':')).last()); //try if it is a resource else fileName = (_styleSheetFile.toLocalFile()); - QFile file(fileName); - if (file.open(QIODevice::ReadOnly)) { - QString styleSheet(file.readAll()); - q->setStyleSheet(styleSheet); - } else { - qWarning() << QString::fromLatin1("setStyleSheetFile: %1: %2").arg(fileName, file.errorString()); - } + Utils::FileReader reader; + if (reader.fetch(fileName)) + q->setStyleSheet(QString::fromLatin1(reader.data())); + else + qWarning() << QString::fromLatin1("setStyleSheetFile: %1").arg(reader.errorString()); } diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp index a6fff788f478981a7fedd49309d5666eb612fd3e..bd3319acd00af24142645a2c19d03691fae1f10c 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp @@ -59,6 +59,8 @@ #include "propertyeditortransaction.h" #include "originwidget.h" +#include + #include #include #include @@ -278,10 +280,8 @@ PropertyEditor::PropertyEditor(QWidget *parent) : m_updateShortcut = new QShortcut(QKeySequence("F5"), m_stackedWidget); connect(m_updateShortcut, SIGNAL(activated()), this, SLOT(reloadQml())); - QFile file(":/qmldesigner/stylesheet.css"); - file.open(QFile::ReadOnly); - QString styleSheet = QLatin1String(file.readAll()); - m_stackedWidget->setStyleSheet(styleSheet); + m_stackedWidget->setStyleSheet( + QLatin1String(Utils::FileReader::fetchQrc(":/qmldesigner/stylesheet.css"))); m_stackedWidget->setMinimumWidth(300); m_stackedWidget->move(0, 0); connect(m_stackedWidget, SIGNAL(resized()), this, SLOT(updateSize())); diff --git a/src/plugins/qmldesigner/designmodewidget.cpp b/src/plugins/qmldesigner/designmodewidget.cpp index da475718607a0421660dd1efda0646dc937dc263..d7e51dea4fb2e92f1a2a7aefe47550509520afee 100644 --- a/src/plugins/qmldesigner/designmodewidget.cpp +++ b/src/plugins/qmldesigner/designmodewidget.cpp @@ -56,6 +56,7 @@ #include #include +#include #include #include @@ -634,17 +635,10 @@ void DesignModeWidget::setup() } if (navigationView.widget) - { - QFile file(":/qmldesigner/stylesheet.css"); - file.open(QFile::ReadOnly); - QFile file2(":/qmldesigner/scrollbar.css"); - file2.open(QFile::ReadOnly); - - QString labelStyle = QLatin1String("QLabel { background-color: #4f4f4f; }"); - - QString styleSheet = file.readAll() + file2.readAll() + labelStyle; - navigationView.widget->setStyleSheet(styleSheet); - } + navigationView.widget->setStyleSheet(QLatin1String( + Utils::FileReader::fetchQrc(":/qmldesigner/stylesheet.css") + + Utils::FileReader::fetchQrc(":/qmldesigner/scrollbar.css") + + "QLabel { background-color: #4f4f4f; }")); } m_nodeInstanceView = new NodeInstanceView(this); diff --git a/src/plugins/qmldesigner/styledoutputpaneplaceholder.cpp b/src/plugins/qmldesigner/styledoutputpaneplaceholder.cpp index a1d15d2d30f85e3c55792904c543b383ca493f9c..44cd43a3ecf499a02aabbed3652abad117a7f530 100644 --- a/src/plugins/qmldesigner/styledoutputpaneplaceholder.cpp +++ b/src/plugins/qmldesigner/styledoutputpaneplaceholder.cpp @@ -32,6 +32,8 @@ #include "styledoutputpaneplaceholder.h" +#include + #include #include #include @@ -40,13 +42,9 @@ StyledOutputpanePlaceHolder::StyledOutputpanePlaceHolder(Core::IMode *mode, QSplitter *parent) : Core::OutputPanePlaceHolder(mode, parent) { - QFile file(":/qmldesigner/outputpane-style.css"); - file.open(QFile::ReadOnly); - QFile file2(":/qmldesigner/scrollbar.css"); - file2.open(QFile::ReadOnly); - m_customStylesheet = file.readAll() + file2.readAll(); - file.close(); - file2.close(); + m_customStylesheet = QString::fromLatin1( + Utils::FileReader::fetchQrc(":/qmldesigner/outputpane-style.css") + + Utils::FileReader::fetchQrc(":/qmldesigner/scrollbar.css")); } void StyledOutputpanePlaceHolder::childEvent(QChildEvent *event) diff --git a/src/plugins/qmljstools/qmljsplugindumper.cpp b/src/plugins/qmljstools/qmljsplugindumper.cpp index ba4ce8a6ab370a5f478b5546b9b9ca8ee5eec01c..3eda610a76a1bb97c97c1a50b22451038be5ea78 100644 --- a/src/plugins/qmljstools/qmljsplugindumper.cpp +++ b/src/plugins/qmljstools/qmljsplugindumper.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #include @@ -235,19 +236,15 @@ void PluginDumper::dump(const Plugin &plugin) return; const QString &path = plugin.predumpedQmlTypesFilePath(); - QFile libraryQmlTypesFile(path); - if (!libraryQmlTypesFile.open(QFile::ReadOnly | QFile::Text)) { - libraryInfo.setDumpStatus(LibraryInfo::DumpError, - tr("Could not open file '%1' for reading.").arg(path)); + Utils::FileReader reader; + if (!reader.fetch(path, QFile::Text)) { + libraryInfo.setDumpStatus(LibraryInfo::DumpError, reader.errorString()); m_modelManager->updateLibraryInfo(plugin.qmldirPath, libraryInfo); return; } - const QByteArray qmlTypeDescriptions = libraryQmlTypesFile.readAll(); - libraryQmlTypesFile.close(); - QString error; - const QList objectsList = parseHelper(qmlTypeDescriptions, &error); + const QList objectsList = parseHelper(reader.data(), &error); if (error.isEmpty()) { libraryInfo.setMetaObjects(objectsList); diff --git a/src/plugins/qmlprojectmanager/qmlproject.cpp b/src/plugins/qmlprojectmanager/qmlproject.cpp index 6e1771bc10bf8faa09a9bd8f8ca4ec53af00e301..ac414e03aa59314ab929392a181fd53fe3149cdf 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.cpp +++ b/src/plugins/qmlprojectmanager/qmlproject.cpp @@ -44,6 +44,7 @@ #include #include #include +#include #include @@ -99,10 +100,10 @@ void QmlProject::parseProject(RefreshOptions options) if (options & ProjectFile) delete m_projectItem.data(); if (!m_projectItem) { - QFile file(m_fileName); - if (file.open(QFile::ReadOnly)) { + Utils::FileReader reader; + if (reader.fetch(m_fileName)) { QDeclarativeComponent *component = new QDeclarativeComponent(&m_engine, this); - component->setData(file.readAll(), QUrl::fromLocalFile(m_fileName)); + component->setData(reader.data(), QUrl::fromLocalFile(m_fileName)); if (component->isReady() && qobject_cast(component->create())) { m_projectItem = qobject_cast(component->create()); @@ -113,7 +114,7 @@ void QmlProject::parseProject(RefreshOptions options) messageManager->printToOutputPane(component->errorString(), true); } } else { - messageManager->printToOutputPane(tr("Error while loading project file %1.").arg(m_fileName), true); + messageManager->printToOutputPane(tr("QML project: %1").arg(reader.errorString()), true); } } if (m_projectItem) { diff --git a/src/plugins/qt4projectmanager/customwidgetwizard/plugingenerator.cpp b/src/plugins/qt4projectmanager/customwidgetwizard/plugingenerator.cpp index 2fc3cba4bdd977ef1f2bc54f238dc0b7433052c3..3c528e20c913a479a3cfff332a91a3ce2b67ca88 100644 --- a/src/plugins/qt4projectmanager/customwidgetwizard/plugingenerator.cpp +++ b/src/plugins/qt4projectmanager/customwidgetwizard/plugingenerator.cpp @@ -35,6 +35,8 @@ #include +#include + #include #include @@ -60,14 +62,11 @@ struct ProjectContents { static inline Core::GeneratedFile generateIconFile(const QString &source, const QString &target, QString *errorMessage) { // Read out source - QFile iconFile(source); - if (!iconFile.open(QIODevice::ReadOnly)) { - *errorMessage = PluginGenerator::tr("Cannot open icon file %1.").arg(source); + Utils::FileReader reader; + if (!reader.fetch(source, errorMessage)) return Core::GeneratedFile(); - } - const QByteArray iconData = iconFile.readAll(); Core::GeneratedFile rc(target); - rc.setBinaryContents(iconData); + rc.setBinaryContents(reader.data()); rc.setBinary(true); return rc; } @@ -307,13 +306,11 @@ QString PluginGenerator::processTemplate(const QString &tmpl, const SubstitutionMap &substMap, QString *errorMessage) { - QFile tpl(tmpl); - if (!tpl.open(QIODevice::ReadOnly|QIODevice::Text)) { - *errorMessage = tr("Cannot open %1: %2").arg(tmpl, tpl.errorString()); + Utils::FileReader reader; + if (!reader.fetch(tmpl, errorMessage)) return QString(); - } - QString cont = QString::fromUtf8(tpl.readAll()); + QString cont = QString::fromUtf8(reader.data()); const QChar atChar = QLatin1Char('@'); int offset = 0; for (;;) { diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigwizard.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigwizard.cpp index 297c25a46b3a51b20fbcc29e4974fa96c78c2c7c..017d37bbd6a3ff98c3775be8569b5abda5446e15 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigwizard.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigwizard.cpp @@ -40,6 +40,7 @@ #include "maemodeviceconfigurations.h" #include "maemokeydeployer.h" +#include #include #include @@ -421,13 +422,10 @@ private: bool saveFile(const QString &filePath, const QByteArray &data) { - QFile file(filePath); - const bool canOpen = file.open(QIODevice::WriteOnly); - if (canOpen) - file.write(data); - if (!canOpen || file.error() != QFile::NoError) { - QMessageBox::critical(this, tr("Could Not Save File"), - tr("Failed to save key file %1: %2").arg(filePath, file.errorString())); + Utils::FileSaver saver(filePath); + saver.write(data); + if (!saver.finalize()) { + QMessageBox::critical(this, tr("Could Not Save Key File"), saver.errorString()); return false; } return true; diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemokeydeployer.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemokeydeployer.cpp index 61d1d562a39e45975d2679fc77f6710fd2d0eaac..e30179ad0d99bbf22df3eea17a16726ad8a7c34a 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemokeydeployer.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemokeydeployer.cpp @@ -32,6 +32,7 @@ #include "maemokeydeployer.h" #include +#include #include @@ -56,13 +57,9 @@ void MaemoKeyDeployer::deployPublicKey(const SshConnectionParameters &sshParams, cleanup(); m_deployProcess = SshRemoteProcessRunner::create(sshParams); - QFile keyFile(keyFilePath); - QByteArray key; - const bool keyFileAccessible = keyFile.open(QIODevice::ReadOnly); - if (keyFileAccessible) - key = keyFile.readAll(); - if (!keyFileAccessible || keyFile.error() != QFile::NoError) { - emit error(tr("Could not read public key file '%1'.").arg(keyFilePath)); + Utils::FileReader reader; + if (!reader.fetch(keyFilePath)) { + emit error(tr("Public key error: %1").arg(reader.errorString())); return; } @@ -72,7 +69,7 @@ void MaemoKeyDeployer::deployPublicKey(const SshConnectionParameters &sshParams, SLOT(handleKeyUploadFinished(int))); const QByteArray command = "test -d .ssh " "|| mkdir .ssh && chmod 0700 .ssh && echo '" - + key + "' >> .ssh/authorized_keys && chmod 0600 .ssh/authorized_keys"; + + reader.data() + "' >> .ssh/authorized_keys && chmod 0600 .ssh/authorized_keys"; m_deployProcess->run(command); } diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemosshconfigdialog.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemosshconfigdialog.cpp index e5f99dc17b19da2120fc097b258d057b9850671b..820d628edbc20900f12f9724c3dc9cdaa809a787 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemosshconfigdialog.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemosshconfigdialog.cpp @@ -34,6 +34,7 @@ #include "maemodeviceconfigurations.h" #include +#include #include #include @@ -124,17 +125,10 @@ void MaemoSshConfigDialog::saveKey(bool publicKey) if (fileName.isEmpty()) return; - QFile file(fileName); - const bool canOpen = file.open(QIODevice::WriteOnly); - if (canOpen) - file.write(publicKey + Utils::FileSaver saver(fileName); + saver.write(publicKey ? m_keyGenerator->publicKey() : m_keyGenerator->privateKey()); - if (!canOpen || file.error() != QFile::NoError) { - QMessageBox::critical(this, tr("Error writing file"), - tr("Could not write file '%1':\n %2") - .arg(fileName, file.errorString())); - } else if (!publicKey) { + if (saver.finalize(this) && !publicKey) emit privateKeyGenerated(fileName); - } } diff --git a/src/plugins/qt4projectmanager/qt-maemo/qt4maemotarget.cpp b/src/plugins/qt4projectmanager/qt-maemo/qt4maemotarget.cpp index 55d000d127e9100a52d6dc0668fb0779670558a9..e00af550ffd06b656f113e59eab36ac7c43d66d0 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/qt4maemotarget.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/qt4maemotarget.cpp @@ -47,6 +47,7 @@ #include #include #include +#include #include @@ -965,10 +966,6 @@ AbstractQt4MaemoTarget::ActionStatus AbstractRpmBasedQt4MaemoTarget::createSpeci { if (QFileInfo(specFilePath()).exists()) return NoActionRequired; - QSharedPointer specFile - = openFile(specFilePath(), QIODevice::WriteOnly, 0); - if (!specFile) - return ActionFailed; QByteArray initialContent( "Name: %%name%%\n" "Summary: \n" @@ -1010,8 +1007,9 @@ AbstractQt4MaemoTarget::ActionStatus AbstractRpmBasedQt4MaemoTarget::createSpeci "# Add post-uninstall scripts here." ); initialContent.replace("%%name%%", project()->displayName().toUtf8()); - return specFile->write(initialContent) == initialContent.count() - ? ActionSuccessful : ActionFailed; + Utils::FileSaver saver(specFilePath()); + saver.write(initialContent); + return saver.finalize() ? ActionSuccessful : ActionFailed; } void AbstractRpmBasedQt4MaemoTarget::handleTargetAddedSpecial() diff --git a/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp b/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp index 29abad83c941833fbac28c8e639029d5dabb82d8..92baaf31b29b87a9022d32f6ab8083c0f0bf5977 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp @@ -46,6 +46,7 @@ #include #include +#include #include #include @@ -622,12 +623,14 @@ QString S60CreatePackageStep::generateKeyId(const QString &keyPath) const if (keyPath.isEmpty()) return QString(); - QFile file(keyPath); - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) + Utils::FileReader reader; + if (!reader.fetch(keyPath, QIODevice::Text)) { + emit addOutput(reader.errorString(), BuildStep::ErrorOutput); return QString(); + } //key file is quite small in size - return QCryptographicHash::hash(file.readAll(), + return QCryptographicHash::hash(reader.data(), QCryptographicHash::Md5).toHex(); } diff --git a/src/plugins/qt4projectmanager/qt-s60/s60publisherovi.cpp b/src/plugins/qt4projectmanager/qt-s60/s60publisherovi.cpp index f69fc89797c49d6882f0e5f705804a2d408f0cb2..079143ccf0fbb643f73cc6fb599e008872a6e237 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60publisherovi.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60publisherovi.cpp @@ -48,6 +48,7 @@ #include #include +#include #include @@ -276,25 +277,23 @@ void S60PublisherOvi::updateProFile(const QString &var, const QString &values) QStringList lines; ProFile *profile = m_reader->parsedProFile(m_qt4project->rootProjectNode()->path()); - QFile qfile(m_qt4project->rootProjectNode()->path()); - if (qfile.open(QIODevice::ReadOnly | QIODevice::Text)) { - lines = QString::fromLocal8Bit(qfile.readAll()).split(QLatin1Char('\n')); - qfile.close(); - while (!lines.isEmpty() && lines.last().isEmpty()) - lines.removeLast(); - } else { - m_qt4project->proFileParseError(tr("Error while reading .pro file %1: %2").arg(m_qt4project->rootProjectNode()->path(), qfile.errorString())); + Utils::FileReader reader; + if (!reader.fetch(m_qt4project->rootProjectNode()->path(), QIODevice::Text)) { + emit progressReport(reader.errorString(), m_errorColor); return; } + lines = QString::fromLocal8Bit(reader.data()).split(QLatin1Char('\n')); + while (!lines.isEmpty() && lines.last().isEmpty()) + lines.removeLast(); ProWriter::putVarValues(profile, &lines, QStringList() << values, var, ProWriter::ReplaceValues | ProWriter::OneLine | ProWriter::AppendOperator, "symbian"); - if (qfile.open(QIODevice::WriteOnly | QIODevice::Text)) { - qfile.write(lines.join("\n").toLocal8Bit()); - qfile.close(); - } + Utils::FileSaver saver(m_qt4project->rootProjectNode()->path(), QIODevice::Text); + saver.write(lines.join("\n").toLocal8Bit()); + if (!saver.finalize()) + emit progressReport(saver.errorString(), m_errorColor); } void S60PublisherOvi::updateProFile() diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp index bd4332411de112ae31084235a5eb62a1cdc6931e..50cb2689e9343a00ee48542836ccc03c82fdcae6 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.cpp +++ b/src/plugins/qt4projectmanager/qt4nodes.cpp @@ -57,6 +57,7 @@ #include #include +#include #include #include @@ -1090,18 +1091,15 @@ void Qt4PriFileNode::changeFiles(const FileType fileType, { QString contents; { - QFile qfile(m_projectFilePath); - if (qfile.open(QIODevice::ReadOnly | QIODevice::Text)) { - contents = QString::fromLocal8Bit(qfile.readAll()); - qfile.close(); - lines = contents.split(QLatin1Char('\n')); - while (!lines.isEmpty() && lines.last().isEmpty()) - lines.removeLast(); - } else { - m_project->proFileParseError(tr("Error while reading .pro file %1: %2") - .arg(m_projectFilePath, qfile.errorString())); + Utils::FileReader reader; + if (!reader.fetch(m_projectFilePath, QIODevice::Text)) { + m_project->proFileParseError(reader.errorString()); return; } + contents = QString::fromLocal8Bit(reader.data()); + lines = contents.split(QLatin1Char('\n')); + while (!lines.isEmpty() && lines.last().isEmpty()) + lines.removeLast(); } ProMessageHandler handler; @@ -1148,14 +1146,12 @@ void Qt4PriFileNode::changeFiles(const FileType fileType, void Qt4PriFileNode::save(const QStringList &lines) { - QFile qfile(m_projectFilePath); - if (qfile.open(QIODevice::WriteOnly | QIODevice::Text)) { - foreach (const QString &str, lines) { - qfile.write(str.toLocal8Bit()); - qfile.write("\n"); - } - qfile.close(); + Utils::FileSaver saver(m_projectFilePath, QIODevice::Text); + foreach (const QString &str, lines) { + saver.write(str.toLocal8Bit()); + saver.write("\n", 1); } + saver.finalize(Core::ICore::instance()->mainWindow()); m_project->qt4ProjectManager()->notifyChanged(m_projectFilePath); } diff --git a/src/plugins/qt4projectmanager/wizards/abstractmobileapp.cpp b/src/plugins/qt4projectmanager/wizards/abstractmobileapp.cpp index 833f5a85eb90d7eb83e3eb9596282cefa353dcf6..f308711afc645dc1c11afd4f3868d276269f8f8b 100644 --- a/src/plugins/qt4projectmanager/wizards/abstractmobileapp.cpp +++ b/src/plugins/qt4projectmanager/wizards/abstractmobileapp.cpp @@ -41,6 +41,8 @@ #include #endif // CREATORLESSTEST +#include + namespace Qt4ProjectManager { AbstractGeneratedFileInfo::AbstractGeneratedFileInfo() @@ -173,28 +175,29 @@ QString AbstractMobileApp::path(int fileType) const return QString(); } +bool AbstractMobileApp::readTemplate(int fileType, QByteArray *data, QString *errorMessage) const +{ + Utils::FileReader reader; + if (!reader.fetch(path(fileType), errorMessage)) + return false; + *data = reader.data(); + return true; +} + QByteArray AbstractMobileApp::generateDesktopFile(QString *errorMessage) const { - QFile desktopTemplate(path(DesktopOrigin)); - if (!desktopTemplate.open(QIODevice::ReadOnly)) { - *errorMessage = QCoreApplication::translate("Qt4ProjectManager::AbstractMobileApp", - "Could not open desktop file template"); + QByteArray desktopFileContent; + if (!readTemplate(DesktopOrigin, &desktopFileContent, errorMessage)) return QByteArray(); - } - QByteArray desktopFileContent = desktopTemplate.readAll(); return desktopFileContent.replace("thisApp", projectName().toUtf8()); } QByteArray AbstractMobileApp::generateMainCpp(QString *errorMessage) const { - QFile sourceFile(path(MainCppOrigin)); - if (!sourceFile.open(QIODevice::ReadOnly)) { - *errorMessage = QCoreApplication::translate("Qt4ProjectManager::AbstractMobileApp", - "Could not open main.cpp template '%1'.") - .arg(sourceFile.fileName()); + QByteArray mainCppInput; + if (!readTemplate(MainCppOrigin, &mainCppInput, errorMessage)) return QByteArray(); - } - QTextStream in(&sourceFile); + QTextStream in(&mainCppInput); QByteArray mainCppContent; QTextStream out(&mainCppContent, QIODevice::WriteOnly); @@ -236,14 +239,10 @@ QByteArray AbstractMobileApp::generateMainCpp(QString *errorMessage) const QByteArray AbstractMobileApp::generateProFile(QString *errorMessage) const { const QChar comment = QLatin1Char('#'); - QFile proFile(path(AppProOrigin)); - if (!proFile.open(QIODevice::ReadOnly)) { - *errorMessage = QCoreApplication::translate("Qt4ProjectManager::AbstractMobileApp", - "Could not open project file template '%1'.") - .arg(proFile.fileName()); + QByteArray proFileInput; + if (!readTemplate(AppProOrigin, &proFileInput, errorMessage)) return QByteArray(); - } - QTextStream in(&proFile); + QTextStream in(&proFileInput); QByteArray proFileContent; QTextStream out(&proFileContent, QIODevice::WriteOnly); @@ -346,14 +345,10 @@ bool AbstractMobileApp::updateFiles(const QList &list const QByteArray data = generateFile(info.fileType, &error); if (!error.isEmpty()) return false; - QFile file(info.fileInfo.absoluteFilePath()); - if (!file.open(QIODevice::WriteOnly) || file.write(data) == -1) { - error = QCoreApplication::translate( - "Qt4ProjectManager::Internal::QtQuickApp", - "Could not write file '%1'."). - arg(QDir::toNativeSeparators(info.fileInfo.canonicalFilePath())); + Utils::FileSaver saver(QDir::cleanPath(info.fileInfo.absoluteFilePath())); + saver.write(data); + if (!saver.finalize(&error)) return false; - } } return true; } @@ -397,13 +392,10 @@ QString AbstractMobileApp::error() const QByteArray AbstractMobileApp::readBlob(const QString &filePath, QString *errorMsg) const { - QFile sourceFile(filePath); - if (!sourceFile.open(QIODevice::ReadOnly)) { - *errorMsg = QCoreApplication::translate("Qt4ProjectManager::AbstractMobileApp", - "Could not open template file '%1'.").arg(filePath); + Utils::FileReader reader; + if (!reader.fetch(filePath, errorMsg)) return QByteArray(); - } - return sourceFile.readAll(); + return reader.data(); } QByteArray AbstractMobileApp::generateFile(int fileType, diff --git a/src/plugins/qt4projectmanager/wizards/abstractmobileapp.h b/src/plugins/qt4projectmanager/wizards/abstractmobileapp.h index 745b295541daacd2122bd1cdeaa88c73a3dc8c72..9c5824e65701f190a36ad1cc321583f70a2a3ab0 100644 --- a/src/plugins/qt4projectmanager/wizards/abstractmobileapp.h +++ b/src/plugins/qt4projectmanager/wizards/abstractmobileapp.h @@ -144,6 +144,7 @@ protected: static void insertParameter(QString &line, const QString ¶meter); QByteArray readBlob(const QString &filePath, QString *errorMsg) const; + bool readTemplate(int fileType, QByteArray *data, QString *errorMessage) const; QByteArray generateFile(int fileType, QString *errorMessage) const; QString outputPathBase() const; diff --git a/src/plugins/qt4projectmanager/wizards/guiappwizard.cpp b/src/plugins/qt4projectmanager/wizards/guiappwizard.cpp index 9a90980d12ae18c690d370b6ac63a22b36e490cf..079f69e8e8f22fef676b270eaa19884392cf8b92 100644 --- a/src/plugins/qt4projectmanager/wizards/guiappwizard.cpp +++ b/src/plugins/qt4projectmanager/wizards/guiappwizard.cpp @@ -41,6 +41,8 @@ #include #include +#include + #include #include #include @@ -258,12 +260,10 @@ bool GuiAppWizard::parametrizeTemplate(const QString &templatePath, const QStrin QString fileName = templatePath; fileName += QDir::separator(); fileName += templateName; - QFile inFile(fileName); - if (!inFile.open(QIODevice::ReadOnly | QIODevice::Text)) { - *errorMessage = tr("The template file '%1' could not be opened for reading: %2").arg(fileName, inFile.errorString()); + Utils::FileReader reader; + if (!reader.fetch(fileName, QIODevice::Text, errorMessage)) return false; - } - QString contents = QString::fromUtf8(inFile.readAll()); + QString contents = QString::fromUtf8(reader.data()); contents.replace(QLatin1String("%QAPP_INCLUDE%"), QLatin1String("QtGui/QApplication")); contents.replace(QLatin1String("%INCLUDE%"), params.headerFileName); diff --git a/src/plugins/qt4projectmanager/wizards/mobileappwizardpages.cpp b/src/plugins/qt4projectmanager/wizards/mobileappwizardpages.cpp index 89313c24bf04613d86112b64773aa5cb664dfc2b..cfe53d100c5455e9ede8b0db99ed4d981b8a176c 100644 --- a/src/plugins/qt4projectmanager/wizards/mobileappwizardpages.cpp +++ b/src/plugins/qt4projectmanager/wizards/mobileappwizardpages.cpp @@ -35,6 +35,7 @@ #include "ui_mobileappwizardmaemooptionspage.h" #include "ui_mobileappwizardsymbianoptionspage.h" #include +#include #include #include @@ -205,15 +206,17 @@ void MobileAppWizardMaemoOptionsPage::setPngIcon(const QString &icon) if (button != QMessageBox::Ok) return; iconPixmap = iconPixmap.scaled(iconSize); - QTemporaryFile tmpFile; - tmpFile.setAutoRemove(false); - const char * const format = QFileInfo(icon).suffix().toAscii().data(); - if (!tmpFile.open() || !iconPixmap.save(&tmpFile, format)) { + Utils::TempFileSaver saver; + saver.setAutoRemove(false); + if (!saver.hasError()) + saver.setResult(iconPixmap.save( + saver.file(), QFileInfo(icon).suffix().toAscii().constData())); + if (!saver.finalize()) { QMessageBox::critical(this, tr("File Error"), - tr("Could not copy icon file.")); + tr("Could not copy icon file: %1").arg(saver.errorString())); return; } - actualIconPath = tmpFile.fileName(); + actualIconPath = saver.fileName(); } m_d->ui.pngIconButton->setIcon(iconPixmap); diff --git a/src/plugins/resourceeditor/resourceeditorw.cpp b/src/plugins/resourceeditor/resourceeditorw.cpp index d80fda36f8ea1753b574e48e1081e00965fe67b4..8612f2d8d26fe1fbf6e0d24ea3dab262b32767b7 100644 --- a/src/plugins/resourceeditor/resourceeditorw.cpp +++ b/src/plugins/resourceeditor/resourceeditorw.cpp @@ -39,6 +39,7 @@ #include #include #include +#include #include #include @@ -97,18 +98,15 @@ ResourceEditorW::~ResourceEditorW() bool ResourceEditorW::createNew(const QString &contents) { - QTemporaryFile tempFile(0); - tempFile.setAutoRemove(true); - if (!tempFile.open()) + Utils::TempFileSaver saver; + saver.write(contents.toUtf8()); + if (!saver.finalize(Core::ICore::instance()->mainWindow())) return false; - const QString tempFileName = tempFile.fileName(); - tempFile.write(contents.toUtf8()); - tempFile.close(); - const bool rc = m_resourceEditor->load(tempFileName); + const bool rc = m_resourceEditor->load(saver.fileName()); m_resourceEditor->setFileName(QString()); if (debugResourceEditorW) - qDebug() << "ResourceEditorW::createNew: " << contents << " (" << tempFileName << ") returns " << rc; + qDebug() << "ResourceEditorW::createNew: " << contents << " (" << saver.fileName() << ") returns " << rc; return rc; } diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp index 656515208c94f4eceaec339466fd740cbd0f7373..319e51501e8ddc796ecec2ac2fef560c41a645d1 100644 --- a/src/plugins/subversion/subversionplugin.cpp +++ b/src/plugins/subversion/subversionplugin.cpp @@ -47,6 +47,7 @@ #include #include #include +#include #include #include @@ -808,19 +809,17 @@ void SubversionPlugin::startCommit(const QString &workingDir, const QStringList } m_commitRepository = workingDir; // Create a new submit change file containing the submit template - QTemporaryFile changeTmpFile; - changeTmpFile.setAutoRemove(false); - if (!changeTmpFile.open()) { - VCSBase::VCSBaseOutputWindow::instance()->appendError(tr("Cannot create temporary file: %1").arg(changeTmpFile.errorString())); - return; - } - m_commitMessageFileName = changeTmpFile.fileName(); - // TODO: Regitctrieve submit template from + Utils::TempFileSaver saver; + saver.setAutoRemove(false); + // TODO: Retrieve submit template from const QString submitTemplate; // Create a submit - changeTmpFile.write(submitTemplate.toUtf8()); - changeTmpFile.flush(); - changeTmpFile.close(); + saver.write(submitTemplate.toUtf8()); + if (!saver.finalize()) { + VCSBase::VCSBaseOutputWindow::instance()->appendError(saver.errorString()); + return; + } + m_commitMessageFileName = saver.fileName(); // Create a submit editor and set file list SubversionSubmitEditor *editor = openSubversionSubmitEditor(m_commitMessageFileName); editor->setStatusList(statusOutput); diff --git a/src/plugins/texteditor/basefilefind.cpp b/src/plugins/texteditor/basefilefind.cpp index 1df5a7913d42a8ed45e17bbfb5288d03673cf451..1226ed7ee4c5e0351dfbf794eaaf50566dc57952 100644 --- a/src/plugins/texteditor/basefilefind.cpp +++ b/src/plugins/texteditor/basefilefind.cpp @@ -42,6 +42,7 @@ #include #include #include +#include #include #include @@ -50,6 +51,7 @@ #include #include #include +#include #include #include @@ -346,25 +348,22 @@ QStringList BaseFileFind::replaceAll(const QString &text, applyChanges(textEditor->document(), text, changeItems); tc.endEditBlock(); } else { - QFile file(fileName); - - if (file.open(QFile::ReadOnly)) { - QTextStream stream(&file); - // ### set the encoding - const QString plainText = stream.readAll(); - file.close(); - + Utils::FileReader reader; + if (reader.fetch(fileName, Core::ICore::instance()->mainWindow())) { QTextDocument doc; - doc.setPlainText(plainText); + // ### set the encoding + doc.setPlainText(QString::fromLocal8Bit(reader.data())); applyChanges(&doc, text, changeItems); - QFile newFile(fileName); - if (newFile.open(QFile::WriteOnly)) { - QTextStream stream(&newFile); + Utils::FileSaver saver(fileName); + if (!saver.hasError()) { + QTextStream stream(saver.file()); // ### set the encoding stream << doc.toPlainText(); + saver.setResult(&stream); } + saver.finalize(Core::ICore::instance()->mainWindow()); } } } diff --git a/src/plugins/texteditor/colorscheme.cpp b/src/plugins/texteditor/colorscheme.cpp index 5ba5061b02be182749eeb7f9f3a60f9531d5c751..b2179deb35dc8cad732cf76ebdf7de3cf65f7a77 100644 --- a/src/plugins/texteditor/colorscheme.cpp +++ b/src/plugins/texteditor/colorscheme.cpp @@ -34,6 +34,8 @@ #include "texteditorconstants.h" +#include + #include #include #include @@ -132,42 +134,42 @@ void ColorScheme::clear() m_formats.clear(); } -bool ColorScheme::save(const QString &fileName) const +bool ColorScheme::save(const QString &fileName, QWidget *parent) const { - QFile file(fileName); - if (!file.open(QIODevice::WriteOnly)) - return false; + Utils::FileSaver saver(fileName); + if (!saver.hasError()) { + QXmlStreamWriter w(saver.file()); + w.setAutoFormatting(true); + w.setAutoFormattingIndent(2); + + w.writeStartDocument(); + w.writeStartElement(QLatin1String("style-scheme")); + w.writeAttribute(QLatin1String("version"), QLatin1String("1.0")); + if (!m_displayName.isEmpty()) + w.writeAttribute(QLatin1String("name"), m_displayName); + + QMapIterator i(m_formats); + while (i.hasNext()) { + const Format &format = i.next().value(); + w.writeStartElement(QLatin1String("style")); + w.writeAttribute(QLatin1String("name"), i.key()); + if (format.foreground().isValid()) + w.writeAttribute(QLatin1String("foreground"), format.foreground().name().toLower()); + if (format.background().isValid()) + w.writeAttribute(QLatin1String("background"), format.background().name().toLower()); + if (format.bold()) + w.writeAttribute(QLatin1String("bold"), QLatin1String(trueString)); + if (format.italic()) + w.writeAttribute(QLatin1String("italic"), QLatin1String(trueString)); + w.writeEndElement(); + } - QXmlStreamWriter w(&file); - w.setAutoFormatting(true); - w.setAutoFormattingIndent(2); - - w.writeStartDocument(); - w.writeStartElement(QLatin1String("style-scheme")); - w.writeAttribute(QLatin1String("version"), QLatin1String("1.0")); - if (!m_displayName.isEmpty()) - w.writeAttribute(QLatin1String("name"), m_displayName); - - QMapIterator i(m_formats); - while (i.hasNext()) { - const Format &format = i.next().value(); - w.writeStartElement(QLatin1String("style")); - w.writeAttribute(QLatin1String("name"), i.key()); - if (format.foreground().isValid()) - w.writeAttribute(QLatin1String("foreground"), format.foreground().name().toLower()); - if (format.background().isValid()) - w.writeAttribute(QLatin1String("background"), format.background().name().toLower()); - if (format.bold()) - w.writeAttribute(QLatin1String("bold"), QLatin1String(trueString)); - if (format.italic()) - w.writeAttribute(QLatin1String("italic"), QLatin1String(trueString)); w.writeEndElement(); - } + w.writeEndDocument(); - w.writeEndElement(); - w.writeEndDocument(); - - return true; + saver.setResult(&w); + } + return saver.finalize(parent); } namespace { diff --git a/src/plugins/texteditor/colorscheme.h b/src/plugins/texteditor/colorscheme.h index 0f0bdc41d896a343842389cb8a5355cf1d193006..b872e517182dea9c2f23b5a113124cf05d651ac0 100644 --- a/src/plugins/texteditor/colorscheme.h +++ b/src/plugins/texteditor/colorscheme.h @@ -39,6 +39,10 @@ #include #include +QT_BEGIN_NAMESPACE +class QWidget; +QT_END_NAMESPACE + namespace TextEditor { /*! Format for a particular piece of text (text/comment, etc). */ @@ -101,7 +105,7 @@ public: void clear(); - bool save(const QString &fileName) const; + bool save(const QString &fileName, QWidget *parent) const; bool load(const QString &fileName); inline bool equals(const ColorScheme &cs) const diff --git a/src/plugins/texteditor/fontsettings.cpp b/src/plugins/texteditor/fontsettings.cpp index c9d8e65d331fe6bed4491972d36d43de7035e59c..08ac417cc6e75a9cb930bace21f9aee78da96a70 100644 --- a/src/plugins/texteditor/fontsettings.cpp +++ b/src/plugins/texteditor/fontsettings.cpp @@ -42,6 +42,7 @@ #include #include #include +#include static const char *fontFamilyKey = "FontFamily"; static const char *fontSizeKey = "FontSize"; @@ -315,7 +316,7 @@ bool FontSettings::loadColorScheme(const QString &fileName, bool FontSettings::saveColorScheme(const QString &fileName) { - const bool saved = m_scheme.save(fileName); + const bool saved = m_scheme.save(fileName, Core::ICore::instance()->mainWindow()); if (saved) m_schemeFileName = fileName; return saved; diff --git a/src/plugins/texteditor/fontsettingspage.cpp b/src/plugins/texteditor/fontsettingspage.cpp index 54cc4ae09b27555225555c4e9df2e0a9dad10c89..823e602bbab1aed3483218dcc489888a065066a2 100644 --- a/src/plugins/texteditor/fontsettingspage.cpp +++ b/src/plugins/texteditor/fontsettingspage.cpp @@ -51,6 +51,7 @@ #include #include #include +#include #include #include #include @@ -492,8 +493,8 @@ void FontSettingsPage::copyColorScheme(const QString &name) ColorScheme scheme = d_ptr->m_value.colorScheme(); scheme.setDisplayName(name); - scheme.save(fileName); - d_ptr->m_value.setColorSchemeFileName(fileName); + if (scheme.save(fileName, Core::ICore::instance()->mainWindow())) + d_ptr->m_value.setColorSchemeFileName(fileName); refreshColorSchemeList(); } @@ -559,7 +560,7 @@ void FontSettingsPage::maybeSaveColorScheme() if (messageBox->exec() == QMessageBox::Save) { const ColorScheme &scheme = d_ptr->m_ui->schemeEdit->colorScheme(); - scheme.save(d_ptr->m_value.colorSchemeFileName()); + scheme.save(d_ptr->m_value.colorSchemeFileName(), Core::ICore::instance()->mainWindow()); } } @@ -618,7 +619,7 @@ void FontSettingsPage::apply() // Update the scheme and save it under the name it already has d_ptr->m_value.setColorScheme(d_ptr->m_ui->schemeEdit->colorScheme()); const ColorScheme &scheme = d_ptr->m_value.colorScheme(); - scheme.save(d_ptr->m_value.colorSchemeFileName()); + scheme.save(d_ptr->m_value.colorSchemeFileName(), Core::ICore::instance()->mainWindow()); } int index = d_ptr->m_ui->schemeComboBox->currentIndex(); diff --git a/src/plugins/texteditor/generichighlighter/definitiondownloader.cpp b/src/plugins/texteditor/generichighlighter/definitiondownloader.cpp index 98c0d43c0d1b340add661c384c4926c5deb4e757..0b82c458a09a6dfc32db86bb861d3f5c14e76583 100644 --- a/src/plugins/texteditor/generichighlighter/definitiondownloader.cpp +++ b/src/plugins/texteditor/generichighlighter/definitiondownloader.cpp @@ -32,6 +32,8 @@ #include "definitiondownloader.h" +#include + #include #include #include @@ -88,14 +90,9 @@ void DefinitionDownloader::saveData(QNetworkReply *reply) const QString &urlPath = m_url.path(); const QString &fileName = urlPath.right(urlPath.length() - urlPath.lastIndexOf(QLatin1Char('/')) - 1); - QFile file(m_localPath + fileName); - if (file.open(QIODevice::Text | QIODevice::WriteOnly)) { - file.write(reply->readAll()); - file.close(); - m_status = Ok; - } else { - m_status = WriteError; - } + Utils::FileSaver saver(m_localPath + fileName, QIODevice::Text); + saver.write(reply->readAll()); + m_status = saver.finalize() ? Ok: WriteError; } DefinitionDownloader::Status DefinitionDownloader::status() const diff --git a/src/plugins/texteditor/refactoringchanges.cpp b/src/plugins/texteditor/refactoringchanges.cpp index b5fb4f9c99f7ec9e1219674fe94429c72492ed6d..85f26be1cbf19ad8fe7eb2703f00bd2ece4be955 100644 --- a/src/plugins/texteditor/refactoringchanges.cpp +++ b/src/plugins/texteditor/refactoringchanges.cpp @@ -33,11 +33,15 @@ #include "refactoringchanges.h" #include "basetexteditor.h" +#include #include #include +#include + #include #include +#include #include #include #include @@ -126,10 +130,11 @@ bool RefactoringChanges::createFile(const QString &fileName, const QString &cont } if (!editor) { - QFile file(fileName); - file.open(QFile::WriteOnly); - file.write(document->toPlainText().toUtf8()); + Utils::FileSaver saver(fileName); + saver.write(document->toPlainText().toUtf8()); delete document; + if (!saver.finalize(Core::ICore::instance()->mainWindow())) + return false; } fileChanged(fileName); @@ -229,10 +234,9 @@ RefactoringFile::~RefactoringFile() // if this document doesn't have an editor, write the result to a file if (!m_editor && !m_fileName.isEmpty()) { - const QByteArray &newContents = doc->toPlainText().toUtf8(); - QFile file(m_fileName); - file.open(QFile::WriteOnly); - file.write(newContents); + Utils::FileSaver saver(m_fileName); + saver.write(doc->toPlainText().toUtf8()); + saver.finalize(Core::ICore::instance()->mainWindow()); } if (!m_fileName.isEmpty()) @@ -259,9 +263,9 @@ QTextDocument *RefactoringFile::mutableDocument() const else if (!m_document) { QString fileContents; if (!m_fileName.isEmpty()) { - QFile file(m_fileName); - if (file.open(QIODevice::ReadOnly)) - fileContents = file.readAll(); + Utils::FileReader reader; + if (reader.fetch(m_fileName, Core::ICore::instance()->mainWindow())) + fileContents = QString::fromUtf8(reader.data()); } m_document = new QTextDocument(fileContents); } diff --git a/src/plugins/texteditor/snippets/snippetscollection.cpp b/src/plugins/texteditor/snippets/snippetscollection.cpp index 195213c1132de922d3c14fc993ea5d629c845a1b..6f3b4be838034985a80ca017614e0837fccb5bcf 100644 --- a/src/plugins/texteditor/snippets/snippetscollection.cpp +++ b/src/plugins/texteditor/snippets/snippetscollection.cpp @@ -36,6 +36,7 @@ #include #include +#include #include #include @@ -312,30 +313,37 @@ void SnippetsCollection::reload() insertSnippet(snippet); } -void SnippetsCollection::synchronize() +bool SnippetsCollection::synchronize(QString *errorString) { - if (QFile::exists(m_userSnippetsPath) || QDir().mkpath(m_userSnippetsPath)) { - QFile file(m_userSnippetsPath + m_userSnippetsFile); - if (file.open(QFile::WriteOnly | QFile::Truncate)) { - QXmlStreamWriter writer(&file); - writer.setAutoFormatting(true); - writer.writeStartDocument(); - writer.writeStartElement(kSnippets); - foreach (const QString &groupId, m_groupIndexById.keys()) { - const int size = m_snippets.at(groupIndex(groupId)).size(); - for (int i = 0; i < size; ++i) { - const Snippet ¤t = snippet(i, groupId); - if (!current.isBuiltIn() || current.isRemoved() || current.isModified()) - writeSnippetXML(current, &writer); - } + if (!QFile::exists(m_userSnippetsPath) && !QDir().mkpath(m_userSnippetsPath)) { + *errorString = tr("Cannot create user snippet directory %1").arg( + QDir::toNativeSeparators(m_userSnippetsPath)); + return false; + } + Utils::FileSaver saver(m_userSnippetsPath + m_userSnippetsFile); + if (!saver.hasError()) { + QXmlStreamWriter writer(saver.file()); + writer.setAutoFormatting(true); + writer.writeStartDocument(); + writer.writeStartElement(kSnippets); + foreach (const QString &groupId, m_groupIndexById.keys()) { + const int size = m_snippets.at(groupIndex(groupId)).size(); + for (int i = 0; i < size; ++i) { + const Snippet ¤t = snippet(i, groupId); + if (!current.isBuiltIn() || current.isRemoved() || current.isModified()) + writeSnippetXML(current, &writer); } - writer.writeEndElement(); - writer.writeEndDocument(); - file.close(); } + writer.writeEndElement(); + writer.writeEndDocument(); + + saver.setResult(&writer); } + if (!saver.finalize(errorString)) + return false; reload(); + return true; } void SnippetsCollection::writeSnippetXML(const Snippet &snippet, QXmlStreamWriter *writer) const diff --git a/src/plugins/texteditor/snippets/snippetscollection.h b/src/plugins/texteditor/snippets/snippetscollection.h index dfb949ee62e2dbb62d5925131890bb93825e8557..f9661d361c385162a1c9c5ad8de658a907c7f8a5 100644 --- a/src/plugins/texteditor/snippets/snippetscollection.h +++ b/src/plugins/texteditor/snippets/snippetscollection.h @@ -97,7 +97,7 @@ public: QList groupIds() const; void reload(); - void synchronize(); + bool synchronize(QString *errorString); private slots: void identifyGroups(); diff --git a/src/plugins/texteditor/snippets/snippetssettingspage.cpp b/src/plugins/texteditor/snippets/snippetssettingspage.cpp index 39d2cbb789d1abb1fa7f7ef78972f452b7d889d1..49afec2f2a29955b6c265ed38fef3312279a90ef 100644 --- a/src/plugins/texteditor/snippets/snippetssettingspage.cpp +++ b/src/plugins/texteditor/snippets/snippetssettingspage.cpp @@ -49,6 +49,7 @@ #include #include #include +#include namespace TextEditor { namespace Internal { @@ -390,8 +391,12 @@ void SnippetsSettingsPagePrivate::apply() setSnippetContent(); if (m_snippetsCollectionChanged) { - SnippetsCollection::instance()->synchronize(); - m_snippetsCollectionChanged = false; + QString errorString; + if (SnippetsCollection::instance()->synchronize(&errorString)) + m_snippetsCollectionChanged = false; + else + QMessageBox::critical(Core::ICore::instance()->mainWindow(), + tr("Error While Saving Snippet Collection"), errorString); } } diff --git a/src/plugins/vcsbase/nicknamedialog.cpp b/src/plugins/vcsbase/nicknamedialog.cpp index 080a969cd3276ef8d2e284a155ab97a1e06d1c1e..5c0be4a0b2901792c5e7958ec64833fa0544dec0 100644 --- a/src/plugins/vcsbase/nicknamedialog.cpp +++ b/src/plugins/vcsbase/nicknamedialog.cpp @@ -33,6 +33,8 @@ #include "nicknamedialog.h" #include "ui_nicknamedialog.h" +#include + #include #include #include @@ -244,15 +246,12 @@ bool NickNameDialog::populateModelFromMailCapFile(const QString &fileName, model->removeRows(0, rowCount); if (fileName.isEmpty()) return true; - QFile file(fileName); - if (!file.open(QIODevice::ReadOnly|QIODevice::Text)) { - *errorMessage = tr("Cannot open '%1': %2"). - arg(QDir::toNativeSeparators(fileName), file.errorString()); + Utils::FileReader reader; + if (!reader.fetch(fileName, QIODevice::Text, errorMessage)) return false; - } // Split into lines and read NickNameEntry entry; - const QStringList lines = QString::fromUtf8(file.readAll()).trimmed().split(QLatin1Char('\n')); + const QStringList lines = QString::fromUtf8(reader.data()).trimmed().split(QLatin1Char('\n')); const int count = lines.size(); for (int i = 0; i < count; i++) { if (entry.parse(lines.at(i))) { diff --git a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp index 645131ceebed3259f4a00a400966d70b825b1a83..41f144a6f90ec123cf14411e71e89a64a1600279 100644 --- a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp +++ b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp @@ -232,13 +232,11 @@ static inline QStringList fieldTexts(const QString &fileContents) void VCSBaseSubmitEditor::createUserFields(const QString &fieldConfigFile) { - QFile fieldFile(fieldConfigFile); - if (!fieldFile.open(QIODevice::ReadOnly|QIODevice::Text)) { - qWarning("%s: Unable to open %s: %s", Q_FUNC_INFO, qPrintable(fieldConfigFile), qPrintable(fieldFile.errorString())); + Utils::FileReader reader; + if (!reader.fetch(fieldConfigFile, QIODevice::Text, Core::ICore::instance()->mainWindow())) return; - } // Parse into fields - const QStringList fields = fieldTexts(QString::fromUtf8(fieldFile.readAll())); + const QStringList fields = fieldTexts(QString::fromUtf8(reader.data())); if (fields.empty()) return; // Create a completer on user names @@ -613,24 +611,17 @@ bool VCSBaseSubmitEditor::runSubmitMessageCheckScript(const QString &checkScript if (!tempFilePattern.endsWith(QDir::separator())) tempFilePattern += QDir::separator(); tempFilePattern += QLatin1String("msgXXXXXX.txt"); - QTemporaryFile messageFile(tempFilePattern); - messageFile.setAutoRemove(true); - if (!messageFile.open()) { - *errorMessage = tr("Unable to open '%1': %2"). - arg(QDir::toNativeSeparators(messageFile.fileName()), - messageFile.errorString()); + Utils::TempFileSaver saver(tempFilePattern); + saver.write(fileContents().toUtf8()); + if (!saver.finalize(errorMessage)) return false; - } - const QString messageFileName = messageFile.fileName(); - messageFile.write(fileContents().toUtf8()); - messageFile.close(); // Run check process VCSBaseOutputWindow *outputWindow = VCSBaseOutputWindow::instance(); outputWindow->appendCommand(msgCheckScript(m_d->m_checkScriptWorkingDirectory, checkScript)); QProcess checkProcess; if (!m_d->m_checkScriptWorkingDirectory.isEmpty()) checkProcess.setWorkingDirectory(m_d->m_checkScriptWorkingDirectory); - checkProcess.start(checkScript, QStringList(messageFileName)); + checkProcess.start(checkScript, QStringList(saver.fileName())); checkProcess.closeWriteChannel(); if (!checkProcess.waitForStarted()) { *errorMessage = tr("The check script '%1' could not be started: %2").arg(checkScript, checkProcess.errorString());