6#include <QtCore/QElapsedTimer>
7#include <QtCore/QtEndian>
9#include <private/qiodevice_p.h>
10#include <private/qobject_p.h>
106 static const qint32 maxSize = std::numeric_limits<qint32>::max() -
sizeof(
qint32);
111 if (
data.size() > maxSize) {
117 d->sendingPackets.append(sendSize);
120 if (!
d->writeToDevice((
const char *)&sendSizeLE,
sizeof(
qint32))
121 || !
d->writeToDevice(
data.data(),
data.size())) {
132 return d->packets.size();
142 return d->packets.isEmpty() ?
QByteArray() :
d->packets.takeFirst();
159 if (!
d->packets.isEmpty())
165 d->waitingForPacket =
true;
167 if (!
d->dev->waitForReadyRead(msecs))
169 if (!
d->waitingForPacket)
175void QPacketProtocol::bytesWritten(
qint64 bytes)
181 if (
d->sendingPackets.at(0) > bytes) {
182 d->sendingPackets[0] -= bytes;
185 bytes -=
d->sendingPackets.at(0);
186 d->sendingPackets.removeFirst();
191void QPacketProtocol::readyToRead()
196 if (-1 ==
d->inProgressSize) {
198 if (
static_cast<qint64>(
sizeof(
qint32)) >
d->dev->bytesAvailable())
203 if (!
d->readFromDevice((
char *)&inProgressSizeLE,
sizeof(
qint32))) {
218 d->inProgressSize -=
sizeof(
qint32);
221 const int bytesToRead =
static_cast<int>(
222 qMin(
d->dev->bytesAvailable(),
223 static_cast<qint64>(
d->inProgressSize -
d->inProgress.size())));
226 if (!
d->readFromDevice(toRead.data(), toRead.size())) {
231 d->inProgress.append(toRead);
232 if (
d->inProgressSize ==
d->inProgress.size()) {
234 d->packets.append(
d->inProgress);
235 d->inProgressSize = -1;
236 d->inProgress.clear();
238 d->waitingForPacket =
false;
247 inProgressSize(-1), waitingForPacket(
false), dev(dev)
254 while (totalWritten <
size) {
258 totalWritten += chunkSize;
260 return totalWritten ==
size;
266 while (totalRead <
size) {
270 totalRead += chunkSize;
272 return totalRead ==
size;
292#include "moc_qpacketprotocol_p.cpp"
qint64 elapsed() const noexcept
Returns the number of milliseconds since this QElapsedTimer was last started.
void start() noexcept
Starts this timer.
\inmodule QtCore \reentrant
void readyRead()
This signal is emitted once every time new data is available for reading from the device's current re...
void bytesWritten(qint64 bytes)
This signal is emitted every time a payload of data has been written to the device's current write ch...
qint64 write(const char *data, qint64 len)
Writes at most maxSize bytes of data from data to the device.
qint64 read(char *data, qint64 maxlen)
Reads at most maxSize bytes from the device into data, and returns the number of bytes read.
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
QList< QByteArray > packets
bool writeToDevice(const char *bytes, qint64 size)
bool readFromDevice(char *buffer, qint64 size)
QList< qint32 > sendingPackets
QPacketProtocolPrivate(QIODevice *dev)
The QPacketProtocol class encapsulates communicating discrete packets across fragmented IO channels,...
void send(const QByteArray &data)
Transmit the packet.
QPacketProtocol(QIODevice *dev, QObject *parent=nullptr)
Construct a QPacketProtocol instance that works on dev with the specified parent.
void readyRead()
Emitted whenever a new packet is received.
bool waitForReadyRead(int msecs=3000)
This function locks until a new packet is available for reading and the \l{QIODevice::}{readyRead()} ...
qint64 packetsAvailable() const
Returns the number of received packets yet to be read.
QByteArray read()
Return the next unread packet, or an empty QByteArray if no packets are available.
Combined button and popup list for selecting options.
constexpr Initialization Uninitialized
constexpr T qFromLittleEndian(T source)
constexpr T qToLittleEndian(T source)
int qt_subtract_from_timeout(int timeout, int elapsed)
constexpr const T & qMin(const T &a, const T &b)
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
myObject disconnect()
[26]
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent