diff options
| author | Ulf Hermann <ulf.hermann@theqtcompany.com> | 2015-09-14 13:40:35 +0200 |
|---|---|---|
| committer | Ulf Hermann <ulf.hermann@theqtcompany.com> | 2015-09-15 08:28:14 +0000 |
| commit | d5707e0e32b6dc0bfd3b07d43dba3e398c11dc5b (patch) | |
| tree | 90e9d6d56d20f9538e73cb5d51d9d1840171c159 /src/plugins/debugger/debuggerprotocol.cpp | |
| parent | 7d3bb6fdee5e1f4f08471d2531197d2445261dac (diff) | |
| download | qt-creator-d5707e0e32b6dc0bfd3b07d43dba3e398c11dc5b.tar.gz | |
Debugger: Use Qt's JSON encoder for debugger protocol
The V4 debug service expects correct JSON as input and gdb, lldb, and
pdb expect Python object literals. There is a subset of JSON that is
also valid as Python object literals and we use that for the protocol
spoken with gdb, lldb, and pdb. The strings passed to CDB are tunneled
through JSON strings and converted to byte arrays before sending them.
Change-Id: I87319b5450e5c3c3b29c565b75cddaa612767611
Task-number: QTCREATORBUG-14931
Reviewed-by: hjk <hjk@theqtcompany.com>
Diffstat (limited to 'src/plugins/debugger/debuggerprotocol.cpp')
| -rw-r--r-- | src/plugins/debugger/debuggerprotocol.cpp | 90 |
1 files changed, 33 insertions, 57 deletions
diff --git a/src/plugins/debugger/debuggerprotocol.cpp b/src/plugins/debugger/debuggerprotocol.cpp index 0d6b877bb1..651a8c1a2b 100644 --- a/src/plugins/debugger/debuggerprotocol.cpp +++ b/src/plugins/debugger/debuggerprotocol.cpp @@ -36,6 +36,8 @@ #include <QHostAddress> #include <QRegExp> #include <QTimeZone> +#include <QJsonArray> +#include <QJsonDocument> #include <ctype.h> @@ -779,106 +781,80 @@ QString decodeData(const QByteArray &ba, DebuggerEncoding encoding) // ////////////////////////////////////////////////////////////////////////////////// -void DebuggerCommand::argHelper(const char *name, const QByteArray &data) +template<typename Value> +QJsonValue addToJsonObject(const QJsonValue &args, const char *name, const Value &value) { - args.append('"'); - args.append(name); - args.append("\":"); - args.append(data); - args.append(","); + QTC_ASSERT(args.isObject() || args.isNull(), return args); + QJsonObject obj = args.toObject(); + obj.insert(QLatin1String(name), value); + return obj; } void DebuggerCommand::arg(const char *name, int value) { - argHelper(name, QByteArray::number(value)); + args = addToJsonObject(args, name, value); } void DebuggerCommand::arg(const char *name, qlonglong value) { - argHelper(name, QByteArray::number(value)); + args = addToJsonObject(args, name, value); } void DebuggerCommand::arg(const char *name, qulonglong value) { - argHelper(name, QByteArray::number(value)); + // gdb and lldb will correctly cast the value back to unsigned if needed, so this is no problem. + args = addToJsonObject(args, name, qint64(value)); } void DebuggerCommand::arg(const char *name, const QString &value) { - arg(name, value.toUtf8().data()); + args = addToJsonObject(args, name, value); } void DebuggerCommand::arg(const char *name, const QByteArray &value) { - arg(name, value.data()); + args = addToJsonObject(args, name, QLatin1String(value)); } void DebuggerCommand::arg(const char *name, const char *value) { - args.append('"'); - args.append(name); - args.append("\":\""); - args.append(value); - args.append("\","); + args = addToJsonObject(args, name, QLatin1String(value)); } void DebuggerCommand::arg(const char *name, const QList<int> &list) { - beginList(name); - foreach (int item, list) { - args.append(QByteArray::number(item)); - args.append(','); - } - endList(); + QJsonArray numbers; + foreach (int item, list) + numbers.append(item); + args = addToJsonObject(args, name, numbers); } void DebuggerCommand::arg(const char *value) { - args.append("\""); - args.append(value); - args.append("\","); -} - -void DebuggerCommand::beginList(const char *name) -{ - if (name) { - args += '"'; - args += name; - args += "\":"; - } - args += '['; + QTC_ASSERT(args.isArray() || args.isNull(), return); + QJsonArray arr = args.toArray(); + arr.append(QLatin1String(value)); + args = arr; } -void DebuggerCommand::endList() +void DebuggerCommand::arg(const char *name, const QJsonValue &value) { - if (args.endsWith(',')) - args.chop(1); - args += "],"; + args = addToJsonObject(args, name, value); } -void DebuggerCommand::beginGroup(const char *name) +QByteArray DebuggerCommand::argsToPython() const { - if (name) { - args += '"'; - args += name; - args += "\":"; - } - args += '{'; -} + // TODO: Verify that this is really Python. -void DebuggerCommand::endGroup() -{ - if (args.endsWith(',')) - args.chop(1); - args += "},"; + if (args.isArray()) + return QJsonDocument(args.toArray()).toJson(QJsonDocument::Compact); + else + return QJsonDocument(args.toObject()).toJson(QJsonDocument::Compact); } -QByteArray DebuggerCommand::arguments() const +QByteArray DebuggerCommand::argsToString() const { - QByteArray result = args; - if (result.endsWith(',')) - result.chop(1); - return result; + return args.toString().toLatin1(); } } // namespace Internal |
