diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2020-11-06 20:28:44 -0800 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2020-12-05 11:29:23 +0000 |
commit | 288d27e9f1d9aa1523b69cb39577620556c11e4b (patch) | |
tree | 47aa90c9987f3e34faf27bef3454a9a3efd19f88 | |
parent | 3bf5dc6eadbe4f182beca3e1eb9626438cc502dd (diff) |
QCborStreamReader: move the readStringChunk code to the Private
And add a currently-unused QByteArray pointer parameter. This function
will resize the array as necessary as data comes in.
Change-Id: I7b9b97ae9b32412abdc6fffd16451f5c6b280f3b
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
(cherry picked from commit c16ad16bd0a1d51d559eed8a4f2f10ac1518f6aa)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/corelib/serialization/qcborstreamreader.cpp | 57 |
1 files changed, 33 insertions, 24 deletions
diff --git a/src/corelib/serialization/qcborstreamreader.cpp b/src/corelib/serialization/qcborstreamreader.cpp index ec385e0629..993a05a337 100644 --- a/src/corelib/serialization/qcborstreamreader.cpp +++ b/src/corelib/serialization/qcborstreamreader.cpp @@ -667,6 +667,7 @@ public: } bool ensureStringIteration(); + QCborStreamReader::StringResult<qsizetype> readStringChunk(char *ptr, qsizetype maxlen); }; void qt_cbor_stream_set_error(QCborStreamReaderPrivate *d, QCborError error) @@ -1460,28 +1461,37 @@ qsizetype QCborStreamReader::_currentStringChunkSize() const QCborStreamReader::StringResult<qsizetype> QCborStreamReader::readStringChunk(char *ptr, qsizetype maxlen) { + auto r = d->readStringChunk(ptr, maxlen); + if (r.status == EndOfString && lastError() == QCborError::NoError) + preparse(); + return r; +} + +QCborStreamReader::StringResult<qsizetype> +QCborStreamReaderPrivate::readStringChunk(char *ptr, qsizetype maxlen) +{ CborError err; size_t len; const void *content = nullptr; QCborStreamReader::StringResult<qsizetype> result; result.data = 0; - result.status = Error; + result.status = QCborStreamReader::Error; - d->lastError = {}; - if (!d->ensureStringIteration()) + lastError = {}; + if (!ensureStringIteration()) return result; #if 1 // Using internal TinyCBOR API! - err = _cbor_value_get_string_chunk(&d->currentElement, &content, &len, &d->currentElement); + err = _cbor_value_get_string_chunk(¤tElement, &content, &len, ¤tElement); #else // the above is effectively the same as: if (cbor_value_is_byte_string(¤tElement)) - err = cbor_value_get_byte_string_chunk(&d->currentElement, reinterpret_cast<const uint8_t **>(&content), - &len, &d->currentElement); + err = cbor_value_get_byte_string_chunk(¤tElement, reinterpret_cast<const uint8_t **>(&content), + &len, ¤tElement); else - err = cbor_value_get_text_string_chunk(&d->currentElement, reinterpret_cast<const char **>(&content), - &len, &d->currentElement); + err = cbor_value_get_text_string_chunk(¤tElement, reinterpret_cast<const char **>(&content), + &len, ¤tElement); #endif // Range check: using implementation-defined behavior in converting an @@ -1493,14 +1503,13 @@ QCborStreamReader::readStringChunk(char *ptr, qsizetype maxlen) if (err) { if (err == CborErrorNoMoreStringChunks) { - d->preread(); - err = cbor_value_finish_string_iteration(&d->currentElement); - result.status = EndOfString; + preread(); + err = cbor_value_finish_string_iteration(¤tElement); + result.status = QCborStreamReader::EndOfString; } if (err) - d->handleError(err); - else - preparse(); + handleError(err); + // caller musts call preparse() return result; } @@ -1514,34 +1523,34 @@ QCborStreamReader::readStringChunk(char *ptr, qsizetype maxlen) else toRead = maxlen; // buffer smaller than string - if (d->device) { + if (device) { // This first skip can't fail because we've already read this many bytes. - d->device->skip(d->bufferStart + qptrdiff(content)); - actuallyRead = d->device->read(ptr, toRead); + device->skip(bufferStart + qptrdiff(content)); + actuallyRead = device->read(ptr, toRead); if (actuallyRead != toRead) { actuallyRead = -1; } else if (left) { - qint64 skipped = d->device->skip(left); + qint64 skipped = device->skip(left); if (skipped != left) actuallyRead = -1; } if (actuallyRead < 0) { - d->handleError(CborErrorIO); + handleError(CborErrorIO); return result; } - d->updateBufferAfterString(offset, len); + updateBufferAfterString(offset, len); } else { actuallyRead = toRead; - memcpy(ptr, d->buffer.constData() + d->bufferStart + offset, toRead); - d->bufferStart += QByteArray::size_type(offset + len); + memcpy(ptr, buffer.constData() + bufferStart + offset, toRead); + bufferStart += QByteArray::size_type(offset + len); } - d->preread(); + preread(); result.data = actuallyRead; - result.status = Ok; + result.status = QCborStreamReader::Ok; return result; } |