debuggerprotocol.h 8.29 KB
Newer Older
hjk's avatar
hjk committed
1
/****************************************************************************
con's avatar
con committed
2
**
3 4
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
con's avatar
con committed
5
**
hjk's avatar
hjk committed
6
** This file is part of Qt Creator.
con's avatar
con committed
7
**
hjk's avatar
hjk committed
8 9 10 11
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
12 13 14
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
15
**
16 17 18 19 20 21 22
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
con's avatar
con committed
23
**
hjk's avatar
hjk committed
24
****************************************************************************/
con's avatar
con committed
25

hjk's avatar
hjk committed
26
#pragma once
27

28
#include <QByteArray>
29
#include <QList>
30
#include <QString>
31 32
#include <QJsonValue>
#include <QJsonObject>
hjk's avatar
hjk committed
33
#include <QVector>
34 35

#include <functional>
con's avatar
con committed
36 37 38 39

namespace Debugger {
namespace Internal {

40 41
class DebuggerResponse;

42 43 44 45
// Convenience structure to build up backend commands.
class DebuggerCommand
{
public:
46 47
    typedef std::function<void(const DebuggerResponse &)> Callback;

48
    DebuggerCommand() {}
hjk's avatar
hjk committed
49 50 51 52
    DebuggerCommand(const QString &f) : function(f), flags(0) {}
    DebuggerCommand(const QString &f, const QJsonValue &a) : function(f), args(a), flags(0) {}
    DebuggerCommand(const QString &f, int fl) : function(f), flags(fl) {}
    DebuggerCommand(const QString &f, int fl, const Callback &cb) : function(f), callback(cb), flags(fl) {}
53

54
    void arg(const char *value);
55
    void arg(const char *name, bool value);
56 57 58 59 60
    void arg(const char *name, int value);
    void arg(const char *name, qlonglong value);
    void arg(const char *name, qulonglong value);
    void arg(const char *name, const QString &value);
    void arg(const char *name, const char *value);
61
    void arg(const char *name, const QList<int> &list);
62
    void arg(const char *name, const QJsonValue &value);
63

hjk's avatar
hjk committed
64 65
    QString argsToPython() const;
    QString argsToString() const;
66

hjk's avatar
hjk committed
67
    QString function;
68
    QJsonValue args;
69
    Callback callback;
70
    uint postTime; // msecsSinceStartOfDay
71
    int flags;
72 73 74

private:
    void argHelper(const char *name, const QByteArray &value);
75 76
};

con's avatar
con committed
77 78 79 80 81 82
// FIXME: rename into GdbMiValue
class GdbMi
{
public:
    GdbMi() : m_type(Invalid) {}

hjk's avatar
hjk committed
83 84
    QString m_name;
    QString m_data;
hjk's avatar
hjk committed
85
    QVector<GdbMi> m_children;
con's avatar
con committed
86

87
    enum Type { Invalid, Const, Tuple, List };
con's avatar
con committed
88 89 90

    Type m_type;

91
    Type type() const { return m_type; }
hjk's avatar
hjk committed
92 93
    const QString &name() const { return m_name; }
    bool hasName(const QString &name) const { return m_name == name; }
con's avatar
con committed
94

95 96
    bool isValid() const { return m_type != Invalid; }
    bool isList() const { return m_type == List; }
con's avatar
con committed
97

hjk's avatar
hjk committed
98
    const QString &data() const { return m_data; }
hjk's avatar
hjk committed
99
    const QVector<GdbMi> &children() const { return m_children; }
100
    int childCount() const { return int(m_children.size()); }
con's avatar
con committed
101

102
    const GdbMi &childAt(int index) const { return m_children[index]; }
103
    const GdbMi &operator[](const char *name) const;
con's avatar
con committed
104

hjk's avatar
hjk committed
105
    QString toString(bool multiline = false, int indent = 0) const;
106
    qulonglong toAddress() const;
107
    int toInt() const { return m_data.toInt(); }
108
    qint64 toLongLong() const { return m_data.toLongLong(); }
hjk's avatar
hjk committed
109 110 111 112 113 114 115 116 117 118
    void fromString(const QString &str);
    void fromStringMultiple(const QString &str);

