diff options
author | Oswald Buddenhagen <oswald.buddenhagen@nokia.com> | 2012-04-10 12:48:01 +0200 |
---|---|---|
committer | Oswald Buddenhagen <oswald.buddenhagen@nokia.com> | 2012-04-10 15:31:45 +0200 |
commit | 143c4d3e13a430b951f4f4f8c28db14303f80605 (patch) | |
tree | 2b89637b93fc7d81c674106008566010f986d67c /src/corelib/json | |
parent | a7ed81b557d593a8ddb43b71bf4bbf3b44ead070 (diff) | |
parent | e5337ad1b1fb02873ce7b5ca8db45f6fd8063352 (diff) |
Merge remote-tracking branch 'origin/master' into api_changes
Conflicts:
configure
src/widgets/styles/qwindowsxpstyle.cpp
tests/auto/gui/kernel/qwindow/qwindow.pro
tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
Change-Id: I624b6d26abce9874c610c04954c1c45bc074bef3
Diffstat (limited to 'src/corelib/json')
-rw-r--r-- | src/corelib/json/qjson_p.h | 2 | ||||
-rw-r--r-- | src/corelib/json/qjsonarray.cpp | 4 | ||||
-rw-r--r-- | src/corelib/json/qjsondocument.cpp | 13 | ||||
-rw-r--r-- | src/corelib/json/qjsondocument.h | 10 | ||||
-rw-r--r-- | src/corelib/json/qjsonobject.cpp | 6 | ||||
-rw-r--r-- | src/corelib/json/qjsonparser.cpp | 93 |
6 files changed, 105 insertions, 23 deletions
diff --git a/src/corelib/json/qjson_p.h b/src/corelib/json/qjson_p.h index f8f41c2e25..831774e456 100644 --- a/src/corelib/json/qjson_p.h +++ b/src/corelib/json/qjson_p.h @@ -745,7 +745,7 @@ public: Data *clone(Base *b, int reserve = 0) { int size = sizeof(Header) + b->size; - if (ref.load() == 1 && alloc >= size + reserve) + if (b == header->root() && ref.load() == 1 && alloc >= size + reserve) return this; if (reserve) { diff --git a/src/corelib/json/qjsonarray.cpp b/src/corelib/json/qjsonarray.cpp index 6bae2001a1..d143215efd 100644 --- a/src/corelib/json/qjsonarray.cpp +++ b/src/corelib/json/qjsonarray.cpp @@ -275,7 +275,7 @@ void QJsonArray::removeAt(int i) detach(); a->removeItems(i, 1); ++d->compactionCounter; - if (d->compactionCounter > 32 && d->compactionCounter >= (int)a->length/2) + if (d->compactionCounter > 32u && d->compactionCounter >= unsigned(a->length) / 2u) compact(); } @@ -379,7 +379,7 @@ void QJsonArray::replace(int i, const QJsonValue &value) QJsonPrivate::Value::copyData(value, (char *)a + valueOffset, compressed); ++d->compactionCounter; - if (d->compactionCounter > 32 && d->compactionCounter >= (int)a->length/2) + if (d->compactionCounter > 32u && d->compactionCounter >= unsigned(a->length) / 2u) compact(); } diff --git a/src/corelib/json/qjsondocument.cpp b/src/corelib/json/qjsondocument.cpp index c2204bf696..be241bc3fc 100644 --- a/src/corelib/json/qjsondocument.cpp +++ b/src/corelib/json/qjsondocument.cpp @@ -224,23 +224,26 @@ const char *QJsonDocument::rawData(int *size) const */ QJsonDocument QJsonDocument::fromBinaryData(const QByteArray &data, DataValidation validation) { + if (data.size() < (int)(sizeof(QJsonPrivate::Header) + sizeof(QJsonPrivate::Base))) + return QJsonDocument(); + QJsonPrivate::Header h; memcpy(&h, data.constData(), sizeof(QJsonPrivate::Header)); QJsonPrivate::Base root; memcpy(&root, data.constData() + sizeof(QJsonPrivate::Header), sizeof(QJsonPrivate::Base)); // do basic checks here, so we don't try to allocate more memory than we can. - if (data.size() < (int)(sizeof(QJsonPrivate::Header) + sizeof(QJsonPrivate::Base)) || - h.tag != QJsonDocument::BinaryFormatTag || h.version != 1u || + if (h.tag != QJsonDocument::BinaryFormatTag || h.version != 1u || sizeof(QJsonPrivate::Header) + root.size > (uint)data.size()) return QJsonDocument(); - char *raw = (char *)malloc(data.size()); + const uint size = sizeof(QJsonPrivate::Header) + root.size; + char *raw = (char *)malloc(size); if (!raw) return QJsonDocument(); - memcpy(raw, data.constData(), data.size()); - QJsonPrivate::Data *d = new QJsonPrivate::Data(raw, data.size()); + memcpy(raw, data.constData(), size); + QJsonPrivate::Data *d = new QJsonPrivate::Data(raw, size); if (validation != BypassValidation && !d->valid()) { delete d; diff --git a/src/corelib/json/qjsondocument.h b/src/corelib/json/qjsondocument.h index e39dc6a27c..c67899192c 100644 --- a/src/corelib/json/qjsondocument.h +++ b/src/corelib/json/qjsondocument.h @@ -63,14 +63,16 @@ struct Q_CORE_EXPORT QJsonParseError UnterminatedArray, MissingValueSeparator, IllegalValue, - EndOfNumber, + TerminationByNumber, IllegalNumber, - StringEscapeSequence, - StringUTF8Scan, - EndOfString, + IllegalEscapeSequence, + IllegalUTF8String, + UnterminatedString, MissingObject }; + QString errorString() const; + int offset; ParseError error; }; diff --git a/src/corelib/json/qjsonobject.cpp b/src/corelib/json/qjsonobject.cpp index e14000fac3..e880078195 100644 --- a/src/corelib/json/qjsonobject.cpp +++ b/src/corelib/json/qjsonobject.cpp @@ -335,7 +335,7 @@ void QJsonObject::remove(const QString &key) detach(); o->removeItems(index, 1); ++d->compactionCounter; - if (d->compactionCounter > 32 && d->compactionCounter >= (int)o->length/2) + if (d->compactionCounter > 32u && d->compactionCounter >= unsigned(o->length) / 2u) compact(); } @@ -361,7 +361,7 @@ QJsonValue QJsonObject::take(const QString &key) QJsonPrivate::Entry *e = o->entryAt(index); o->removeItems(index, 1); ++d->compactionCounter; - if (d->compactionCounter > 32 && d->compactionCounter >= (int)o->length/2) + if (d->compactionCounter > 32u && d->compactionCounter >= unsigned(o->length) / 2u) compact(); return QJsonValue(d, o, e->value); @@ -432,7 +432,7 @@ QJsonObject::iterator QJsonObject::erase(QJsonObject::iterator it) o->removeItems(index, 1); ++d->compactionCounter; - if (d->compactionCounter > 32 && d->compactionCounter >= (int)o->length/2) + if (d->compactionCounter > 32u && d->compactionCounter >= unsigned(o->length) / 2u) compact(); // iterator hasn't changed diff --git a/src/corelib/json/qjsonparser.cpp b/src/corelib/json/qjsonparser.cpp index b1e6a5a5c7..9b11c9ac3e 100644 --- a/src/corelib/json/qjsonparser.cpp +++ b/src/corelib/json/qjsonparser.cpp @@ -39,6 +39,9 @@ ** ****************************************************************************/ +#ifndef QT_BOOTSTRAPPED +#include <qcoreapplication.h> +#endif #include <qdebug.h> #include "qjsonparser_p.h" #include "qjson_p.h" @@ -57,6 +60,80 @@ static int indent = 0; QT_BEGIN_NAMESPACE +// error strings for the JSON parser +#define JSONERR_OK QT_TRANSLATE_NOOP("QJsonParseError", "no error occurred") +#define JSONERR_UNTERM_OBJ QT_TRANSLATE_NOOP("QJsonParseError", "unterminated object") +#define JSONERR_MISS_NSEP QT_TRANSLATE_NOOP("QJsonParseError", "missing name separator") +#define JSONERR_UNTERM_AR QT_TRANSLATE_NOOP("QJsonParseError", "unterminated array") +#define JSONERR_MISS_VSEP QT_TRANSLATE_NOOP("QJsonParseError", "missing value separator") +#define JSONERR_ILLEGAL_VAL QT_TRANSLATE_NOOP("QJsonParseError", "illegal value") +#define JSONERR_END_OF_NUM QT_TRANSLATE_NOOP("QJsonParseError", "invalid termination by number") +#define JSONERR_ILLEGAL_NUM QT_TRANSLATE_NOOP("QJsonParseError", "illegal number") +#define JSONERR_STR_ESC_SEQ QT_TRANSLATE_NOOP("QJsonParseError", "invalid escape sequence") +#define JSONERR_STR_UTF8 QT_TRANSLATE_NOOP("QJsonParseError", "invalid UTF8 string") +#define JSONERR_UTERM_STR QT_TRANSLATE_NOOP("QJsonParseError", "unterminated string") +#define JSONERR_MISS_OBJ QT_TRANSLATE_NOOP("QJsonParseError", "object is missing after a comma") + +/*! + \class QJsonParseError + \ingroup json + \reentrant + \since 5.0 + + \brief The QJsonParseError class is used to report errors during JSON parsing. +*/ + +/*! + Returns the human-readable message appropriate to the reported JSON parsing error. + */ +QString QJsonParseError::errorString() const +{ + const char *sz = ""; + switch (error) { + case NoError: + sz = JSONERR_OK; + break; + case UnterminatedObject: + sz = JSONERR_UNTERM_OBJ; + break; + case MissingNameSeparator: + sz = JSONERR_MISS_NSEP; + break; + case UnterminatedArray: + sz = JSONERR_UNTERM_AR; + break; + case MissingValueSeparator: + sz = JSONERR_MISS_VSEP; + break; + case IllegalValue: + sz = JSONERR_ILLEGAL_VAL; + break; + case TerminationByNumber: + sz = JSONERR_END_OF_NUM; + break; + case IllegalNumber: + sz = JSONERR_ILLEGAL_NUM; + break; + case IllegalEscapeSequence: + sz = JSONERR_STR_ESC_SEQ; + break; + case IllegalUTF8String: + sz = JSONERR_STR_UTF8; + break; + case UnterminatedString: + sz = JSONERR_UTERM_STR; + break; + case MissingObject: + sz = JSONERR_MISS_OBJ; + break; + } +#ifndef QT_BOOTSTRAPPED + return QCoreApplication::translate("QJsonParseError", sz); +#else + return QLatin1String(sz); +#endif +} + using namespace QJsonPrivate; Parser::Parser(const char *json, int length) @@ -524,7 +601,7 @@ bool Parser::parseNumber(QJsonPrivate::Value *val, int baseOffset) } if (json >= end) { - lastError = QJsonParseError::EndOfNumber; + lastError = QJsonParseError::TerminationByNumber; return false; } @@ -717,12 +794,12 @@ bool Parser::parseString(bool *latin1) break; else if (*json == '\\') { if (!scanEscapeSequence(json, end, &ch)) { - lastError = QJsonParseError::StringEscapeSequence; + lastError = QJsonParseError::IllegalEscapeSequence; return false; } } else { if (!scanUtf8Char(json, end, &ch)) { - lastError = QJsonParseError::StringUTF8Scan; + lastError = QJsonParseError::IllegalUTF8String; return false; } } @@ -737,14 +814,14 @@ bool Parser::parseString(bool *latin1) ++json; DEBUG << "end of string"; if (json >= end) { - lastError = QJsonParseError::EndOfString; + lastError = QJsonParseError::UnterminatedString; return false; } // no unicode string, we are done if (*latin1) { // write string length - *(QJsonPrivate::qle_ushort *)(data + stringPos) = current - outStart - sizeof(ushort); + *(QJsonPrivate::qle_ushort *)(data + stringPos) = ushort(current - outStart - sizeof(ushort)); int pos = reserveSpace((4 - current) & 3); while (pos & 3) data[pos++] = 0; @@ -764,12 +841,12 @@ bool Parser::parseString(bool *latin1) break; else if (*json == '\\') { if (!scanEscapeSequence(json, end, &ch)) { - lastError = QJsonParseError::StringEscapeSequence; + lastError = QJsonParseError::IllegalEscapeSequence; return false; } } else { if (!scanUtf8Char(json, end, &ch)) { - lastError = QJsonParseError::StringUTF8Scan; + lastError = QJsonParseError::IllegalUTF8String; return false; } } @@ -785,7 +862,7 @@ bool Parser::parseString(bool *latin1) ++json; if (json >= end) { - lastError = QJsonParseError::EndOfString; + lastError = QJsonParseError::UnterminatedString; return false; } |