diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/corelib/io/qfile.cpp | 51 | ||||
-rw-r--r-- | src/corelib/io/qfile.h | 6 | ||||
-rw-r--r-- | src/corelib/io/qfile_p.h | 5 | ||||
-rw-r--r-- | src/corelib/io/qtemporaryfile.cpp | 35 | ||||
-rw-r--r-- | src/corelib/io/qtemporaryfile.h | 2 |
5 files changed, 48 insertions, 51 deletions
diff --git a/src/corelib/io/qfile.cpp b/src/corelib/io/qfile.cpp index d7308c710d..58935fad3b 100644 --- a/src/corelib/io/qfile.cpp +++ b/src/corelib/io/qfile.cpp @@ -130,6 +130,13 @@ QFilePrivate::openExternalFile(int flags, FILE *fh, QFile::FileHandleFlags handl #endif } +QAbstractFileEngine *QFilePrivate::engine() const +{ + if (!fileEngine) + fileEngine = QAbstractFileEngine::create(fileName); + return fileEngine; +} + inline bool QFilePrivate::ensureFlushed() const { // This function ensures that the write buffer has been flushed (const @@ -424,7 +431,8 @@ QFile::~QFile() */ QString QFile::fileName() const { - return fileEngine()->fileName(QAbstractFileEngine::DefaultName); + Q_D(const QFile); + return d->engine()->fileName(QAbstractFileEngine::DefaultName); } /*! @@ -569,8 +577,9 @@ QFile::setDecodingFunction(DecoderFn f) bool QFile::exists() const { + Q_D(const QFile); // 0x1000000 = QAbstractFileEngine::Refresh, forcing an update - return (fileEngine()->fileFlags(QAbstractFileEngine::FlagsMask + return (d->engine()->fileFlags(QAbstractFileEngine::FlagsMask | QAbstractFileEngine::FileFlag(0x1000000)) & QAbstractFileEngine::ExistsFlag); } @@ -608,7 +617,8 @@ QFile::exists(const QString &fileName) QString QFile::readLink() const { - return fileEngine()->fileName(QAbstractFileEngine::LinkName); + Q_D(const QFile); + return d->engine()->fileName(QAbstractFileEngine::LinkName); } /*! @@ -654,7 +664,7 @@ QFile::remove() unsetError(); close(); if(error() == QFile::NoError) { - if(fileEngine()->remove()) { + if (d->engine()->remove()) { unsetError(); return true; } @@ -709,7 +719,7 @@ QFile::rename(const QString &newName) unsetError(); close(); if(error() == QFile::NoError) { - if (fileEngine()->rename(newName)) { + if (d->engine()->rename(newName)) { unsetError(); // engine was able to handle the new name so we just reset it d->fileEngine->setFileName(newName); @@ -806,7 +816,7 @@ QFile::link(const QString &linkName) return false; } QFileInfo fi(linkName); - if(fileEngine()->link(fi.absoluteFilePath())) { + if (d->engine()->link(fi.absoluteFilePath())) { unsetError(); return true; } @@ -861,7 +871,7 @@ QFile::copy(const QString &newName) unsetError(); close(); if(error() == QFile::NoError) { - if(fileEngine()->copy(newName)) { + if (d->engine()->copy(newName)) { unsetError(); return true; } else { @@ -996,7 +1006,7 @@ bool QFile::open(OpenMode mode) } // QIODevice provides the buffering, so there's no need to request it from the file engine. - if (fileEngine()->open(mode | QIODevice::Unbuffered)) { + if (d->engine()->open(mode | QIODevice::Unbuffered)) { QIODevice::open(mode); if (mode & Append) seek(size()); @@ -1271,7 +1281,7 @@ QFile::handle() const uchar *QFile::map(qint64 offset, qint64 size, MemoryMapFlags flags) { Q_D(QFile); - if (fileEngine() + if (d->engine() && d->fileEngine->supportsExtension(QAbstractFileEngine::MapExtension)) { unsetError(); uchar *address = d->fileEngine->map(offset, size, flags); @@ -1293,7 +1303,7 @@ uchar *QFile::map(qint64 offset, qint64 size, MemoryMapFlags flags) bool QFile::unmap(uchar *address) { Q_D(QFile); - if (fileEngine() + if (d->engine() && d->fileEngine->supportsExtension(QAbstractFileEngine::UnMapExtension)) { unsetError(); bool success = d->fileEngine->unmap(address); @@ -1320,7 +1330,7 @@ QFile::resize(qint64 sz) Q_D(QFile); if (!d->ensureFlushed()) return false; - fileEngine(); + d->engine(); if (isOpen() && d->fileEngine->pos() > sz) seek(sz); if(d->fileEngine->setSize(sz)) { @@ -1360,7 +1370,8 @@ QFile::resize(const QString &fileName, qint64 sz) QFile::Permissions QFile::permissions() const { - QAbstractFileEngine::FileFlags perms = fileEngine()->fileFlags(QAbstractFileEngine::PermsMask) & QAbstractFileEngine::PermsMask; + Q_D(const QFile); + QAbstractFileEngine::FileFlags perms = d->engine()->fileFlags(QAbstractFileEngine::PermsMask) & QAbstractFileEngine::PermsMask; return QFile::Permissions((int)perms); //ewww } @@ -1389,7 +1400,7 @@ bool QFile::setPermissions(Permissions permissions) { Q_D(QFile); - if(fileEngine()->setPermissions(permissions)) { + if (d->engine()->setPermissions(permissions)) { unsetError(); return true; } @@ -1490,7 +1501,7 @@ qint64 QFile::size() const Q_D(const QFile); if (!d->ensureFlushed()) return 0; - d->cachedSize = fileEngine()->size(); + d->cachedSize = d->engine()->size(); return d->cachedSize; } @@ -1731,18 +1742,6 @@ QFile::writeData(const char *data, qint64 len) } /*! - \internal - Returns the QIOEngine for this QFile object. -*/ -QAbstractFileEngine *QFile::fileEngine() const -{ - Q_D(const QFile); - if(!d->fileEngine) - d->fileEngine = QAbstractFileEngine::create(d->fileName); - return d->fileEngine; -} - -/*! Returns the file error status. The I/O device status returns an error code. For example, if open() diff --git a/src/corelib/io/qfile.h b/src/corelib/io/qfile.h index bc278cf600..bf7290dda2 100644 --- a/src/corelib/io/qfile.h +++ b/src/corelib/io/qfile.h @@ -54,8 +54,7 @@ QT_BEGIN_HEADER QT_BEGIN_NAMESPACE - -class QAbstractFileEngine; +class QTemporaryFile; class QFilePrivate; class Q_CORE_EXPORT QFile : public QIODevice @@ -174,8 +173,6 @@ public: uchar *map(qint64 offset, qint64 size, MemoryMapFlags flags = NoOptions); bool unmap(uchar *address); - virtual QAbstractFileEngine *fileEngine() const; - protected: #ifdef QT_NO_QOBJECT QFile(QFilePrivate &dd); @@ -188,6 +185,7 @@ protected: qint64 readLineData(char *data, qint64 maxlen); private: + friend class QTemporaryFile; Q_DISABLE_COPY(QFile) }; diff --git a/src/corelib/io/qfile_p.h b/src/corelib/io/qfile_p.h index b932627ec0..4a637d44a8 100644 --- a/src/corelib/io/qfile_p.h +++ b/src/corelib/io/qfile_p.h @@ -59,9 +59,12 @@ QT_BEGIN_NAMESPACE +class QTemporaryFile; + class QFilePrivate : public QIODevicePrivate { Q_DECLARE_PUBLIC(QFile) + friend class QTemporaryFile; protected: QFilePrivate(); @@ -70,6 +73,8 @@ protected: bool openExternalFile(int flags, int fd, QFile::FileHandleFlags handleFlags); bool openExternalFile(int flags, FILE *fh, QFile::FileHandleFlags handleFlags); + virtual QAbstractFileEngine *engine() const; + QString fileName; mutable QAbstractFileEngine *fileEngine; diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp index b80ba6eee1..75681dadff 100644 --- a/src/corelib/io/qtemporaryfile.cpp +++ b/src/corelib/io/qtemporaryfile.cpp @@ -407,6 +407,8 @@ protected: QTemporaryFilePrivate(); ~QTemporaryFilePrivate(); + QAbstractFileEngine *engine() const; + bool autoRemove; QString templateName; }; @@ -419,6 +421,17 @@ QTemporaryFilePrivate::~QTemporaryFilePrivate() { } +QAbstractFileEngine *QTemporaryFilePrivate::engine() const +{ + if (!fileEngine) { + if (fileName.isEmpty()) + fileEngine = new QTemporaryFileEngine(templateName); + else + fileEngine = new QTemporaryFileEngine(fileName, false); + } + return fileEngine; +} + static QString defaultTemplateName() { QString baseName; @@ -640,7 +653,7 @@ QString QTemporaryFile::fileName() const Q_D(const QTemporaryFile); if(d->fileName.isEmpty()) return QString(); - return fileEngine()->fileName(QAbstractFileEngine::DefaultName); + return d->engine()->fileName(QAbstractFileEngine::DefaultName); } /*! @@ -692,7 +705,7 @@ void QTemporaryFile::setFileTemplate(const QString &name) */ QTemporaryFile *QTemporaryFile::createLocalFile(QFile &file) { - if (QAbstractFileEngine *engine = file.fileEngine()) { + if (QAbstractFileEngine *engine = file.d_func()->engine()) { if(engine->fileFlags(QAbstractFileEngine::FlagsMask) & QAbstractFileEngine::LocalDiskFlag) return 0; //local already //cache @@ -726,22 +739,6 @@ QTemporaryFile *QTemporaryFile::createLocalFile(QFile &file) } /*! - \internal -*/ - -QAbstractFileEngine *QTemporaryFile::fileEngine() const -{ - Q_D(const QTemporaryFile); - if(!d->fileEngine) { - if (d->fileName.isEmpty()) - d->fileEngine = new QTemporaryFileEngine(d->templateName); - else - d->fileEngine = new QTemporaryFileEngine(d->fileName, false); - } - return d->fileEngine; -} - -/*! \reimp Creates a unique file name for the temporary file, and opens it. You can @@ -752,7 +749,7 @@ bool QTemporaryFile::open(OpenMode flags) { Q_D(QTemporaryFile); if (!d->fileName.isEmpty()) { - if (static_cast<QTemporaryFileEngine*>(fileEngine())->isReallyOpen()) { + if (static_cast<QTemporaryFileEngine*>(d->engine())->isReallyOpen()) { setOpenMode(flags); return true; } diff --git a/src/corelib/io/qtemporaryfile.h b/src/corelib/io/qtemporaryfile.h index 8b14e5a14a..e766569293 100644 --- a/src/corelib/io/qtemporaryfile.h +++ b/src/corelib/io/qtemporaryfile.h @@ -88,8 +88,6 @@ public: { QFile file(fileName); return createLocalFile(file); } static QTemporaryFile *createLocalFile(QFile &file); - virtual QAbstractFileEngine *fileEngine() const; - protected: bool open(OpenMode flags); |