69 QIODevice*
const io =
device();
70 if (
fatalError() || !io || io->bytesToWrite() != 0) {
74 const QMetaObject::Connection counter = QObject::connect(
75 io, &QIODevice::bytesWritten, io, [&drained](qint64 count) { drained += count; }, Qt::DirectConnection);
76 const int length =
static_cast<int>(bytes.size());
79 while (accepted < length || io->bytesToWrite() > 0) {
85 io->write(bytes.data() + accepted,
91 accepted +=
static_cast<int>(count);
93 if (io->bytesToWrite() > 0) {
97 QObject::disconnect(counter);
98 const int written =
static_cast<int>(std::clamp(
confirmedWritten(accepted, drained), qint64(0), qint64(accepted)));
100 if (written < length) {
105 }
else if (deadline.hasExpired()) {
136 if (!
isCancelled() && !done() && !deadline.hasExpired()) {
139 const auto check = [&]() {
140 if (
isCancelled() || deadline.hasExpired() || done()) {
144 if (QIODevice*
const io =
device()) {
145 (void) QObject::connect(io, &QIODevice::readyRead, &loop, check);
146 (void) QObject::connect(io, &QIODevice::bytesWritten, &loop, check);
147 if (
auto*
const socket = qobject_cast<QAbstractSocket*>(io)) {
148 (void) QObject::connect(socket, &QAbstractSocket::errorOccurred, &loop, check);
149 (void) QObject::connect(socket, &QAbstractSocket::stateChanged, &loop, check);
151#ifndef QGC_NO_SERIAL_LINK
152 if (
auto*
const port = qobject_cast<QSerialPort*>(io)) {
157 (void) QObject::connect(&timeout, &QTimer::timeout, &loop, &QEventLoop::quit);
158 timeout.setSingleShot(
true);
159 timeout.setTimerType(Qt::PreciseTimer);
160 if (!deadline.isForever()) {
162 static_cast<int>((std::min) (deadline.remainingTime(), qint64((std::numeric_limits<int>::max)()))));
167 cancelToken(), [&loop]() { QMetaObject::invokeMethod(&loop, &QEventLoop::quit, Qt::QueuedConnection); });