Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qfilesystemmetadata_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
4#ifndef QFILESYSTEMMETADATA_P_H
5#define QFILESYSTEMMETADATA_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include "qplatformdefs.h"
19#include <QtCore/qglobal.h>
20#include <QtCore/qdatetime.h>
21#include <QtCore/qtimezone.h>
22#include <QtCore/private/qabstractfileengine_p.h>
23
24// Platform-specific includes
25#ifdef Q_OS_WIN
26# include <QtCore/qt_windows.h>
27# ifndef IO_REPARSE_TAG_SYMLINK
28# define IO_REPARSE_TAG_SYMLINK (0xA000000CL)
29# endif
30#endif
31
32#ifdef Q_OS_UNIX
33struct statx;
34#endif
35
37
39
41{
42public:
44 : size_(-1)
45 {
46 }
47
49 // Permissions, overlaps with QFile::Permissions
50 OtherReadPermission = 0x00000004, OtherWritePermission = 0x00000002, OtherExecutePermission = 0x00000001,
51 GroupReadPermission = 0x00000040, GroupWritePermission = 0x00000020, GroupExecutePermission = 0x00000010,
52 UserReadPermission = 0x00000400, UserWritePermission = 0x00000200, UserExecutePermission = 0x00000100,
53 OwnerReadPermission = 0x00004000, OwnerWritePermission = 0x00002000, OwnerExecutePermission = 0x00001000,
54
55 OtherPermissions = OtherReadPermission | OtherWritePermission | OtherExecutePermission,
56 GroupPermissions = GroupReadPermission | GroupWritePermission | GroupExecutePermission,
57 UserPermissions = UserReadPermission | UserWritePermission | UserExecutePermission,
58 OwnerPermissions = OwnerReadPermission | OwnerWritePermission | OwnerExecutePermission,
59
60 ReadPermissions = OtherReadPermission | GroupReadPermission | UserReadPermission | OwnerReadPermission,
61 WritePermissions = OtherWritePermission | GroupWritePermission | UserWritePermission | OwnerWritePermission,
62 ExecutePermissions = OtherExecutePermission | GroupExecutePermission | UserExecutePermission | OwnerExecutePermission,
63
64 Permissions = OtherPermissions | GroupPermissions | UserPermissions | OwnerPermissions,
65
66 // Type
67 LinkType = 0x00010000,
68 FileType = 0x00020000,
69 DirectoryType = 0x00040000,
70#if defined(Q_OS_DARWIN)
71 BundleType = 0x00080000,
72 AliasType = 0x08000000,
73#else
74 BundleType = 0x0,
75 AliasType = 0x0,
76#endif
77#if defined(Q_OS_WIN)
78 JunctionType = 0x04000000,
79 WinLnkType = 0x08000000, // Note: Uses the same position for AliasType on Mac
80#else
81 JunctionType = 0x0,
82 WinLnkType = 0x0,
83#endif
84 SequentialType = 0x00800000, // Note: overlaps with QAbstractFileEngine::RootFlag
85
86 LegacyLinkType = LinkType | AliasType | WinLnkType,
87
88 Type = LinkType | FileType | DirectoryType | BundleType | SequentialType | AliasType,
89
90 // Attributes
91 HiddenAttribute = 0x00100000,
92 SizeAttribute = 0x00200000, // Note: overlaps with QAbstractFileEngine::LocalDiskFlag
93 ExistsAttribute = 0x00400000, // For historical reasons, indicates existence of data, not the file
94#if defined(Q_OS_WIN)
95 WasDeletedAttribute = 0x0,
96#else
97 WasDeletedAttribute = 0x40000000, // Indicates the file was deleted
98#endif
99
100 Attributes = HiddenAttribute | SizeAttribute | ExistsAttribute | WasDeletedAttribute,
101
102 // Times - if we know one of them, we know them all
103 AccessTime = 0x02000000,
104 BirthTime = 0x02000000,
105 MetadataChangeTime = 0x02000000,
106 ModificationTime = 0x02000000,
107
108 Times = AccessTime | BirthTime | MetadataChangeTime | ModificationTime,
109
110 // Owner IDs
111 UserId = 0x10000000,
112 GroupId = 0x20000000,
113
114 OwnerIds = UserId | GroupId,
115
126
127#if defined(Q_OS_WIN)
128 WinStatFlags = QFileSystemMetaData::FileType
134#endif
135
136 AllMetaDataFlags = 0xFFFFFFFF
137
138 };
139 Q_DECLARE_FLAGS(MetaDataFlags, MetaDataFlag)
140
141 bool hasFlags(MetaDataFlags flags) const
142 {
143 return ((knownFlagsMask & flags) == flags);
144 }
145
147 {
148 return flags & ~knownFlagsMask;
149 }
150
151 void clear()
152 {
153 knownFlagsMask = {};
154 }
155
156 void clearFlags(MetaDataFlags flags = AllMetaDataFlags)
157 {
158 knownFlagsMask &= ~flags;
159 }
160
161 bool exists() const { return entryFlags.testAnyFlag(ExistsAttribute); }
162
163 bool isLink() const { return entryFlags.testAnyFlag(LinkType); }
164 bool isFile() const { return entryFlags.testAnyFlag(FileType); }
165 bool isDirectory() const { return entryFlags.testAnyFlag(DirectoryType); }
166 bool isBundle() const;
167 bool isAlias() const;
168 bool isLegacyLink() const { return entryFlags.testAnyFlag(LegacyLinkType); }
169 bool isSequential() const { return entryFlags.testAnyFlag(SequentialType); }
170 bool isHidden() const { return entryFlags.testAnyFlag(HiddenAttribute); }
171 bool wasDeleted() const { return entryFlags.testAnyFlag(WasDeletedAttribute); }
172#if defined(Q_OS_WIN)
173 bool isLnkFile() const { return entryFlags.testAnyFlag(WinLnkType); }
174 bool isJunction() const { return entryFlags.testAnyFlag(JunctionType); }
175#else
176 bool isLnkFile() const { return false; }
177 bool isJunction() const { return false; }
178#endif
179
180 qint64 size() const { return size_; }
181
182 QFile::Permissions permissions() const;
183
184 QDateTime accessTime() const;
185 QDateTime birthTime() const;
186 QDateTime metadataChangeTime() const;
187 QDateTime modificationTime() const;
188
190 uint userId() const;
191 uint groupId() const;
193
194 bool isReadable() const { return permissions().testAnyFlags(QFile::ReadUser); }
195 bool isWritable() const { return permissions().testAnyFlags(QFile::WriteUser); }
196 bool isExecutable() const { return permissions().testAnyFlags(QFile::ExeUser); }
197
198#ifdef Q_OS_UNIX
199 void fillFromStatxBuf(const struct statx &statBuffer);
200 void fillFromStatBuf(const QT_STATBUF &statBuffer);
201 void fillFromDirEnt(const QT_DIRENT &statBuffer);
202#endif
203
204#if defined(Q_OS_WIN)
205 inline void fillFromFileAttribute(DWORD fileAttribute, bool isDriveRoot = false);
206 inline void fillFromFindData(WIN32_FIND_DATA &findData, bool setLinkType = false, bool isDriveRoot = false);
207 inline void fillFromFindInfo(BY_HANDLE_FILE_INFORMATION &fileInfo);
208#endif
209private:
210 friend class QFileSystemEngine;
211
212 MetaDataFlags knownFlagsMask;
213 MetaDataFlags entryFlags;
214
215 qint64 size_ = 0;
216
217 // Platform-specific data goes here:
218#if defined(Q_OS_WIN)
219 DWORD fileAttribute_;
220 FILETIME birthTime_;
221 FILETIME changeTime_;
222 FILETIME lastAccessTime_;
223 FILETIME lastWriteTime_;
224#else
225 // msec precision
226 qint64 accessTime_ = 0;
227 qint64 birthTime_ = 0;
228 qint64 metadataChangeTime_ = 0;
229 qint64 modificationTime_ = 0;
230
231 uint userId_ = (uint) -2;
232 uint groupId_ = (uint) -2;
233#endif
234
235};
236
237Q_DECLARE_OPERATORS_FOR_FLAGS(QFileSystemMetaData::MetaDataFlags)
238
239inline QFile::Permissions QFileSystemMetaData::permissions() const { return QFile::Permissions::fromInt((Permissions & entryFlags).toInt()); }
240
241#if defined(Q_OS_DARWIN)
242inline bool QFileSystemMetaData::isBundle() const { return entryFlags.testAnyFlag(BundleType); }
243inline bool QFileSystemMetaData::isAlias() const { return entryFlags.testAnyFlag(AliasType); }
244#else
245inline bool QFileSystemMetaData::isBundle() const { return false; }
246inline bool QFileSystemMetaData::isAlias() const { return false; }
247#endif
248
249#if defined(Q_OS_UNIX) || defined (Q_OS_WIN)
251{
252 switch (time) {
254 return modificationTime();
255
257 return accessTime();
258
260 return birthTime();
261
263 return metadataChangeTime();
264 }
265
266 return QDateTime();
267}
268#endif
269
270#if defined(Q_OS_UNIX)
272{
273 return birthTime_
275 : QDateTime();
276}
278{
279 return metadataChangeTime_
280 ? QDateTime::fromMSecsSinceEpoch(metadataChangeTime_, QTimeZone::UTC)
281 : QDateTime();
282}
284{
285 return modificationTime_
287 : QDateTime();
288}
290{
291 return accessTime_
293 : QDateTime();
294}
295
296inline uint QFileSystemMetaData::userId() const { return userId_; }
297inline uint QFileSystemMetaData::groupId() const { return groupId_; }
298
300{
302 return userId();
303 else
304 return groupId();
305}
306#endif
307
308#if defined(Q_OS_WIN)
309inline uint QFileSystemMetaData::userId() const { return (uint) -2; }
310inline uint QFileSystemMetaData::groupId() const { return (uint) -2; }
312{
314 return userId();
315 else
316 return groupId();
317}
318
319inline void QFileSystemMetaData::fillFromFileAttribute(DWORD fileAttribute,bool isDriveRoot)
320{
321 fileAttribute_ = fileAttribute;
322 // Ignore the hidden attribute for drives.
323 if (!isDriveRoot && (fileAttribute_ & FILE_ATTRIBUTE_HIDDEN))
324 entryFlags |= HiddenAttribute;
325 entryFlags |= ((fileAttribute & FILE_ATTRIBUTE_DIRECTORY) ? DirectoryType: FileType);
326 entryFlags |= ExistsAttribute;
328}
329
330inline void QFileSystemMetaData::fillFromFindData(WIN32_FIND_DATA &findData, bool setLinkType, bool isDriveRoot)
331{
332 fillFromFileAttribute(findData.dwFileAttributes, isDriveRoot);
333 birthTime_ = findData.ftCreationTime;
334 lastAccessTime_ = findData.ftLastAccessTime;
335 changeTime_ = lastWriteTime_ = findData.ftLastWriteTime;
336 if (fileAttribute_ & FILE_ATTRIBUTE_DIRECTORY) {
337 size_ = 0;
338 } else {
339 size_ = findData.nFileSizeHigh;
340 size_ <<= 32;
341 size_ += findData.nFileSizeLow;
342 }
343 knownFlagsMask |= Times | SizeAttribute;
344 if (setLinkType) {
345 knownFlagsMask |= LinkType;
346 entryFlags &= ~LinkType;
347 if (fileAttribute_ & FILE_ATTRIBUTE_REPARSE_POINT) {
348 if (findData.dwReserved0 == IO_REPARSE_TAG_SYMLINK) {
349 entryFlags |= LinkType;
350#if defined(IO_REPARSE_TAG_MOUNT_POINT)
351 } else if ((fileAttribute_ & FILE_ATTRIBUTE_DIRECTORY)
352 && (findData.dwReserved0 == IO_REPARSE_TAG_MOUNT_POINT)) {
353 entryFlags |= JunctionType;
354#endif
355 }
356 }
357 }
358}
359
360inline void QFileSystemMetaData::fillFromFindInfo(BY_HANDLE_FILE_INFORMATION &fileInfo)
361{
362 fillFromFileAttribute(fileInfo.dwFileAttributes);
363 birthTime_ = fileInfo.ftCreationTime;
364 lastAccessTime_ = fileInfo.ftLastAccessTime;
365 changeTime_ = lastWriteTime_ = fileInfo.ftLastWriteTime;
366 if (fileAttribute_ & FILE_ATTRIBUTE_DIRECTORY) {
367 size_ = 0;
368 } else {
369 size_ = fileInfo.nFileSizeHigh;
370 size_ <<= 32;
371 size_ += fileInfo.nFileSizeLow;
372 }
373 knownFlagsMask |= Times | SizeAttribute;
374}
375#endif // Q_OS_WIN
376
378
379#endif // include guard
FileOwner
\value OwnerUser The user who owns the file.
\inmodule QtCore\reentrant
Definition qdatetime.h:283
static QDateTime fromMSecsSinceEpoch(qint64 msecs, const QTimeZone &timeZone)
@ FileMetadataChangeTime
Definition qfiledevice.h:60
@ FileModificationTime
Definition qfiledevice.h:61
uint ownerId(QAbstractFileEngine::FileOwner owner) const
uint userId() const
void clearFlags(MetaDataFlags flags=AllMetaDataFlags)
QDateTime modificationTime() const
MetaDataFlags missingFlags(MetaDataFlags flags)
uint groupId() const
QDateTime metadataChangeTime() const
QDateTime fileTime(QFile::FileTime time) const
\inmodule QtCore
Definition qfile.h:93
Combined button and popup list for selecting options.
#define IO_REPARSE_TAG_SYMLINK
#define Q_DECLARE_FLAGS(Flags, Enum)
Definition qflags.h:174
#define Q_DECLARE_OPERATORS_FOR_FLAGS(Flags)
Definition qflags.h:194
MetaDataFlags
GLbitfield flags
#define Q_AUTOTEST_EXPORT
unsigned int uint
Definition qtypes.h:34
long long qint64
Definition qtypes.h:60
static int toInt(const QChar &qc, int R)
Definition moc.h:23