    static QString parseCString(const QChar *&from, const QChar *to);
    static QString escapeCString(const QString &ba);
    void parseResultOrValue(const QChar *&from, const QChar *to);
    void parseValue(const QChar *&from, const QChar *to);
    void parseTuple(const QChar *&from, const QChar *to);
    void parseTuple_helper(const QChar *&from, const QChar *to);
    void parseList(const QChar *&from, const QChar *to);
con's avatar
con committed
119

120
private:
hjk's avatar
hjk committed
121
    void dumpChildren(QString *str, bool multiline, int indent) const;
con's avatar
con committed
122 123
};

hjk's avatar
hjk committed
124 125 126 127
QString fromHex(const QString &str);
QString toHex(const QString &str);


128
enum ResultClass
con's avatar
con committed
129
{
130
    // "done" | "running" | "connected" | "error" | "exit"
131 132 133 134 135 136
    ResultUnknown,
    ResultDone,
    ResultRunning,
    ResultConnected,
    ResultError,
    ResultExit
con's avatar
con committed
137 138
};

139
class DebuggerResponse
con's avatar
con committed
140 141
{
public:
142
    DebuggerResponse() : token(-1), resultClass(ResultUnknown) {}
hjk's avatar
hjk committed
143 144 145 146 147 148 149 150
    QString toString() const;
    static QString stringFromResultClass(ResultClass resultClass);

    int         token;
    ResultClass resultClass;
    GdbMi       data;
    QString     logStreamOutput;
    QString     consoleStreamOutput;
con's avatar
con committed
151 152
};

153
void extractGdbVersion(const QString &msg,
154
    int *gdbVersion, int *gdbBuildVersion, bool *isMacGdb, bool *isQnxGdb);
155

hjk's avatar
hjk committed
156

hjk's avatar
hjk committed
157
class DebuggerEncoding
158
{
hjk's avatar
hjk committed
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
public:
    enum EncodingType {
        Unencoded,
        HexEncodedLocal8Bit,
        HexEncodedLatin1,
        HexEncodedUtf8,
        HexEncodedUtf16,
        HexEncodedUcs4,
        HexEncodedSignedInteger,
        HexEncodedUnsignedInteger,
        HexEncodedFloat,
        JulianDate,
        MillisecondsSinceMidnight,
        JulianDateAndMillisecondsSinceMidnight,
        IPv6AddressAndHexScopeId,
        DateTimeInternal,
    };

    DebuggerEncoding() {}
hjk's avatar
hjk committed
178
    explicit DebuggerEncoding(const QString &data);
hjk's avatar
hjk committed
179 180 181 182 183
    QString toString() const;

    EncodingType type = Unencoded;
    int size = 0;
    bool quotes = false;
184 185
};

hjk's avatar
hjk committed
186
// Decode string data as returned by the dumper helpers.
hjk's avatar
hjk committed
187
QString decodeData(const QString &baIn, const QString &encoding);
hjk's avatar
hjk committed
188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240


// These enum values correspond to possible value display format requests,
// typically selected by the user using the L&E context menu, under
// "Change Value Display Format". They are passed from the frontend to
// the dumpers.
//
// Keep in sync with dumper.py.
//
// \note Add new enum values only at the end, as the numeric values are
// persisted in user settings.

enum DisplayFormat
{
    AutomaticFormat             =  0, // Based on type for individuals, dumper default for types.
                                      // Could be anything reasonably cheap.
    RawFormat                   =  1, // No formatting at all.

    SimpleFormat                =  2, // Typical simple format (e.g. for QModelIndex row/column)
    EnhancedFormat              =  3, // Enhanced format (e.g. for QModelIndex with resolved display)
    SeparateFormat              =  4, // Display in separate Window

    Latin1StringFormat          =  5,
    SeparateLatin1StringFormat  =  6,
    Utf8StringFormat            =  7,
    SeparateUtf8StringFormat    =  8,
    Local8BitStringFormat       =  9,
    Utf16StringFormat           = 10,
    Ucs4StringFormat            = 11,

    Array10Format               = 12,
    Array100Format              = 13,
    Array1000Format             = 14,
    Array10000Format            = 15,
    ArrayPlotFormat             = 16,

    CompactMapFormat            = 17,
    DirectQListStorageFormat    = 18,
    IndirectQListStorageFormat  = 19,

    BoolTextFormat              = 20, // Bools as "true" or "false" - Frontend internal only.
    BoolIntegerFormat           = 21, // Bools as "0" or "1" - Frontend internal only

    DecimalIntegerFormat        = 22, // Frontend internal only
    HexadecimalIntegerFormat    = 23, // Frontend internal only
    BinaryIntegerFormat         = 24, // Frontend internal only
    OctalIntegerFormat          = 25, // Frontend internal only

    CompactFloatFormat          = 26, // Frontend internal only
    ScientificFloatFormat       = 27  // Frontend internal only
};


241
// These values are passed from the dumper to the frontend,
hjk's avatar
hjk committed
242 243 244
// typically as a result of passing a related DisplayFormat value.
// They are never stored in settings.

245 246 247 248 249 250 251
const char DisplayLatin1String[] = "latin1:separate";
const char DisplayUtf8String[]   = "utf8:separate";
const char DisplayUtf16String[]  = "utf16:separate";
const char DisplayUcs4String[]   = "ucs4:separate";
const char DisplayImageData[]    = "imagedata:separate";
const char DisplayImageFile[]    = "imagefile:separate";
const char DisplayPlotData[]     = "plotdata:separate";
252
const char DisplayArrayData[]    = "arraydata:separate";
253

con's avatar
con committed
254 255
} // namespace Internal
} // namespace Debugger