summaryrefslogtreecommitdiffstats
path: root/src/corelib/serialization/qcborstream.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/serialization/qcborstream.cpp')
-rw-r--r--src/corelib/serialization/qcborstream.cpp53
1 files changed, 14 insertions, 39 deletions
diff --git a/src/corelib/serialization/qcborstream.cpp b/src/corelib/serialization/qcborstream.cpp
index 9ad6a55456..1a4a53fed3 100644
--- a/src/corelib/serialization/qcborstream.cpp
+++ b/src/corelib/serialization/qcborstream.cpp
@@ -1903,7 +1903,6 @@ public:
}
ChunkParameters getStringChunkParameters();
- QCborStreamReader::StringResult<QByteArray> readString();
};
void qt_cbor_stream_set_error(QCborStreamReaderPrivate *d, QCborError error)
@@ -1986,35 +1985,6 @@ QCborStreamReaderPrivate::ChunkParameters QCborStreamReaderPrivate::getStringChu
return { qintptr(content), err ? -1 : qsizetype(len) };
}
-Q_NEVER_INLINE
-QCborStreamReader::StringResult<QByteArray> QCborStreamReaderPrivate::readString()
-{
- auto params = getStringChunkParameters();
- QCborStreamReader::StringResult<QByteArray> result;
- result.status = QCborStreamReader::Error;
-
- if (params.size < 0) {
- // this error may be due to failure to parse the string itself (content
- // will be non-null) or failure to parse the next element (content will
- // be null). If it's the next element, we first return EndOfString,
- // then allow the error to be presented.
- if (params.offset)
- return result;
- }
-
- if (params.offset) {
- // read from the device now
- device->skip(params.offset);
- result.data = device->read(params.size);
- result.status = QCborStreamReader::Ok;
- } else {
- result.status = QCborStreamReader::EndOfString;
- }
-
- preread();
- return result;
-}
-
/*!
\internal
*/
@@ -2335,13 +2305,13 @@ bool QCborStreamReader::next(int maxRecursion)
if (lastError() == QCborError::NoError)
leaveContainer();
} else if (isString() || isByteArray()) {
- auto r = d->readString();
+ auto r = _readByteArray_helper();
while (r.status == Ok) {
if (isString() && !QUtf8::isValidUtf8(r.data, r.data.size()).isValidUtf8) {
d->handleError(CborErrorInvalidUtf8TextString);
break;
}
- r = d->readString();
+ r = _readByteArray_helper();
}
} else {
// fixed types
@@ -2630,7 +2600,7 @@ bool QCborStreamReader::leaveContainer()
*/
QCborStreamReader::StringResult<QString> QCborStreamReader::_readString_helper()
{
- auto r = d->readString();
+ auto r = _readByteArray_helper();
QCborStreamReader::StringResult<QString> result;
result.status = r.status;
@@ -2645,8 +2615,6 @@ QCborStreamReader::StringResult<QString> QCborStreamReader::_readString_helper()
result.status = Error;
return result;
}
- if (r.status == EndOfString)
- preparse();
return result;
}
@@ -2684,10 +2652,17 @@ QCborStreamReader::StringResult<QString> QCborStreamReader::_readString_helper()
*/
QCborStreamReader::StringResult<QByteArray> QCborStreamReader::_readByteArray_helper()
{
- auto r = d->readString();
- if (r.status == EndOfString)
- preparse();
- return r;
+ QCborStreamReader::StringResult<QByteArray> result;
+ result.status = Error;
+ qsizetype len = _currentStringChunkSize();
+ if (len < 0)
+ return result;
+
+ result.data.resize(len);
+ auto r = readStringChunk(result.data.data(), len);
+ Q_ASSERT(r.status != Ok || r.data == len);
+ result.status = r.status;
+ return result;
}
/*!