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
btgcdtimer.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 "btgcdtimer_p.h"
5#include "btutility_p.h"
6
7#include <QtCore/qelapsedtimer.h>
8#include <QtCore/qdebug.h>
9
10#include <algorithm>
11
13using namespace DarwinBluetooth;
14
15@implementation DarwinBTGCDTimer {
16@private
19
20 // Optional:
23
25 id<QT_MANGLE_NAMESPACE(GCDTimerDelegate)> timeoutHandler;
26
28}
29
30- (instancetype)initWithDelegate:(id<QT_MANGLE_NAMESPACE(GCDTimerDelegate)>)delegate
31{
32 if (self = [super init]) {
33 timeoutHandler = delegate;
34 timeoutMS = 0;
35 timeoutStepMS = 0;
36 objectUnderWatch = nil;
37 timeoutType = OperationTimeout::none;
38 cancelled = false;
39 }
40 return self;
41}
42
43- (void)watchAfter:(id)object withTimeoutType:(OperationTimeout)type
44{
47}
48
49- (void)startWithTimeout:(qint64)ms step:(qint64)stepMS
50{
53
54 if (!timeoutHandler) {
55 // Nobody to report timeout to, no need to start any task then.
56 return;
57 }
58
59 if (ms <= 0 || stepMS <= 0) {
60 qCWarning(QT_BT_DARWIN, "Invalid timeout/step parameters");
61 return;
62 }
63
64 timeoutMS = ms;
65 timeoutStepMS = stepMS;
66 timer.start();
67
68 [self handleTimeout];
69}
70
71- (void)handleTimeout
72{
73 if (cancelled)
74 return;
75
76 const qint64 elapsed = timer.elapsed();
77 if (elapsed >= timeoutMS) {
78 [timeoutHandler timeout:self];
79 } else {
80 // Re-schedule:
81 dispatch_queue_t leQueue(qt_LE_queue());
82 Q_ASSERT(leQueue);
83 const qint64 timeChunkMS = std::min(timeoutMS - elapsed, timeoutStepMS);
84 dispatch_after(dispatch_time(DISPATCH_TIME_NOW,
85 int64_t(timeChunkMS / 1000. * NSEC_PER_SEC)),
86 leQueue,
87 ^{
88 [self handleTimeout];
89 });
90 }
91}
92
93- (void)cancelTimer
94{
95 cancelled = true;
96 timeoutHandler = nil;
97 objectUnderWatch = nil;
98 timeoutType = OperationTimeout::none;
99}
100
102{
103 return objectUnderWatch;
104}
105
107{
108 return timeoutType;
109}
110
111@end
qint64 timeoutMS
id objectUnderWatch
Definition btgcdtimer.mm:21
OperationTimeout timeoutType
Definition btgcdtimer.mm:22
id< QT_MANGLE_NAMESPACE(GCDTimerDelegate)> timeoutHandler
Definition btgcdtimer.mm:25
QElapsedTimer timer
Definition btgcdtimer.mm:24
bool cancelled
Definition btgcdtimer.mm:27
qint64 timeoutStepMS
Definition btgcdtimer.mm:18
\inmodule QtCore
qint64 elapsed() const noexcept
Returns the number of milliseconds since this QElapsedTimer was last started.
void start() noexcept
\typealias QElapsedTimer::Duration Synonym for std::chrono::nanoseconds.
dispatch_queue_t qt_LE_queue()
Definition btutility.mm:324
QString self
Definition language.cpp:58
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
#define qCWarning(category,...)
GLenum GLuint id
[7]
GLuint object
[3]
GLenum type
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
static double elapsed(qint64 after, qint64 before)
#define QT_MANGLE_NAMESPACE(name)
static QT_BEGIN_NAMESPACE void init(QTextBoundaryFinder::BoundaryType type, QStringView str, QCharAttributes *attributes)
long long qint64
Definition qtypes.h:60
QTimer * timer
[3]