diff options
author | hjk <hjk121@nokiamail.com> | 2013-01-24 11:19:15 +0100 |
---|---|---|
committer | hjk <hjk121@nokiamail.com> | 2013-01-24 12:22:31 +0100 |
commit | 63439a5f2164d608f552913d976cd492f331a8da (patch) | |
tree | 49056c1682d8ffd7ca16ab4e609418edcb853865 | |
parent | b57e37243d8d8a4a993ee25c5a120638ede6368a (diff) | |
download | qt-creator-63439a5f2164d608f552913d976cd492f331a8da.tar.gz |
Debugger: move MI decoding to debuggerprotocol.{h,cpp}
Change-Id: I9d2eaf43b66f0db74ba2584157d6df8280d76652
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
-rw-r--r-- | src/plugins/debugger/debuggerprotocol.cpp | 155 | ||||
-rw-r--r-- | src/plugins/debugger/debuggerprotocol.h | 45 | ||||
-rw-r--r-- | src/plugins/debugger/watchhandler.cpp | 7 | ||||
-rw-r--r-- | src/plugins/debugger/watchutils.cpp | 139 | ||||
-rw-r--r-- | src/plugins/debugger/watchutils.h | 47 |
5 files changed, 199 insertions, 194 deletions
diff --git a/src/plugins/debugger/debuggerprotocol.cpp b/src/plugins/debugger/debuggerprotocol.cpp index a194ff90df..cb4cde81cd 100644 --- a/src/plugins/debugger/debuggerprotocol.cpp +++ b/src/plugins/debugger/debuggerprotocol.cpp @@ -29,11 +29,10 @@ #include "debuggerprotocol.h" -#include <utils/qtcassert.h> - #include <QByteArray> +#include <QCoreApplication> +#include <QDateTime> #include <QDebug> -#include <QRegExp> #include <QTextStream> #include <ctype.h> @@ -181,7 +180,7 @@ void GdbMi::parseValue(const char *&from, const char *to) void GdbMi::parseTuple(const char *&from, const char *to) { //qDebug() << "parseTuple: " << QByteArray(from, to - from); - QTC_CHECK(*from == '{'); + //QTC_CHECK(*from == '{'); ++from; parseTuple_helper(from, to); } @@ -209,7 +208,7 @@ void GdbMi::parseTuple_helper(const char *&from, const char *to) void GdbMi::parseList(const char *&from, const char *to) { //qDebug() << "parseList: " << QByteArray(from, to - from); - QTC_CHECK(*from == '['); + //QTC_CHECK(*from == '['); ++from; m_type = List; skipCommas(from, to); @@ -429,5 +428,151 @@ void extractGdbVersion(const QString &msg, *gdbBuildVersion = build.section(dot, 1, 1).toInt(); } +////////////////////////////////////////////////////////////////////////////////// +// +// Decoding +// +////////////////////////////////////////////////////////////////////////////////// + +static QString quoteUnprintableLatin1(const QByteArray &ba) +{ + QString res; + char buf[10]; + for (int i = 0, n = ba.size(); i != n; ++i) { + const unsigned char c = ba.at(i); + if (isprint(c)) { + res += QLatin1Char(c); + } else { + qsnprintf(buf, sizeof(buf) - 1, "\\%x", int(c)); + res += QLatin1String(buf); + } + } + return res; +} + +static QDate dateFromData(int jd) +{ + return jd ? QDate::fromJulianDay(jd) : QDate(); +} + +static QTime timeFromData(int ms) +{ + return ms == -1 ? QTime() : QTime(0, 0, 0, 0).addMSecs(ms); +} + +QString decodeData(const QByteArray &ba, int encoding) +{ + switch (encoding) { + case Unencoded8Bit: // 0 + return quoteUnprintableLatin1(ba); + case Base64Encoded8BitWithQuotes: { // 1, used for QByteArray + const QChar doubleQuote(QLatin1Char('"')); + QString rc = doubleQuote; + rc += quoteUnprintableLatin1(QByteArray::fromBase64(ba)); + rc += doubleQuote; + return rc; + } + case Base64Encoded16BitWithQuotes: { // 2, used for QString + const QChar doubleQuote(QLatin1Char('"')); + const QByteArray decodedBa = QByteArray::fromBase64(ba); + QString rc = doubleQuote; + rc += QString::fromUtf16(reinterpret_cast<const ushort *> + (decodedBa.data()), decodedBa.size() / 2); + rc += doubleQuote; + return rc; + } + case Base64Encoded32BitWithQuotes: { // 3 + const QByteArray decodedBa = QByteArray::fromBase64(ba); + const QChar doubleQuote(QLatin1Char('"')); + QString rc = doubleQuote; + rc += QString::fromUcs4(reinterpret_cast<const uint *> + (decodedBa.data()), decodedBa.size() / 4); + rc += doubleQuote; + return rc; + } + case Base64Encoded16Bit: { // 4, without quotes (see 2) + const QByteArray decodedBa = QByteArray::fromBase64(ba); + return QString::fromUtf16(reinterpret_cast<const ushort *> + (decodedBa.data()), decodedBa.size() / 2); + } + case Base64Encoded8Bit: { // 5, without quotes (see 1) + return quoteUnprintableLatin1(QByteArray::fromBase64(ba)); + } + case Hex2EncodedLatin1WithQuotes: { // 6, %02x encoded 8 bit Latin1 data + const QChar doubleQuote(QLatin1Char('"')); + const QByteArray decodedBa = QByteArray::fromHex(ba); + return doubleQuote + QString::fromLatin1(decodedBa) + doubleQuote; + } + case Hex4EncodedLittleEndianWithQuotes: { // 7, %04x encoded 16 bit data + const QChar doubleQuote(QLatin1Char('"')); + const QByteArray decodedBa = QByteArray::fromHex(ba); + return doubleQuote + QString::fromUtf16(reinterpret_cast<const ushort *> + (decodedBa.data()), decodedBa.size() / 2) + doubleQuote; + } + case Hex8EncodedLittleEndianWithQuotes: { // 8, %08x encoded 32 bit data + const QChar doubleQuote(QLatin1Char('"')); + const QByteArray decodedBa = QByteArray::fromHex(ba); + return doubleQuote + QString::fromUcs4(reinterpret_cast<const uint *> + (decodedBa.data()), decodedBa.size() / 4) + doubleQuote; + } + case Hex2EncodedUtf8WithQuotes: { // 9, %02x encoded 8 bit UTF-8 data + const QChar doubleQuote(QLatin1Char('"')); + const QByteArray decodedBa = QByteArray::fromHex(ba); + return doubleQuote + QString::fromUtf8(decodedBa) + doubleQuote; + } + case Hex8EncodedBigEndian: { // 10, %08x encoded 32 bit data + const QChar doubleQuote(QLatin1Char('"')); + QByteArray decodedBa = QByteArray::fromHex(ba); + for (int i = 0; i < decodedBa.size() - 3; i += 4) { + char c = decodedBa.at(i); + decodedBa[i] = decodedBa.at(i + 3); + decodedBa[i + 3] = c; + c = decodedBa.at(i + 1); + decodedBa[i + 1] = decodedBa.at(i + 2); + decodedBa[i + 2] = c; + } + return doubleQuote + QString::fromUcs4(reinterpret_cast<const uint *> + (decodedBa.data()), decodedBa.size() / 4) + doubleQuote; + } + case Hex4EncodedBigEndianWithQuotes: { // 11, %04x encoded 16 bit data + const QChar doubleQuote(QLatin1Char('"')); + QByteArray decodedBa = QByteArray::fromHex(ba); + for (int i = 0; i < decodedBa.size(); i += 2) { + char c = decodedBa.at(i); + decodedBa[i] = decodedBa.at(i + 1); + decodedBa[i + 1] = c; + } + return doubleQuote + QString::fromUtf16(reinterpret_cast<const ushort *> + (decodedBa.data()), decodedBa.size() / 2) + doubleQuote; + } + case Hex4EncodedLittleEndianWithoutQuotes: { // 12, see 7, without quotes + const QByteArray decodedBa = QByteArray::fromHex(ba); + return QString::fromUtf16(reinterpret_cast<const ushort *> + (decodedBa.data()), decodedBa.size() / 2); + } + case Hex2EncodedLocal8BitWithQuotes: { // 13, %02x encoded 8 bit UTF-8 data + const QChar doubleQuote(QLatin1Char('"')); + const QByteArray decodedBa = QByteArray::fromHex(ba); + return doubleQuote + QString::fromLocal8Bit(decodedBa) + doubleQuote; + } + case JulianDate: { // 14, an integer count + const QDate date = dateFromData(ba.toInt()); + return date.toString(Qt::TextDate); + } + case MillisecondsSinceMidnight: { + const QTime time = timeFromData(ba.toInt()); + return time.toString(Qt::TextDate); + } + case JulianDateAndMillisecondsSinceMidnight: { + const int p = ba.indexOf('/'); + const QDate date = dateFromData(ba.left(p).toInt()); + const QTime time = timeFromData(ba.mid(p + 1 ).toInt()); + return QDateTime(date, time).toString(Qt::TextDate); + } + } + qDebug() << "ENCODING ERROR: " << encoding; + return QCoreApplication::translate("Debugger", "<Encoding error>"); +} + } // namespace Internal } // namespace Debugger diff --git a/src/plugins/debugger/debuggerprotocol.h b/src/plugins/debugger/debuggerprotocol.h index 539ac1129a..dc736102d0 100644 --- a/src/plugins/debugger/debuggerprotocol.h +++ b/src/plugins/debugger/debuggerprotocol.h @@ -174,6 +174,51 @@ public: void extractGdbVersion(const QString &msg, int *gdbVersion, int *gdbBuildVersion, bool *isMacGdb, bool *isQnxGdb); +// Keep in sync with dumper.py +enum DebuggerEncoding +{ + Unencoded8Bit = 0, + Base64Encoded8BitWithQuotes = 1, + Base64Encoded16BitWithQuotes = 2, + Base64Encoded32BitWithQuotes = 3, + Base64Encoded16Bit = 4, + Base64Encoded8Bit = 5, + Hex2EncodedLatin1WithQuotes = 6, + Hex4EncodedLittleEndianWithQuotes = 7, + Hex8EncodedLittleEndianWithQuotes = 8, + Hex2EncodedUtf8WithQuotes = 9, + Hex8EncodedBigEndian = 10, + Hex4EncodedBigEndianWithQuotes = 11, + Hex4EncodedLittleEndianWithoutQuotes = 12, + Hex2EncodedLocal8BitWithQuotes = 13, + JulianDate = 14, + MillisecondsSinceMidnight = 15, + JulianDateAndMillisecondsSinceMidnight = 16, + Hex2EncodedInt1 = 17, + Hex2EncodedInt2 = 18, + Hex2EncodedInt4 = 19, + Hex2EncodedInt8 = 20, + Hex2EncodedUInt1 = 21, + Hex2EncodedUInt2 = 22, + Hex2EncodedUInt4 = 23, + Hex2EncodedUInt8 = 24, + Hex2EncodedFloat4 = 25, + Hex2EncodedFloat8 = 26 +}; + +// Keep in sync with dumper.py, symbolgroupvalue.cpp of CDB +enum DebuggerDisplay { + StopDisplay = 0, + DisplayImageData = 1, + DisplayUtf16String = 2, + DisplayImageFile = 3, + DisplayProcess = 4, + DisplayLatin1String = 5, + DisplayUtf8String = 6 +}; +// Decode string data as returned by the dumper helpers. +QString decodeData(const QByteArray &baIn, int encoding); + } // namespace Internal } // namespace Debugger diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp index 15ac26206a..8cbd0c6cbf 100644 --- a/src/plugins/debugger/watchhandler.cpp +++ b/src/plugins/debugger/watchhandler.cpp @@ -30,13 +30,14 @@ #include "watchhandler.h" #include "breakhandler.h" -#include "debuggerinternalconstants.h" #include "debuggeractions.h" #include "debuggercore.h" -#include "debuggerengine.h" #include "debuggerdialogs.h" -#include "watchutils.h" +#include "debuggerengine.h" +#include "debuggerinternalconstants.h" +#include "debuggerprotocol.h" #include "imageviewer.h" +#include "watchutils.h" #include <utils/qtcassert.h> #include <utils/savedaction.h> diff --git a/src/plugins/debugger/watchutils.cpp b/src/plugins/debugger/watchutils.cpp index a54e244145..a3df9c3bbc 100644 --- a/src/plugins/debugger/watchutils.cpp +++ b/src/plugins/debugger/watchutils.cpp @@ -558,145 +558,6 @@ QByteArray gdbQuoteTypes(const QByteArray &type) // Utilities to decode string data returned by the dumper helpers. -QString quoteUnprintableLatin1(const QByteArray &ba) -{ - QString res; - char buf[10]; - for (int i = 0, n = ba.size(); i != n; ++i) { - const unsigned char c = ba.at(i); - if (isprint(c)) { - res += QLatin1Char(c); - } else { - qsnprintf(buf, sizeof(buf) - 1, "\\%x", int(c)); - res += QLatin1String(buf); - } - } - return res; -} - -static QDate dateFromData(int jd) -{ - return jd ? QDate::fromJulianDay(jd) : QDate(); -} - -static QTime timeFromData(int ms) -{ - return ms == -1 ? QTime() : QTime(0, 0, 0, 0).addMSecs(ms); -} - -QString decodeData(const QByteArray &ba, int encoding) -{ - switch (encoding) { - case Unencoded8Bit: // 0 - return quoteUnprintableLatin1(ba); - case Base64Encoded8BitWithQuotes: { // 1, used for QByteArray - const QChar doubleQuote(QLatin1Char('"')); - QString rc = doubleQuote; - rc += quoteUnprintableLatin1(QByteArray::fromBase64(ba)); - rc += doubleQuote; - return rc; - } - case Base64Encoded16BitWithQuotes: { // 2, used for QString - const QChar doubleQuote(QLatin1Char('"')); - const QByteArray decodedBa = QByteArray::fromBase64(ba); - QString rc = doubleQuote; - rc += QString::fromUtf16(reinterpret_cast<const ushort *> - (decodedBa.data()), decodedBa.size() / 2); - rc += doubleQuote; - return rc; - } - case Base64Encoded32BitWithQuotes: { // 3 - const QByteArray decodedBa = QByteArray::fromBase64(ba); - const QChar doubleQuote(QLatin1Char('"')); - QString rc = doubleQuote; - rc += QString::fromUcs4(reinterpret_cast<const uint *> - (decodedBa.data()), decodedBa.size() / 4); - rc += doubleQuote; - return rc; - } - case Base64Encoded16Bit: { // 4, without quotes (see 2) - const QByteArray decodedBa = QByteArray::fromBase64(ba); - return QString::fromUtf16(reinterpret_cast<const ushort *> - (decodedBa.data()), decodedBa.size() / 2); - } - case Base64Encoded8Bit: { // 5, without quotes (see 1) - return quoteUnprintableLatin1(QByteArray::fromBase64(ba)); - } - case Hex2EncodedLatin1WithQuotes: { // 6, %02x encoded 8 bit Latin1 data - const QChar doubleQuote(QLatin1Char('"')); - const QByteArray decodedBa = QByteArray::fromHex(ba); - return doubleQuote + QString::fromLatin1(decodedBa) + doubleQuote; - } - case Hex4EncodedLittleEndianWithQuotes: { // 7, %04x encoded 16 bit data - const QChar doubleQuote(QLatin1Char('"')); - const QByteArray decodedBa = QByteArray::fromHex(ba); - return doubleQuote + QString::fromUtf16(reinterpret_cast<const ushort *> - (decodedBa.data()), decodedBa.size() / 2) + doubleQuote; - } - case Hex8EncodedLittleEndianWithQuotes: { // 8, %08x encoded 32 bit data - const QChar doubleQuote(QLatin1Char('"')); - const QByteArray decodedBa = QByteArray::fromHex(ba); - return doubleQuote + QString::fromUcs4(reinterpret_cast<const uint *> - (decodedBa.data()), decodedBa.size() / 4) + doubleQuote; - } - case Hex2EncodedUtf8WithQuotes: { // 9, %02x encoded 8 bit UTF-8 data - const QChar doubleQuote(QLatin1Char('"')); - const QByteArray decodedBa = QByteArray::fromHex(ba); - return doubleQuote + QString::fromUtf8(decodedBa) + doubleQuote; - } - case Hex8EncodedBigEndian: { // 10, %08x encoded 32 bit data - const QChar doubleQuote(QLatin1Char('"')); - QByteArray decodedBa = QByteArray::fromHex(ba); - for (int i = 0; i < decodedBa.size() - 3; i += 4) { - char c = decodedBa.at(i); - decodedBa[i] = decodedBa.at(i + 3); - decodedBa[i + 3] = c; - c = decodedBa.at(i + 1); - decodedBa[i + 1] = decodedBa.at(i + 2); - decodedBa[i + 2] = c; - } - return doubleQuote + QString::fromUcs4(reinterpret_cast<const uint *> - (decodedBa.data()), decodedBa.size() / 4) + doubleQuote; - } - case Hex4EncodedBigEndianWithQuotes: { // 11, %04x encoded 16 bit data - const QChar doubleQuote(QLatin1Char('"')); - QByteArray decodedBa = QByteArray::fromHex(ba); - for (int i = 0; i < decodedBa.size(); i += 2) { - char c = decodedBa.at(i); - decodedBa[i] = decodedBa.at(i + 1); - decodedBa[i + 1] = c; - } - return doubleQuote + QString::fromUtf16(reinterpret_cast<const ushort *> - (decodedBa.data()), decodedBa.size() / 2) + doubleQuote; - } - case Hex4EncodedLittleEndianWithoutQuotes: { // 12, see 7, without quotes - const QByteArray decodedBa = QByteArray::fromHex(ba); - return QString::fromUtf16(reinterpret_cast<const ushort *> - (decodedBa.data()), decodedBa.size() / 2); - } - case Hex2EncodedLocal8BitWithQuotes: { // 13, %02x encoded 8 bit UTF-8 data - const QChar doubleQuote(QLatin1Char('"')); - const QByteArray decodedBa = QByteArray::fromHex(ba); - return doubleQuote + QString::fromLocal8Bit(decodedBa) + doubleQuote; - } - case JulianDate: { // 14, an integer count - const QDate date = dateFromData(ba.toInt()); - return date.toString(Qt::TextDate); - } - case MillisecondsSinceMidnight: { - const QTime time = timeFromData(ba.toInt()); - return time.toString(Qt::TextDate); - } - case JulianDateAndMillisecondsSinceMidnight: { - const int p = ba.indexOf('/'); - const QDate date = dateFromData(ba.left(p).toInt()); - const QTime time = timeFromData(ba.mid(p + 1 ).toInt()); - return QDateTime(date, time).toString(Qt::TextDate); - } - } - qDebug() << "ENCODING ERROR: " << encoding; - return QCoreApplication::translate("Debugger", "<Encoding error>"); -} template <class T> void decodeArrayHelper(QList<WatchData> *list, const WatchData &tmplate, diff --git a/src/plugins/debugger/watchutils.h b/src/plugins/debugger/watchutils.h index 87f72d1738..11d3f0566a 100644 --- a/src/plugins/debugger/watchutils.h +++ b/src/plugins/debugger/watchutils.h @@ -51,49 +51,6 @@ namespace Internal { class WatchData; class GdbMi; -// Keep in sync with dumper.py -enum DebuggerEncoding -{ - Unencoded8Bit = 0, - Base64Encoded8BitWithQuotes = 1, - Base64Encoded16BitWithQuotes = 2, - Base64Encoded32BitWithQuotes = 3, - Base64Encoded16Bit = 4, - Base64Encoded8Bit = 5, - Hex2EncodedLatin1WithQuotes = 6, - Hex4EncodedLittleEndianWithQuotes = 7, - Hex8EncodedLittleEndianWithQuotes = 8, - Hex2EncodedUtf8WithQuotes = 9, - Hex8EncodedBigEndian = 10, - Hex4EncodedBigEndianWithQuotes = 11, - Hex4EncodedLittleEndianWithoutQuotes = 12, - Hex2EncodedLocal8BitWithQuotes = 13, - JulianDate = 14, - MillisecondsSinceMidnight = 15, - JulianDateAndMillisecondsSinceMidnight = 16, - Hex2EncodedInt1 = 17, - Hex2EncodedInt2 = 18, - Hex2EncodedInt4 = 19, - Hex2EncodedInt8 = 20, - Hex2EncodedUInt1 = 21, - Hex2EncodedUInt2 = 22, - Hex2EncodedUInt4 = 23, - Hex2EncodedUInt8 = 24, - Hex2EncodedFloat4 = 25, - Hex2EncodedFloat8 = 26 -}; - -// Keep in sync with dumper.py, symbolgroupvalue.cpp of CDB -enum DebuggerDisplay { - StopDisplay = 0, - DisplayImageData = 1, - DisplayUtf16String = 2, - DisplayImageFile = 3, - DisplayProcess = 4, - DisplayLatin1String = 5, - DisplayUtf8String = 6 -}; - bool isEditorDebuggable(Core::IEditor *editor); QByteArray dotEscape(QByteArray str); QString currentTime(); @@ -114,8 +71,6 @@ bool isIntType(const QByteArray &type); QString formatToolTipAddress(quint64 a); -QString quoteUnprintableLatin1(const QByteArray &ba); - // Editor tooltip support bool isCppEditor(Core::IEditor *editor); QString cppExpressionAt(TextEditor::ITextEditor *editor, int pos, @@ -124,8 +79,6 @@ QString removeObviousSideEffects(const QString &exp); QString fixCppExpression(const QString &exp); QString cppFunctionAt(const QString &fileName, int line); // Decode string data as returned by the dumper helpers. -QString decodeData(const QByteArray &baIn, int encoding); -// Decode string data as returned by the dumper helpers. void decodeArray(WatchData *list, const WatchData &tmplate, const QByteArray &rawData, int encoding); |