6#if QT_CONFIG(temporaryfile)
8#include "qplatformdefs.h"
9#include "private/qsavefile_p.h"
14#include "private/qiodevice_p.h"
15#include "private/qtemporaryfile_p.h"
24QSaveFilePrivate::QSaveFilePrivate()
26 useTemporaryFile(true),
27 directWriteFallback(
false)
31QSaveFilePrivate::~QSaveFilePrivate()
94QSaveFile::QSaveFile(
QObject *parent)
113QSaveFile::~QSaveFile()
119 d->fileEngine->remove();
129QString QSaveFile::fileName()
const
131 return d_func()->fileName;
142 d_func()->fileName =
name;
157bool QSaveFile::open(OpenMode
mode)
166 if ((
mode & (ReadOnly | WriteOnly)) == 0) {
167 qWarning(
"QSaveFile::open: Open mode not specified");
172 if (
mode & (ReadOnly | Append | NewOnly | ExistingOnly)) {
173 qWarning(
"QSaveFile::open: Unsupported open mode 0x%x",
uint(
mode.toInt()));
179 if (existingFile.exists() && !existingFile.isWritable()) {
185 if (existingFile.isDir()) {
193 d->finalFileName =
d->fileName;
194 if (existingFile.isSymLink()) {
196 while (--maxDepth && existingFile.isSymLink())
197 existingFile.setFile(existingFile.symLinkTarget());
199 d->finalFileName = existingFile.filePath();
202 auto openDirectly = [&]() {
205 d->useTemporaryFile =
false;
212 bool requiresDirectWrite =
false;
215 requiresDirectWrite =
d->finalFileName ==
d->fileName &&
d->fileName.indexOf(u
':', 2) > 1;
216#elif defined(Q_OS_ANDROID)
218 requiresDirectWrite =
d->fileName.startsWith(
"content://"_L1);
220 if (requiresDirectWrite) {
222 if (
d->directWriteFallback) {
225 d->setError(
d->fileEngine->error(),
d->fileEngine->errorString());
226 d->fileEngine.reset();
229 QSaveFile::tr(
"QSaveFile cannot open '%1' without direct write fallback enabled.")
236 d->fileEngine.reset(
new QTemporaryFileEngine(&
d->finalFileName, QTemporaryFileEngine::Win32NonShared));
240 int perm = (existingFile.exists() ? 0600 : 0666);
241 static_cast<QTemporaryFileEngine *
>(
d->fileEngine.get())->
initialize(
d->finalFileName, perm);
249 err =
d->fileEngine->error();
254 d->setError(err,
d->fileEngine->errorString());
255 d->fileEngine.reset();
259 d->useTemporaryFile =
true;
261 if (existingFile.exists())
262 setPermissions(existingFile.permissions());
272void QSaveFile::close()
274 qFatal(
"QSaveFile::close called");
289bool QSaveFile::commit()
301 const auto &fe =
d->fileEngine;
306 if (
d->useTemporaryFile) {
315 if (!fe->renameOverwrite(
d->finalFileName)) {
316 d->setError(fe->error(), fe->errorString());
342void QSaveFile::cancelWriting()
363 d->writeError =
d->error;
391void QSaveFile::setDirectWriteFallback(
bool enabled)
403bool QSaveFile::directWriteFallback()
const
405 Q_D(
const QSaveFile);
406 return d->directWriteFallback;
412#include "moc_qsavefile.cpp"
static std::unique_ptr< QAbstractFileEngine > create(const QString &fileName)
Creates and returns a QAbstractFileEngine suitable for processing fileName.
static QString toNativeSeparators(const QString &pathName)
qint64 writeData(const char *data, qint64 len) override
\reimp
FileError
This enum describes the errors that may be returned by the error() function.
void close() override
Calls QFileDevice::flush() and closes the file.
virtual bool open(QIODeviceBase::OpenMode mode)
Opens the device and sets its OpenMode to mode.
\macro QT_RESTRICTED_CAST_FROM_ASCII
QString arg(qlonglong a, int fieldwidth=0, int base=10, QChar fillChar=u' ') const
Combined button and popup list for selecting options.
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum GLenum GLsizei const GLuint GLboolean enabled
#define qUtf16Printable(string)