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
qpermissions_darwin.mm
Go to the documentation of this file.
1// Copyright (C) 2022 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#include "qpermissions.h"
5#include "qpermissions_p.h"
6
7#include <QtCore/private/qfactoryloader_p.h>
8#include <QtCore/private/qcoreapplication_p.h>
9#include <QtCore/qcborarray.h>
10
12
13using namespace Qt::StringLiterals;
14
15namespace {
16
19
20QPermissionPlugin *permissionPlugin(const QPermission &permission)
21{
22 static QMutex mutex;
23 QMutexLocker locker(&mutex);
24
25 const char *permissionType = permission.type().name();
26 qCDebug(lcPermissions, "Looking for permission plugin for %s", permissionType);
27
28 if (Q_UNLIKELY(!pluginLoader)) {
29 qCWarning(lcPermissions, "Cannot check or request permissions during application shutdown");
30 return nullptr;
31 }
32
33 auto metaDataList = pluginLoader()->metaData();
34 for (int i = 0; i < metaDataList.size(); ++i) {
35 auto metaData = metaDataList.at(i).value(QtPluginMetaDataKeys::MetaData).toMap();
36 auto permissions = metaData.value("Permissions"_L1).toArray();
37 if (permissions.contains(QString::fromUtf8(permissionType))) {
38 auto className = metaDataList.at(i).value(QtPluginMetaDataKeys::ClassName).toString();
39 qCDebug(lcPermissions) << "Found matching plugin" << qUtf8Printable(className);
40 auto *plugin = static_cast<QPermissionPlugin*>(pluginLoader()->instance(i));
41 if (!plugin->parent()) {
42 // We want to re-parent the plugin to the factory loader, so that it's
43 // cleaned up properly. To do so we first need to move the plugin to the
44 // same thread as the factory loader, as the plugin might be instantiated
45 // on a secondary thread if triggered from a checkPermission call (which
46 // is allowed on any thread).
48
49 // Also, as setParent will involve sending a ChildAdded event to the parent,
50 // we need to make the call on the same thread as the parent lives, as events
51 // are not allowed to be sent to an object owned by another thread.
52 QMetaObject::invokeMethod(plugin, [=] {
53 plugin->setParent(pluginLoader);
54 });
55 }
56 return plugin;
57 }
58 }
59
60 qCWarning(lcPermissions).nospace() << "Could not find permission plugin for "
61 << permission.type().name() << ". Please make sure you have included the "
62 << "required usage description in your Info.plist";
63
64 return nullptr;
65}
66
67} // Unnamed namespace
68
70{
72 {
73 if (auto *plugin = permissionPlugin(permission))
74 return plugin->checkPermission(permission);
75 else
77 }
78
79 void requestPermission(const QPermission &permission, const QPermissions::Private::PermissionCallback &callback)
80 {
81 if (auto *plugin = permissionPlugin(permission))
82 plugin->requestPermission(permission, callback);
83 else
85 }
86}
87
constexpr const char * name() const
Definition qmetatype.h:2680
\inmodule QtCore
Definition qmutex.h:313
\inmodule QtCore
Definition qmutex.h:281
QObject * parent() const
Returns a pointer to the parent object.
Definition qobject.h:346
void setParent(QObject *parent)
Makes the object a child of parent.
Definition qobject.cpp:2195
bool moveToThread(QThread *thread QT6_DECL_NEW_OVERLOAD_TAIL)
Changes the thread affinity for this object and its children and returns true on success.
Definition qobject.cpp:1643
\inmodule QtCore \inheaderfile QPermissions
QMetaType type() const
Returns the type of the permission.
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:6018
QSharedPointer< QFactoryLoader > pluginLoader()
void requestPermission(const QPermission &permission, const PermissionCallback &callback)
std::function< void(Qt::PermissionStatus)> PermissionCallback
Qt::PermissionStatus checkPermission(const QPermission &permission)
Combined button and popup list for selecting options.
PermissionStatus
@ CaseInsensitive
#define Q_UNLIKELY(x)
#define Q_GLOBAL_STATIC_WITH_ARGS(TYPE, NAME, ARGS)
#define qCWarning(category,...)
#define qCDebug(category,...)
#define QPermissionPluginInterface_iid
#define qUtf8Printable(string)
Definition qstring.h:1535
QLatin1StringView QLatin1String
Definition qstringfwd.h:31
const char className[16]
[1]
Definition qwizard.cpp:100
QMutex mutex
[2]
static bool invokeMethod(QObject *obj, const char *member, Qt::ConnectionType, QGenericReturnArgument ret, QGenericArgument val0=QGenericArgument(nullptr), QGenericArgument val1=QGenericArgument(), QGenericArgument val2=QGenericArgument(), QGenericArgument val3=QGenericArgument(), QGenericArgument val4=QGenericArgument(), QGenericArgument val5=QGenericArgument(), QGenericArgument val6=QGenericArgument(), QGenericArgument val7=QGenericArgument(), QGenericArgument val8=QGenericArgument(), QGenericArgument val9=QGenericArgument())
\threadsafe This is an overloaded member function, provided for convenience. It differs from the abov...