9#include <private/qlocking_p.h>
19#include <qplatformdefs.h>
21#include "private/qabstractfileengine_p.h"
22#include "private/qduplicatetracker_p.h"
23#include "private/qnumeric_p.h"
24#include "private/qsimd_p.h"
25#include "private/qtools_p.h"
26#include "private/qsystemerror_p.h"
36#if defined(Q_OS_UNIX) && !defined(Q_OS_INTEGRITY)
41# define MREMAP_DONTUNMAP 4
42# elif defined(Q_OS_DARWIN)
43# include <mach/mach.h>
44# include <mach/vm_map.h>
60#if defined(__ELF__) || defined(__APPLE__)
61# define RCC_FEATURE_SYMBOL(feature) \
62 extern Q_CORE_EXPORT const quint8 qt_resourceFeature ## feature; \
63 const quint8 qt_resourceFeature ## feature = 0;
65# define RCC_FEATURE_SYMBOL(feature) \
66 Q_CORE_EXPORT quint8 qResourceFeature ## feature() { return 0; }
76#undef RCC_FEATURE_SYMBOL
89 while (m_pos < m_len &&
m_data[m_pos] == m_splitChar)
97 while (m_pos < m_len &&
m_data[m_pos] != m_splitChar)
105 QChar m_splitChar = u
'/';
116 CompressedZstd = 0x04
122 inline int findOffset(
int node)
const {
return node * (14 + (version >= 0x02 ? 8 : 0)); }
125 short flags(
int node)
const;
129 inline QResourceRoot(): tree(
nullptr),
names(
nullptr), payloads(
nullptr), version(0) {}
130 inline QResourceRoot(
int version,
const uchar *
t,
const uchar *
n,
const uchar *
d) { setSource(version,
t,
n,
d); }
131 virtual ~QResourceRoot() { }
133 inline bool isContainer(
int node)
const {
return flags(node) & Directory; }
136 uint compressionFlags =
flags(node) & (Compressed | CompressedZstd);
137 if (compressionFlags == Compressed)
139 if (compressionFlags == CompressedZstd)
144 qint64 lastModified(
int node)
const;
152 enum ResourceRootType { Resource_Builtin, Resource_File, Resource_Buffer };
153 virtual ResourceRootType
type()
const {
return Resource_Builtin; }
169 if (
path.startsWith(
"//"_L1))
179struct QResourceGlobalData
188{
return resourceGlobalData->resourceMutex; }
191{
return &resourceGlobalData->resourceList; }
324 if (!root->ref.
deref())
352 qWarning(
"QResourceInfo: Resource [%s] has both data and children!",
353 file.toLatin1().constData());
357 }
else if (
res->mappingRootSubdir(
file)) {
378 if (!that->absoluteFilePath.startsWith(u
':'))
379 that->absoluteFilePath.
prepend(u
':');
382 if (
path.startsWith(u
':'))
385 if (
path.startsWith(u
'/')) {
386 that->load(
path.toString());
390 if (that->load(searchPath))
391 that->absoluteFilePath = u
':' + searchPath;
402 if (
path.startsWith(u
':'))
408 if (
res->mappingRootSubdir(
path, &k) && !k.isEmpty()) {
409 if (!kids.hasSeen(k))
415 for (
int kid = 0; kid < related_children.size(); ++kid) {
416 k = related_children.at(kid);
417 if (!kids.hasSeen(k))
432#ifndef QT_NO_COMPRESS
434 return qFromBigEndian<quint32>(
data);
436 Q_ASSERT(!
"QResource: Qt built without support for Zlib compression");
443 size_t n = ZSTD_getFrameContentSize(
data,
size);
444 return ZSTD_isError(
n) ? -1 :
qint64(
n);
447 Q_ASSERT(!
"QResource: Qt built without support for Zstd compression");
458#if defined(QT_NO_COMPRESS) && !QT_CONFIG(zstd)
469#ifndef QT_NO_COMPRESS
470 uLong
len = uLong(bufferSize);
474 qWarning(
"QResource: error decompressing zlib content (%d)",
res);
486 if (ZSTD_isError(usize)) {
487 qWarning(
"QResource: error decompressing zstd content: %s", ZSTD_getErrorName(usize));
571 d->ensureInitialized();
585 d->ensureInitialized();
586 return d->absoluteFilePath;
598 d->ensureInitialized();
599 return !
d->related.isEmpty();
632 d->ensureInitialized();
648 d->ensureInitialized();
665 d->ensureInitialized();
666 return d->uncompressedSize();
681 d->ensureInitialized();
704 if (
n > std::numeric_limits<QByteArray::size_type>::max()) {
705 qWarning(
"QResource: compressed content does not fit into a QByteArray; use QFile instead");
730 d->ensureInitialized();
744 d->ensureInitialized();
762inline uint QResourceRoot::hash(
int node)
const
766 const int offset = findOffset(node);
767 qint32 name_offset = qFromBigEndian<qint32>(tree +
offset);
769 return qFromBigEndian<quint32>(
names + name_offset);
771inline QString QResourceRoot::name(
int node)
const
775 const int offset = findOffset(node);
778 qint32 name_offset = qFromBigEndian<qint32>(tree +
offset);
779 quint16 name_length = qFromBigEndian<qint16>(
names + name_offset);
783 ret.resize(name_length);
785 qFromBigEndian<char16_t>(
names + name_offset, name_length, strData);
789int QResourceRoot::findNode(
const QString &_path,
const QLocale &locale)
const
800 if (
path.size() >= root.
size() &&
path.startsWith(root))
807#ifdef DEBUG_RESOURCE_MATCH
815 qint32 child_count = qFromBigEndian<qint32>(tree + 6);
821 QStringSplitter splitter(
path);
822 while (child_count && splitter.hasNext()) {
825#ifdef DEBUG_RESOURCE_MATCH
827 for (
int j = 0;
j < child_count; ++
j) {
834 int l = 0,
r = child_count - 1;
835 int sub_node = (l +
r + 1) / 2;
838 if (
h == sub_node_hash)
840 else if (
h < sub_node_hash)
844 sub_node = (l +
r + 1) / 2;
850 if (
hash(sub_node) ==
h) {
851 while (sub_node >
child &&
hash(sub_node - 1) ==
h)
853 for (; sub_node <
child + child_count &&
hash(sub_node) ==
h;
857 int offset = findOffset(sub_node);
858#ifdef DEBUG_RESOURCE_MATCH
866 if (!splitter.hasNext()) {
867 if (!(
flags & Directory)) {
868 const qint16 territory = qFromBigEndian<qint16>(tree +
offset);
873#ifdef DEBUG_RESOURCE_MATCH
877#ifdef DEBUG_RESOURCE_MATCH
878 qDebug() <<
"!!!!" <<
"FINISHED" << __LINE__ << sub_node;
890#ifdef DEBUG_RESOURCE_MATCH
891 qDebug() <<
"!!!!" <<
"FINISHED" << __LINE__ << sub_node;
898 if (!(
flags & Directory))
901 child_count = qFromBigEndian<qint32>(tree +
offset);
911#ifdef DEBUG_RESOURCE_MATCH
912 qDebug() <<
"!!!!" <<
"FINISHED" << __LINE__ << node;
916short QResourceRoot::flags(
int node)
const
920 const int offset = findOffset(node) + 4;
921 return qFromBigEndian<qint16>(tree +
offset);
929 int offset = findOffset(node) + 4;
936 if (!(
flags & Directory)) {
937 const qint32 data_offset = qFromBigEndian<qint32>(tree +
offset);
938 const quint32 data_length = qFromBigEndian<quint32>(payloads + data_offset);
939 const uchar *
ret = payloads + data_offset + 4;
947qint64 QResourceRoot::lastModified(
int node)
const
949 if (node == -1 || version < 0x02)
952 const int offset = findOffset(node) + 14;
954 return qFromBigEndian<qint64>(tree +
offset);
961 int offset = findOffset(node) + 4;
967 if (
flags & Directory) {
968 const qint32 child_count = qFromBigEndian<qint32>(tree +
offset);
970 const qint32 child_off = qFromBigEndian<qint32>(tree +
offset);
971 ret.reserve(child_count);
972 for (
int i = child_off;
i < child_off + child_count; ++
i)
979 const QString root = mappingRoot();
983 QStringSplitter rootIt(root);
984 QStringSplitter pathIt(
path);
985 while (rootIt.hasNext()) {
986 if (pathIt.hasNext()) {
987 if (rootIt.next() != pathIt.next())
992 *
match = rootIt.next().toString();
997 return !pathIt.hasNext();
1001 const unsigned char *
name,
const unsigned char *
data)
1003 if (resourceGlobalData.isDestroyed())
1007 if (version >= 0x01 && version <= 0x3) {
1017 QResourceRoot *root =
new QResourceRoot(version, tree,
name,
data);
1027 const unsigned char *
name,
const unsigned char *
data)
1029 if (resourceGlobalData.isDestroyed())
1033 if (version >= 0x01 && version <= 0x3) {
1039 if (!root->ref.
deref())
1052class QDynamicBufferResourceRoot :
public QResourceRoot
1059 inline ~QDynamicBufferResourceRoot() { }
1060 inline const uchar *mappingBuffer()
const {
return buffer; }
1061 QString mappingRoot()
const override {
return root; }
1062 ResourceRootType
type()
const override {
return Resource_Buffer; }
1081 const int version = qFromBigEndian<qint32>(
b +
offset);
1084 const int tree_offset = qFromBigEndian<qint32>(
b +
offset);
1087 const int data_offset = qFromBigEndian<qint32>(
b +
offset);
1090 const int name_offset = qFromBigEndian<qint32>(
b +
offset);
1095 file_flags = qFromBigEndian<qint32>(
b +
offset);
1100 if (
size >= 0 && (tree_offset >=
size || data_offset >=
size || name_offset >=
size))
1105#ifndef QT_NO_COMPRESS
1106 acceptableFlags |= Compressed;
1109 acceptableFlags |= CompressedZstd;
1110 if (file_flags & ~acceptableFlags)
1113 if (version >= 0x01 && version <= 0x03) {
1115 setSource(version,
b + tree_offset,
b + name_offset,
b + data_offset);
1122class QDynamicFileResourceRoot :
public QDynamicBufferResourceRoot
1131 uchar *unmapPointer;
1135 QDynamicFileResourceRoot(
const QString &_root)
1136 : QDynamicBufferResourceRoot(_root), unmapPointer(
nullptr), unmapLength(0)
1138 ~QDynamicFileResourceRoot() {
1139 if (wasMemoryMapped())
1140 unmap_sys(unmapPointer, unmapLength);
1142 delete[] mappingBuffer();
1145 ResourceRootType
type()
const override {
return Resource_File; }
1146 bool wasMemoryMapped()
const {
return unmapPointer; }
1148 bool registerSelf(
const QString &
f);
1156# define MAP_FAILED reinterpret_cast<void *>(-1)
1161#if defined(QT_USE_MMAP)
1163#elif defined(Q_OS_WIN)
1165 UnmapViewOfFile(
reinterpret_cast<void *
>(
base));
1173 void *
ptr =
nullptr;
1178#if defined(QT_USE_MMAP)
1180 int protection = PROT_READ;
1185#elif defined(Q_OS_WIN)
1187 HANDLE fileHandle =
reinterpret_cast<HANDLE>(_get_osfhandle(
fd));
1188 if (fileHandle != INVALID_HANDLE_VALUE) {
1189 HANDLE mapHandle = CreateFileMapping(fileHandle, 0, PAGE_WRITECOPY, 0, 0, 0);
1192 CloseHandle(mapHandle);
1199bool QDynamicFileResourceRoot::registerSelf(
const QString &
f)
1206 if (data_len > std::numeric_limits<qsizetype>::max())
1210 bool fromMM = !!
data;
1215 ok = (data_len ==
file.
read(
reinterpret_cast<char *
>(
data), data_len));
1223 if (
data && QDynamicBufferResourceRoot::registerSelf(
data, data_len)) {
1225 unmapPointer =
data;
1226 unmapLength = data_len;
1237 if (
r.startsWith(u
':'))
1258 if (!
r.isEmpty() &&
r[0] != u
'/') {
1259 qWarning(
"QDir::registerResource: Registering a resource [%ls] must be rooted in an "
1260 "absolute path (start with /) [%ls]",
1265 QDynamicFileResourceRoot *root =
new QDynamicFileResourceRoot(
r);
1266 if (root->registerSelf(rccFilename)) {
1295 if (
res->type() == QResourceRoot::Resource_File) {
1296 QDynamicFileResourceRoot *root =
reinterpret_cast<QDynamicFileResourceRoot *
>(
res);
1297 if (root->mappingFile() == rccFilename && root->mappingRoot() ==
r) {
1299 if (!root->ref.deref()) {
1327 if (!
r.isEmpty() &&
r[0] != u
'/') {
1328 qWarning(
"QDir::registerResource: Registering a resource [%p] must be rooted in an "
1329 "absolute path (start with /) [%ls]",
1334 QDynamicBufferResourceRoot *root =
new QDynamicBufferResourceRoot(
r);
1335 if (root->registerSelf(rccData, -1)) {
1364 if (
res->type() == QResourceRoot::Resource_Buffer) {
1365 QDynamicBufferResourceRoot *root =
reinterpret_cast<QDynamicBufferResourceRoot *
>(
res);
1366 if (root->mappingBuffer() == rccData && root->mappingRoot() ==
r) {
1368 if (!root->ref.deref()) {
1379#if !defined(QT_BOOTSTRAPPED)
1388 void uncompress()
const;
1389 void mapUncompressed();
1390 bool mapUncompressed_sys();
1391 void unmapUncompressed_sys();
1395 bool mustUnmap =
false;
1398 static constexpr qsizetype RemapCompressedThreshold = 16384;
1403 unmapUncompressed_sys();
1416 d->resource.setFileName(
file);
1426 d->resource.setFileName(
file);
1430 std::optional<QFile::Permissions> permissions)
1435 if (
d->resource.fileName().isEmpty()) {
1436 qWarning(
"QResourceFileEngine::open: Missing file name");
1443 if (
d->uncompressed.isNull()) {
1448 if (!
d->resource.isValid()) {
1474 if (!
d->uncompressed.isNull())
1475 memcpy(
data,
d->uncompressed.constData() +
d->offset,
len);
1477 memcpy(
data,
d->resource.data() +
d->offset,
len);
1485 return d->resource.isValid() ?
d->resource.uncompressedSize() : 0;
1497 if (!
d->resource.isValid())
1499 return d->offset ==
size();
1505 if (!
d->resource.isValid())
1508 if (
d->offset >
size())
1517 QAbstractFileEngine::FileFlags
ret;
1518 if (!
d->resource.isValid())
1525 if (
d->resource.isDir())
1532 if (
d->resource.absoluteFilePath() ==
":/"_L1)
1542 const qsizetype slash =
d->resource.fileName().lastIndexOf(u
'/');
1544 return d->resource.fileName();
1545 return d->resource.fileName().mid(slash + 1);
1548 :
d->resource.fileName();
1552 else if (slash <= 1)
1554 return path.left(slash);
1565 return d->resource.fileName();
1570 static const uint nobodyID =
static_cast<uint>(-2);
1578 return d->resource.lastModified();
1589 return std::make_unique<QResourceFileEngineIterator>(
path,
filters, filterNames);
1598 returnValue->
address =
d->map(options->offset, options->size, options->flags);
1599 return (returnValue->address !=
nullptr);
1603 return d->unmap(options->address);
1617 || !uncompressed.
isNull(),
"QFile::map()",
1618 "open() should have uncompressed compressed resources");
1629 if (!uncompressed.
isNull())
1643bool QResourceFileEnginePrivate::unmap(
uchar *
ptr)
1649void QResourceFileEnginePrivate::uncompress()
const
1652 || !uncompressed.
isEmpty() || resource.
size() == 0)
1657void QResourceFileEnginePrivate::mapUncompressed()
1660 if (!uncompressed.
isNull())
1664 if (mapUncompressed_sys())
1672#if defined(MREMAP_MAYMOVE) && defined(MREMAP_DONTUNMAP)
1675 auto d = resource.d_func();
1681 const QResourceRoot *root =
d->related.
at(0);
1683 switch (root->type()) {
1684 case QResourceRoot::Resource_Builtin:
1686 case QResourceRoot::Resource_Buffer:
1688 case QResourceRoot::Resource_File:
1692 auto df =
static_cast<const QDynamicFileResourceRoot *
>(root);
1693 return df->wasMemoryMapped();
1701 auto getpagesize = [] {
1702 SYSTEM_INFO sysinfo;
1703 ::GetSystemInfo(&sysinfo);
1704 return sysinfo.dwAllocationGranularity;
1713 const quintptr pageMask = getpagesize() - 1;
1717 r.begin =
reinterpret_cast<void *
>(
begin);
1719 r.offset =
data & pageMask;
1723bool QResourceFileEnginePrivate::mapUncompressed_sys()
1726 void *
ptr =
nullptr;
1728#if defined(MREMAP_MAYMOVE) && defined(MREMAP_DONTUNMAP)
1737 ptr = mremap(
r.begin,
r.size,
r.size, MREMAP_MAYMOVE | MREMAP_DONTUNMAP);
1743 if (mprotect(
ptr,
r.size, PROT_READ | PROT_WRITE) != 0) {
1744 munmap(
ptr,
r.size);
1747#elif defined(Q_OS_DARWIN)
1748 mach_port_t
self = mach_task_self();
1749 vm_address_t
addr = 0;
1750 vm_address_t
mask = 0;
1751 bool anywhere =
true;
1753 vm_prot_t cur_prot = VM_PROT_READ | VM_PROT_WRITE;
1754 vm_prot_t max_prot = VM_PROT_ALL;
1755 kern_return_t
res = vm_remap(self, &
addr,
r.size,
mask, anywhere,
1756 self, vm_address_t(
r.begin),
copy, &cur_prot,
1757 &max_prot, VM_INHERIT_DEFAULT);
1758 if (
res != KERN_SUCCESS)
1761 ptr =
reinterpret_cast<void *
>(
addr);
1762 if ((max_prot & VM_PROT_WRITE) == 0 || mprotect(
ptr,
r.size, PROT_READ | PROT_WRITE) != 0) {
1763 munmap(
ptr,
r.size);
1770 const char *newdata =
static_cast<char *
>(
ptr) +
r.offset;
1776void QResourceFileEnginePrivate::unmapUncompressed_sys()
1779 QDynamicFileResourceRoot::unmap_sys(
r.begin,
r.size);
\inmodule QtCore \reentrant
FileOwner
\value OwnerUser The user who owns the file.
std::unique_ptr< Iterator > IteratorUniquePtr
FileName
These values are used to request a file name in a particular format.
const_iterator constBegin() const noexcept
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first byte in the byte-ar...
qsizetype size() const noexcept
Returns the number of bytes in this byte array.
const char * constData() const noexcept
Returns a pointer to the const data stored in the byte array.
bool isEmpty() const noexcept
Returns true if the byte array has size 0; otherwise returns false.
bool isNull() const noexcept
Returns true if this byte array is null; otherwise returns false.
static QByteArray fromRawData(const char *data, qsizetype size)
Constructs a QByteArray that uses the first size bytes of the data array.
\inmodule QtCore\reentrant
static QDateTime fromMSecsSinceEpoch(qint64 msecs, const QTimeZone &timeZone)
static QString cleanPath(const QString &path)
Returns path with directory separators normalized (that is, platform-native separators converted to "...
int handle() const
Returns the file handle of the file.
QFILE_MAYBE_NODISCARD bool open(OpenMode flags) override
Opens the file using OpenMode mode, returning true if successful; otherwise false.
qint64 size() const override
\reimp
bool isOpen() const
Returns true if the device is open; otherwise returns false.
qint64 read(char *data, qint64 maxlen)
Reads at most maxSize bytes from the device into data, and returns the number of bytes read.
qsizetype size() const noexcept
bool isEmpty() const noexcept
void removeAt(qsizetype i)
const_reference at(qsizetype i) const noexcept
void append(parameter_type t)
~QResourceFileEnginePrivate()
bool caseSensitive() const override
Should return true if the underlying file system is case-sensitive; otherwise return false.
bool flush() override
Flushes the open file, returning true if successful; otherwise returns false.
qint64 read(char *data, qint64 maxlen) override
Reads a number of characters from the file into data.
bool close() override
Closes the file, returning true if successful; otherwise returns false.
bool open(QIODevice::OpenMode flags, std::optional< QFile::Permissions > permissions) override
Opens the file in the specified mode.
void setFileName(const QString &file) override
Sets the file engine's file name to file.
IteratorUniquePtr beginEntryList(const QString &path, QDir::Filters filters, const QStringList &filterNames) override
bool seek(qint64) override
Sets the file position to the given offset.
qint64 pos() const override
Returns the current file position.
QString fileName(QAbstractFileEngine::FileName file) const override
Return the file engine's current file name in the format specified by file.
QResourceFileEngine(const QString &path)
qint64 size() const override
Returns the size of the file.
FileFlags fileFlags(FileFlags type) const override
This function should return the set of OR'd flags that are true for the file engine's file,...
bool extension(Extension extension, const ExtensionOption *option=nullptr, ExtensionReturn *output=nullptr) override
QDateTime fileTime(QFile::FileTime time) const override
If time is BirthTime, return when the file was born (created).
virtual bool atEnd() const
uint ownerId(FileOwner) const override
If owner is OwnerUser return the ID of the user who owns the file.
bool supportsExtension(Extension extension) const override
void ensureChildren() const
static bool mayRemapData(const QResource &resource)
qint64 uncompressedSize() const Q_DECL_PURE_FUNCTION
QList< QResourceRoot * > related
void ensureInitialized() const
QResourcePrivate(QResource *_q)
qsizetype decompress(char *buffer, qsizetype bufferSize) const
bool load(const QString &file)
qint64 uncompressedSize() const
void setFileName(const QString &file)
Sets a QResource to point to file.
QResource(const QString &file=QString(), const QLocale &locale=QLocale())
Constructs a QResource pointing to file.
QStringList children() const
Returns a list of all resources in this directory, if the resource represents a file the list will be...
qint64 size() const
Returns the size of the stored data backing the resource.
const uchar * data() const
Returns direct access to a segment of read-only data, that this resource represents.
static bool registerResource(const QString &rccFilename, const QString &resourceRoot=QString())
Registers the resource with the given rccFileName at the location in the resource tree specified by m...
QLocale locale() const
Returns the locale used to locate the data for the QResource.
QDateTime lastModified() const
void setLocale(const QLocale &locale)
Sets a QResource to only load the localization of resource to for locale.
QString absoluteFilePath() const
Returns the real path that this QResource represents, if the resource was found via the QDir::searchP...
QString fileName() const
Returns the full path to the file that this QResource represents as it was passed.
bool isValid() const
Returns true if the resource really exists in the resource hierarchy, false otherwise.
~QResource()
Releases the resources of the QResource object.
static bool unregisterResource(const QString &rccFilename, const QString &resourceRoot=QString())
Unregisters the resource with the given rccFileName at the location in the resource tree specified by...
QByteArray uncompressedData() const
bool isDir() const
Returns true if the resource represents a directory and thus may have children() in it,...
Compression compressionAlgorithm() const
constexpr qsizetype size() const noexcept
Returns the size of this string view, in UTF-16 code units (that is, surrogate pairs count as two for...
const_pointer data() const noexcept
\macro QT_RESTRICTED_CAST_FROM_ASCII
qsizetype lastIndexOf(QChar c, Qt::CaseSensitivity cs=Qt::CaseSensitive) const noexcept
QString mid(qsizetype position, qsizetype n=-1) const &
bool isEmpty() const noexcept
Returns true if the string has no characters; otherwise returns false.
void clear()
Clears the contents of the string and makes it null.
qsizetype size() const noexcept
Returns the number of characters in this string.
const QChar at(qsizetype i) const
Returns the character at the given index position in the string.
bool endsWith(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Returns true if the string ends with s; otherwise returns false.
QString & prepend(QChar c)
static Q_CORE_EXPORT QString stdString(int errorCode=-1)
QHash< int, QWidget * > hash
[35multi]
QMap< QString, QString > map
[6]
Q_QML_EXPORT QV4::ReturnedValue locale(QV4::ExecutionEngine *engine, const QString &localeName)
Provides locale specific properties and formatted data.
Combined button and popup list for selecting options.
constexpr Initialization Uninitialized
static QByteArray cleaned(const QByteArray &input)
static jboolean copy(JNIEnv *, jobject)
#define Q_DECL_PURE_FUNCTION
QList< QString > QStringList
Constructs a string list that contains the given string, str.
constexpr bool operator!=(const timespec &t1, const timespec &t2)
typedef QByteArray(EGLAPIENTRYP PFNQGSGETDISPLAYSPROC)()
#define Q_GLOBAL_STATIC(TYPE, NAME,...)
uint qt_hash(QStringView key, uint chained) noexcept
static ControlElement< T > * ptr(QWidget *widget)
constexpr const T & qMin(const T &a, const T &b)
std::enable_if_t< std::is_unsigned_v< T >, bool > qAddOverflow(T v1, T v2, T *r)
GLboolean GLboolean GLboolean b
GLsizei const GLfloat * v
[13]
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum GLuint GLintptr offset
GLint GLint GLint GLint GLint GLint GLint GLbitfield mask
GLfloat GLfloat GLfloat GLfloat h
GLuint GLuint64EXT address
GLdouble GLdouble GLdouble GLdouble q
GLsizei const GLchar *const * path
bool operator==(const QRandomGenerator &rng1, const QRandomGenerator &rng2)
#define Q_ASSERT_X(cond, x, msg)
QtPrivate::QRegularExpressionMatchIteratorRangeBasedForIterator begin(const QRegularExpressionMatchIterator &iterator)
static ResourceList * resourceList()
#define RCC_FEATURE_SYMBOL(feature)
static QRecursiveMutex & resourceMutex()
static auto mappingBoundaries(const void *location, qsizetype size)
Q_CORE_EXPORT bool qUnregisterResourceData(int version, const unsigned char *tree, const unsigned char *name, const unsigned char *data)
static QString qt_resource_fixResourceRoot(QString r)
QList< QResourceRoot * > ResourceList
Q_CORE_EXPORT bool qRegisterResourceData(int version, const unsigned char *tree, const unsigned char *name, const unsigned char *data)
#define qUtf16Printable(string)
static QString absoluteFilePath(const Options *options, const QString &relativeFileName)
static bool hasNext(const Symbols &symbols, int i)
#define QT_CONFIG(feature)
static bool match(const uchar *found, uint foundLen, const char *target, uint targetLen)
#define Q_DECLARE_TYPEINFO(TYPE, FLAGS)
QT_BEGIN_NAMESPACE typedef uchar * output
const QStringList filters({"Image files (*.png *.xpm *.jpg)", "Text files (*.txt)", "Any files (*)" })
[6]