summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@nokia.com>2012-01-12 23:10:37 +0100
committerJamey Hicks <jamey.hicks@nokia.com>2012-01-13 03:52:30 +0100
commit9be2a4e9e843957fe5ff976a8309104caeed8418 (patch)
tree6663e7d5aaf6a06b56138a2603a7f33b4e4f5ade
parent163726cf946bcf519bf17ab747c04363e056041e (diff)
Add fromRawData and rawData methods
FromRawData will operate on an existing chunk of binary data without taking ownership. rawData gives direct access to the binary data used inside the document. Change-Id: Ie8c704571ce5a0d68883f0aac8de664397006a94 Sanity-Review: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Denis Dzyubenko <denis.dzyubenko@nokia.com> Reviewed-by: Jamey Hicks <jamey.hicks@nokia.com>
-rw-r--r--src/qjson_p.h9
-rw-r--r--src/qjsondocument.cpp18
-rw-r--r--src/qjsondocument.h3
3 files changed, 26 insertions, 4 deletions
diff --git a/src/qjson_p.h b/src/qjson_p.h
index 4e88f1f..96d135e 100644
--- a/src/qjson_p.h
+++ b/src/qjson_p.h
@@ -58,7 +58,7 @@
#include <qjsonvalue.h>
#include <qjsondocument.h>
#include <qjsonarray.h>
-#include <qbasicatomic.h>
+#include <qoldbasicatomic.h>
#include <qstring.h>
#include <qendian.h>
@@ -587,12 +587,12 @@ struct Data {
};
inline Data(char *raw, int a)
- : alloc(a), compactionCounter(0), valid(Unchecked), rawData(raw)
+ : alloc(a), compactionCounter(0), valid(Unchecked), ownsData(true), rawData(raw)
{
ref.store(0);
}
inline Data(int reserved, QJsonValue::Type valueType)
- : compactionCounter(0), valid(Validated), rawData(0)
+ : compactionCounter(0), valid(Validated), ownsData(true), rawData(0)
{
ref.store(0);
@@ -607,12 +607,13 @@ struct Data {
b->length = 0;
}
inline ~Data()
- { free(rawData); }
+ { if (ownsData) free(rawData); }
QBasicAtomicInt ref;
int alloc;
int compactionCounter;
Validation valid;
+ bool ownsData;
union {
char *rawData;
Header *header;
diff --git a/src/qjsondocument.cpp b/src/qjsondocument.cpp
index 764e963..6e0c1c4 100644
--- a/src/qjsondocument.cpp
+++ b/src/qjsondocument.cpp
@@ -101,6 +101,23 @@ QJsonDocument &QJsonDocument::operator =(const QJsonDocument &other)
return *this;
}
+QJsonDocument QJsonDocument::fromRawData(const char *data, int size)
+{
+ Private::Data *d = new Private::Data((char *)data, size);
+ d->ownsData = false;
+ return QJsonDocument(d);
+}
+
+const char *QJsonDocument::rawData(int *size) const
+{
+ if (!d) {
+ *size = 0;
+ return 0;
+ }
+ *size = d->alloc;
+ return d->rawData;
+}
+
QJsonDocument QJsonDocument::fromBinaryData(const QByteArray &data)
{
Private::Header *h = (Private::Header *) data.constData();
@@ -222,6 +239,7 @@ void QJsonDocument::setObject(const QJsonObject &object)
delete d;
d = object.d;
+
if (!d) {
d = new Private::Data(0, QJsonValue::Object);
} else if (d->compactionCounter) {
diff --git a/src/qjsondocument.h b/src/qjsondocument.h
index 639447b..65847f6 100644
--- a/src/qjsondocument.h
+++ b/src/qjsondocument.h
@@ -65,6 +65,9 @@ public:
QJsonDocument(const QJsonDocument &other);
QJsonDocument &operator =(const QJsonDocument &other);
+ static QJsonDocument fromRawData(const char *data, int size);
+ const char *rawData(int *size) const;
+
static QJsonDocument fromBinaryData(const QByteArray &data);
QByteArray toBinaryData() const;