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.cpp
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#include "qhashfunctions.h"
7
8#include <QtCore/qshareddata.h>
9#include <QtCore/qdebug.h>
10
12
13Q_LOGGING_CATEGORY(lcPermissions, "qt.permissions", QtWarningMsg);
14
266/*
267 \internal
268*/
269const void *QPermission::data(QMetaType requestedType) const
270{
271 const auto actualType = type();
272 if (requestedType != actualType)
273 return nullptr;
274 return m_data.data();
275}
276
277// check alignof(AlignmentCheck) instead of alignof(void*), in case
278// pointers have different alignment inside structs:
279struct AlignmentCheck { void *p; };
280
281#define QT_PERMISSION_IMPL_COMMON(ClassName) \
282 /* Class##Private is unused until we need it: */ \
283 static_assert(sizeof(ClassName) == sizeof(void*), \
284 "You have added too many members to " #ClassName "::ShortData. " \
285 "Decrease their size or switch to using a d-pointer."); \
286 static_assert(alignof(ClassName) == alignof(AlignmentCheck), \
287 "You have added members to " #ClassName "::ShortData that are overaligned. " \
288 "Decrease their alignment or switch to using a d-pointer."); \
289 ClassName::ClassName(const ClassName &other) noexcept = default; \
290 ClassName::~ClassName() = default; \
291 ClassName &ClassName::operator=(const ClassName &other) noexcept = default; \
292 ClassName::ClassName() \
293 /* impl supplied by caller */
294
295
317 : u{} // stateless, atm
318{}
319
341 : u{} // stateless, atm
342{}
343
384 : u{ShortData{CommunicationMode::Default, {}}}
385{}
386
418{
419 if (modes == CommunicationModes{}) {
420 qCWarning(lcPermissions, "QBluetoothPermission: trying to set an invalid empty mode. "
421 "Falling back to CommunicationMode::Default.");
422 u.data.mode = Default;
423 } else {
424 u.data.mode = static_cast<CommunicationMode>(modes.toInt());
425 }
426}
427
433QBluetoothPermission::CommunicationModes QBluetoothPermission::communicationModes() const
434{
435 return u.data.mode;
436}
437
477 : u{ShortData{Accuracy::Approximate, Availability::WhenInUse, {}}}
478{}
479
504{
505 u.data.accuracy = accuracy;
506}
507
512{
513 return u.data.accuracy;
514}
515
520{
521 u.data.availability = availability;
522}
523
528{
529 return u.data.availability;
530}
531
568 : u{ShortData{AccessMode::ReadOnly, {}}}
569{}
570
576{
577 u.data.mode = mode;
578}
579
585{
586 return u.data.mode;
587}
588
625 : u{ShortData{AccessMode::ReadOnly, {}}}
626{}
627
633{
634 u.data.mode = mode;
635}
636
642{
643 return u.data.mode;
644}
645
651
652#ifndef QT_NO_DEBUG_STREAM
654{
655 const auto verbosity = debug.verbosity();
656 QDebugStateSaver saver(debug);
657 debug.nospace().setVerbosity(0);
658 if (verbosity >= QDebug::DefaultVerbosity)
659 debug << permission.type().name() << "(";
660 debug << permission.status();
661 if (verbosity >= QDebug::DefaultVerbosity)
662 debug << ")";
663 return debug;
664}
665#endif
666
667#undef QT_PERMISSION_IMPL_COMMON
668
669#if !defined(Q_OS_DARWIN) && !defined(Q_OS_ANDROID) && !defined(Q_OS_WASM)
670// Default backend for platforms without a permission implementation.
671// Always returns Granted, to match behavior when not using permission APIs
672// https://bugreports.qt.io/browse/QTBUG-90498?focusedCommentId=725085#comment-725085
674{
676 {
677 qCDebug(lcPermissions) << "No permission backend on this platform."
678 << "Optimistically returning Granted for" << permission;
680 }
681
682 void requestPermission(const QPermission &permission, const PermissionCallback &callback)
683 {
684 qCDebug(lcPermissions) << "No permission backend on this platform."
685 << "Optimistically returning Granted for" << permission;
687 }
688}
689#endif
690
692
693#include "moc_qpermissions.cpp"
Access Bluetooth peripherals.
Q_CORE_EXPORT CommunicationModes communicationModes() const
Q_CORE_EXPORT void setCommunicationModes(CommunicationModes modes)
Access the user's calendar.
Q_CORE_EXPORT void setAccessMode(AccessMode mode)
Sets whether the request is for read-write (mode == AccessMode::ReadOnly) or read-only (mode == Acces...
Q_CORE_EXPORT AccessMode accessMode() const
Returns AccessMode::ReadWrite when the request is for read-write and AccessMode::ReadOnly when it is ...
AccessMode
This enum is used to control access to the calendar data.
Access the camera for taking pictures or videos.
Access the user's contacts.
AccessMode
This enum is used to control access to the contacts data.
Q_CORE_EXPORT AccessMode accessMode() const
Returns AccessMode::ReadWrite when the request is for read-write and AccessMode::ReadOnly when it is ...
Q_CORE_EXPORT void setAccessMode(AccessMode mode)
Sets whether the request is for read-write (mode == AccessMode::ReadOnly) or read-only (mode == Acces...
\inmodule QtCore
\inmodule QtCore
Access the user's location.
Availability
This enum is used to control the availability of the location data.
Q_CORE_EXPORT void setAvailability(Availability availability)
Sets the desired availability of the request.
Q_CORE_EXPORT void setAccuracy(Accuracy accuracy)
Sets the desired accuracy of the request.
Accuracy
This enum is used to control the accuracy of the location data.
Q_CORE_EXPORT Availability availability() const
Returns the availability of the request.
Q_CORE_EXPORT Accuracy accuracy() const
Returns the accuracy of the request.
\inmodule QtCore
Definition qmetatype.h:341
constexpr const char * name() const
Definition qmetatype.h:2680
Access the microphone for monitoring or recording sound.
virtual ~QPermissionPlugin()
\inmodule QtCore \inheaderfile QPermissions
QMetaType type() const
Returns the type of the permission.
Qt::PermissionStatus status() const
Returns the status of the permission.
void * data()
Returns a pointer to the contained object as a generic void* that can be written to.
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
QDateTimePrivate::QDateTimeShortData ShortData
@ QtWarningMsg
Definition qlogging.h:31
#define Q_LOGGING_CATEGORY(name,...)
#define qCWarning(category,...)
#define qCDebug(category,...)
GLenum mode
#define QT_PERMISSION_IMPL_COMMON(ClassName)
QDebug operator<<(QDebug debug, const QPermission &permission)
static QT_BEGIN_NAMESPACE const uint Default
Definition qsplitter_p.h:27