14class QBufferPrivate :
public QIODevicePrivate
16 Q_DECLARE_PUBLIC(QBuffer)
19 QBufferPrivate() =
default;
21 QByteArray *buf =
nullptr;
22 QByteArray defaultBuf;
24 qint64 peek(
char *data, qint64 maxSize) override;
25 QByteArray peek(qint64 maxSize) override;
28 qint64 writtenSinceLastEmit = 0;
29 int signalConnectionCount = 0;
30 bool signalsEmitted =
false;
34qint64 QBufferPrivate::peek(
char *data, qint64 maxSize)
36 qint64 readBytes = qMin(maxSize,
static_cast<qint64>(buf->size()) - pos);
37 memcpy(data, buf->constData() + pos, readBytes);
41QByteArray QBufferPrivate::peek(qint64 maxSize)
43 qint64 readBytes = qMin(maxSize,
static_cast<qint64>(buf->size()) - pos);
44 if (pos == 0 && maxSize >= buf->size())
46 return QByteArray(buf->constData() + pos, readBytes);
287bool QBuffer::open(OpenMode mode)
291 if ((mode & (Append | Truncate)) != 0)
293 if ((mode & (ReadOnly | WriteOnly)) == 0) {
294 qWarning(
"QBuffer::open: Buffer access not specified");
298 if ((mode & Truncate) == Truncate)
301 return QIODevice::open(mode | QIODevice::Unbuffered);
332bool QBuffer::seek(qint64 pos)
335 const auto oldBufSize = d->buf->size();
336 constexpr qint64 MaxSeekPos = (std::numeric_limits<
decltype(oldBufSize)>::max)();
337 if (pos <= MaxSeekPos && pos > oldBufSize && isWritable()) {
339 d->buf->resize(qsizetype(pos),
'\0');
340 } QT_CATCH(
const std::bad_alloc &) {}
341 if (d->buf->size() != pos) {
342 qWarning(
"QBuffer::seek: Unable to fill gap");
346 if (pos > d->buf->size() || pos < 0) {
347 qWarning(
"QBuffer::seek: Invalid pos: %lld", pos);
350 return QIODevice::seek(pos);
376qint64 QBuffer::readData(
char *data, qint64 len)
379 if ((len = qMin(len, qint64(d->buf->size()) - pos())) <= 0)
381 memcpy(data, d->buf->constData() + pos(), len);
388qint64 QBuffer::writeData(
const char *data, qint64 len)
391 const quint64 required = quint64(pos()) + quint64(len);
393 if (required > quint64(d->buf->size())) {
395 Q_ASSERT(required <= quint64((std::numeric_limits<qsizetype>::max)()));
396 d->buf->resize(qsizetype(required));
397 if (quint64(d->buf->size()) != required) {
398 qWarning(
"QBuffer::writeData: Memory allocation error");
403 memcpy(d->buf->data() + pos(), data, size_t(len));
406 d->writtenSinceLastEmit += len;
407 if (d->signalConnectionCount && !d->signalsEmitted && !signalsBlocked()) {
408 d->signalsEmitted =
true;
409 QMetaObject::invokeMethod(
this, [](QBuffer *q) {
410 auto d = q->d_func();
411 emit q->bytesWritten(d->writtenSinceLastEmit);
412 d->writtenSinceLastEmit = 0;
414 d->signalsEmitted =
false;
415 }, Qt::QueuedConnection,
this);