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
qdirentryinfo_p.h
Go to the documentation of this file.
1// Copyright (C) 2024 Ahmad Samir <a.samirh78@gmail.com>
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 QDIRENTRYINFO_P_H
6#define QDIRENTRYINFO_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 <QtCore/private/qfileinfo_p.h>
20#include <QtCore/private/qfilesystementry_p.h>
21#include <QtCore/private/qfilesystemmetadata_p.h>
22
24
26template<class... Ts>
27struct overloaded : Ts... { using Ts::operator()...; };
28template<class... Ts>
29overloaded(Ts...) -> overloaded<Ts...>;
30};
31
33{
34 template<typename QueryNative, typename QueryFileInfo, typename QueryIterator>
35 auto query(
36 QueryNative &&queryNative, QueryFileInfo &&queryFileInfo, QueryIterator &&queryIterator)
37 {
38 return std::visit(QDirEntryInfoPrivate::overloaded {
39 std::forward<QueryNative>(queryNative),
40 std::forward<QueryFileInfo>(queryFileInfo),
41 [&](const Iterator &iterator) { return queryIterator(iterator.iterator); }
42 }, content);
43 }
44
45 template<typename QueryNative, typename QueryFileInfo>
46 auto query(QueryNative &&queryNative, const QueryFileInfo &queryFileInfo)
47 {
48 return std::visit(QDirEntryInfoPrivate::overloaded {
49 std::forward<QueryNative>(queryNative),
50 [&](Iterator &iterator) { return queryFileInfo(iterator.ensureFileInfo()); },
51 queryFileInfo,
52 }, content);
53 }
54
55public:
56 QDirEntryInfo() = default;
57
58 explicit QDirEntryInfo(const QAbstractFileEngineIterator *iterator)
60 {
61 }
62
63 explicit QDirEntryInfo(QFileSystemEntry &&e, QFileSystemMetaData &&md)
64 : content(Native { std::move(e), std::move(md) })
65 {
66 }
67
68 explicit QDirEntryInfo(QFileInfo &&info)
69 : content(std::move(info))
70 {
71 }
72
73 const QFileInfo &fileInfo()
74 {
75 return std::visit(QDirEntryInfoPrivate::overloaded {
76 [](Iterator &iterator) -> const QFileInfo & { return iterator.ensureFileInfo(); },
77 [this](const Native &native) -> const QFileInfo & {
78 content = QFileInfo(new QFileInfoPrivate(native.entry, native.metaData));
79 return std::get<QFileInfo>(content);
80 },
81 [](const QFileInfo &fileInfo) -> const QFileInfo & { return fileInfo; }
82 }, content);
83 }
84
86 {
87 return query(
88 [](const Native &native) { return native.entry.fileName(); },
89 [](const QFileInfo &info) { return info.fileName(); },
90 [](const QAbstractFileEngineIterator *it) { return it->currentFileName(); });
91 }
92
94 {
95 return query(
96 [](const Native &native) { return native.entry.baseName(); },
97 [](const QFileInfo &info) { return info.baseName(); });
98 }
99
101 {
102 return query(
103 [](const Native &native) { return native.entry.completeBaseName(); },
104 [](const QFileInfo &info) { return info.completeBaseName(); });
105 }
106
108 {
109 return query(
110 [](const Native &native) { return native.entry.suffix(); },
111 [](const QFileInfo &info) { return info.suffix(); });
112 }
113
115 {
116 return query(
117 [](const Native &native) { return native.entry.completeSuffix(); },
118 [](const QFileInfo &info) { return info.completeSuffix(); });
119 }
120
122 {
123 return query(
124 [](const Native &native) { return native.entry.filePath(); },
125 [](const QFileInfo &info) { return info.filePath(); },
126 [](const QAbstractFileEngineIterator *it) { return it->currentFilePath(); });
127 }
128
129 QString bundleName() { return fileInfo().bundleName(); }
130
132 {
133 // QFileInfo caches these strings
134 return fileInfo().canonicalFilePath();
135 }
136
138 // QFileInfo caches these strings
139 return fileInfo().absoluteFilePath();
140 }
141
143 // QFileInfo caches these strings
144 return fileInfo().absolutePath();
145 }
146
147
148 bool isDir() {
149 return query(
150 [](Native &native) {
151 return native.ensureFilled(QFileSystemMetaData::DirectoryType).isDirectory();
152 },
153 [](const QFileInfo &fileInfo) {return fileInfo.isDir(); });
154 }
155
156 bool isFile() {
157 return query(
158 [](Native &native) {
159 return native.ensureFilled(QFileSystemMetaData::FileType).isFile();
160 },
161 [](const QFileInfo &fileInfo) {return fileInfo.isFile(); });
162 }
163
164 bool isSymLink() {
165 return query(
166 [](Native &native) {
167 return native.ensureFilled(QFileSystemMetaData::LegacyLinkType).isLegacyLink();
168 },
169 [](const QFileInfo &fileInfo) {return fileInfo.isSymLink(); });
170 }
171
173 return query(
174 [](Native &native) {
175 return native.ensureFilled(QFileSystemMetaData::LinkType).isLink();
176 },
177 [](const QFileInfo &fileInfo) {return fileInfo.isSymbolicLink(); });
178 }
179
180 bool exists() {
181 return query(
182 [](Native &native) {
183 return native.ensureFilled(QFileSystemMetaData::ExistsAttribute).exists();
184 },
185 [](const QFileInfo &fileInfo) {return fileInfo.exists(); });
186 }
187
188 bool isHidden() {
189 return query(
190 [](Native &native) {
191 return native.ensureFilled(QFileSystemMetaData::HiddenAttribute).isHidden();
192 },
193 [](const QFileInfo &fileInfo) {return fileInfo.isHidden(); });
194 }
195
196 bool isReadable() {
197 return query(
198 [](Native &native) {
199 return native.ensureFilled(QFileSystemMetaData::UserReadPermission).isReadable();
200 },
201 [](const QFileInfo &fileInfo) {return fileInfo.isReadable(); });
202 }
203
204 bool isWritable() {
205 return query(
206 [](Native &native) {
207 return native.ensureFilled(QFileSystemMetaData::UserWritePermission).isWritable();
208 },
209 [](const QFileInfo &fileInfo) {return fileInfo.isWritable(); });
210 }
211
213 return query(
214 [](Native &native) {
215 return native.ensureFilled(QFileSystemMetaData::UserExecutePermission)
216 .isExecutable();
217 },
218 [](const QFileInfo &fileInfo) {return fileInfo.isExecutable(); });
219 }
220
221 qint64 size() { return fileInfo().size(); }
222
223 QDateTime fileTime(QFile::FileTime type, const QTimeZone &tz)
224 {
225 return fileInfo().fileTime(type, tz);
226 }
227
228private:
229 friend class QDirListingPrivate;
230 friend class QDirListing;
231 friend class QFileSystemIterator;
233
234 struct Iterator
235 {
236 // The data we can query from both the QFileInfo and the iterator is cheaper to retrieve
237 // from the iterator. Therefore, keep the iterator around even if we create a the QFileInfo.
238 const QAbstractFileEngineIterator *iterator = nullptr;
239 std::optional<QFileInfo> fileInfo;
240
241 const QFileInfo &ensureFileInfo()
242 {
243 if (!fileInfo.has_value())
244 fileInfo = iterator->currentFileInfo();
245 return *fileInfo;
246 }
247 };
248
249 struct Native
250 {
251 QFileSystemEntry entry;
252 QFileSystemMetaData metaData;
253
254 const QFileSystemMetaData &ensureFilled(QFileSystemMetaData::MetaDataFlag what)
255 {
256 if (!metaData.hasFlags(what))
257 QFileSystemEngine::fillMetaData(entry, metaData, what);
258 return metaData;
259 }
260 };
261
262 std::variant<Native, QFileInfo, Iterator> content;
263};
264
265QT_END_NAMESPACE
266
267#endif // QDIRENTRYINFO_P_H
QString baseName()
QDirEntryInfo(QFileSystemEntry &&e, QFileSystemMetaData &&md)
const QFileInfo & fileInfo()
QString absoluteFilePath()
QString canonicalFilePath()
QString completeSuffix()
QDateTime fileTime(QFile::FileTime type, const QTimeZone &tz)
QDirEntryInfo(QFileInfo &&info)
QDirEntryInfo()=default
QDirEntryInfo(const QAbstractFileEngineIterator *iterator)
QString fileName()
QString completeBaseName()
QString bundleName()
QString absolutePath()
QDirIteratorPrivate(const QString &path, const QStringList &nameFilters={}, QDir::Filters dirFilters=QDir::NoFilter, QDirIterator::IteratorFlags flags=QDirIterator::NoIteratorFlags)
QDir::Filters filters
void skipToNextMatch(QDirListing::const_iterator &iter)
QDirListing::const_iterator it
The QDirIterator class provides an iterator for directory entrylists.
\inmodule QtCore
Definition qdirlisting.h:71
reference operator*() const
Returns a {const QDirListing::DirEntry &} of the directory entry this iterator points to.
const_iterator & operator++()
Pre-increment operator.
overloaded(Ts...) -> overloaded< Ts... >
Combined button and popup list for selecting options.
static QDirListing::IteratorFlags toDirListingFlags(QDir::Filters filters, QDirIterator::IteratorFlags flags)