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
qfileinfo_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 QFILEINFO_P_H
6#define QFILEINFO_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 "qfileinfo.h"
20#include "qdatetime.h"
21#include "qatomic.h"
22#include "qshareddata.h"
24
25#include <QtCore/private/qabstractfileengine_p.h>
26#include <QtCore/private/qfilesystementry_p.h>
27#include <QtCore/private/qfilesystemmetadata_p.h>
28
29#include <memory>
30
32
34{
35public:
36 enum {
37 // note: cachedFlags is only 30-bits wide
41 CachedSize = 0x08,
47 };
48
49 static QFileInfoPrivate *get(QFileInfo *fi) { return fi->d_func(); }
50
52 : QSharedData(), fileEngine(nullptr),
53 cachedFlags(0),
55 cache_enabled(true), fileFlags(0), fileSize(0)
56 {}
70 inline QFileInfoPrivate(const QString &file)
71 : fileEntry(file),
73 cachedFlags(0),
74#ifndef QT_NO_FSFILEENGINE
75 isDefaultConstructed(file.isEmpty()),
76#else
78#endif
79 cache_enabled(true), fileFlags(0), fileSize(0)
80 {
81 }
82
83 inline QFileInfoPrivate(const QFileSystemEntry &file, const QFileSystemMetaData &data)
88 cachedFlags(0),
90 cache_enabled(true), fileFlags(0), fileSize(0)
91 {
92 //If the file engine is not null, this maybe a "mount point" for a custom file engine
93 //in which case we can't trust the metadata
94 if (fileEngine)
95 metaData = QFileSystemMetaData();
96 }
97
98 inline QFileInfoPrivate(const QFileSystemEntry &file, const QFileSystemMetaData &data, std::unique_ptr<QAbstractFileEngine> engine)
99 : fileEntry(file),
100 metaData(data),
102 cachedFlags(0),
103#ifndef QT_NO_FSFILEENGINE
105#else
107#endif
108 cache_enabled(true), fileFlags(0), fileSize(0)
109 {
110 }
111
112 inline void clearFlags() const {
113 fileFlags = 0;
114 cachedFlags = 0;
115 if (fileEngine)
116 (void)fileEngine->fileFlags(QAbstractFileEngine::Refresh);
117 }
118 inline void clear() {
119 metaData.clear();
121 for (int i = QAbstractFileEngine::NFileNames - 1 ; i >= 0 ; --i)
122 fileNames[i].clear();
123 fileOwners[1].clear();
124 fileOwners[0].clear();
125 }
126
128 QDateTime &getFileTime(QFile::FileTime) const;
130 QString getFileOwner(QAbstractFileEngine::FileOwner own) const;
131
132 QFileSystemEntry fileEntry;
134
136
138 mutable QString fileOwners[2]; // QAbstractFileEngine::FileOwner: OwnerUser and OwnerGroup
139 mutable QDateTime fileTimes[4]; // QFile::FileTime: FileBirthTime, FileMetadataChangeTime, FileModificationTime, FileAccessTime
140
141 mutable uint cachedFlags : 30;
142 bool const isDefaultConstructed : 1; // QFileInfo is a default constructed instance
146 inline bool getCachedFlag(uint c) const
147 { return cache_enabled ? (cachedFlags & c) : 0; }
148 inline void setCachedFlag(uint c) const
149 { if (cache_enabled) cachedFlags |= c; }
150
151 template <typename Ret, typename FSLambda, typename EngineLambda>
154 {
156 return defaultValue;
157 if (fileEngine)
158 return engineLambda();
159 if (!cache_enabled || !metaData.hasFlags(fsFlags)) {
160 QFileSystemEngine::fillMetaData(fileEntry, metaData, fsFlags);
161 // ignore errors, fillMetaData will have cleared the flags
162 }
163 return fsLambda();
164 }
165
166 template <typename Ret, typename FSLambda, typename EngineLambda>
169 {
170 return checkAttribute(Ret(), std::move(fsFlags), std::move(fsLambda), engineLambda);
171 }
172};
173
174QT_END_NAMESPACE
175
176#endif // QFILEINFO_P_H
QFileInfoPrivate(const QFileSystemEntry &file, const QFileSystemMetaData &data, std::unique_ptr< QAbstractFileEngine > engine)
Definition qfileinfo_p.h:98
bool const isDefaultConstructed
QFileInfoPrivate(const QFileSystemEntry &file, const QFileSystemMetaData &data)
Definition qfileinfo_p.h:83
Ret checkAttribute(QFileSystemMetaData::MetaDataFlags fsFlags, FSLambda fsLambda, EngineLambda engineLambda) const
QFileSystemMetaData metaData
QDateTime & getFileTime(QFile::FileTime) const
std::unique_ptr< QAbstractFileEngine > const fileEngine
QDateTime fileTimes[4]
uint getFileFlags(QAbstractFileEngine::FileFlags) const
void clearFlags() const
void setCachedFlag(uint c) const
QString getFileOwner(QAbstractFileEngine::FileOwner own) const
Definition qfileinfo.cpp:76
QString fileOwners[2]
bool getCachedFlag(uint c) const
QFileInfoPrivate(const QFileInfoPrivate &copy)
Definition qfileinfo_p.h:57
QFileSystemEntry fileEntry
static QFileInfoPrivate * get(QFileInfo *fi)
Definition qfileinfo_p.h:49
QString getFileName(QAbstractFileEngine::FileName) const
Definition qfileinfo.cpp:18
QString fileNames[QAbstractFileEngine::NFileNames]
QFileInfoPrivate(const QString &file)
Definition qfileinfo_p.h:70
Ret checkAttribute(Ret defaultValue, QFileSystemMetaData::MetaDataFlags fsFlags, FSLambda fsLambda, EngineLambda engineLambda) const
\inmodule QtCore
Definition qshareddata.h:19
QSharedData() noexcept
Constructs a QSharedData object with a reference count of 0.
Definition qshareddata.h:23
QDebug operator<<(QDebug dbg, const QFileInfo &fi)
bool comparesEqual(const QFileInfo &lhs, const QFileInfo &rhs)