summaryrefslogtreecommitdiffstats
path: root/src/corelib/io/qfsfileengine_p.h
blob: 8744a8f53ef73d96dfe2d396351c1e4ef0282e1a (plain)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
// Copyright (C) 2016 The Qt Company Ltd.// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only#ifndef QFSFILEENGINE_P_H#define QFSFILEENGINE_P_H//// W A R N I N G// -------------//// This file is not part of the Qt API. It exists purely as an// implementation detail. This header file may change from version to// version without notice, or even be removed.//// We mean it.//#include"qplatformdefs.h"#include"QtCore/private/qabstractfileengine_p.h"#include <QtCore/private/qfilesystementry_p.h>#include <QtCore/private/qfilesystemmetadata_p.h>#include <qhash.h>#include <optional>#ifdef Q_OS_UNIX#include <sys/types.h>// for mode_t#endif#ifndef QT_NO_FSFILEENGINE QT_BEGIN_NAMESPACE struct ProcessOpenModeResult {bool ok;QIODevice::OpenMode openMode; QString error;}; Q_CORE_EXPORT ProcessOpenModeResult processOpenModeFlags(QIODevice::OpenMode mode);class QFSFileEnginePrivate;class Q_CORE_EXPORT QFSFileEngine :public QAbstractFileEngine {Q_DECLARE_PRIVATE(QFSFileEngine)public:QFSFileEngine();explicitQFSFileEngine(const QString &file);~QFSFileEngine();boolopen(QIODevice::OpenMode openMode,std::optional<QFile::Permissions> permissions) override;boolopen(QIODevice::OpenMode flags,FILE*fh);boolclose() override;boolflush() override;boolsyncToDisk() override; qint64 size()const override; qint64 pos()const override;boolseek(qint64) override;boolisSequential()const override;boolremove() override;boolcopy(const QString &newName) override;boolrename(const QString &newName) override {returnrename_helper(newName, Rename); }boolrenameOverwrite(const QString &newName) override {returnrename_helper(newName, RenameOverwrite); }boollink(const QString &newName) override;boolmkdir(const QString &dirName,bool createParentDirectories,std::optional<QFile::Permissions> permissions)const override;boolrmdir(const QString &dirName,bool recurseParentDirectories)const override;boolsetSize(qint64 size) override;boolcaseSensitive()const override;boolisRelativePath()const override; FileFlags fileFlags(FileFlags type)const override;boolsetPermissions(uint perms) override; QByteArray id()const override; QString fileName(FileName file)const override; uint ownerId(FileOwner)const override; QString owner(FileOwner)const override;boolsetFileTime(const QDateTime &newDate,QFile::FileTime time) override; QDateTime fileTime(QFile::FileTime time)const override;voidsetFileName(const QString &file) override;voidsetFileEntry(QFileSystemEntry &&entry);inthandle()const override;#ifndef QT_NO_FILESYSTEMITERATOR IteratorUniquePtr beginEntryList(const QString &path,QDirListing::IteratorFlags filters,const QStringList &filterNames) override;#endif qint64 read(char*data, qint64 maxlen) override; qint64 readLine(char*data, qint64 maxlen) override; qint64 write(const char*data, qint64 len) override; TriStateResult cloneTo(QAbstractFileEngine *target) override;virtualboolisUnnamedFile()const{return false; }boolextension(Extension extension,const ExtensionOption *option =nullptr, ExtensionReturn *output =nullptr) override;boolsupportsExtension(Extension extension)const override;//FS only!!boolopen(QIODevice::OpenMode flags,int fd);boolopen(QIODevice::OpenMode flags,int fd,QFile::FileHandleFlags handleFlags);boolopen(QIODevice::OpenMode flags,FILE*fh,QFile::FileHandleFlags handleFlags);static boolsetCurrentPath(const QString &path);static QString currentPath(const QString &path =QString());static QString homePath();static QString rootPath();static QString tempPath();static QFileInfoList drives();protected:QFSFileEngine(QFSFileEnginePrivate &dd);private:enum RenameMode :int{ Rename, RenameOverwrite };boolrename_helper(const QString &newName, RenameMode mode);};class Q_AUTOTEST_EXPORT QFSFileEnginePrivate :public QAbstractFileEnginePrivate {Q_DECLARE_PUBLIC(QFSFileEngine)public:#ifdef Q_OS_WINstatic QString longFileName(const QString &path);#endif QFileSystemEntry fileEntry;QIODevice::OpenMode openMode;boolnativeOpen(QIODevice::OpenMode openMode,std::optional<QFile::Permissions> permissions);boolopenFh(QIODevice::OpenMode flags,FILE*fh);boolopenFd(QIODevice::OpenMode flags,int fd);boolnativeClose();boolcloseFdFh();boolnativeFlush();boolnativeSyncToDisk();boolflushFh(); qint64 nativeSize()const;#ifndef Q_OS_WIN qint64 sizeFdFh()const;#endif qint64 nativePos()const; qint64 posFdFh()const;boolnativeSeek(qint64);boolseekFdFh(qint64); qint64 nativeRead(char*data, qint64 maxlen); qint64 readFdFh(char*data, qint64 maxlen); qint64 nativeReadLine(char*data, qint64 maxlen); qint64 readLineFdFh(char*data, qint64 maxlen); qint64 nativeWrite(const char*data, qint64 len); qint64 writeFdFh(const char*data, qint64 len);intnativeHandle()const;boolnativeIsSequential()const;#ifndef Q_OS_WINboolisSequentialFdFh()const;#endif#ifdef Q_OS_WINboolnativeRenameOverwrite(const QFileSystemEntry &newEntry);#endif uchar *map(qint64 offset, qint64 size,QFile::MemoryMapFlags flags);boolunmap(uchar *ptr);voidunmapAll();mutable QFileSystemMetaData metaData;FILE*fh;#ifdef Q_OS_WIN HANDLE fileHandle; HANDLE mapHandle; QHash<uchar *, DWORD /* offset % AllocationGranularity */> maps;mutableint cachedFd;mutable DWORD fileAttrib;#elsestruct StartAndLength {int start;// offset % PageSizesize_t length;// length + offset % PageSize}; QHash<uchar *, StartAndLength> maps;#endifint fd;enum LastIOCommand { IOFlushCommand, IOReadCommand, IOWriteCommand }; LastIOCommand lastIOCommand;bool lastFlushFailed;bool closeFileHandle;mutable uint is_sequential :2;mutable uint tried_stat :1;mutable uint need_lstat :1;mutable uint is_link :1;#if defined(Q_OS_WIN)booldoStat(QFileSystemMetaData::MetaDataFlags flags)const;#elsebooldoStat(QFileSystemMetaData::MetaDataFlags flags =QFileSystemMetaData::PosixStatFlags)const;#endifboolisSymlink()const;#if defined(Q_OS_WIN32)intsysOpen(const QString &,int flags);#endifstatic boolopenModeCanCreate(QIODevice::OpenMode openMode){// WriteOnly can create, but only when ExistingOnly isn't specified.// ReadOnly by itself never creates.return(openMode &QFile::WriteOnly) && !(openMode &QFile::ExistingOnly);}protected:QFSFileEnginePrivate(QAbstractFileEngine *q);voidinit();QAbstractFileEngine::FileFlags getPermissions(QAbstractFileEngine::FileFlags type)const;#ifdef Q_OS_UNIXboolnativeOpenImpl(QIODevice::OpenMode openMode, mode_t mode);#endif}; QT_END_NAMESPACE #endif// QT_NO_FSFILEENGINE#endif// QFSFILEENGINE_P_H
close