Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qfsfileengine_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#ifndef QFSFILEENGINE_P_H
6#define QFSFILEENGINE_P_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or even be removed.
15//
16// We mean it.
17//
18
19#include "qplatformdefs.h"
20#include "QtCore/private/qabstractfileengine_p.h"
21#include <QtCore/private/qfilesystementry_p.h>
22#include <QtCore/private/qfilesystemmetadata_p.h>
23#include <qhash.h>
24
25#include <optional>
26
27#ifdef Q_OS_UNIX
28#include <sys/types.h> // for mode_t
29#endif
30
31#ifndef QT_NO_FSFILEENGINE
32
34
35struct ProcessOpenModeResult
36{
37 bool ok;
38 QIODevice::OpenMode openMode;
39 QString error;
40};
41Q_CORE_EXPORT ProcessOpenModeResult processOpenModeFlags(QIODevice::OpenMode mode);
42
43class QFSFileEnginePrivate;
44
45class Q_CORE_EXPORT QFSFileEngine : public QAbstractFileEngine
46{
47 Q_DECLARE_PRIVATE(QFSFileEngine)
48public:
49 QFSFileEngine();
50 explicit QFSFileEngine(const QString &file);
51 ~QFSFileEngine();
52
53 bool open(QIODevice::OpenMode openMode, std::optional<QFile::Permissions> permissions) override;
54 bool close() override;
55 bool flush() override;
56 bool syncToDisk() override;
57 qint64 size() const override;
58 qint64 pos() const override;
59 bool seek(qint64) override;
60 bool isSequential() const override;
61 bool remove() override;
62 bool copy(const QString &newName) override;
63
64 bool rename(const QString &newName) override
65 { return rename_helper(newName, Rename); }
66 bool renameOverwrite(const QString &newName) override
67 { return rename_helper(newName, RenameOverwrite); }
68
69 bool link(const QString &newName) override;
70 bool mkdir(const QString &dirName, bool createParentDirectories,
71 std::optional<QFile::Permissions> permissions) const override;
72 bool rmdir(const QString &dirName, bool recurseParentDirectories) const override;
73 bool setSize(qint64 size) override;
74 bool caseSensitive() const override;
75 bool isRelativePath() const override;
76 FileFlags fileFlags(FileFlags type) const override;
77 bool setPermissions(uint perms) override;
78 QByteArray id() const override;
79 QString fileName(FileName file) const override;
80 uint ownerId(FileOwner) const override;
81 QString owner(FileOwner) const override;
82 bool setFileTime(const QDateTime &newDate, QFile::FileTime time) override;
83 QDateTime fileTime(QFile::FileTime time) const override;
84 void setFileName(const QString &file) override;
85 void setFileEntry(QFileSystemEntry &&entry);
86 int handle() const override;
87
88#ifndef QT_NO_FILESYSTEMITERATOR
89 IteratorUniquePtr beginEntryList(const QString &path, QDirListing::IteratorFlags filters,
90 const QStringList &filterNames) override;
91#endif
92
93 qint64 read(char *data, qint64 maxlen) override;
94 qint64 readLine(char *data, qint64 maxlen) override;
95 qint64 write(const char *data, qint64 len) override;
96 TriStateResult cloneTo(QAbstractFileEngine *target) override;
97
98 virtual bool isUnnamedFile() const
99 { return false; }
100
101 bool extension(Extension extension, const ExtensionOption *option = nullptr, ExtensionReturn *output = nullptr) override;
102 bool supportsExtension(Extension extension) const override;
103
104 //FS only!!
105 bool open(QIODevice::OpenMode flags, int fd, QFile::FileHandleFlags handleFlags);
106 bool open(QIODevice::OpenMode flags, FILE *fh, QFile::FileHandleFlags handleFlags);
107 static bool setCurrentPath(const QString &path);
108 static QString currentPath(const QString &path = QString());
109 static QFileInfoList drives();
110
111protected:
112 QFSFileEngine(QFSFileEnginePrivate &dd);
113
114private:
115 enum RenameMode : int { Rename, RenameOverwrite };
116 bool rename_helper(const QString &newName, RenameMode mode);
117};
118
119class Q_AUTOTEST_EXPORT QFSFileEnginePrivate : public QAbstractFileEnginePrivate
120{
121 Q_DECLARE_PUBLIC(QFSFileEngine)
122
123public:
124#ifdef Q_OS_WIN
125 static QString longFileName(const QString &path);
126#endif
127
128 QFileSystemEntry fileEntry;
129 QIODevice::OpenMode openMode;
130
131 bool nativeOpen(QIODevice::OpenMode openMode, std::optional<QFile::Permissions> permissions);
132 bool openFh(QIODevice::OpenMode flags, FILE *fh);
133 bool openFd(QIODevice::OpenMode flags, int fd);
134 bool nativeClose();
135 bool closeFdFh();
136 bool nativeFlush();
137 bool nativeSyncToDisk();
138 bool flushFh();
139 qint64 nativeSize() const;
140#ifndef Q_OS_WIN
141 qint64 sizeFdFh() const;
142#endif
143 qint64 nativePos() const;
144 qint64 posFdFh() const;
145 bool nativeSeek(qint64);
146 bool seekFdFh(qint64);
147 qint64 nativeRead(char *data, qint64 maxlen);
148 qint64 readFdFh(char *data, qint64 maxlen);
149 qint64 nativeReadLine(char *data, qint64 maxlen);
150 qint64 readLineFdFh(char *data, qint64 maxlen);
151 qint64 nativeWrite(const char *data, qint64 len);
152 qint64 writeFdFh(const char *data, qint64 len);
153 int nativeHandle() const;
154 bool nativeIsSequential() const;
155#ifndef Q_OS_WIN
156 bool isSequentialFdFh() const;
157#endif
158#ifdef Q_OS_WIN
159 bool nativeRenameOverwrite(const QFileSystemEntry &newEntry);
160#endif
161
162 uchar *map(qint64 offset, qint64 size, QFile::MemoryMapFlags flags);
163 bool unmap(uchar *ptr);
164 void unmapAll();
165
166 mutable QFileSystemMetaData metaData;
167
168 FILE *fh;
169
170#ifdef Q_OS_WIN
171 HANDLE fileHandle;
172 HANDLE mapHandle;
173 QHash<uchar *, DWORD /* offset % AllocationGranularity */> maps;
174
175 mutable int cachedFd;
176 mutable DWORD fileAttrib;
177#else
178 struct StartAndLength {
179 int start; // offset % PageSize
180 size_t length; // length + offset % PageSize
181 };
182 QHash<uchar *, StartAndLength> maps;
183#endif
184 int fd;
185
186 enum LastIOCommand
187 {
188 IOFlushCommand,
189 IOReadCommand,
190 IOWriteCommand
191 };
192 LastIOCommand lastIOCommand;
193 bool lastFlushFailed;
194 bool closeFileHandle;
195
196 mutable uint is_sequential : 2;
197 mutable uint tried_stat : 1;
198 mutable uint need_lstat : 1;
199 mutable uint is_link : 1;
200
201#if defined(Q_OS_WIN)
202 bool doStat(QFileSystemMetaData::MetaDataFlags flags) const;
203#else
204 bool doStat(QFileSystemMetaData::MetaDataFlags flags = QFileSystemMetaData::PosixStatFlags) const;
205#endif
206 bool isSymlink() const;
207
208#if defined(Q_OS_WIN32)
209 int sysOpen(const QString &, int flags);
210#endif
211
212 static bool openModeCanCreate(QIODevice::OpenMode openMode)
213 {
214 // WriteOnly can create, but only when ExistingOnly isn't specified.
215 // ReadOnly by itself never creates.
216 return (openMode & QFile::WriteOnly) && !(openMode & QFile::ExistingOnly);
217 }
218protected:
219 QFSFileEnginePrivate(QAbstractFileEngine *q);
220
221 void init();
222
223 QAbstractFileEngine::FileFlags getPermissions(QAbstractFileEngine::FileFlags type) const;
224
225#ifdef Q_OS_UNIX
226 bool nativeOpenImpl(QIODevice::OpenMode openMode, mode_t mode);
227#endif
228};
229
230QT_END_NAMESPACE
231
232#endif // QT_NO_FSFILEENGINE
233
234#endif // QFSFILEENGINE_P_H
The QAbstractFileEngineIterator class provides an iterator interface for custom file engines.
virtual ~QAbstractFileEnginePrivate()
QAbstractFileEnginePrivate(QAbstractFileEngine *q)
QAbstractFileEngine *const q_ptr
\inmodule QtCore \reentrant
\inmodule QtCore
Definition qdirlisting.h:68
QDirPrivate(const QDirPrivate &copy)
Definition qdir.cpp:105
@ UrlNormalizationMode
Definition qdir_p.h:34
@ RemotePath
Definition qdir_p.h:35
MetaDataClearing
Definition qdir_p.h:65
@ IncludingMetaData
Definition qdir_p.h:65
void clearCache(MetaDataClearing mode)
Definition qdir.cpp:470
void initFileLists(const QDir &dir) const
Definition qdir.cpp:455
bool exists() const
Definition qdir.cpp:122
QString resolveAbsoluteEntry() const
Definition qdir.cpp:178
bool operator()(const QDirSortItem &, const QDirSortItem &) const
Definition qdir.cpp:258
QDirSortItemComparator(QDir::SortFlags flags, QCollator *coll=nullptr)
Definition qdir.cpp:232
int compareStrings(const QString &a, const QString &b, Qt::CaseSensitivity cs) const
Definition qdir.cpp:248
\inmodule QtCore
\inmodule QtCore
Definition qmutex.h:346
std::unique_ptr< QAbstractFileEngine > qt_custom_file_engine_handler_create(const QString &path)
static void appendIfMatchesNonDirListingFlags(const QDirListing::DirEntry &dirEntry, QDir::Filters filters, QFileInfoList &l)
Definition qdir.cpp:402
static qsizetype rootLength(QStringView name, QDirPrivate::PathNormalizations flags)
Definition qdir.cpp:56
static bool qt_cleanPath(QString *path)
Definition qdir.cpp:2485
bool comparesEqual(const QDir &lhs, const QDir &rhs)
Definition qdir.cpp:1936
static bool treatAsAbsolute(const QString &path)
Definition qdir.cpp:866
static bool checkPermissions(const QDirListing::DirEntry &dirEntry, QDir::Filters filters)
Definition qdir.cpp:364
bool qt_normalizePathSegments(QString *path, QDirPrivate::PathNormalizations flags)
Definition qdir.cpp:2346
static bool checkDotOrDotDot(const QDirListing::DirEntry &dirEntry, QDir::Filters filters)
Definition qdir.cpp:380
Q_AUTOTEST_EXPORT bool qt_normalizePathSegments(QString *path, QDirPrivate::PathNormalizations flags)
Definition qdir.cpp:2346
QFileInfo item
Definition qdir.cpp:220
QString suffix_cache
Definition qdir.cpp:219
QDirSortItem(const QFileInfo &fi, QDir::SortFlags sort)
Definition qdir.cpp:208
QDirSortItem()=default
QString filename_cache
Definition qdir.cpp:218