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 decltype(auto) visit(QueryNative qn, QueryFileInfo qf, QueryIterator qi)
36 {
37 auto visitor = QDirEntryInfoPrivate::overloaded{std::move(qn), std::move(qf), std::move(qi)};
38 {
39 [[maybe_unused]] const bool valueless = content.valueless_by_exception();
40 Q_PRESUME(!valueless);
41 }
42 return std::visit(visitor, content);
43 }
44 template<typename QueryNative, typename QueryFileInfo, typename QueryIterator>
45 auto query(
46 QueryNative &&queryNative, QueryFileInfo &&queryFileInfo, QueryIterator &&queryIterator)
47 {
48 return visit(
49 std::forward<QueryNative>(queryNative),
50 std::forward<QueryFileInfo>(queryFileInfo),
51 [&](const Iterator &iterator) { return queryIterator(iterator.iterator); }
52 );
53 }
54
55 template<typename QueryNative, typename QueryFileInfo>
56 auto query(QueryNative &&queryNative, const QueryFileInfo &queryFileInfo)
57 {
58 return visit(
59 std::forward<QueryNative>(queryNative),
60 [&](Iterator &iterator) { return queryFileInfo(iterator.ensureFileInfo()); },
61 queryFileInfo
62 );
63 }
64
65public:
66 QDirEntryInfo() = default;
67
68 explicit QDirEntryInfo(const QAbstractFileEngineIterator *iterator)
70 {
71 }
72
73 explicit QDirEntryInfo(QFileSystemEntry &&e, QFileSystemMetaData &&md)
74 : content(Native { std::move(e), std::move(md) })
75 {
76 }
77
78 explicit QDirEntryInfo(QFileInfo &&info)
79 : content(std::move(info))
80 {
81 }
82
83 const QFileInfo &fileInfo()
84 {
85 return visit(
86 [](Iterator &iterator) -> const QFileInfo & { return iterator.ensureFileInfo(); },
87 [this](const Native &native) -> const QFileInfo & {
88 content = QFileInfo(new QFileInfoPrivate(native.entry, native.metaData));
89 return std::get<QFileInfo>(content);
90 },
91 [](const QFileInfo &fileInfo) -> const QFileInfo & { return fileInfo; }
92 );
93 }
94
96 {
97 return query(
98 [](const Native &native) { return native.entry.fileName(); },
99 [](const QFileInfo &info) { return info.fileName(); },
100 [](const QAbstractFileEngineIterator *it) { return it->currentFileName(); });
101 }
102
104 {
105 return query(
106 [](const Native &native) { return native.entry.baseName(); },
107 [](const QFileInfo &info) { return info.baseName(); });
108 }
109
111 {
112 return query(
113 [](const Native &native) { return native.entry.completeBaseName(); },
114 [](const QFileInfo &info) { return info.completeBaseName(); });
115 }
116
118 {
119 return query(
120 [](const Native &native) { return native.entry.suffix(); },
121 [](const QFileInfo &info) { return info.suffix(); });
122 }
123
125 {
126 return query(
127 [](const Native &native) { return native.entry.completeSuffix(); },
128 [](const QFileInfo &info) { return info.completeSuffix(); });
129 }
130
132 {
133 return query(
134 [](const Native &native) { return native.entry.filePath(); },
135 [](const QFileInfo &info) { return info.filePath(); },
136 [](const QAbstractFileEngineIterator *it) { return it->currentFilePath(); });
137 }
138
139 QString bundleName() { return fileInfo().bundleName(); }
140
142 {
143 // QFileInfo caches these strings
144 return fileInfo().canonicalFilePath();
145 }
146
148 // QFileInfo caches these strings
149 return fileInfo().absoluteFilePath();
150 }
151
153 // QFileInfo caches these strings
154 return fileInfo().absolutePath();
155 }
156
157
158 bool isDir() {
159 return query(
160 [](Native &native) {
161 return native.ensureFilled(QFileSystemMetaData::DirectoryType).isDirectory();
162 },
163 [](const QFileInfo &fileInfo) {return fileInfo.isDir(); });
164 }
165
166 bool isFile() {
167 return query(
168 [](Native &native) {
169 return native.ensureFilled(QFileSystemMetaData::FileType).isFile();
170 },
171 [](const QFileInfo &fileInfo) {return fileInfo.isFile(); });
172 }
173
174 bool isSymLink() {
175 return query(
176 [](Native &native) {
177 return native.ensureFilled(QFileSystemMetaData::LegacyLinkType).isLegacyLink();
178 },
179 [](const QFileInfo &fileInfo) {return fileInfo.isSymLink(); });
180 }
181
183 return query(
184 [](Native &native) {
185 return native.ensureFilled(QFileSystemMetaData::LinkType).isLink();
186 },
187 [](const QFileInfo &fileInfo) {return fileInfo.isSymbolicLink(); });
188 }
189
190 bool exists() {
191 return query(
192 [](Native &native) {
193 return native.ensureFilled(QFileSystemMetaData::ExistsAttribute).exists();
194 },
195 [](const QFileInfo &fileInfo) {return fileInfo.exists(); });
196 }
197
198 bool isHidden() {
199 return query(
200 [](Native &native) {
201 return native.ensureFilled(QFileSystemMetaData::HiddenAttribute).isHidden();
202 },
203 [](const QFileInfo &fileInfo) {return fileInfo.isHidden(); });
204 }
205
206 bool isReadable() {
207 return query(
208 [](Native &native) {
209 return native.ensureFilled(QFileSystemMetaData::UserReadPermission).isReadable();
210 },
211 [](const QFileInfo &fileInfo) {return fileInfo.isReadable(); });
212 }
213
214 bool isWritable() {
215 return query(
216 [](Native &native) {
217 return native.ensureFilled(QFileSystemMetaData::UserWritePermission).isWritable();
218 },
219 [](const QFileInfo &fileInfo) {return fileInfo.isWritable(); });
220 }
221
223 return query(
224 [](Native &native) {
225 return native.ensureFilled(QFileSystemMetaData::UserExecutePermission)
226 .isExecutable();
227 },
228 [](const QFileInfo &fileInfo) {return fileInfo.isExecutable(); });
229 }
230
231 qint64 size() { return fileInfo().size(); }
232
233 QDateTime fileTime(QFile::FileTime type, const QTimeZone &tz)
234 {
235 return fileInfo().fileTime(type, tz);
236 }
237
238private:
239 friend class QDirListingPrivate;
240 friend class QDirListing;
241 friend class QFileSystemIterator;
243
244 struct Iterator
245 {
246 // The data we can query from both the QFileInfo and the iterator is cheaper to retrieve
247 // from the iterator. Therefore, keep the iterator around even if we create a the QFileInfo.
248 const QAbstractFileEngineIterator *iterator = nullptr;
249 std::optional<QFileInfo> fileInfo;
250
251 const QFileInfo &ensureFileInfo()
252 {
253 if (!fileInfo.has_value())
254 fileInfo = iterator->currentFileInfo();
255 return *fileInfo;
256 }
257 };
258
259 struct Native
260 {
261 QFileSystemEntry entry;
262 QFileSystemMetaData metaData;
263
264 const QFileSystemMetaData &ensureFilled(QFileSystemMetaData::MetaDataFlag what)
265 {
266 if (!metaData.hasFlags(what))
267 QFileSystemEngine::fillMetaData(entry, metaData, what);
268 return metaData;
269 }
270 };
271
272 std::variant<Native, QFileInfo, Iterator> content;
273};
274
275QT_END_NAMESPACE
276
277#endif // QDIRENTRYINFO_P_H
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)