/**************************************************************************** | |
** | |
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). | |
** All rights reserved. | |
** Contact: Nokia Corporation (qt-info@nokia.com) | |
** | |
** This file is part of the tools applications 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 SYMBIANUTILS_JSON_H | |
#define SYMBIANUTILS_JSON_H | |
#include "symbianutils_global.h" | |
#include <QtCore/QByteArray> | |
#include <QtCore/QStringList> | |
#include <QtCore/QVector> | |
namespace tcftrk { | |
class SYMBIANUTILS_EXPORT JsonValue | |
{ | |
public: | |
JsonValue() : m_type(Invalid) {} | |
explicit JsonValue(const QByteArray &str) { fromString(str); } | |
QByteArray m_name; | |
QByteArray m_data; | |
QList<JsonValue> m_children; | |
enum Type { | |
Invalid, | |
String, | |
Number, | |
Boolean, | |
Object, | |
NullObject, | |
Array, | |
}; | |
Type m_type; | |
inline Type type() const { return m_type; } | |
inline QByteArray name() const { return m_name; } | |
inline bool hasName(const char *name) const { return m_name == name; } | |
inline bool isValid() const { return m_type != Invalid; } | |
inline bool isNumber() const { return m_type == Number; } | |
inline bool isString() const { return m_type == String; } | |
inline bool isObject() const { return m_type == Object; } | |
inline bool isArray() const { return m_type == Array; } | |
inline QByteArray data() const { return m_data; } | |
inline const QList<JsonValue> &children() const { return m_children; } | |
inline int childCount() const { return m_children.size(); } | |
const JsonValue &childAt(int index) const { return m_children[index]; } | |
JsonValue &childAt(int index) { return m_children[index]; } | |
JsonValue findChild(const char *name) const; | |
QByteArray toString(bool multiline = false, int indent = 0) const; | |
void fromString(const QByteArray &str); | |
void setStreamOutput(const QByteArray &name, const QByteArray &content); | |
private: | |
static QByteArray parseCString(const char *&from, const char *to); | |
static QByteArray parseNumber(const char *&from, const char *to); | |
static QByteArray escapeCString(const QByteArray &ba); | |
static QString escapeCString(const QString &ba); | |
void parsePair(const char *&from, const char *to); | |
void parseValue(const char *&from, const char *to); | |
void parseObject(const char *&from, const char *to); | |
void parseArray(const char *&from, const char *to); | |
void dumpChildren(QByteArray *str, bool multiline, int indent) const; | |
}; | |
/* Thin wrapper around QByteArray for formatting JSON input. Use as in: | |
* JsonInputStream(byteArray) << '{' << "bla" << ':' << "blup" << '}'; | |
* Note that strings get double quotes and JSON-escaping, characters should be | |
* used for the array/hash delimiters. | |
* */ | |
class SYMBIANUTILS_EXPORT JsonInputStream { | |
public: | |
explicit JsonInputStream(QByteArray &a) : m_target(a) {} | |
JsonInputStream &operator<<(char c) { m_target.append(c); return *this; } | |
JsonInputStream &operator<<(const char *c) { appendCString(c); return *this; } | |
JsonInputStream &operator<<(const QByteArray &a) { appendCString(a.constData()); return *this; } | |
JsonInputStream &operator<<(const QString &c) { appendString(c); return *this; } | |
// Format as array | |
JsonInputStream &operator<<(const QStringList &c); | |
// Format as array | |
JsonInputStream &operator<<(const QVector<QByteArray> &ba); | |
JsonInputStream &operator<<(bool b); | |
JsonInputStream &operator<<(int i) | |
{ m_target.append(QByteArray::number(i)); return *this; } | |
JsonInputStream &operator<<(unsigned i) | |
{ m_target.append(QByteArray::number(i)); return *this; } | |
JsonInputStream &operator<<(quint64 i) | |
{ m_target.append(QByteArray::number(i)); return *this; } | |
private: | |
void appendString(const QString &); | |
void appendCString(const char *c); | |
QByteArray &m_target; | |
}; | |
} // namespace tcftrk | |
#endif // SYMBIANUTILS_JSON_H |