hlp:荆州版本
This commit is contained in:
@@ -1,12 +1,12 @@
|
||||
#ifndef QJSONBACKPORT_GLOBAL_H
|
||||
#define QJSONBACKPORT_GLOBAL_H
|
||||
|
||||
#include <QtCore/qglobal.h>
|
||||
|
||||
#if defined(QJSONBACKPORT_LIBRARY)
|
||||
# define QJSONBACKPORTSHARED_EXPORT Q_DECL_EXPORT
|
||||
#else
|
||||
# define QJSONBACKPORTSHARED_EXPORT Q_DECL_IMPORT
|
||||
#endif
|
||||
|
||||
#endif // QJSONBACKPORT_GLOBAL_H
|
||||
#ifndef QJSONBACKPORT_GLOBAL_H
|
||||
#define QJSONBACKPORT_GLOBAL_H
|
||||
|
||||
#include <QtCore/qglobal.h>
|
||||
|
||||
#if defined(QJSONBACKPORT_LIBRARY)
|
||||
# define QJSONBACKPORTSHARED_EXPORT Q_DECL_EXPORT
|
||||
#else
|
||||
# define QJSONBACKPORTSHARED_EXPORT Q_DECL_IMPORT
|
||||
#endif
|
||||
|
||||
#endif // QJSONBACKPORT_GLOBAL_H
|
||||
|
||||
+427
-427
@@ -1,427 +1,427 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/
|
||||
**
|
||||
** This file is part of the QtCore module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** GNU Lesser General Public License Usage
|
||||
** This file may be used under the terms of the GNU Lesser General Public
|
||||
** License version 2.1 as published by the Free Software Foundation and
|
||||
** appearing in the file LICENSE.LGPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU Lesser
|
||||
** General Public License version 2.1 requirements will be met:
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License version 3.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU General
|
||||
** Public License version 3.0 requirements will be met:
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Other Usage
|
||||
** Alternatively, this file may be used in accordance with the terms and
|
||||
** conditions contained in a signed written agreement between you and Nokia.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "qjson_p.h"
|
||||
#include <qalgorithms.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
namespace QJsonPrivate
|
||||
{
|
||||
|
||||
#ifdef Q_LITTLE_ENDIAN
|
||||
#define Q_TO_LITTLE_ENDIAN(x) (x)
|
||||
#else
|
||||
#define Q_TO_LITTLE_ENDIAN(x) ( ((x & 0xff) << 24) | ((x & 0xff00) << 8) | ((x & 0xff0000) >> 8) | ((x & 0xff000000) >> 24) )
|
||||
#endif
|
||||
|
||||
static const Base emptyArray = { { Q_TO_LITTLE_ENDIAN(sizeof(Base)) }, { 0 }, { 0 } };
|
||||
static const Base emptyObject = { { Q_TO_LITTLE_ENDIAN(sizeof(Base)) }, { 0 }, { 0 } };
|
||||
|
||||
|
||||
void Data::compact()
|
||||
{
|
||||
Q_ASSERT(sizeof(Value) == sizeof(offset));
|
||||
|
||||
if (!compactionCounter)
|
||||
return;
|
||||
|
||||
Base *base = header->root();
|
||||
int reserve = 0;
|
||||
if (base->is_object) {
|
||||
Object *o = static_cast<Object *>(base);
|
||||
for (int i = 0; i < (int)o->length; ++i)
|
||||
reserve += o->entryAt(i)->usedStorage(o);
|
||||
} else {
|
||||
Array *a = static_cast<Array *>(base);
|
||||
for (int i = 0; i < (int)a->length; ++i)
|
||||
reserve += (*a)[i].usedStorage(a);
|
||||
}
|
||||
|
||||
int size = sizeof(Base) + reserve + base->length*sizeof(offset);
|
||||
int alloc = sizeof(Header) + size;
|
||||
Header *h = (Header *) malloc(alloc);
|
||||
h->tag = QJsonDocument::BinaryFormatTag;
|
||||
h->version = 1;
|
||||
Base *b = h->root();
|
||||
b->size = size;
|
||||
b->is_object = header->root()->is_object;
|
||||
b->length = base->length;
|
||||
b->tableOffset = reserve + sizeof(Array);
|
||||
|
||||
int offset = sizeof(Base);
|
||||
if (b->is_object) {
|
||||
Object *o = static_cast<Object *>(base);
|
||||
Object *no = static_cast<Object *>(b);
|
||||
|
||||
for (int i = 0; i < (int)o->length; ++i) {
|
||||
no->table()[i] = offset;
|
||||
|
||||
const Entry *e = o->entryAt(i);
|
||||
Entry *ne = no->entryAt(i);
|
||||
int s = e->size();
|
||||
memcpy(ne, e, s);
|
||||
offset += s;
|
||||
int dataSize = e->value.usedStorage(o);
|
||||
if (dataSize) {
|
||||
memcpy((char *)no + offset, e->value.data(o), dataSize);
|
||||
ne->value.value = offset;
|
||||
offset += dataSize;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Array *a = static_cast<Array *>(base);
|
||||
Array *na = static_cast<Array *>(b);
|
||||
|
||||
for (int i = 0; i < (int)a->length; ++i) {
|
||||
const Value &v = (*a)[i];
|
||||
Value &nv = (*na)[i];
|
||||
nv = v;
|
||||
int dataSize = v.usedStorage(a);
|
||||
if (dataSize) {
|
||||
memcpy((char *)na + offset, v.data(a), dataSize);
|
||||
nv.value = offset;
|
||||
offset += dataSize;
|
||||
}
|
||||
}
|
||||
}
|
||||
Q_ASSERT(offset == (int)b->tableOffset);
|
||||
|
||||
free(header);
|
||||
header = h;
|
||||
this->alloc = alloc;
|
||||
compactionCounter = 0;
|
||||
}
|
||||
|
||||
bool Data::valid() const
|
||||
{
|
||||
if (header->tag != QJsonDocument::BinaryFormatTag || header->version != 1u)
|
||||
return false;
|
||||
|
||||
bool res = false;
|
||||
if (header->root()->is_object)
|
||||
res = static_cast<Object *>(header->root())->isValid();
|
||||
else
|
||||
res = static_cast<Array *>(header->root())->isValid();
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
int Base::reserveSpace(uint dataSize, int posInTable, uint numItems, bool replace)
|
||||
{
|
||||
Q_ASSERT(posInTable >= 0 && posInTable <= (int)length);
|
||||
|
||||
offset off = tableOffset;
|
||||
// move table to new position
|
||||
if (replace) {
|
||||
memmove((char *)(table()) + dataSize, table(), length*sizeof(offset));
|
||||
} else {
|
||||
memmove((char *)(table() + posInTable + numItems) + dataSize, table() + posInTable, (length - posInTable)*sizeof(offset));
|
||||
memmove((char *)(table()) + dataSize, table(), posInTable*sizeof(offset));
|
||||
}
|
||||
tableOffset += dataSize;
|
||||
for (int i = 0; i < (int)numItems; ++i)
|
||||
table()[posInTable + i] = off;
|
||||
size += dataSize;
|
||||
if (!replace) {
|
||||
length += numItems;
|
||||
size += numItems * sizeof(offset);
|
||||
}
|
||||
return off;
|
||||
}
|
||||
|
||||
void Base::removeItems(int pos, int numItems)
|
||||
{
|
||||
Q_ASSERT(pos >= 0 && pos <= (int)length);
|
||||
if (pos + numItems < (int)length)
|
||||
memmove(table() + pos, table() + pos + numItems, (length - pos - numItems)*sizeof(offset));
|
||||
length -= numItems;
|
||||
}
|
||||
|
||||
int Object::indexOf(const QString &key, bool *exists)
|
||||
{
|
||||
int min = 0;
|
||||
int n = length;
|
||||
while (n > 0) {
|
||||
int half = n >> 1;
|
||||
int middle = min + half;
|
||||
if (*entryAt(middle) >= key) {
|
||||
n = half;
|
||||
} else {
|
||||
min = middle + 1;
|
||||
n -= half + 1;
|
||||
}
|
||||
}
|
||||
if (min < (int)length && *entryAt(min) == key) {
|
||||
*exists = true;
|
||||
return min;
|
||||
}
|
||||
*exists = false;
|
||||
return min;
|
||||
}
|
||||
|
||||
bool Object::isValid() const
|
||||
{
|
||||
if (tableOffset + length*sizeof(offset) > size)
|
||||
return false;
|
||||
|
||||
for (uint i = 0; i < length; ++i) {
|
||||
offset entryOffset = table()[i];
|
||||
if (entryOffset + sizeof(Entry) >= tableOffset)
|
||||
return false;
|
||||
Entry *e = entryAt(i);
|
||||
int s = e->size();
|
||||
if (table()[i] + s > tableOffset)
|
||||
return false;
|
||||
if (!e->value.isValid(this))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool Array::isValid() const
|
||||
{
|
||||
if (tableOffset + length*sizeof(offset) > size)
|
||||
return false;
|
||||
|
||||
for (uint i = 0; i < length; ++i) {
|
||||
if (!at(i).isValid(this))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool Entry::operator ==(const QString &key) const
|
||||
{
|
||||
if (value.latinKey)
|
||||
return (shallowLatin1Key() == key);
|
||||
else
|
||||
return (shallowKey() == key);
|
||||
}
|
||||
|
||||
bool Entry::operator >=(const QString &key) const
|
||||
{
|
||||
if (value.latinKey)
|
||||
return (shallowLatin1Key() >= key);
|
||||
else
|
||||
return (shallowKey() >= key);
|
||||
}
|
||||
|
||||
bool Entry::operator ==(const Entry &other) const
|
||||
{
|
||||
if (value.latinKey) {
|
||||
if (other.value.latinKey)
|
||||
return shallowLatin1Key() == other.shallowLatin1Key();
|
||||
return shallowLatin1Key() == other.shallowKey();
|
||||
} else if (other.value.latinKey) {
|
||||
return shallowKey() == other.shallowLatin1Key();
|
||||
}
|
||||
return shallowKey() == other.shallowKey();
|
||||
}
|
||||
|
||||
bool Entry::operator >=(const Entry &other) const
|
||||
{
|
||||
if (value.latinKey) {
|
||||
if (other.value.latinKey)
|
||||
return shallowLatin1Key() >= other.shallowLatin1Key();
|
||||
return shallowLatin1Key() >= other.shallowKey();
|
||||
} else if (other.value.latinKey) {
|
||||
return shallowKey() >= other.shallowLatin1Key();
|
||||
}
|
||||
return shallowKey() >= other.shallowKey();
|
||||
}
|
||||
|
||||
|
||||
int Value::usedStorage(const Base *b) const
|
||||
{
|
||||
int s = 0;
|
||||
switch (type) {
|
||||
case QJsonValue::Double:
|
||||
if (latinOrIntValue)
|
||||
break;
|
||||
s = sizeof(double);
|
||||
break;
|
||||
case QJsonValue::String: {
|
||||
char *d = data(b);
|
||||
if (latinOrIntValue)
|
||||
s = sizeof(ushort) + *(ushort *)d;
|
||||
else
|
||||
s = sizeof(int) + sizeof(ushort)*(*(int *)d);
|
||||
break;
|
||||
}
|
||||
case QJsonValue::Array:
|
||||
case QJsonValue::Object:
|
||||
s = base(b)->size;
|
||||
break;
|
||||
case QJsonValue::Null:
|
||||
case QJsonValue::Bool:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return alignedSize(s);
|
||||
}
|
||||
|
||||
bool Value::isValid(const Base *b) const
|
||||
{
|
||||
int offset = 0;
|
||||
switch (type) {
|
||||
case QJsonValue::Double:
|
||||
if (latinOrIntValue)
|
||||
break;
|
||||
// fall through
|
||||
case QJsonValue::String:
|
||||
case QJsonValue::Array:
|
||||
case QJsonValue::Object:
|
||||
offset = value;
|
||||
break;
|
||||
case QJsonValue::Null:
|
||||
case QJsonValue::Bool:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (!offset)
|
||||
return true;
|
||||
if (offset + sizeof(uint) > b->tableOffset)
|
||||
return false;
|
||||
|
||||
int s = usedStorage(b);
|
||||
if (!s)
|
||||
return true;
|
||||
if (s < 0 || offset + s > (int)b->tableOffset)
|
||||
return false;
|
||||
if (type == QJsonValue::Array)
|
||||
return static_cast<Array *>(base(b))->isValid();
|
||||
if (type == QJsonValue::Object)
|
||||
return static_cast<Object *>(base(b))->isValid();
|
||||
return true;
|
||||
}
|
||||
|
||||
/*!
|
||||
\internal
|
||||
*/
|
||||
int Value::requiredStorage(const QJsonValue &v, bool *compressed)
|
||||
{
|
||||
*compressed = false;
|
||||
switch (v.t) {
|
||||
case QJsonValue::Double:
|
||||
if (QJsonPrivate::compressedNumber(v.dbl) != INT_MAX) {
|
||||
*compressed = true;
|
||||
return 0;
|
||||
}
|
||||
return sizeof(double);
|
||||
case QJsonValue::String: {
|
||||
QString s = v.toString();
|
||||
*compressed = QJsonPrivate::useCompressed(s);
|
||||
return QJsonPrivate::qStringSize(s, *compressed);
|
||||
}
|
||||
case QJsonValue::Array:
|
||||
case QJsonValue::Object:
|
||||
return v.base ? v.base->size : sizeof(QJsonPrivate::Base);
|
||||
case QJsonValue::Undefined:
|
||||
case QJsonValue::Null:
|
||||
case QJsonValue::Bool:
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*!
|
||||
\internal
|
||||
*/
|
||||
uint Value::valueToStore(const QJsonValue &v, uint offset)
|
||||
{
|
||||
switch (v.t) {
|
||||
case QJsonValue::Undefined:
|
||||
case QJsonValue::Null:
|
||||
break;
|
||||
case QJsonValue::Bool:
|
||||
return v.b;
|
||||
case QJsonValue::Double: {
|
||||
int c = QJsonPrivate::compressedNumber(v.dbl);
|
||||
if (c != INT_MAX)
|
||||
return c;
|
||||
}
|
||||
// fall through
|
||||
case QJsonValue::String:
|
||||
case QJsonValue::Array:
|
||||
case QJsonValue::Object:
|
||||
return offset;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*!
|
||||
\internal
|
||||
*/
|
||||
void Value::copyData(const QJsonValue &v, char *dest, bool compressed)
|
||||
{
|
||||
switch (v.t) {
|
||||
case QJsonValue::Double:
|
||||
if (!compressed) {
|
||||
qToLittleEndian(v.ui, (uchar *)dest);
|
||||
}
|
||||
break;
|
||||
case QJsonValue::String: {
|
||||
QString str = v.toString();
|
||||
QJsonPrivate::copyString(dest, str, compressed);
|
||||
break;
|
||||
}
|
||||
case QJsonValue::Array:
|
||||
case QJsonValue::Object: {
|
||||
const QJsonPrivate::Base *b = v.base;
|
||||
if (!b)
|
||||
b = (v.t == QJsonValue::Array ? &emptyArray : &emptyObject);
|
||||
memcpy(dest, b, b->size);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace QJsonPrivate
|
||||
|
||||
QT_END_NAMESPACE
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/
|
||||
**
|
||||
** This file is part of the QtCore module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** GNU Lesser General Public License Usage
|
||||
** This file may be used under the terms of the GNU Lesser General Public
|
||||
** License version 2.1 as published by the Free Software Foundation and
|
||||
** appearing in the file LICENSE.LGPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU Lesser
|
||||
** General Public License version 2.1 requirements will be met:
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License version 3.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU General
|
||||
** Public License version 3.0 requirements will be met:
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Other Usage
|
||||
** Alternatively, this file may be used in accordance with the terms and
|
||||
** conditions contained in a signed written agreement between you and Nokia.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "qjson_p.h"
|
||||
#include <qalgorithms.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
namespace QJsonPrivate
|
||||
{
|
||||
|
||||
#ifdef Q_LITTLE_ENDIAN
|
||||
#define Q_TO_LITTLE_ENDIAN(x) (x)
|
||||
#else
|
||||
#define Q_TO_LITTLE_ENDIAN(x) ( ((x & 0xff) << 24) | ((x & 0xff00) << 8) | ((x & 0xff0000) >> 8) | ((x & 0xff000000) >> 24) )
|
||||
#endif
|
||||
|
||||
static const Base emptyArray = { { Q_TO_LITTLE_ENDIAN(sizeof(Base)) }, { 0 }, { 0 } };
|
||||
static const Base emptyObject = { { Q_TO_LITTLE_ENDIAN(sizeof(Base)) }, { 0 }, { 0 } };
|
||||
|
||||
|
||||
void Data::compact()
|
||||
{
|
||||
Q_ASSERT(sizeof(Value) == sizeof(offset));
|
||||
|
||||
if (!compactionCounter)
|
||||
return;
|
||||
|
||||
Base *base = header->root();
|
||||
int reserve = 0;
|
||||
if (base->is_object) {
|
||||
Object *o = static_cast<Object *>(base);
|
||||
for (int i = 0; i < (int)o->length; ++i)
|
||||
reserve += o->entryAt(i)->usedStorage(o);
|
||||
} else {
|
||||
Array *a = static_cast<Array *>(base);
|
||||
for (int i = 0; i < (int)a->length; ++i)
|
||||
reserve += (*a)[i].usedStorage(a);
|
||||
}
|
||||
|
||||
int size = sizeof(Base) + reserve + base->length*sizeof(offset);
|
||||
int alloc = sizeof(Header) + size;
|
||||
Header *h = (Header *) malloc(alloc);
|
||||
h->tag = QJsonDocument::BinaryFormatTag;
|
||||
h->version = 1;
|
||||
Base *b = h->root();
|
||||
b->size = size;
|
||||
b->is_object = header->root()->is_object;
|
||||
b->length = base->length;
|
||||
b->tableOffset = reserve + sizeof(Array);
|
||||
|
||||
int offset = sizeof(Base);
|
||||
if (b->is_object) {
|
||||
Object *o = static_cast<Object *>(base);
|
||||
Object *no = static_cast<Object *>(b);
|
||||
|
||||
for (int i = 0; i < (int)o->length; ++i) {
|
||||
no->table()[i] = offset;
|
||||
|
||||
const Entry *e = o->entryAt(i);
|
||||
Entry *ne = no->entryAt(i);
|
||||
int s = e->size();
|
||||
memcpy(ne, e, s);
|
||||
offset += s;
|
||||
int dataSize = e->value.usedStorage(o);
|
||||
if (dataSize) {
|
||||
memcpy((char *)no + offset, e->value.data(o), dataSize);
|
||||
ne->value.value = offset;
|
||||
offset += dataSize;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Array *a = static_cast<Array *>(base);
|
||||
Array *na = static_cast<Array *>(b);
|
||||
|
||||
for (int i = 0; i < (int)a->length; ++i) {
|
||||
const Value &v = (*a)[i];
|
||||
Value &nv = (*na)[i];
|
||||
nv = v;
|
||||
int dataSize = v.usedStorage(a);
|
||||
if (dataSize) {
|
||||
memcpy((char *)na + offset, v.data(a), dataSize);
|
||||
nv.value = offset;
|
||||
offset += dataSize;
|
||||
}
|
||||
}
|
||||
}
|
||||
Q_ASSERT(offset == (int)b->tableOffset);
|
||||
|
||||
free(header);
|
||||
header = h;
|
||||
this->alloc = alloc;
|
||||
compactionCounter = 0;
|
||||
}
|
||||
|
||||
bool Data::valid() const
|
||||
{
|
||||
if (header->tag != QJsonDocument::BinaryFormatTag || header->version != 1u)
|
||||
return false;
|
||||
|
||||
bool res = false;
|
||||
if (header->root()->is_object)
|
||||
res = static_cast<Object *>(header->root())->isValid();
|
||||
else
|
||||
res = static_cast<Array *>(header->root())->isValid();
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
int Base::reserveSpace(uint dataSize, int posInTable, uint numItems, bool replace)
|
||||
{
|
||||
Q_ASSERT(posInTable >= 0 && posInTable <= (int)length);
|
||||
|
||||
offset off = tableOffset;
|
||||
// move table to new position
|
||||
if (replace) {
|
||||
memmove((char *)(table()) + dataSize, table(), length*sizeof(offset));
|
||||
} else {
|
||||
memmove((char *)(table() + posInTable + numItems) + dataSize, table() + posInTable, (length - posInTable)*sizeof(offset));
|
||||
memmove((char *)(table()) + dataSize, table(), posInTable*sizeof(offset));
|
||||
}
|
||||
tableOffset += dataSize;
|
||||
for (int i = 0; i < (int)numItems; ++i)
|
||||
table()[posInTable + i] = off;
|
||||
size += dataSize;
|
||||
if (!replace) {
|
||||
length += numItems;
|
||||
size += numItems * sizeof(offset);
|
||||
}
|
||||
return off;
|
||||
}
|
||||
|
||||
void Base::removeItems(int pos, int numItems)
|
||||
{
|
||||
Q_ASSERT(pos >= 0 && pos <= (int)length);
|
||||
if (pos + numItems < (int)length)
|
||||
memmove(table() + pos, table() + pos + numItems, (length - pos - numItems)*sizeof(offset));
|
||||
length -= numItems;
|
||||
}
|
||||
|
||||
int Object::indexOf(const QString &key, bool *exists)
|
||||
{
|
||||
int min = 0;
|
||||
int n = length;
|
||||
while (n > 0) {
|
||||
int half = n >> 1;
|
||||
int middle = min + half;
|
||||
if (*entryAt(middle) >= key) {
|
||||
n = half;
|
||||
} else {
|
||||
min = middle + 1;
|
||||
n -= half + 1;
|
||||
}
|
||||
}
|
||||
if (min < (int)length && *entryAt(min) == key) {
|
||||
*exists = true;
|
||||
return min;
|
||||
}
|
||||
*exists = false;
|
||||
return min;
|
||||
}
|
||||
|
||||
bool Object::isValid() const
|
||||
{
|
||||
if (tableOffset + length*sizeof(offset) > size)
|
||||
return false;
|
||||
|
||||
for (uint i = 0; i < length; ++i) {
|
||||
offset entryOffset = table()[i];
|
||||
if (entryOffset + sizeof(Entry) >= tableOffset)
|
||||
return false;
|
||||
Entry *e = entryAt(i);
|
||||
int s = e->size();
|
||||
if (table()[i] + s > tableOffset)
|
||||
return false;
|
||||
if (!e->value.isValid(this))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool Array::isValid() const
|
||||
{
|
||||
if (tableOffset + length*sizeof(offset) > size)
|
||||
return false;
|
||||
|
||||
for (uint i = 0; i < length; ++i) {
|
||||
if (!at(i).isValid(this))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool Entry::operator ==(const QString &key) const
|
||||
{
|
||||
if (value.latinKey)
|
||||
return (shallowLatin1Key() == key);
|
||||
else
|
||||
return (shallowKey() == key);
|
||||
}
|
||||
|
||||
bool Entry::operator >=(const QString &key) const
|
||||
{
|
||||
if (value.latinKey)
|
||||
return (shallowLatin1Key() >= key);
|
||||
else
|
||||
return (shallowKey() >= key);
|
||||
}
|
||||
|
||||
bool Entry::operator ==(const Entry &other) const
|
||||
{
|
||||
if (value.latinKey) {
|
||||
if (other.value.latinKey)
|
||||
return shallowLatin1Key() == other.shallowLatin1Key();
|
||||
return shallowLatin1Key() == other.shallowKey();
|
||||
} else if (other.value.latinKey) {
|
||||
return shallowKey() == other.shallowLatin1Key();
|
||||
}
|
||||
return shallowKey() == other.shallowKey();
|
||||
}
|
||||
|
||||
bool Entry::operator >=(const Entry &other) const
|
||||
{
|
||||
if (value.latinKey) {
|
||||
if (other.value.latinKey)
|
||||
return shallowLatin1Key() >= other.shallowLatin1Key();
|
||||
return shallowLatin1Key() >= other.shallowKey();
|
||||
} else if (other.value.latinKey) {
|
||||
return shallowKey() >= other.shallowLatin1Key();
|
||||
}
|
||||
return shallowKey() >= other.shallowKey();
|
||||
}
|
||||
|
||||
|
||||
int Value::usedStorage(const Base *b) const
|
||||
{
|
||||
int s = 0;
|
||||
switch (type) {
|
||||
case QJsonValue::Double:
|
||||
if (latinOrIntValue)
|
||||
break;
|
||||
s = sizeof(double);
|
||||
break;
|
||||
case QJsonValue::String: {
|
||||
char *d = data(b);
|
||||
if (latinOrIntValue)
|
||||
s = sizeof(ushort) + *(ushort *)d;
|
||||
else
|
||||
s = sizeof(int) + sizeof(ushort)*(*(int *)d);
|
||||
break;
|
||||
}
|
||||
case QJsonValue::Array:
|
||||
case QJsonValue::Object:
|
||||
s = base(b)->size;
|
||||
break;
|
||||
case QJsonValue::Null:
|
||||
case QJsonValue::Bool:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return alignedSize(s);
|
||||
}
|
||||
|
||||
bool Value::isValid(const Base *b) const
|
||||
{
|
||||
int offset = 0;
|
||||
switch (type) {
|
||||
case QJsonValue::Double:
|
||||
if (latinOrIntValue)
|
||||
break;
|
||||
// fall through
|
||||
case QJsonValue::String:
|
||||
case QJsonValue::Array:
|
||||
case QJsonValue::Object:
|
||||
offset = value;
|
||||
break;
|
||||
case QJsonValue::Null:
|
||||
case QJsonValue::Bool:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (!offset)
|
||||
return true;
|
||||
if (offset + sizeof(uint) > b->tableOffset)
|
||||
return false;
|
||||
|
||||
int s = usedStorage(b);
|
||||
if (!s)
|
||||
return true;
|
||||
if (s < 0 || offset + s > (int)b->tableOffset)
|
||||
return false;
|
||||
if (type == QJsonValue::Array)
|
||||
return static_cast<Array *>(base(b))->isValid();
|
||||
if (type == QJsonValue::Object)
|
||||
return static_cast<Object *>(base(b))->isValid();
|
||||
return true;
|
||||
}
|
||||
|
||||
/*!
|
||||
\internal
|
||||
*/
|
||||
int Value::requiredStorage(const QJsonValue &v, bool *compressed)
|
||||
{
|
||||
*compressed = false;
|
||||
switch (v.t) {
|
||||
case QJsonValue::Double:
|
||||
if (QJsonPrivate::compressedNumber(v.dbl) != INT_MAX) {
|
||||
*compressed = true;
|
||||
return 0;
|
||||
}
|
||||
return sizeof(double);
|
||||
case QJsonValue::String: {
|
||||
QString s = v.toString();
|
||||
*compressed = QJsonPrivate::useCompressed(s);
|
||||
return QJsonPrivate::qStringSize(s, *compressed);
|
||||
}
|
||||
case QJsonValue::Array:
|
||||
case QJsonValue::Object:
|
||||
return v.base ? v.base->size : sizeof(QJsonPrivate::Base);
|
||||
case QJsonValue::Undefined:
|
||||
case QJsonValue::Null:
|
||||
case QJsonValue::Bool:
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*!
|
||||
\internal
|
||||
*/
|
||||
uint Value::valueToStore(const QJsonValue &v, uint offset)
|
||||
{
|
||||
switch (v.t) {
|
||||
case QJsonValue::Undefined:
|
||||
case QJsonValue::Null:
|
||||
break;
|
||||
case QJsonValue::Bool:
|
||||
return v.b;
|
||||
case QJsonValue::Double: {
|
||||
int c = QJsonPrivate::compressedNumber(v.dbl);
|
||||
if (c != INT_MAX)
|
||||
return c;
|
||||
}
|
||||
// fall through
|
||||
case QJsonValue::String:
|
||||
case QJsonValue::Array:
|
||||
case QJsonValue::Object:
|
||||
return offset;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*!
|
||||
\internal
|
||||
*/
|
||||
void Value::copyData(const QJsonValue &v, char *dest, bool compressed)
|
||||
{
|
||||
switch (v.t) {
|
||||
case QJsonValue::Double:
|
||||
if (!compressed) {
|
||||
qToLittleEndian(v.ui, (uchar *)dest);
|
||||
}
|
||||
break;
|
||||
case QJsonValue::String: {
|
||||
QString str = v.toString();
|
||||
QJsonPrivate::copyString(dest, str, compressed);
|
||||
break;
|
||||
}
|
||||
case QJsonValue::Array:
|
||||
case QJsonValue::Object: {
|
||||
const QJsonPrivate::Base *b = v.base;
|
||||
if (!b)
|
||||
b = (v.t == QJsonValue::Array ? &emptyArray : &emptyObject);
|
||||
memcpy(dest, b, b->size);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace QJsonPrivate
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
+765
-765
File diff suppressed because it is too large
Load Diff
+1017
-1017
File diff suppressed because it is too large
Load Diff
+224
-224
@@ -1,224 +1,224 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/
|
||||
**
|
||||
** This file is part of the QtCore module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** GNU Lesser General Public License Usage
|
||||
** This file may be used under the terms of the GNU Lesser General Public
|
||||
** License version 2.1 as published by the Free Software Foundation and
|
||||
** appearing in the file LICENSE.LGPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU Lesser
|
||||
** General Public License version 2.1 requirements will be met:
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License version 3.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU General
|
||||
** Public License version 3.0 requirements will be met:
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Other Usage
|
||||
** Alternatively, this file may be used in accordance with the terms and
|
||||
** conditions contained in a signed written agreement between you and Nokia.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QJSONARRAY_H
|
||||
#define QJSONARRAY_H
|
||||
|
||||
#include "qjsonvalue.h"
|
||||
#include <QtCore/qiterator.h>
|
||||
|
||||
QT_BEGIN_HEADER
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
class QDebug;
|
||||
class QStringList;
|
||||
template <typename T> class QList;
|
||||
typedef QList<QVariant> QVariantList;
|
||||
|
||||
class Q_JSONRPC_EXPORT QJsonArray
|
||||
{
|
||||
public:
|
||||
QJsonArray();
|
||||
~QJsonArray();
|
||||
|
||||
QJsonArray(const QJsonArray &other);
|
||||
QJsonArray &operator =(const QJsonArray &other);
|
||||
|
||||
static QJsonArray fromStringList(const QStringList &list);
|
||||
static QJsonArray fromVariantList(const QVariantList &list);
|
||||
QVariantList toVariantList() const;
|
||||
|
||||
int size() const;
|
||||
inline int count() const { return size(); }
|
||||
|
||||
bool isEmpty() const;
|
||||
QJsonValue at(int i) const;
|
||||
QJsonValue first() const;
|
||||
QJsonValue last() const;
|
||||
|
||||
void prepend(const QJsonValue &value);
|
||||
void append(const QJsonValue &value);
|
||||
void removeAt(int i);
|
||||
QJsonValue takeAt(int i);
|
||||
inline void removeFirst() { removeAt(0); }
|
||||
inline void removeLast() { removeAt(size() - 1); }
|
||||
|
||||
void insert(int i, const QJsonValue &value);
|
||||
void replace(int i, const QJsonValue &value);
|
||||
|
||||
bool contains(const QJsonValue &element) const;
|
||||
QJsonValueRef operator[](int i);
|
||||
QJsonValue operator[](int i) const;
|
||||
|
||||
bool operator==(const QJsonArray &other) const;
|
||||
bool operator!=(const QJsonArray &other) const;
|
||||
|
||||
class const_iterator;
|
||||
|
||||
class iterator {
|
||||
public:
|
||||
QJsonArray *a;
|
||||
int i;
|
||||
typedef std::random_access_iterator_tag iterator_category;
|
||||
typedef int difference_type;
|
||||
typedef QJsonValue value_type;
|
||||
//typedef T *pointer;
|
||||
typedef QJsonValueRef reference;
|
||||
|
||||
inline iterator() : a(0), i(0) { }
|
||||
explicit inline iterator(QJsonArray *array, int index) : a(array), i(index) { }
|
||||
|
||||
inline QJsonValueRef operator*() const { return QJsonValueRef(a, i); }
|
||||
//inline T *operator->() const { return &concrete(i)->value; }
|
||||
inline QJsonValueRef operator[](int j) const { return QJsonValueRef(a, i + j); }
|
||||
|
||||
inline bool operator==(const iterator &o) const { return i == o.i; }
|
||||
inline bool operator!=(const iterator &o) const { return i != o.i; }
|
||||
inline bool operator<(const iterator& other) const { return i < other.i; }
|
||||
inline bool operator<=(const iterator& other) const { return i <= other.i; }
|
||||
inline bool operator>(const iterator& other) const { return i > other.i; }
|
||||
inline bool operator>=(const iterator& other) const { return i >= other.i; }
|
||||
inline bool operator==(const const_iterator &o) const { return i == o.i; }
|
||||
inline bool operator!=(const const_iterator &o) const { return i != o.i; }
|
||||
inline bool operator<(const const_iterator& other) const { return i < other.i; }
|
||||
inline bool operator<=(const const_iterator& other) const { return i <= other.i; }
|
||||
inline bool operator>(const const_iterator& other) const { return i > other.i; }
|
||||
inline bool operator>=(const const_iterator& other) const { return i >= other.i; }
|
||||
inline iterator &operator++() { ++i; return *this; }
|
||||
inline iterator operator++(int) { iterator n = *this; ++i; return n; }
|
||||
inline iterator &operator--() { i--; return *this; }
|
||||
inline iterator operator--(int) { iterator n = *this; i--; return n; }
|
||||
inline iterator &operator+=(int j) { i+=j; return *this; }
|
||||
inline iterator &operator-=(int j) { i-=j; return *this; }
|
||||
inline iterator operator+(int j) const { return iterator(a, i+j); }
|
||||
inline iterator operator-(int j) const { return iterator(a, i-j); }
|
||||
inline int operator-(iterator j) const { return i - j.i; }
|
||||
};
|
||||
friend class iterator;
|
||||
|
||||
class const_iterator {
|
||||
public:
|
||||
const QJsonArray *a;
|
||||
int i;
|
||||
typedef std::random_access_iterator_tag iterator_category;
|
||||
typedef qptrdiff difference_type;
|
||||
typedef QJsonValue value_type;
|
||||
//typedef const T *pointer;
|
||||
typedef QJsonValue reference;
|
||||
|
||||
inline const_iterator() : a(0), i(0) { }
|
||||
explicit inline const_iterator(const QJsonArray *array, int index) : a(array), i(index) { }
|
||||
inline const_iterator(const const_iterator &o) : a(o.a), i(o.i) {}
|
||||
inline const_iterator(const iterator &o) : a(o.a), i(o.i) {}
|
||||
|
||||
inline QJsonValue operator*() const { return a->at(i); }
|
||||
//inline T *operator->() const { return &concrete(i)->value; }
|
||||
inline QJsonValue operator[](int j) const { return a->at(i+j); }
|
||||
inline bool operator==(const const_iterator &o) const { return i == o.i; }
|
||||
inline bool operator!=(const const_iterator &o) const { return i != o.i; }
|
||||
inline bool operator<(const const_iterator& other) const { return i < other.i; }
|
||||
inline bool operator<=(const const_iterator& other) const { return i <= other.i; }
|
||||
inline bool operator>(const const_iterator& other) const { return i > other.i; }
|
||||
inline bool operator>=(const const_iterator& other) const { return i >= other.i; }
|
||||
inline const_iterator &operator++() { ++i; return *this; }
|
||||
inline const_iterator operator++(int) { const_iterator n = *this; ++i; return n; }
|
||||
inline const_iterator &operator--() { i--; return *this; }
|
||||
inline const_iterator operator--(int) { const_iterator n = *this; i--; return n; }
|
||||
inline const_iterator &operator+=(int j) { i+=j; return *this; }
|
||||
inline const_iterator &operator-=(int j) { i-=j; return *this; }
|
||||
inline const_iterator operator+(int j) const { return const_iterator(a, i+j); }
|
||||
inline const_iterator operator-(int j) const { return const_iterator(a, i-j); }
|
||||
inline int operator-(const_iterator j) const { return i - j.i; }
|
||||
};
|
||||
friend class const_iterator;
|
||||
|
||||
// stl style
|
||||
inline iterator begin() { detach(); return iterator(this, 0); }
|
||||
inline const_iterator begin() const { return const_iterator(this, 0); }
|
||||
inline const_iterator constBegin() const { return const_iterator(this, 0); }
|
||||
inline iterator end() { detach(); return iterator(this, size()); }
|
||||
inline const_iterator end() const { return const_iterator(this, size()); }
|
||||
inline const_iterator constEnd() const { return const_iterator(this, size()); }
|
||||
iterator insert(iterator before, const QJsonValue &value) { insert(before.i, value); return before; }
|
||||
iterator erase(iterator pos) { removeAt(pos.i); return pos; }
|
||||
|
||||
// more Qt
|
||||
typedef iterator Iterator;
|
||||
typedef const_iterator ConstIterator;
|
||||
|
||||
// stl compatibility
|
||||
inline void push_back(const QJsonValue &t) { append(t); }
|
||||
inline void push_front(const QJsonValue &t) { prepend(t); }
|
||||
inline void pop_front() { removeFirst(); }
|
||||
inline void pop_back() { removeLast(); }
|
||||
inline bool empty() const { return isEmpty(); }
|
||||
typedef int size_type;
|
||||
typedef QJsonValue value_type;
|
||||
typedef value_type *pointer;
|
||||
typedef const value_type *const_pointer;
|
||||
typedef QJsonValueRef reference;
|
||||
typedef QJsonValue const_reference;
|
||||
typedef int difference_type;
|
||||
|
||||
private:
|
||||
friend class QJsonPrivate::Data;
|
||||
friend class QJsonValue;
|
||||
friend class QJsonDocument;
|
||||
friend Q_JSONRPC_EXPORT QDebug operator<<(QDebug, const QJsonArray &);
|
||||
|
||||
QJsonArray(QJsonPrivate::Data *data, QJsonPrivate::Array *array);
|
||||
void compact();
|
||||
void detach(uint reserve = 0);
|
||||
|
||||
QJsonPrivate::Data *d;
|
||||
QJsonPrivate::Array *a;
|
||||
};
|
||||
|
||||
#ifndef QT_NO_DEBUG_STREAM
|
||||
Q_JSONRPC_EXPORT QDebug operator<<(QDebug, const QJsonArray &);
|
||||
#endif
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
||||
#endif // QJSONARRAY_H
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/
|
||||
**
|
||||
** This file is part of the QtCore module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** GNU Lesser General Public License Usage
|
||||
** This file may be used under the terms of the GNU Lesser General Public
|
||||
** License version 2.1 as published by the Free Software Foundation and
|
||||
** appearing in the file LICENSE.LGPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU Lesser
|
||||
** General Public License version 2.1 requirements will be met:
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License version 3.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU General
|
||||
** Public License version 3.0 requirements will be met:
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Other Usage
|
||||
** Alternatively, this file may be used in accordance with the terms and
|
||||
** conditions contained in a signed written agreement between you and Nokia.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QJSONARRAY_H
|
||||
#define QJSONARRAY_H
|
||||
|
||||
#include "qjsonvalue.h"
|
||||
#include <QtCore/qiterator.h>
|
||||
|
||||
QT_BEGIN_HEADER
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
class QDebug;
|
||||
class QStringList;
|
||||
template <typename T> class QList;
|
||||
typedef QList<QVariant> QVariantList;
|
||||
|
||||
class Q_JSONRPC_EXPORT QJsonArray
|
||||
{
|
||||
public:
|
||||
QJsonArray();
|
||||
~QJsonArray();
|
||||
|
||||
QJsonArray(const QJsonArray &other);
|
||||
QJsonArray &operator =(const QJsonArray &other);
|
||||
|
||||
static QJsonArray fromStringList(const QStringList &list);
|
||||
static QJsonArray fromVariantList(const QVariantList &list);
|
||||
QVariantList toVariantList() const;
|
||||
|
||||
int size() const;
|
||||
inline int count() const { return size(); }
|
||||
|
||||
bool isEmpty() const;
|
||||
QJsonValue at(int i) const;
|
||||
QJsonValue first() const;
|
||||
QJsonValue last() const;
|
||||
|
||||
void prepend(const QJsonValue &value);
|
||||
void append(const QJsonValue &value);
|
||||
void removeAt(int i);
|
||||
QJsonValue takeAt(int i);
|
||||
inline void removeFirst() { removeAt(0); }
|
||||
inline void removeLast() { removeAt(size() - 1); }
|
||||
|
||||
void insert(int i, const QJsonValue &value);
|
||||
void replace(int i, const QJsonValue &value);
|
||||
|
||||
bool contains(const QJsonValue &element) const;
|
||||
QJsonValueRef operator[](int i);
|
||||
QJsonValue operator[](int i) const;
|
||||
|
||||
bool operator==(const QJsonArray &other) const;
|
||||
bool operator!=(const QJsonArray &other) const;
|
||||
|
||||
class const_iterator;
|
||||
|
||||
class iterator {
|
||||
public:
|
||||
QJsonArray *a;
|
||||
int i;
|
||||
typedef std::random_access_iterator_tag iterator_category;
|
||||
typedef int difference_type;
|
||||
typedef QJsonValue value_type;
|
||||
//typedef T *pointer;
|
||||
typedef QJsonValueRef reference;
|
||||
|
||||
inline iterator() : a(0), i(0) { }
|
||||
explicit inline iterator(QJsonArray *array, int index) : a(array), i(index) { }
|
||||
|
||||
inline QJsonValueRef operator*() const { return QJsonValueRef(a, i); }
|
||||
//inline T *operator->() const { return &concrete(i)->value; }
|
||||
inline QJsonValueRef operator[](int j) const { return QJsonValueRef(a, i + j); }
|
||||
|
||||
inline bool operator==(const iterator &o) const { return i == o.i; }
|
||||
inline bool operator!=(const iterator &o) const { return i != o.i; }
|
||||
inline bool operator<(const iterator& other) const { return i < other.i; }
|
||||
inline bool operator<=(const iterator& other) const { return i <= other.i; }
|
||||
inline bool operator>(const iterator& other) const { return i > other.i; }
|
||||
inline bool operator>=(const iterator& other) const { return i >= other.i; }
|
||||
inline bool operator==(const const_iterator &o) const { return i == o.i; }
|
||||
inline bool operator!=(const const_iterator &o) const { return i != o.i; }
|
||||
inline bool operator<(const const_iterator& other) const { return i < other.i; }
|
||||
inline bool operator<=(const const_iterator& other) const { return i <= other.i; }
|
||||
inline bool operator>(const const_iterator& other) const { return i > other.i; }
|
||||
inline bool operator>=(const const_iterator& other) const { return i >= other.i; }
|
||||
inline iterator &operator++() { ++i; return *this; }
|
||||
inline iterator operator++(int) { iterator n = *this; ++i; return n; }
|
||||
inline iterator &operator--() { i--; return *this; }
|
||||
inline iterator operator--(int) { iterator n = *this; i--; return n; }
|
||||
inline iterator &operator+=(int j) { i+=j; return *this; }
|
||||
inline iterator &operator-=(int j) { i-=j; return *this; }
|
||||
inline iterator operator+(int j) const { return iterator(a, i+j); }
|
||||
inline iterator operator-(int j) const { return iterator(a, i-j); }
|
||||
inline int operator-(iterator j) const { return i - j.i; }
|
||||
};
|
||||
friend class iterator;
|
||||
|
||||
class const_iterator {
|
||||
public:
|
||||
const QJsonArray *a;
|
||||
int i;
|
||||
typedef std::random_access_iterator_tag iterator_category;
|
||||
typedef qptrdiff difference_type;
|
||||
typedef QJsonValue value_type;
|
||||
//typedef const T *pointer;
|
||||
typedef QJsonValue reference;
|
||||
|
||||
inline const_iterator() : a(0), i(0) { }
|
||||
explicit inline const_iterator(const QJsonArray *array, int index) : a(array), i(index) { }
|
||||
inline const_iterator(const const_iterator &o) : a(o.a), i(o.i) {}
|
||||
inline const_iterator(const iterator &o) : a(o.a), i(o.i) {}
|
||||
|
||||
inline QJsonValue operator*() const { return a->at(i); }
|
||||
//inline T *operator->() const { return &concrete(i)->value; }
|
||||
inline QJsonValue operator[](int j) const { return a->at(i+j); }
|
||||
inline bool operator==(const const_iterator &o) const { return i == o.i; }
|
||||
inline bool operator!=(const const_iterator &o) const { return i != o.i; }
|
||||
inline bool operator<(const const_iterator& other) const { return i < other.i; }
|
||||
inline bool operator<=(const const_iterator& other) const { return i <= other.i; }
|
||||
inline bool operator>(const const_iterator& other) const { return i > other.i; }
|
||||
inline bool operator>=(const const_iterator& other) const { return i >= other.i; }
|
||||
inline const_iterator &operator++() { ++i; return *this; }
|
||||
inline const_iterator operator++(int) { const_iterator n = *this; ++i; return n; }
|
||||
inline const_iterator &operator--() { i--; return *this; }
|
||||
inline const_iterator operator--(int) { const_iterator n = *this; i--; return n; }
|
||||
inline const_iterator &operator+=(int j) { i+=j; return *this; }
|
||||
inline const_iterator &operator-=(int j) { i-=j; return *this; }
|
||||
inline const_iterator operator+(int j) const { return const_iterator(a, i+j); }
|
||||
inline const_iterator operator-(int j) const { return const_iterator(a, i-j); }
|
||||
inline int operator-(const_iterator j) const { return i - j.i; }
|
||||
};
|
||||
friend class const_iterator;
|
||||
|
||||
// stl style
|
||||
inline iterator begin() { detach(); return iterator(this, 0); }
|
||||
inline const_iterator begin() const { return const_iterator(this, 0); }
|
||||
inline const_iterator constBegin() const { return const_iterator(this, 0); }
|
||||
inline iterator end() { detach(); return iterator(this, size()); }
|
||||
inline const_iterator end() const { return const_iterator(this, size()); }
|
||||
inline const_iterator constEnd() const { return const_iterator(this, size()); }
|
||||
iterator insert(iterator before, const QJsonValue &value) { insert(before.i, value); return before; }
|
||||
iterator erase(iterator pos) { removeAt(pos.i); return pos; }
|
||||
|
||||
// more Qt
|
||||
typedef iterator Iterator;
|
||||
typedef const_iterator ConstIterator;
|
||||
|
||||
// stl compatibility
|
||||
inline void push_back(const QJsonValue &t) { append(t); }
|
||||
inline void push_front(const QJsonValue &t) { prepend(t); }
|
||||
inline void pop_front() { removeFirst(); }
|
||||
inline void pop_back() { removeLast(); }
|
||||
inline bool empty() const { return isEmpty(); }
|
||||
typedef int size_type;
|
||||
typedef QJsonValue value_type;
|
||||
typedef value_type *pointer;
|
||||
typedef const value_type *const_pointer;
|
||||
typedef QJsonValueRef reference;
|
||||
typedef QJsonValue const_reference;
|
||||
typedef int difference_type;
|
||||
|
||||
private:
|
||||
friend class QJsonPrivate::Data;
|
||||
friend class QJsonValue;
|
||||
friend class QJsonDocument;
|
||||
friend Q_JSONRPC_EXPORT QDebug operator<<(QDebug, const QJsonArray &);
|
||||
|
||||
QJsonArray(QJsonPrivate::Data *data, QJsonPrivate::Array *array);
|
||||
void compact();
|
||||
void detach(uint reserve = 0);
|
||||
|
||||
QJsonPrivate::Data *d;
|
||||
QJsonPrivate::Array *a;
|
||||
};
|
||||
|
||||
#ifndef QT_NO_DEBUG_STREAM
|
||||
Q_JSONRPC_EXPORT QDebug operator<<(QDebug, const QJsonArray &);
|
||||
#endif
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
||||
#endif // QJSONARRAY_H
|
||||
|
||||
+537
-537
File diff suppressed because it is too large
Load Diff
+146
-146
@@ -1,146 +1,146 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/
|
||||
**
|
||||
** This file is part of the QtCore module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** GNU Lesser General Public License Usage
|
||||
** This file may be used under the terms of the GNU Lesser General Public
|
||||
** License version 2.1 as published by the Free Software Foundation and
|
||||
** appearing in the file LICENSE.LGPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU Lesser
|
||||
** General Public License version 2.1 requirements will be met:
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License version 3.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU General
|
||||
** Public License version 3.0 requirements will be met:
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Other Usage
|
||||
** Alternatively, this file may be used in accordance with the terms and
|
||||
** conditions contained in a signed written agreement between you and Nokia.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QJSONDOCUMENT_H
|
||||
#define QJSONDOCUMENT_H
|
||||
|
||||
#include "qjsonvalue.h"
|
||||
|
||||
QT_BEGIN_HEADER
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
class QDebug;
|
||||
|
||||
namespace QJsonPrivate {
|
||||
class Parser;
|
||||
}
|
||||
|
||||
struct Q_JSONRPC_EXPORT QJsonParseError
|
||||
{
|
||||
enum ParseError {
|
||||
NoError = 0,
|
||||
UnterminatedObject,
|
||||
MissingNameSeparator,
|
||||
UnterminatedArray,
|
||||
MissingValueSeparator,
|
||||
IllegalValue,
|
||||
EndOfNumber,
|
||||
IllegalNumber,
|
||||
StringEscapeSequence,
|
||||
StringUTF8Scan,
|
||||
EndOfString,
|
||||
MissingObject
|
||||
};
|
||||
|
||||
int offset;
|
||||
ParseError error;
|
||||
};
|
||||
|
||||
class Q_JSONRPC_EXPORT QJsonDocument
|
||||
{
|
||||
public:
|
||||
#ifdef Q_LITTLE_ENDIAN
|
||||
static const uint BinaryFormatTag = ('q') | ('b' << 8) | ('j' << 16) | ('s' << 24);
|
||||
#else
|
||||
static const uint BinaryFormatTag = ('q' << 24) | ('b' << 16) | ('j' << 8) | ('s');
|
||||
#endif
|
||||
|
||||
QJsonDocument();
|
||||
explicit QJsonDocument(const QJsonObject &object);
|
||||
explicit QJsonDocument(const QJsonArray &array);
|
||||
~QJsonDocument();
|
||||
|
||||
QJsonDocument(const QJsonDocument &other);
|
||||
QJsonDocument &operator =(const QJsonDocument &other);
|
||||
|
||||
enum DataValidation {
|
||||
Validate,
|
||||
BypassValidation
|
||||
};
|
||||
|
||||
static QJsonDocument fromRawData(const char *data, int size, DataValidation validation = Validate);
|
||||
const char *rawData(int *size) const;
|
||||
|
||||
static QJsonDocument fromBinaryData(const QByteArray &data, DataValidation validation = Validate);
|
||||
QByteArray toBinaryData() const;
|
||||
|
||||
static QJsonDocument fromVariant(const QVariant &variant);
|
||||
QVariant toVariant() const;
|
||||
|
||||
static QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error = 0);
|
||||
QByteArray toJson() const;
|
||||
|
||||
bool isEmpty() const;
|
||||
bool isArray() const;
|
||||
bool isObject() const;
|
||||
|
||||
QJsonObject object() const;
|
||||
QJsonArray array() const;
|
||||
|
||||
void setObject(const QJsonObject &object);
|
||||
void setArray(const QJsonArray &array);
|
||||
|
||||
bool operator==(const QJsonDocument &other) const;
|
||||
bool operator!=(const QJsonDocument &other) const { return !(*this == other); }
|
||||
|
||||
bool isNull() const;
|
||||
|
||||
private:
|
||||
friend class QJsonValue;
|
||||
friend class QJsonPrivate::Data;
|
||||
friend class QJsonPrivate::Parser;
|
||||
friend Q_JSONRPC_EXPORT QDebug operator<<(QDebug, const QJsonDocument &);
|
||||
|
||||
QJsonDocument(QJsonPrivate::Data *data);
|
||||
|
||||
QJsonPrivate::Data *d;
|
||||
};
|
||||
|
||||
#ifndef QT_NO_DEBUG_STREAM
|
||||
Q_JSONRPC_EXPORT QDebug operator<<(QDebug, const QJsonDocument &);
|
||||
#endif
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
||||
#endif // QJSONDOCUMENT_H
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/
|
||||
**
|
||||
** This file is part of the QtCore module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** GNU Lesser General Public License Usage
|
||||
** This file may be used under the terms of the GNU Lesser General Public
|
||||
** License version 2.1 as published by the Free Software Foundation and
|
||||
** appearing in the file LICENSE.LGPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU Lesser
|
||||
** General Public License version 2.1 requirements will be met:
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License version 3.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU General
|
||||
** Public License version 3.0 requirements will be met:
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Other Usage
|
||||
** Alternatively, this file may be used in accordance with the terms and
|
||||
** conditions contained in a signed written agreement between you and Nokia.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QJSONDOCUMENT_H
|
||||
#define QJSONDOCUMENT_H
|
||||
|
||||
#include "qjsonvalue.h"
|
||||
|
||||
QT_BEGIN_HEADER
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
class QDebug;
|
||||
|
||||
namespace QJsonPrivate {
|
||||
class Parser;
|
||||
}
|
||||
|
||||
struct Q_JSONRPC_EXPORT QJsonParseError
|
||||
{
|
||||
enum ParseError {
|
||||
NoError = 0,
|
||||
UnterminatedObject,
|
||||
MissingNameSeparator,
|
||||
UnterminatedArray,
|
||||
MissingValueSeparator,
|
||||
IllegalValue,
|
||||
EndOfNumber,
|
||||
IllegalNumber,
|
||||
StringEscapeSequence,
|
||||
StringUTF8Scan,
|
||||
EndOfString,
|
||||
MissingObject
|
||||
};
|
||||
|
||||
int offset;
|
||||
ParseError error;
|
||||
};
|
||||
|
||||
class Q_JSONRPC_EXPORT QJsonDocument
|
||||
{
|
||||
public:
|
||||
#ifdef Q_LITTLE_ENDIAN
|
||||
static const uint BinaryFormatTag = ('q') | ('b' << 8) | ('j' << 16) | ('s' << 24);
|
||||
#else
|
||||
static const uint BinaryFormatTag = ('q' << 24) | ('b' << 16) | ('j' << 8) | ('s');
|
||||
#endif
|
||||
|
||||
QJsonDocument();
|
||||
explicit QJsonDocument(const QJsonObject &object);
|
||||
explicit QJsonDocument(const QJsonArray &array);
|
||||
~QJsonDocument();
|
||||
|
||||
QJsonDocument(const QJsonDocument &other);
|
||||
QJsonDocument &operator =(const QJsonDocument &other);
|
||||
|
||||
enum DataValidation {
|
||||
Validate,
|
||||
BypassValidation
|
||||
};
|
||||
|
||||
static QJsonDocument fromRawData(const char *data, int size, DataValidation validation = Validate);
|
||||
const char *rawData(int *size) const;
|
||||
|
||||
static QJsonDocument fromBinaryData(const QByteArray &data, DataValidation validation = Validate);
|
||||
QByteArray toBinaryData() const;
|
||||
|
||||
static QJsonDocument fromVariant(const QVariant &variant);
|
||||
QVariant toVariant() const;
|
||||
|
||||
static QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error = 0);
|
||||
QByteArray toJson() const;
|
||||
|
||||
bool isEmpty() const;
|
||||
bool isArray() const;
|
||||
bool isObject() const;
|
||||
|
||||
QJsonObject object() const;
|
||||
QJsonArray array() const;
|
||||
|
||||
void setObject(const QJsonObject &object);
|
||||
void setArray(const QJsonArray &array);
|
||||
|
||||
bool operator==(const QJsonDocument &other) const;
|
||||
bool operator!=(const QJsonDocument &other) const { return !(*this == other); }
|
||||
|
||||
bool isNull() const;
|
||||
|
||||
private:
|
||||
friend class QJsonValue;
|
||||
friend class QJsonPrivate::Data;
|
||||
friend class QJsonPrivate::Parser;
|
||||
friend Q_JSONRPC_EXPORT QDebug operator<<(QDebug, const QJsonDocument &);
|
||||
|
||||
QJsonDocument(QJsonPrivate::Data *data);
|
||||
|
||||
QJsonPrivate::Data *d;
|
||||
};
|
||||
|
||||
#ifndef QT_NO_DEBUG_STREAM
|
||||
Q_JSONRPC_EXPORT QDebug operator<<(QDebug, const QJsonDocument &);
|
||||
#endif
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
||||
#endif // QJSONDOCUMENT_H
|
||||
|
||||
+16
-16
@@ -1,16 +1,16 @@
|
||||
|
||||
#ifndef QJSONEXPORT_H
|
||||
#define QJSONEXPORT_H
|
||||
|
||||
|
||||
#ifdef Q_JSONRPC_DLL
|
||||
# ifdef Q_BUILD_JSONRPC // build qjsonrpc Dll
|
||||
# define Q_JSONRPC_EXPORT Q_DECL_EXPORT
|
||||
# else // use qjsonrpc as Dll
|
||||
# define Q_JSONRPC_EXPORT Q_DECL_IMPORT
|
||||
# endif
|
||||
#else
|
||||
# define Q_JSONRPC_EXPORT
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef QJSONEXPORT_H
|
||||
#define QJSONEXPORT_H
|
||||
|
||||
|
||||
#ifdef Q_JSONRPC_DLL
|
||||
# ifdef Q_BUILD_JSONRPC // build qjsonrpc Dll
|
||||
# define Q_JSONRPC_EXPORT Q_DECL_EXPORT
|
||||
# else // use qjsonrpc as Dll
|
||||
# define Q_JSONRPC_EXPORT Q_DECL_IMPORT
|
||||
# endif
|
||||
#else
|
||||
# define Q_JSONRPC_EXPORT
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
+1022
-1022
File diff suppressed because it is too large
Load Diff
+219
-219
@@ -1,219 +1,219 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/
|
||||
**
|
||||
** This file is part of the QtCore module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** GNU Lesser General Public License Usage
|
||||
** This file may be used under the terms of the GNU Lesser General Public
|
||||
** License version 2.1 as published by the Free Software Foundation and
|
||||
** appearing in the file LICENSE.LGPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU Lesser
|
||||
** General Public License version 2.1 requirements will be met:
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License version 3.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU General
|
||||
** Public License version 3.0 requirements will be met:
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Other Usage
|
||||
** Alternatively, this file may be used in accordance with the terms and
|
||||
** conditions contained in a signed written agreement between you and Nokia.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QJSONOBJECT_H
|
||||
#define QJSONOBJECT_H
|
||||
|
||||
#include "qjsonvalue.h"
|
||||
#include <QtCore/qiterator.h>
|
||||
|
||||
QT_BEGIN_HEADER
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
class QDebug;
|
||||
template <class Key, class T> class QMap;
|
||||
typedef QMap<QString, QVariant> QVariantMap;
|
||||
|
||||
class Q_JSONRPC_EXPORT QJsonObject
|
||||
{
|
||||
public:
|
||||
QJsonObject();
|
||||
~QJsonObject();
|
||||
|
||||
QJsonObject(const QJsonObject &other);
|
||||
QJsonObject &operator =(const QJsonObject &other);
|
||||
|
||||
static QJsonObject fromVariantMap(const QVariantMap &map);
|
||||
QVariantMap toVariantMap() const;
|
||||
|
||||
QStringList keys() const;
|
||||
int size() const;
|
||||
inline int count() const { return size(); }
|
||||
inline int length() const { return size(); }
|
||||
bool isEmpty() const;
|
||||
|
||||
QJsonValue value(const QString &key) const;
|
||||
QJsonValue operator[] (const QString &key) const;
|
||||
QJsonValueRef operator[] (const QString &key);
|
||||
|
||||
void remove(const QString &key);
|
||||
QJsonValue take(const QString &key);
|
||||
bool contains(const QString &key) const;
|
||||
|
||||
bool operator==(const QJsonObject &other) const;
|
||||
bool operator!=(const QJsonObject &other) const;
|
||||
|
||||
class const_iterator;
|
||||
|
||||
class iterator
|
||||
{
|
||||
friend class const_iterator;
|
||||
friend class QJsonObject;
|
||||
QJsonObject *o;
|
||||
int i;
|
||||
|
||||
public:
|
||||
typedef std::bidirectional_iterator_tag iterator_category;
|
||||
typedef int difference_type;
|
||||
typedef QJsonValue value_type;
|
||||
// typedef T *pointer;
|
||||
typedef QJsonValueRef reference;
|
||||
|
||||
inline iterator() : o(0), i(0) {}
|
||||
inline iterator(QJsonObject *obj, int index) : o(obj), i(index) {}
|
||||
|
||||
inline QString key() const { return o->keyAt(i); }
|
||||
inline QJsonValueRef value() const { return QJsonValueRef(o, i); }
|
||||
inline QJsonValueRef operator*() const { return QJsonValueRef(o, i); }
|
||||
//inline T *operator->() const { return &concrete(i)->value; }
|
||||
inline bool operator==(const iterator &other) const { return i == other.i; }
|
||||
inline bool operator!=(const iterator &other) const { return i != other.i; }
|
||||
|
||||
inline iterator &operator++() { ++i; return *this; }
|
||||
inline iterator operator++(int) { iterator r = *this; ++i; return r; }
|
||||
inline iterator &operator--() { --i; return *this; }
|
||||
inline iterator operator--(int) { iterator r = *this; --i; return r; }
|
||||
inline iterator operator+(int j) const
|
||||
{ iterator r = *this; r.i += j; return r; }
|
||||
inline iterator operator-(int j) const { return operator+(-j); }
|
||||
inline iterator &operator+=(int j) { i += j; return *this; }
|
||||
inline iterator &operator-=(int j) { i -= j; return *this; }
|
||||
|
||||
public:
|
||||
inline bool operator==(const const_iterator &other) const { return i == other.i; }
|
||||
inline bool operator!=(const const_iterator &other) const { return i != other.i; }
|
||||
};
|
||||
friend class iterator;
|
||||
|
||||
class const_iterator
|
||||
{
|
||||
friend class iterator;
|
||||
const QJsonObject *o;
|
||||
int i;
|
||||
|
||||
public:
|
||||
typedef std::bidirectional_iterator_tag iterator_category;
|
||||
typedef int difference_type;
|
||||
typedef QJsonValue value_type;
|
||||
typedef QJsonValue reference;
|
||||
|
||||
inline const_iterator() : o(0), i(0) {}
|
||||
inline const_iterator(const QJsonObject *obj, int index)
|
||||
: o(obj), i(index) {}
|
||||
inline const_iterator(const iterator &other)
|
||||
: o(other.o), i(other.i) {}
|
||||
|
||||
inline QString key() const { return o->keyAt(i); }
|
||||
inline QJsonValue value() const { return o->valueAt(i); }
|
||||
inline QJsonValue operator*() const { return o->valueAt(i); }
|
||||
//inline const T *operator->() const { return &concrete(i)->value; }
|
||||
inline bool operator==(const const_iterator &other) const { return i == other.i; }
|
||||
inline bool operator!=(const const_iterator &other) const { return i != other.i; }
|
||||
|
||||
inline const_iterator &operator++() { ++i; return *this; }
|
||||
inline const_iterator operator++(int) { const_iterator r = *this; ++i; return r; }
|
||||
inline const_iterator &operator--() { --i; return *this; }
|
||||
inline const_iterator operator--(int) { const_iterator r = *this; --i; return r; }
|
||||
inline const_iterator operator+(int j) const
|
||||
{ const_iterator r = *this; r.i += j; return r; }
|
||||
inline const_iterator operator-(int j) const { return operator+(-j); }
|
||||
inline const_iterator &operator+=(int j) { i += j; return *this; }
|
||||
inline const_iterator &operator-=(int j) { i -= j; return *this; }
|
||||
|
||||
inline bool operator==(const iterator &other) const { return i == other.i; }
|
||||
inline bool operator!=(const iterator &other) const { return i != other.i; }
|
||||
};
|
||||
friend class const_iterator;
|
||||
|
||||
// STL style
|
||||
inline iterator begin() { detach(); return iterator(this, 0); }
|
||||
inline const_iterator begin() const { return const_iterator(this, 0); }
|
||||
inline const_iterator constBegin() const { return const_iterator(this, 0); }
|
||||
inline iterator end() { detach(); return iterator(this, size()); }
|
||||
inline const_iterator end() const { return const_iterator(this, size()); }
|
||||
inline const_iterator constEnd() const { return const_iterator(this, size()); }
|
||||
iterator erase(iterator it);
|
||||
|
||||
// more Qt
|
||||
typedef iterator Iterator;
|
||||
typedef const_iterator ConstIterator;
|
||||
iterator find(const QString &key);
|
||||
const_iterator find(const QString &key) const { return constFind(key); }
|
||||
const_iterator constFind(const QString &key) const;
|
||||
iterator insert(const QString &key, const QJsonValue &value);
|
||||
|
||||
// STL compatibility
|
||||
typedef QJsonValue mapped_type;
|
||||
typedef QString key_type;
|
||||
typedef int size_type;
|
||||
|
||||
inline bool empty() const { return isEmpty(); }
|
||||
|
||||
private:
|
||||
friend class QJsonPrivate::Data;
|
||||
friend class QJsonValue;
|
||||
friend class QJsonDocument;
|
||||
friend class QJsonValueRef;
|
||||
|
||||
friend Q_JSONRPC_EXPORT QDebug operator<<(QDebug, const QJsonObject &);
|
||||
|
||||
QJsonObject(QJsonPrivate::Data *data, QJsonPrivate::Object *object);
|
||||
void detach(uint reserve = 0);
|
||||
void compact();
|
||||
|
||||
QString keyAt(int i) const;
|
||||
QJsonValue valueAt(int i) const;
|
||||
void setValueAt(int i, const QJsonValue &val);
|
||||
|
||||
QJsonPrivate::Data *d;
|
||||
QJsonPrivate::Object *o;
|
||||
};
|
||||
|
||||
#ifndef QT_NO_DEBUG_STREAM
|
||||
Q_JSONRPC_EXPORT QDebug operator<<(QDebug, const QJsonObject &);
|
||||
#endif
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
||||
#endif // QJSONOBJECT_H
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/
|
||||
**
|
||||
** This file is part of the QtCore module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** GNU Lesser General Public License Usage
|
||||
** This file may be used under the terms of the GNU Lesser General Public
|
||||
** License version 2.1 as published by the Free Software Foundation and
|
||||
** appearing in the file LICENSE.LGPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU Lesser
|
||||
** General Public License version 2.1 requirements will be met:
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License version 3.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU General
|
||||
** Public License version 3.0 requirements will be met:
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Other Usage
|
||||
** Alternatively, this file may be used in accordance with the terms and
|
||||
** conditions contained in a signed written agreement between you and Nokia.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QJSONOBJECT_H
|
||||
#define QJSONOBJECT_H
|
||||
|
||||
#include "qjsonvalue.h"
|
||||
#include <QtCore/qiterator.h>
|
||||
|
||||
QT_BEGIN_HEADER
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
class QDebug;
|
||||
template <class Key, class T> class QMap;
|
||||
typedef QMap<QString, QVariant> QVariantMap;
|
||||
|
||||
class Q_JSONRPC_EXPORT QJsonObject
|
||||
{
|
||||
public:
|
||||
QJsonObject();
|
||||
~QJsonObject();
|
||||
|
||||
QJsonObject(const QJsonObject &other);
|
||||
QJsonObject &operator =(const QJsonObject &other);
|
||||
|
||||
static QJsonObject fromVariantMap(const QVariantMap &map);
|
||||
QVariantMap toVariantMap() const;
|
||||
|
||||
QStringList keys() const;
|
||||
int size() const;
|
||||
inline int count() const { return size(); }
|
||||
inline int length() const { return size(); }
|
||||
bool isEmpty() const;
|
||||
|
||||
QJsonValue value(const QString &key) const;
|
||||
QJsonValue operator[] (const QString &key) const;
|
||||
QJsonValueRef operator[] (const QString &key);
|
||||
|
||||
void remove(const QString &key);
|
||||
QJsonValue take(const QString &key);
|
||||
bool contains(const QString &key) const;
|
||||
|
||||
bool operator==(const QJsonObject &other) const;
|
||||
bool operator!=(const QJsonObject &other) const;
|
||||
|
||||
class const_iterator;
|
||||
|
||||
class iterator
|
||||
{
|
||||
friend class const_iterator;
|
||||
friend class QJsonObject;
|
||||
QJsonObject *o;
|
||||
int i;
|
||||
|
||||
public:
|
||||
typedef std::bidirectional_iterator_tag iterator_category;
|
||||
typedef int difference_type;
|
||||
typedef QJsonValue value_type;
|
||||
// typedef T *pointer;
|
||||
typedef QJsonValueRef reference;
|
||||
|
||||
inline iterator() : o(0), i(0) {}
|
||||
inline iterator(QJsonObject *obj, int index) : o(obj), i(index) {}
|
||||
|
||||
inline QString key() const { return o->keyAt(i); }
|
||||
inline QJsonValueRef value() const { return QJsonValueRef(o, i); }
|
||||
inline QJsonValueRef operator*() const { return QJsonValueRef(o, i); }
|
||||
//inline T *operator->() const { return &concrete(i)->value; }
|
||||
inline bool operator==(const iterator &other) const { return i == other.i; }
|
||||
inline bool operator!=(const iterator &other) const { return i != other.i; }
|
||||
|
||||
inline iterator &operator++() { ++i; return *this; }
|
||||
inline iterator operator++(int) { iterator r = *this; ++i; return r; }
|
||||
inline iterator &operator--() { --i; return *this; }
|
||||
inline iterator operator--(int) { iterator r = *this; --i; return r; }
|
||||
inline iterator operator+(int j) const
|
||||
{ iterator r = *this; r.i += j; return r; }
|
||||
inline iterator operator-(int j) const { return operator+(-j); }
|
||||
inline iterator &operator+=(int j) { i += j; return *this; }
|
||||
inline iterator &operator-=(int j) { i -= j; return *this; }
|
||||
|
||||
public:
|
||||
inline bool operator==(const const_iterator &other) const { return i == other.i; }
|
||||
inline bool operator!=(const const_iterator &other) const { return i != other.i; }
|
||||
};
|
||||
friend class iterator;
|
||||
|
||||
class const_iterator
|
||||
{
|
||||
friend class iterator;
|
||||
const QJsonObject *o;
|
||||
int i;
|
||||
|
||||
public:
|
||||
typedef std::bidirectional_iterator_tag iterator_category;
|
||||
typedef int difference_type;
|
||||
typedef QJsonValue value_type;
|
||||
typedef QJsonValue reference;
|
||||
|
||||
inline const_iterator() : o(0), i(0) {}
|
||||
inline const_iterator(const QJsonObject *obj, int index)
|
||||
: o(obj), i(index) {}
|
||||
inline const_iterator(const iterator &other)
|
||||
: o(other.o), i(other.i) {}
|
||||
|
||||
inline QString key() const { return o->keyAt(i); }
|
||||
inline QJsonValue value() const { return o->valueAt(i); }
|
||||
inline QJsonValue operator*() const { return o->valueAt(i); }
|
||||
//inline const T *operator->() const { return &concrete(i)->value; }
|
||||
inline bool operator==(const const_iterator &other) const { return i == other.i; }
|
||||
inline bool operator!=(const const_iterator &other) const { return i != other.i; }
|
||||
|
||||
inline const_iterator &operator++() { ++i; return *this; }
|
||||
inline const_iterator operator++(int) { const_iterator r = *this; ++i; return r; }
|
||||
inline const_iterator &operator--() { --i; return *this; }
|
||||
inline const_iterator operator--(int) { const_iterator r = *this; --i; return r; }
|
||||
inline const_iterator operator+(int j) const
|
||||
{ const_iterator r = *this; r.i += j; return r; }
|
||||
inline const_iterator operator-(int j) const { return operator+(-j); }
|
||||
inline const_iterator &operator+=(int j) { i += j; return *this; }
|
||||
inline const_iterator &operator-=(int j) { i -= j; return *this; }
|
||||
|
||||
inline bool operator==(const iterator &other) const { return i == other.i; }
|
||||
inline bool operator!=(const iterator &other) const { return i != other.i; }
|
||||
};
|
||||
friend class const_iterator;
|
||||
|
||||
// STL style
|
||||
inline iterator begin() { detach(); return iterator(this, 0); }
|
||||
inline const_iterator begin() const { return const_iterator(this, 0); }
|
||||
inline const_iterator constBegin() const { return const_iterator(this, 0); }
|
||||
inline iterator end() { detach(); return iterator(this, size()); }
|
||||
inline const_iterator end() const { return const_iterator(this, size()); }
|
||||
inline const_iterator constEnd() const { return const_iterator(this, size()); }
|
||||
iterator erase(iterator it);
|
||||
|
||||
// more Qt
|
||||
typedef iterator Iterator;
|
||||
typedef const_iterator ConstIterator;
|
||||
iterator find(const QString &key);
|
||||
const_iterator find(const QString &key) const { return constFind(key); }
|
||||
const_iterator constFind(const QString &key) const;
|
||||
iterator insert(const QString &key, const QJsonValue &value);
|
||||
|
||||
// STL compatibility
|
||||
typedef QJsonValue mapped_type;
|
||||
typedef QString key_type;
|
||||
typedef int size_type;
|
||||
|
||||
inline bool empty() const { return isEmpty(); }
|
||||
|
||||
private:
|
||||
friend class QJsonPrivate::Data;
|
||||
friend class QJsonValue;
|
||||
friend class QJsonDocument;
|
||||
friend class QJsonValueRef;
|
||||
|
||||
friend Q_JSONRPC_EXPORT QDebug operator<<(QDebug, const QJsonObject &);
|
||||
|
||||
QJsonObject(QJsonPrivate::Data *data, QJsonPrivate::Object *object);
|
||||
void detach(uint reserve = 0);
|
||||
void compact();
|
||||
|
||||
QString keyAt(int i) const;
|
||||
QJsonValue valueAt(int i) const;
|
||||
void setValueAt(int i, const QJsonValue &val);
|
||||
|
||||
QJsonPrivate::Data *d;
|
||||
QJsonPrivate::Object *o;
|
||||
};
|
||||
|
||||
#ifndef QT_NO_DEBUG_STREAM
|
||||
Q_JSONRPC_EXPORT QDebug operator<<(QDebug, const QJsonObject &);
|
||||
#endif
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
||||
#endif // QJSONOBJECT_H
|
||||
|
||||
+801
-801
File diff suppressed because it is too large
Load Diff
+120
-120
@@ -1,120 +1,120 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/
|
||||
**
|
||||
** This file is part of the QtCore module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** GNU Lesser General Public License Usage
|
||||
** This file may be used under the terms of the GNU Lesser General Public
|
||||
** License version 2.1 as published by the Free Software Foundation and
|
||||
** appearing in the file LICENSE.LGPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU Lesser
|
||||
** General Public License version 2.1 requirements will be met:
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License version 3.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU General
|
||||
** Public License version 3.0 requirements will be met:
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Other Usage
|
||||
** Alternatively, this file may be used in accordance with the terms and
|
||||
** conditions contained in a signed written agreement between you and Nokia.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QJSONPARSER_P_H
|
||||
#define QJSONPARSER_P_H
|
||||
|
||||
//
|
||||
// W A R N I N G
|
||||
// -------------
|
||||
//
|
||||
// This file is not part of the Qt API. It exists purely as an
|
||||
// implementation detail. This header file may change from version to
|
||||
// version without notice, or even be removed.
|
||||
//
|
||||
// We mean it.
|
||||
//
|
||||
|
||||
#include "qjsondocument.h"
|
||||
#include <qvarlengtharray.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
namespace QJsonPrivate {
|
||||
|
||||
class Parser
|
||||
{
|
||||
public:
|
||||
Parser(const char *json, int length);
|
||||
|
||||
QJsonDocument parse(QJsonParseError *error);
|
||||
|
||||
class ParsedObject
|
||||
{
|
||||
public:
|
||||
ParsedObject(Parser *p, int pos) : parser(p), objectPosition(pos) {}
|
||||
void insert(uint offset);
|
||||
|
||||
Parser *parser;
|
||||
int objectPosition;
|
||||
QVector<uint> offsets;
|
||||
|
||||
inline QJsonPrivate::Entry *entryAt(int i) const {
|
||||
return reinterpret_cast<QJsonPrivate::Entry *>(parser->data + objectPosition + offsets[i]);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
private:
|
||||
inline bool eatSpace();
|
||||
inline char nextToken();
|
||||
|
||||
bool parseObject();
|
||||
bool parseArray();
|
||||
bool parseMember(int baseOffset);
|
||||
bool parseString(bool *latin1);
|
||||
bool parseValue(QJsonPrivate::Value *val, int baseOffset);
|
||||
bool parseNumber(QJsonPrivate::Value *val, int baseOffset);
|
||||
const char *head;
|
||||
const char *json;
|
||||
const char *end;
|
||||
|
||||
char *data;
|
||||
int dataLength;
|
||||
int current;
|
||||
QJsonParseError::ParseError lastError;
|
||||
|
||||
inline int reserveSpace(int space) {
|
||||
if (current + space >= dataLength) {
|
||||
dataLength = 2*dataLength + space;
|
||||
data = (char *)realloc(data, dataLength);
|
||||
}
|
||||
int pos = current;
|
||||
current += space;
|
||||
return pos;
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/
|
||||
**
|
||||
** This file is part of the QtCore module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** GNU Lesser General Public License Usage
|
||||
** This file may be used under the terms of the GNU Lesser General Public
|
||||
** License version 2.1 as published by the Free Software Foundation and
|
||||
** appearing in the file LICENSE.LGPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU Lesser
|
||||
** General Public License version 2.1 requirements will be met:
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License version 3.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU General
|
||||
** Public License version 3.0 requirements will be met:
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Other Usage
|
||||
** Alternatively, this file may be used in accordance with the terms and
|
||||
** conditions contained in a signed written agreement between you and Nokia.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QJSONPARSER_P_H
|
||||
#define QJSONPARSER_P_H
|
||||
|
||||
//
|
||||
// W A R N I N G
|
||||
// -------------
|
||||
//
|
||||
// This file is not part of the Qt API. It exists purely as an
|
||||
// implementation detail. This header file may change from version to
|
||||
// version without notice, or even be removed.
|
||||
//
|
||||
// We mean it.
|
||||
//
|
||||
|
||||
#include "qjsondocument.h"
|
||||
#include <qvarlengtharray.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
namespace QJsonPrivate {
|
||||
|
||||
class Parser
|
||||
{
|
||||
public:
|
||||
Parser(const char *json, int length);
|
||||
|
||||
QJsonDocument parse(QJsonParseError *error);
|
||||
|
||||
class ParsedObject
|
||||
{
|
||||
public:
|
||||
ParsedObject(Parser *p, int pos) : parser(p), objectPosition(pos) {}
|
||||
void insert(uint offset);
|
||||
|
||||
Parser *parser;
|
||||
int objectPosition;
|
||||
QVector<uint> offsets;
|
||||
|
||||
inline QJsonPrivate::Entry *entryAt(int i) const {
|
||||
return reinterpret_cast<QJsonPrivate::Entry *>(parser->data + objectPosition + offsets[i]);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
private:
|
||||
inline bool eatSpace();
|
||||
inline char nextToken();
|
||||
|
||||
bool parseObject();
|
||||
bool parseArray();
|
||||
bool parseMember(int baseOffset);
|
||||
bool parseString(bool *latin1);
|
||||
bool parseValue(QJsonPrivate::Value *val, int baseOffset);
|
||||
bool parseNumber(QJsonPrivate::Value *val, int baseOffset);
|
||||
const char *head;
|
||||
const char *json;
|
||||
const char *end;
|
||||
|
||||
char *data;
|
||||
int dataLength;
|
||||
int current;
|
||||
QJsonParseError::ParseError lastError;
|
||||
|
||||
inline int reserveSpace(int space) {
|
||||
if (current + space >= dataLength) {
|
||||
dataLength = 2*dataLength + space;
|
||||
data = (char *)realloc(data, dataLength);
|
||||
}
|
||||
int pos = current;
|
||||
current += space;
|
||||
return pos;
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif
|
||||
|
||||
+592
-592
File diff suppressed because it is too large
Load Diff
+192
-192
@@ -1,192 +1,192 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/
|
||||
**
|
||||
** This file is part of the QtCore module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** GNU Lesser General Public License Usage
|
||||
** This file may be used under the terms of the GNU Lesser General Public
|
||||
** License version 2.1 as published by the Free Software Foundation and
|
||||
** appearing in the file LICENSE.LGPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU Lesser
|
||||
** General Public License version 2.1 requirements will be met:
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License version 3.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU General
|
||||
** Public License version 3.0 requirements will be met:
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Other Usage
|
||||
** Alternatively, this file may be used in accordance with the terms and
|
||||
** conditions contained in a signed written agreement between you and Nokia.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QJSONVALUE_H
|
||||
#define QJSONVALUE_H
|
||||
|
||||
#include <QtCore/qglobal.h>
|
||||
#include <QtCore/qstring.h>
|
||||
#include <QtCore/qvariant.h>
|
||||
|
||||
#include "qjsonexport.h"
|
||||
|
||||
QT_BEGIN_HEADER
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
class QDebug;
|
||||
class QVariant;
|
||||
class QJsonArray;
|
||||
class QJsonObject;
|
||||
|
||||
namespace QJsonPrivate {
|
||||
class Data;
|
||||
class Base;
|
||||
class Object;
|
||||
class Header;
|
||||
class Array;
|
||||
class Value;
|
||||
class Entry;
|
||||
}
|
||||
|
||||
class Q_JSONRPC_EXPORT QJsonValue
|
||||
{
|
||||
public:
|
||||
enum Type {
|
||||
Null = 0x0,
|
||||
Bool = 0x1,
|
||||
Double = 0x2,
|
||||
String = 0x3,
|
||||
Array = 0x4,
|
||||
Object = 0x5,
|
||||
Undefined = 0x80
|
||||
};
|
||||
|
||||
QJsonValue(Type = Null);
|
||||
QJsonValue(bool b);
|
||||
QJsonValue(double n);
|
||||
QJsonValue(int n);
|
||||
QJsonValue(const QString &s);
|
||||
QJsonValue(const QLatin1String &s);
|
||||
QJsonValue(const QJsonArray &a);
|
||||
QJsonValue(const QJsonObject &o);
|
||||
|
||||
~QJsonValue();
|
||||
|
||||
QJsonValue(const QJsonValue &other);
|
||||
QJsonValue &operator =(const QJsonValue &other);
|
||||
|
||||
static QJsonValue fromVariant(const QVariant &variant);
|
||||
QVariant toVariant() const;
|
||||
|
||||
Type type() const;
|
||||
inline bool isNull() const { return type() == Null; }
|
||||
inline bool isBool() const { return type() == Bool; }
|
||||
inline bool isDouble() const { return type() == Double; }
|
||||
inline bool isString() const { return type() == String; }
|
||||
inline bool isArray() const { return type() == Array; }
|
||||
inline bool isObject() const { return type() == Object; }
|
||||
inline bool isUndefined() const { return type() == Undefined; }
|
||||
|
||||
bool toBool() const;
|
||||
double toDouble() const;
|
||||
QString toString() const;
|
||||
QJsonArray toArray() const;
|
||||
QJsonObject toObject() const;
|
||||
|
||||
bool operator==(const QJsonValue &other) const;
|
||||
bool operator!=(const QJsonValue &other) const;
|
||||
inline QJsonValue(const void *) {}
|
||||
private:
|
||||
// avoid implicit conversions from char * to bool
|
||||
|
||||
friend class QJsonPrivate::Value;
|
||||
friend class QJsonArray;
|
||||
friend class QJsonObject;
|
||||
friend Q_JSONRPC_EXPORT QDebug operator<<(QDebug, const QJsonValue &);
|
||||
|
||||
QJsonValue(QJsonPrivate::Data *d, QJsonPrivate::Base *b, const QJsonPrivate::Value& v);
|
||||
|
||||
void detach();
|
||||
|
||||
union {
|
||||
quint64 ui;
|
||||
bool b;
|
||||
double dbl;
|
||||
// QStringData *stringData;
|
||||
QJsonPrivate::Base *base;
|
||||
};
|
||||
|
||||
QString stringValue;
|
||||
|
||||
QJsonPrivate::Data *d; // needed for Objects and Arrays
|
||||
Type t;
|
||||
};
|
||||
|
||||
class Q_JSONRPC_EXPORT QJsonValueRef
|
||||
{
|
||||
public:
|
||||
QJsonValueRef(QJsonArray *array, int idx)
|
||||
: a(array), is_object(false), index(idx) {}
|
||||
QJsonValueRef(QJsonObject *object, int idx)
|
||||
: o(object), is_object(true), index(idx) {}
|
||||
|
||||
inline operator QJsonValue() const { return toValue(); }
|
||||
QJsonValueRef &operator = (const QJsonValue &val);
|
||||
|
||||
inline QJsonValue::Type type() const { return toValue().type(); }
|
||||
inline bool isNull() const { return type() == QJsonValue::Null; }
|
||||
inline bool isBool() const { return type() == QJsonValue::Bool; }
|
||||
inline bool isDouble() const { return type() == QJsonValue::Double; }
|
||||
inline bool isString() const { return type() == QJsonValue::String; }
|
||||
inline bool isArray() const { return type() == QJsonValue::Array; }
|
||||
inline bool isObject() const { return type() == QJsonValue::Object; }
|
||||
inline bool isUndefined() const { return type() == QJsonValue::Undefined; }
|
||||
|
||||
inline bool toBool() const { return toValue().toBool(); }
|
||||
inline double toDouble() const { return toValue().toDouble(); }
|
||||
inline QString toString() const { return toValue().toString(); }
|
||||
QJsonArray toArray() const;
|
||||
QJsonObject toObject() const;
|
||||
|
||||
inline bool operator==(const QJsonValue &other) const { return toValue() == other; }
|
||||
inline bool operator!=(const QJsonValue &other) const { return toValue() != other; }
|
||||
|
||||
private:
|
||||
QJsonValue toValue() const;
|
||||
|
||||
union {
|
||||
QJsonArray *a;
|
||||
QJsonObject *o;
|
||||
};
|
||||
uint is_object : 1;
|
||||
uint index : 31;
|
||||
};
|
||||
|
||||
#ifndef QT_NO_DEBUG_STREAM
|
||||
Q_JSONRPC_EXPORT QDebug operator<<(QDebug, const QJsonValue &);
|
||||
#endif
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
||||
#endif // QJSONVALUE_H
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/
|
||||
**
|
||||
** This file is part of the QtCore module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** GNU Lesser General Public License Usage
|
||||
** This file may be used under the terms of the GNU Lesser General Public
|
||||
** License version 2.1 as published by the Free Software Foundation and
|
||||
** appearing in the file LICENSE.LGPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU Lesser
|
||||
** General Public License version 2.1 requirements will be met:
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License version 3.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU General
|
||||
** Public License version 3.0 requirements will be met:
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Other Usage
|
||||
** Alternatively, this file may be used in accordance with the terms and
|
||||
** conditions contained in a signed written agreement between you and Nokia.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QJSONVALUE_H
|
||||
#define QJSONVALUE_H
|
||||
|
||||
#include <QtCore/qglobal.h>
|
||||
#include <QtCore/qstring.h>
|
||||
#include <QtCore/qvariant.h>
|
||||
|
||||
#include "qjsonexport.h"
|
||||
|
||||
QT_BEGIN_HEADER
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
class QDebug;
|
||||
class QVariant;
|
||||
class QJsonArray;
|
||||
class QJsonObject;
|
||||
|
||||
namespace QJsonPrivate {
|
||||
class Data;
|
||||
class Base;
|
||||
class Object;
|
||||
class Header;
|
||||
class Array;
|
||||
class Value;
|
||||
class Entry;
|
||||
}
|
||||
|
||||
class Q_JSONRPC_EXPORT QJsonValue
|
||||
{
|
||||
public:
|
||||
enum Type {
|
||||
Null = 0x0,
|
||||
Bool = 0x1,
|
||||
Double = 0x2,
|
||||
String = 0x3,
|
||||
Array = 0x4,
|
||||
Object = 0x5,
|
||||
Undefined = 0x80
|
||||
};
|
||||
|
||||
QJsonValue(Type = Null);
|
||||
QJsonValue(bool b);
|
||||
QJsonValue(double n);
|
||||
QJsonValue(int n);
|
||||
QJsonValue(const QString &s);
|
||||
QJsonValue(const QLatin1String &s);
|
||||
QJsonValue(const QJsonArray &a);
|
||||
QJsonValue(const QJsonObject &o);
|
||||
|
||||
~QJsonValue();
|
||||
|
||||
QJsonValue(const QJsonValue &other);
|
||||
QJsonValue &operator =(const QJsonValue &other);
|
||||
|
||||
static QJsonValue fromVariant(const QVariant &variant);
|
||||
QVariant toVariant() const;
|
||||
|
||||
Type type() const;
|
||||
inline bool isNull() const { return type() == Null; }
|
||||
inline bool isBool() const { return type() == Bool; }
|
||||
inline bool isDouble() const { return type() == Double; }
|
||||
inline bool isString() const { return type() == String; }
|
||||
inline bool isArray() const { return type() == Array; }
|
||||
inline bool isObject() const { return type() == Object; }
|
||||
inline bool isUndefined() const { return type() == Undefined; }
|
||||
|
||||
bool toBool() const;
|
||||
double toDouble() const;
|
||||
QString toString() const;
|
||||
QJsonArray toArray() const;
|
||||
QJsonObject toObject() const;
|
||||
|
||||
bool operator==(const QJsonValue &other) const;
|
||||
bool operator!=(const QJsonValue &other) const;
|
||||
inline QJsonValue(const void *) {}
|
||||
private:
|
||||
// avoid implicit conversions from char * to bool
|
||||
|
||||
friend class QJsonPrivate::Value;
|
||||
friend class QJsonArray;
|
||||
friend class QJsonObject;
|
||||
friend Q_JSONRPC_EXPORT QDebug operator<<(QDebug, const QJsonValue &);
|
||||
|
||||
QJsonValue(QJsonPrivate::Data *d, QJsonPrivate::Base *b, const QJsonPrivate::Value& v);
|
||||
|
||||
void detach();
|
||||
|
||||
union {
|
||||
quint64 ui;
|
||||
bool b;
|
||||
double dbl;
|
||||
// QStringData *stringData;
|
||||
QJsonPrivate::Base *base;
|
||||
};
|
||||
|
||||
QString stringValue;
|
||||
|
||||
QJsonPrivate::Data *d; // needed for Objects and Arrays
|
||||
Type t;
|
||||
};
|
||||
|
||||
class Q_JSONRPC_EXPORT QJsonValueRef
|
||||
{
|
||||
public:
|
||||
QJsonValueRef(QJsonArray *array, int idx)
|
||||
: a(array), is_object(false), index(idx) {}
|
||||
QJsonValueRef(QJsonObject *object, int idx)
|
||||
: o(object), is_object(true), index(idx) {}
|
||||
|
||||
inline operator QJsonValue() const { return toValue(); }
|
||||
QJsonValueRef &operator = (const QJsonValue &val);
|
||||
|
||||
inline QJsonValue::Type type() const { return toValue().type(); }
|
||||
inline bool isNull() const { return type() == QJsonValue::Null; }
|
||||
inline bool isBool() const { return type() == QJsonValue::Bool; }
|
||||
inline bool isDouble() const { return type() == QJsonValue::Double; }
|
||||
inline bool isString() const { return type() == QJsonValue::String; }
|
||||
inline bool isArray() const { return type() == QJsonValue::Array; }
|
||||
inline bool isObject() const { return type() == QJsonValue::Object; }
|
||||
inline bool isUndefined() const { return type() == QJsonValue::Undefined; }
|
||||
|
||||
inline bool toBool() const { return toValue().toBool(); }
|
||||
inline double toDouble() const { return toValue().toDouble(); }
|
||||
inline QString toString() const { return toValue().toString(); }
|
||||
QJsonArray toArray() const;
|
||||
QJsonObject toObject() const;
|
||||
|
||||
inline bool operator==(const QJsonValue &other) const { return toValue() == other; }
|
||||
inline bool operator!=(const QJsonValue &other) const { return toValue() != other; }
|
||||
|
||||
private:
|
||||
QJsonValue toValue() const;
|
||||
|
||||
union {
|
||||
QJsonArray *a;
|
||||
QJsonObject *o;
|
||||
};
|
||||
uint is_object : 1;
|
||||
uint index : 31;
|
||||
};
|
||||
|
||||
#ifndef QT_NO_DEBUG_STREAM
|
||||
Q_JSONRPC_EXPORT QDebug operator<<(QDebug, const QJsonValue &);
|
||||
#endif
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
||||
#endif // QJSONVALUE_H
|
||||
|
||||
+280
-280
@@ -1,280 +1,280 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/
|
||||
**
|
||||
** This file is part of the QtCore module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** GNU Lesser General Public License Usage
|
||||
** This file may be used under the terms of the GNU Lesser General Public
|
||||
** License version 2.1 as published by the Free Software Foundation and
|
||||
** appearing in the file LICENSE.LGPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU Lesser
|
||||
** General Public License version 2.1 requirements will be met:
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License version 3.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU General
|
||||
** Public License version 3.0 requirements will be met:
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Other Usage
|
||||
** Alternatively, this file may be used in accordance with the terms and
|
||||
** conditions contained in a signed written agreement between you and Nokia.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "qjsonwriter_p.h"
|
||||
#include "qjson_p.h"
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
using namespace QJsonPrivate;
|
||||
|
||||
static void objectContentToJson(const QJsonPrivate::Object *o, QByteArray &json, int indent, bool compact);
|
||||
static void arrayContentToJson(const QJsonPrivate::Array *a, QByteArray &json, int indent, bool compact);
|
||||
|
||||
// some code from qutfcodec.cpp, inlined here for performance reasons
|
||||
// to allow fast escaping of strings
|
||||
static inline bool isUnicodeNonCharacter(uint ucs4)
|
||||
{
|
||||
// Unicode has a couple of "non-characters" that one can use internally,
|
||||
// but are not allowed to be used for text interchange.
|
||||
//
|
||||
// Those are the last two entries each Unicode Plane (U+FFFE, U+FFFF,
|
||||
// U+1FFFE, U+1FFFF, etc.) as well as the entries between U+FDD0 and
|
||||
// U+FDEF (inclusive)
|
||||
|
||||
return (ucs4 & 0xfffe) == 0xfffe
|
||||
|| (ucs4 - 0xfdd0U) < 16;
|
||||
}
|
||||
|
||||
static inline uchar hexdig(uint u)
|
||||
{
|
||||
return (u < 0xa ? '0' + u : 'a' + u - 0xa);
|
||||
}
|
||||
|
||||
static QByteArray escapedString(const QString &s)
|
||||
{
|
||||
const uchar replacement = '?';
|
||||
QByteArray ba(s.length(), Qt::Uninitialized);
|
||||
|
||||
uchar *cursor = (uchar *)ba.data();
|
||||
const uchar *ba_end = cursor + ba.length();
|
||||
|
||||
const QChar *ch = (const QChar *)s.constData();
|
||||
const QChar *end = ch + s.length();
|
||||
|
||||
int surrogate_high = -1;
|
||||
|
||||
while (ch < end) {
|
||||
if (cursor >= ba_end - 6) {
|
||||
// ensure we have enough space
|
||||
int pos = cursor - (const uchar *)ba.constData();
|
||||
ba.resize(ba.size()*2);
|
||||
cursor = (uchar *)ba.data() + pos;
|
||||
ba_end = (const uchar *)ba.constData() + ba.length();
|
||||
}
|
||||
|
||||
uint u = ch->unicode();
|
||||
if (surrogate_high >= 0) {
|
||||
if (ch->isLowSurrogate()) {
|
||||
u = QChar::surrogateToUcs4(surrogate_high, u);
|
||||
surrogate_high = -1;
|
||||
} else {
|
||||
// high surrogate without low
|
||||
*cursor = replacement;
|
||||
++ch;
|
||||
surrogate_high = -1;
|
||||
continue;
|
||||
}
|
||||
} else if (ch->isLowSurrogate()) {
|
||||
// low surrogate without high
|
||||
*cursor = replacement;
|
||||
++ch;
|
||||
continue;
|
||||
} else if (ch->isHighSurrogate()) {
|
||||
surrogate_high = u;
|
||||
++ch;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (u < 0x80) {
|
||||
if (u < 0x20 || u == 0x22 || u == 0x5c) {
|
||||
*cursor++ = '\\';
|
||||
switch (u) {
|
||||
case 0x22:
|
||||
*cursor++ = '"';
|
||||
break;
|
||||
case 0x5c:
|
||||
*cursor++ = '\\';
|
||||
break;
|
||||
case 0x8:
|
||||
*cursor++ = 'b';
|
||||
break;
|
||||
case 0xc:
|
||||
*cursor++ = 'f';
|
||||
break;
|
||||
case 0xa:
|
||||
*cursor++ = 'n';
|
||||
break;
|
||||
case 0xd:
|
||||
*cursor++ = 'r';
|
||||
break;
|
||||
case 0x9:
|
||||
*cursor++ = 't';
|
||||
break;
|
||||
default:
|
||||
*cursor++ = 'u';
|
||||
*cursor++ = '0';
|
||||
*cursor++ = '0';
|
||||
*cursor++ = hexdig(u>>4);
|
||||
*cursor++ = hexdig(u & 0xf);
|
||||
}
|
||||
} else {
|
||||
*cursor++ = (uchar)u;
|
||||
}
|
||||
} else {
|
||||
if (u < 0x0800) {
|
||||
*cursor++ = 0xc0 | ((uchar) (u >> 6));
|
||||
} else {
|
||||
// is it one of the Unicode non-characters?
|
||||
if (isUnicodeNonCharacter(u)) {
|
||||
*cursor++ = replacement;
|
||||
++ch;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (u > 0xffff) {
|
||||
*cursor++ = 0xf0 | ((uchar) (u >> 18));
|
||||
*cursor++ = 0x80 | (((uchar) (u >> 12)) & 0x3f);
|
||||
} else {
|
||||
*cursor++ = 0xe0 | (((uchar) (u >> 12)) & 0x3f);
|
||||
}
|
||||
*cursor++ = 0x80 | (((uchar) (u >> 6)) & 0x3f);
|
||||
}
|
||||
*cursor++ = 0x80 | ((uchar) (u&0x3f));
|
||||
}
|
||||
++ch;
|
||||
}
|
||||
|
||||
ba.resize(cursor - (const uchar *)ba.constData());
|
||||
return ba;
|
||||
}
|
||||
|
||||
static void valueToJson(const QJsonPrivate::Base *b, const QJsonPrivate::Value &v, QByteArray &json, int indent, bool compact)
|
||||
{
|
||||
QJsonValue::Type type = (QJsonValue::Type)(uint)v.type;
|
||||
switch (type) {
|
||||
case QJsonValue::Bool:
|
||||
json += v.toBoolean() ? "true" : "false";
|
||||
break;
|
||||
case QJsonValue::Double:
|
||||
json += QByteArray::number(v.toDouble(b));
|
||||
break;
|
||||
case QJsonValue::String:
|
||||
json += '"';
|
||||
json += escapedString(v.toString(b));
|
||||
json += '"';
|
||||
break;
|
||||
case QJsonValue::Array:
|
||||
json += compact ? "[" : "[\n";
|
||||
arrayContentToJson(static_cast<QJsonPrivate::Array *>(v.base(b)), json, indent + (compact ? 0 : 1), compact);
|
||||
json += QByteArray(4*indent, ' ');
|
||||
json += "]";
|
||||
break;
|
||||
case QJsonValue::Object:
|
||||
json += compact ? "{" : "{\n";
|
||||
objectContentToJson(static_cast<QJsonPrivate::Object *>(v.base(b)), json, indent + (compact ? 0 : 1), compact);
|
||||
json += QByteArray(4*indent, ' ');
|
||||
json += "}";
|
||||
break;
|
||||
case QJsonValue::Null:
|
||||
default:
|
||||
json += "null";
|
||||
}
|
||||
}
|
||||
|
||||
static void arrayContentToJson(const QJsonPrivate::Array *a, QByteArray &json, int indent, bool compact)
|
||||
{
|
||||
if (!a || !a->length)
|
||||
return;
|
||||
|
||||
QByteArray indentString(4*indent, ' ');
|
||||
|
||||
uint i = 0;
|
||||
while (1) {
|
||||
json += indentString;
|
||||
valueToJson(a, a->at(i), json, indent, compact);
|
||||
|
||||
if (++i == a->length) {
|
||||
if (!compact)
|
||||
json += '\n';
|
||||
break;
|
||||
}
|
||||
|
||||
json += compact ? "," : ",\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void objectContentToJson(const QJsonPrivate::Object *o, QByteArray &json, int indent, bool compact)
|
||||
{
|
||||
if (!o || !o->length)
|
||||
return;
|
||||
|
||||
QByteArray indentString(4*indent, ' ');
|
||||
|
||||
uint i = 0;
|
||||
while (1) {
|
||||
QJsonPrivate::Entry *e = o->entryAt(i);
|
||||
json += indentString;
|
||||
json += '"';
|
||||
json += escapedString(e->key());
|
||||
json += "\": ";
|
||||
valueToJson(o, e->value, json, indent, compact);
|
||||
|
||||
if (++i == o->length) {
|
||||
if (!compact)
|
||||
json += '\n';
|
||||
break;
|
||||
}
|
||||
|
||||
json += compact ? "," : ",\n";
|
||||
}
|
||||
}
|
||||
|
||||
void Writer::objectToJson(const QJsonPrivate::Object *o, QByteArray &json, int indent, bool compact)
|
||||
{
|
||||
json.reserve(json.size() + (o ? (int)o->size : 16));
|
||||
json += compact ? "{" : "{\n";
|
||||
objectContentToJson(o, json, indent + (compact ? 0 : 1), compact);
|
||||
json += QByteArray(4*indent, ' ');
|
||||
json += compact ? "}" : "}\n";
|
||||
}
|
||||
|
||||
void Writer::arrayToJson(const QJsonPrivate::Array *a, QByteArray &json, int indent, bool compact)
|
||||
{
|
||||
json.reserve(json.size() + (a ? (int)a->size : 16));
|
||||
json += compact ? "[" : "[\n";
|
||||
arrayContentToJson(a, json, indent + (compact ? 0 : 1), compact);
|
||||
json += QByteArray(4*indent, ' ');
|
||||
json += compact ? "]" : "]\n";
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/
|
||||
**
|
||||
** This file is part of the QtCore module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** GNU Lesser General Public License Usage
|
||||
** This file may be used under the terms of the GNU Lesser General Public
|
||||
** License version 2.1 as published by the Free Software Foundation and
|
||||
** appearing in the file LICENSE.LGPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU Lesser
|
||||
** General Public License version 2.1 requirements will be met:
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License version 3.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU General
|
||||
** Public License version 3.0 requirements will be met:
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Other Usage
|
||||
** Alternatively, this file may be used in accordance with the terms and
|
||||
** conditions contained in a signed written agreement between you and Nokia.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "qjsonwriter_p.h"
|
||||
#include "qjson_p.h"
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
using namespace QJsonPrivate;
|
||||
|
||||
static void objectContentToJson(const QJsonPrivate::Object *o, QByteArray &json, int indent, bool compact);
|
||||
static void arrayContentToJson(const QJsonPrivate::Array *a, QByteArray &json, int indent, bool compact);
|
||||
|
||||
// some code from qutfcodec.cpp, inlined here for performance reasons
|
||||
// to allow fast escaping of strings
|
||||
static inline bool isUnicodeNonCharacter(uint ucs4)
|
||||
{
|
||||
// Unicode has a couple of "non-characters" that one can use internally,
|
||||
// but are not allowed to be used for text interchange.
|
||||
//
|
||||
// Those are the last two entries each Unicode Plane (U+FFFE, U+FFFF,
|
||||
// U+1FFFE, U+1FFFF, etc.) as well as the entries between U+FDD0 and
|
||||
// U+FDEF (inclusive)
|
||||
|
||||
return (ucs4 & 0xfffe) == 0xfffe
|
||||
|| (ucs4 - 0xfdd0U) < 16;
|
||||
}
|
||||
|
||||
static inline uchar hexdig(uint u)
|
||||
{
|
||||
return (u < 0xa ? '0' + u : 'a' + u - 0xa);
|
||||
}
|
||||
|
||||
static QByteArray escapedString(const QString &s)
|
||||
{
|
||||
const uchar replacement = '?';
|
||||
QByteArray ba(s.length(), Qt::Uninitialized);
|
||||
|
||||
uchar *cursor = (uchar *)ba.data();
|
||||
const uchar *ba_end = cursor + ba.length();
|
||||
|
||||
const QChar *ch = (const QChar *)s.constData();
|
||||
const QChar *end = ch + s.length();
|
||||
|
||||
int surrogate_high = -1;
|
||||
|
||||
while (ch < end) {
|
||||
if (cursor >= ba_end - 6) {
|
||||
// ensure we have enough space
|
||||
int pos = cursor - (const uchar *)ba.constData();
|
||||
ba.resize(ba.size()*2);
|
||||
cursor = (uchar *)ba.data() + pos;
|
||||
ba_end = (const uchar *)ba.constData() + ba.length();
|
||||
}
|
||||
|
||||
uint u = ch->unicode();
|
||||
if (surrogate_high >= 0) {
|
||||
if (ch->isLowSurrogate()) {
|
||||
u = QChar::surrogateToUcs4(surrogate_high, u);
|
||||
surrogate_high = -1;
|
||||
} else {
|
||||
// high surrogate without low
|
||||
*cursor = replacement;
|
||||
++ch;
|
||||
surrogate_high = -1;
|
||||
continue;
|
||||
}
|
||||
} else if (ch->isLowSurrogate()) {
|
||||
// low surrogate without high
|
||||
*cursor = replacement;
|
||||
++ch;
|
||||
continue;
|
||||
} else if (ch->isHighSurrogate()) {
|
||||
surrogate_high = u;
|
||||
++ch;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (u < 0x80) {
|
||||
if (u < 0x20 || u == 0x22 || u == 0x5c) {
|
||||
*cursor++ = '\\';
|
||||
switch (u) {
|
||||
case 0x22:
|
||||
*cursor++ = '"';
|
||||
break;
|
||||
case 0x5c:
|
||||
*cursor++ = '\\';
|
||||
break;
|
||||
case 0x8:
|
||||
*cursor++ = 'b';
|
||||
break;
|
||||
case 0xc:
|
||||
*cursor++ = 'f';
|
||||
break;
|
||||
case 0xa:
|
||||
*cursor++ = 'n';
|
||||
break;
|
||||
case 0xd:
|
||||
*cursor++ = 'r';
|
||||
break;
|
||||
case 0x9:
|
||||
*cursor++ = 't';
|
||||
break;
|
||||
default:
|
||||
*cursor++ = 'u';
|
||||
*cursor++ = '0';
|
||||
*cursor++ = '0';
|
||||
*cursor++ = hexdig(u>>4);
|
||||
*cursor++ = hexdig(u & 0xf);
|
||||
}
|
||||
} else {
|
||||
*cursor++ = (uchar)u;
|
||||
}
|
||||
} else {
|
||||
if (u < 0x0800) {
|
||||
*cursor++ = 0xc0 | ((uchar) (u >> 6));
|
||||
} else {
|
||||
// is it one of the Unicode non-characters?
|
||||
if (isUnicodeNonCharacter(u)) {
|
||||
*cursor++ = replacement;
|
||||
++ch;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (u > 0xffff) {
|
||||
*cursor++ = 0xf0 | ((uchar) (u >> 18));
|
||||
*cursor++ = 0x80 | (((uchar) (u >> 12)) & 0x3f);
|
||||
} else {
|
||||
*cursor++ = 0xe0 | (((uchar) (u >> 12)) & 0x3f);
|
||||
}
|
||||
*cursor++ = 0x80 | (((uchar) (u >> 6)) & 0x3f);
|
||||
}
|
||||
*cursor++ = 0x80 | ((uchar) (u&0x3f));
|
||||
}
|
||||
++ch;
|
||||
}
|
||||
|
||||
ba.resize(cursor - (const uchar *)ba.constData());
|
||||
return ba;
|
||||
}
|
||||
|
||||
static void valueToJson(const QJsonPrivate::Base *b, const QJsonPrivate::Value &v, QByteArray &json, int indent, bool compact)
|
||||
{
|
||||
QJsonValue::Type type = (QJsonValue::Type)(uint)v.type;
|
||||
switch (type) {
|
||||
case QJsonValue::Bool:
|
||||
json += v.toBoolean() ? "true" : "false";
|
||||
break;
|
||||
case QJsonValue::Double:
|
||||
json += QByteArray::number(v.toDouble(b));
|
||||
break;
|
||||
case QJsonValue::String:
|
||||
json += '"';
|
||||
json += escapedString(v.toString(b));
|
||||
json += '"';
|
||||
break;
|
||||
case QJsonValue::Array:
|
||||
json += compact ? "[" : "[\n";
|
||||
arrayContentToJson(static_cast<QJsonPrivate::Array *>(v.base(b)), json, indent + (compact ? 0 : 1), compact);
|
||||
json += QByteArray(4*indent, ' ');
|
||||
json += "]";
|
||||
break;
|
||||
case QJsonValue::Object:
|
||||
json += compact ? "{" : "{\n";
|
||||
objectContentToJson(static_cast<QJsonPrivate::Object *>(v.base(b)), json, indent + (compact ? 0 : 1), compact);
|
||||
json += QByteArray(4*indent, ' ');
|
||||
json += "}";
|
||||
break;
|
||||
case QJsonValue::Null:
|
||||
default:
|
||||
json += "null";
|
||||
}
|
||||
}
|
||||
|
||||
static void arrayContentToJson(const QJsonPrivate::Array *a, QByteArray &json, int indent, bool compact)
|
||||
{
|
||||
if (!a || !a->length)
|
||||
return;
|
||||
|
||||
QByteArray indentString(4*indent, ' ');
|
||||
|
||||
uint i = 0;
|
||||
while (1) {
|
||||
json += indentString;
|
||||
valueToJson(a, a->at(i), json, indent, compact);
|
||||
|
||||
if (++i == a->length) {
|
||||
if (!compact)
|
||||
json += '\n';
|
||||
break;
|
||||
}
|
||||
|
||||
json += compact ? "," : ",\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void objectContentToJson(const QJsonPrivate::Object *o, QByteArray &json, int indent, bool compact)
|
||||
{
|
||||
if (!o || !o->length)
|
||||
return;
|
||||
|
||||
QByteArray indentString(4*indent, ' ');
|
||||
|
||||
uint i = 0;
|
||||
while (1) {
|
||||
QJsonPrivate::Entry *e = o->entryAt(i);
|
||||
json += indentString;
|
||||
json += '"';
|
||||
json += escapedString(e->key());
|
||||
json += "\": ";
|
||||
valueToJson(o, e->value, json, indent, compact);
|
||||
|
||||
if (++i == o->length) {
|
||||
if (!compact)
|
||||
json += '\n';
|
||||
break;
|
||||
}
|
||||
|
||||
json += compact ? "," : ",\n";
|
||||
}
|
||||
}
|
||||
|
||||
void Writer::objectToJson(const QJsonPrivate::Object *o, QByteArray &json, int indent, bool compact)
|
||||
{
|
||||
json.reserve(json.size() + (o ? (int)o->size : 16));
|
||||
json += compact ? "{" : "{\n";
|
||||
objectContentToJson(o, json, indent + (compact ? 0 : 1), compact);
|
||||
json += QByteArray(4*indent, ' ');
|
||||
json += compact ? "}" : "}\n";
|
||||
}
|
||||
|
||||
void Writer::arrayToJson(const QJsonPrivate::Array *a, QByteArray &json, int indent, bool compact)
|
||||
{
|
||||
json.reserve(json.size() + (a ? (int)a->size : 16));
|
||||
json += compact ? "[" : "[\n";
|
||||
arrayContentToJson(a, json, indent + (compact ? 0 : 1), compact);
|
||||
json += QByteArray(4*indent, ' ');
|
||||
json += compact ? "]" : "]\n";
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
+73
-73
@@ -1,73 +1,73 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/
|
||||
**
|
||||
** This file is part of the QtCore module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** GNU Lesser General Public License Usage
|
||||
** This file may be used under the terms of the GNU Lesser General Public
|
||||
** License version 2.1 as published by the Free Software Foundation and
|
||||
** appearing in the file LICENSE.LGPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU Lesser
|
||||
** General Public License version 2.1 requirements will be met:
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License version 3.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU General
|
||||
** Public License version 3.0 requirements will be met:
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Other Usage
|
||||
** Alternatively, this file may be used in accordance with the terms and
|
||||
** conditions contained in a signed written agreement between you and Nokia.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QJSONWRITER_P_H
|
||||
#define QJSONWRITER_P_H
|
||||
|
||||
//
|
||||
// W A R N I N G
|
||||
// -------------
|
||||
//
|
||||
// This file is not part of the Qt API. It exists purely as an
|
||||
// implementation detail. This header file may change from version to
|
||||
// version without notice, or even be removed.
|
||||
//
|
||||
// We mean it.
|
||||
//
|
||||
#include "qjsonvalue.h"
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
namespace QJsonPrivate
|
||||
{
|
||||
|
||||
class Writer
|
||||
{
|
||||
public:
|
||||
static void objectToJson(const QJsonPrivate::Object *o, QByteArray &json, int indent, bool compact = false);
|
||||
static void arrayToJson(const QJsonPrivate::Array *a, QByteArray &json, int indent, bool compact = false);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/
|
||||
**
|
||||
** This file is part of the QtCore module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** GNU Lesser General Public License Usage
|
||||
** This file may be used under the terms of the GNU Lesser General Public
|
||||
** License version 2.1 as published by the Free Software Foundation and
|
||||
** appearing in the file LICENSE.LGPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU Lesser
|
||||
** General Public License version 2.1 requirements will be met:
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License version 3.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU General
|
||||
** Public License version 3.0 requirements will be met:
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Other Usage
|
||||
** Alternatively, this file may be used in accordance with the terms and
|
||||
** conditions contained in a signed written agreement between you and Nokia.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QJSONWRITER_P_H
|
||||
#define QJSONWRITER_P_H
|
||||
|
||||
//
|
||||
// W A R N I N G
|
||||
// -------------
|
||||
//
|
||||
// This file is not part of the Qt API. It exists purely as an
|
||||
// implementation detail. This header file may change from version to
|
||||
// version without notice, or even be removed.
|
||||
//
|
||||
// We mean it.
|
||||
//
|
||||
#include "qjsonvalue.h"
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
namespace QJsonPrivate
|
||||
{
|
||||
|
||||
class Writer
|
||||
{
|
||||
public:
|
||||
static void objectToJson(const QJsonPrivate::Object *o, QByteArray &json, int indent, bool compact = false);
|
||||
static void arrayToJson(const QJsonPrivate::Array *a, QByteArray &json, int indent, bool compact = false);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif
|
||||
|
||||
+24
-24
@@ -1,24 +1,24 @@
|
||||
!greaterThan(QT_MAJOR_VERSION, 4): {
|
||||
|
||||
INCLUDEPATH += \
|
||||
$$PWD
|
||||
|
||||
SOURCES += \
|
||||
$$PWD/qjson.cpp \
|
||||
$$PWD/qjsonarray.cpp \
|
||||
$$PWD/qjsondocument.cpp \
|
||||
$$PWD/qjsonobject.cpp \
|
||||
$$PWD/qjsonparser.cpp \
|
||||
$$PWD/qjsonvalue.cpp \
|
||||
$$PWD/qjsonwriter.cpp
|
||||
|
||||
HEADERS += \
|
||||
$$PWD/qjson_p.h \
|
||||
$$PWD/qjsonarray.h \
|
||||
$$PWD/qjsondocument.h \
|
||||
$$PWD/qjsonobject.h \
|
||||
$$PWD/qjsonparser_p.h \
|
||||
$$PWD/qjsonvalue.h \
|
||||
$$PWD/qjsonwriter_p.h
|
||||
|
||||
}
|
||||
!greaterThan(QT_MAJOR_VERSION, 4): {
|
||||
|
||||
INCLUDEPATH += \
|
||||
$$PWD
|
||||
|
||||
SOURCES += \
|
||||
$$PWD/qjson.cpp \
|
||||
$$PWD/qjsonarray.cpp \
|
||||
$$PWD/qjsondocument.cpp \
|
||||
$$PWD/qjsonobject.cpp \
|
||||
$$PWD/qjsonparser.cpp \
|
||||
$$PWD/qjsonvalue.cpp \
|
||||
$$PWD/qjsonwriter.cpp
|
||||
|
||||
HEADERS += \
|
||||
$$PWD/qjson_p.h \
|
||||
$$PWD/qjsonarray.h \
|
||||
$$PWD/qjsondocument.h \
|
||||
$$PWD/qjsonobject.h \
|
||||
$$PWD/qjsonparser_p.h \
|
||||
$$PWD/qjsonvalue.h \
|
||||
$$PWD/qjsonwriter_p.h
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user