Back to home page

EIC code displayed by LXR

 
 

    


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 // Copyright (C) 2022 The Qt Company Ltd.
0002 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
0003 // Qt-Security score:significant reason:default
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     /*end*/
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 // QPERMISSIONS_H