Warning, file /include/QtCore/qpermissions.h was not indexed
or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001
0002
0003
0004
0005 #ifndef QPERMISSIONS_H
0006 #define QPERMISSIONS_H
0007
0008 #if 0
0009 #pragma qt_class(QPermissions)
0010 #endif
0011
0012 #include <QtCore/qglobal.h>
0013 #include <QtCore/qtmetamacros.h>
0014 #include <QtCore/qvariant.h>
0015
0016 #include <QtCore/qshareddata_impl.h>
0017 #include <QtCore/qtypeinfo.h>
0018 #include <QtCore/qmetatype.h>
0019
0020 #include <optional>
0021
0022 #if !defined(Q_QDOC)
0023 QT_REQUIRE_CONFIG(permissions);
0024 #endif
0025
0026 QT_BEGIN_NAMESPACE
0027
0028 #ifndef QT_NO_DEBUG_STREAM
0029 class QDebug;
0030 #endif
0031
0032 struct QMetaObject;
0033 class QCoreApplication;
0034
0035 class QPermission
0036 {
0037 template <typename T, typename Enable = void>
0038 static constexpr inline bool is_permission_v = false;
0039
0040 template <typename T>
0041 using if_permission = std::enable_if_t<is_permission_v<T>, bool>;
0042 public:
0043 explicit QPermission() = default;
0044
0045 template <typename T, if_permission<T> = true>
0046 QPermission(const T &t) : m_data(QVariant::fromValue(t)) {}
0047
0048 Qt::PermissionStatus status() const { return m_status; }
0049
0050 QMetaType type() const { return m_data.metaType(); }
0051
0052 template <typename T, if_permission<T> = true>
0053 std::optional<T> value() const
0054 {
0055 if (auto p = data(QMetaType::fromType<T>()))
0056 return *static_cast<const T *>(p);
0057 return std::nullopt;
0058 }
0059
0060 #ifndef QT_NO_DEBUG_STREAM
0061 friend Q_CORE_EXPORT QDebug operator<<(QDebug debug, const QPermission &);
0062 #endif
0063
0064 private:
0065 Q_CORE_EXPORT const void *data(QMetaType id) const;
0066
0067 Qt::PermissionStatus m_status = Qt::PermissionStatus::Undetermined;
0068 QVariant m_data;
0069
0070 friend class QCoreApplication;
0071 };
0072
0073 template <typename T>
0074 constexpr bool QPermission::is_permission_v<T, typename T::QtPermissionHelper> = true;
0075
0076 #define QT_PERMISSION(ClassName) \
0077 using QtPermissionHelper = void; \
0078 friend class QPermission; \
0079 union U { \
0080 U() : d(nullptr) {} \
0081 U(ShortData _data) : data(_data) {} \
0082 U(ClassName##Private *_d) : d(_d) {} \
0083 ShortData data; \
0084 ClassName##Private *d; \
0085 } u; \
0086 public: \
0087 Q_CORE_EXPORT ClassName(); \
0088 Q_CORE_EXPORT ClassName(const ClassName &other) noexcept; \
0089 ClassName(ClassName &&other) noexcept \
0090 : u{other.u} { other.u.d = nullptr; } \
0091 Q_CORE_EXPORT ~ClassName(); \
0092 Q_CORE_EXPORT ClassName &operator=(const ClassName &other) noexcept; \
0093 QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(ClassName) \
0094 void swap(ClassName &other) noexcept { std::swap(u, other.u); } \
0095 private: \
0096
0097
0098 class QLocationPermissionPrivate;
0099 class QLocationPermission
0100 {
0101 Q_GADGET_EXPORT(Q_CORE_EXPORT)
0102 public:
0103 enum Accuracy : quint8 {
0104 Approximate,
0105 Precise,
0106 };
0107 Q_ENUM(Accuracy)
0108
0109 Q_CORE_EXPORT void setAccuracy(Accuracy accuracy);
0110 Q_CORE_EXPORT Accuracy accuracy() const;
0111
0112 enum Availability : quint8 {
0113 WhenInUse,
0114 Always,
0115 };
0116 Q_ENUM(Availability)
0117
0118 Q_CORE_EXPORT void setAvailability(Availability availability);
0119 Q_CORE_EXPORT Availability availability() const;
0120
0121 private:
0122 struct ShortData {
0123 Accuracy accuracy;
0124 Availability availability;
0125 char reserved[sizeof(void*) - sizeof(accuracy) - sizeof(availability)];
0126 };
0127 QT_PERMISSION(QLocationPermission)
0128 };
0129 Q_DECLARE_SHARED(QLocationPermission)
0130
0131 class QCalendarPermissionPrivate;
0132 class QCalendarPermission
0133 {
0134 Q_GADGET_EXPORT(Q_CORE_EXPORT)
0135 public:
0136 enum AccessMode : quint8 {
0137 ReadOnly,
0138 ReadWrite,
0139 };
0140 Q_ENUM(AccessMode)
0141
0142 Q_CORE_EXPORT void setAccessMode(AccessMode mode);
0143 Q_CORE_EXPORT AccessMode accessMode() const;
0144
0145 private:
0146 struct ShortData {
0147 AccessMode mode;
0148 char reserved[sizeof(void*) - sizeof(mode)];
0149 };
0150 QT_PERMISSION(QCalendarPermission)
0151 };
0152 Q_DECLARE_SHARED(QCalendarPermission)
0153
0154 class QContactsPermissionPrivate;
0155 class QContactsPermission
0156 {
0157 Q_GADGET_EXPORT(Q_CORE_EXPORT)
0158 public:
0159 enum AccessMode : quint8 {
0160 ReadOnly,
0161 ReadWrite,
0162 };
0163 Q_ENUM(AccessMode)
0164
0165 Q_CORE_EXPORT void setAccessMode(AccessMode mode);
0166 Q_CORE_EXPORT AccessMode accessMode() const;
0167
0168 private:
0169 struct ShortData {
0170 AccessMode mode;
0171 char reserved[sizeof(void*) - sizeof(mode)];
0172 };
0173 QT_PERMISSION(QContactsPermission)
0174 };
0175 Q_DECLARE_SHARED(QContactsPermission)
0176
0177 class QBluetoothPermissionPrivate;
0178 class QBluetoothPermission
0179 {
0180 Q_GADGET_EXPORT(Q_CORE_EXPORT)
0181 public:
0182 enum CommunicationMode : quint8 {
0183 Access = 0x01,
0184 Advertise = 0x02,
0185 Default = Access | Advertise,
0186 };
0187 Q_DECLARE_FLAGS(CommunicationModes, CommunicationMode)
0188 Q_FLAG(CommunicationModes)
0189
0190 Q_CORE_EXPORT void setCommunicationModes(CommunicationModes modes);
0191 Q_CORE_EXPORT CommunicationModes communicationModes() const;
0192
0193 private:
0194 struct ShortData {
0195 CommunicationMode mode;
0196 char reserved[sizeof(void*) - sizeof(mode)];
0197 };
0198 QT_PERMISSION(QBluetoothPermission)
0199 };
0200 Q_DECLARE_OPERATORS_FOR_FLAGS(QBluetoothPermission::CommunicationModes)
0201 Q_DECLARE_SHARED(QBluetoothPermission)
0202
0203 #define Q_DECLARE_MINIMAL_PERMISSION(ClassName) \
0204 class ClassName##Private; \
0205 class ClassName \
0206 { \
0207 struct ShortData { char reserved[sizeof(void*)]; }; \
0208 QT_PERMISSION(ClassName) \
0209 }; \
0210 Q_DECLARE_SHARED(ClassName)
0211
0212 Q_DECLARE_MINIMAL_PERMISSION(QCameraPermission)
0213 Q_DECLARE_MINIMAL_PERMISSION(QMicrophonePermission)
0214
0215 #undef QT_PERMISSION
0216 #undef Q_DECLARE_MINIMAL_PERMISSION
0217
0218 QT_END_NAMESPACE
0219
0220 #endif