]> git.cworth.org Git - apitrace/blob - gui/apitracecall.h
Get JSON state to not be fully buffered into memory.
[apitrace] / gui / apitracecall.h
1 #ifndef APITRACECALL_H
2 #define APITRACECALL_H
3
4 #include "apisurface.h"
5
6 #include <QStaticText>
7 #include <QStringList>
8 #include <QUrl>
9 #include <QVariant>
10
11 #include "trace_model.hpp"
12
13
14 class ApiTrace;
15 class TraceLoader;
16
17 class VariantVisitor : public trace::Visitor
18 {
19 public:
20     VariantVisitor(TraceLoader *loader)
21         : m_loader(loader)
22     {}
23     virtual void visit(trace::Null *);
24     virtual void visit(trace::Bool *node);
25     virtual void visit(trace::SInt *node);
26     virtual void visit(trace::UInt *node);
27     virtual void visit(trace::Float *node);
28     virtual void visit(trace::Double *node);
29     virtual void visit(trace::String *node);
30     virtual void visit(trace::Enum *e);
31     virtual void visit(trace::Bitmask *bitmask);
32     virtual void visit(trace::Struct *str);
33     virtual void visit(trace::Array *array);
34     virtual void visit(trace::Blob *blob);
35     virtual void visit(trace::Pointer *ptr);
36
37     QVariant variant() const
38     {
39         return m_variant;
40     }
41 private:
42     TraceLoader *m_loader;
43     QVariant m_variant;
44 };
45
46
47 struct ApiTraceError
48 {
49     int callIndex;
50     QString type;
51     QString message;
52 };
53
54 class ApiTraceEnumSignature
55 {
56 public:
57     ApiTraceEnumSignature(const trace::EnumSig *sig);
58
59     QString name(signed long long value) const;
60
61 private:
62     typedef QList<QPair<QString, signed long long> > ValueList;
63     ValueList m_names;
64 };
65
66 class ApiEnum
67 {
68 public:
69     ApiEnum(ApiTraceEnumSignature *sig=0, signed long long value = 0);
70
71     QString toString() const;
72
73     QVariant value() const;
74     QString name() const;
75 private:
76     ApiTraceEnumSignature *m_sig;
77     signed long long m_value;
78 };
79 Q_DECLARE_METATYPE(ApiEnum);
80
81 class ApiPointer
82 {
83 public:
84     ApiPointer(unsigned long long val=0);
85
86     QString toString() const;
87
88     unsigned long long value() const;
89
90 private:
91     unsigned long long m_value;
92 };
93 Q_DECLARE_METATYPE(ApiPointer);
94
95 class ApiBitmask
96 {
97 public:
98     typedef QList<QPair<QString, unsigned long long> > Signature;
99
100     ApiBitmask(const trace::Bitmask *bitmask = 0);
101
102     QString toString() const;
103
104     unsigned long long value() const;
105     Signature signature() const;
106
107 private:
108     void init(const trace::Bitmask *bitmask);
109 private:
110     Signature m_sig;
111     unsigned long long m_value;
112 };
113 Q_DECLARE_METATYPE(ApiBitmask);
114
115 class ApiStruct
116 {
117 public:
118     struct Signature {
119         QString name;
120         QStringList memberNames;
121     };
122
123     ApiStruct(const trace::Struct *s = 0);
124
125     QString toString(bool multiLine = false) const;
126     Signature signature() const;
127     QList<QVariant> values() const;
128
129 private:
130     void init(const trace::Struct *bitmask);
131 private:
132     Signature m_sig;
133     QList<QVariant> m_members;
134 };
135 Q_DECLARE_METATYPE(ApiStruct);
136
137 class ApiArray
138 {
139 public:
140     ApiArray(const trace::Array *arr = 0);
141     ApiArray(const QVector<QVariant> &vals);
142
143     QString toString(bool multiLine = false) const;
144
145     QVector<QVariant> values() const;
146 private:
147     void init(const trace::Array *arr);
148 private:
149     QVector<QVariant> m_array;
150 };
151 Q_DECLARE_METATYPE(ApiArray);
152
153
154 QString apiVariantToString(const QVariant &variant, bool multiLine = false);
155
156 class ApiTraceFrame;
157
158 class ApiTraceState {
159 public:
160     ApiTraceState();
161     explicit ApiTraceState(const QVariantMap &parseJson);
162
163     bool isEmpty() const;
164     const QVariantMap & parameters() const;
165     const QMap<QString, QString> & shaderSources() const;
166     const QVariantMap & uniforms() const;
167     const QList<ApiTexture> & textures() const;
168     const QList<ApiFramebuffer> & framebuffers() const;
169
170     ApiFramebuffer colorBuffer() const;
171 private:
172     QVariantMap m_parameters;
173     QMap<QString, QString> m_shaderSources;
174     QVariantMap m_uniforms;
175     QList<ApiTexture> m_textures;
176     QList<ApiFramebuffer> m_framebuffers;
177 };
178 Q_DECLARE_METATYPE(ApiTraceState);
179
180 class ApiTraceCallSignature
181 {
182 public:
183     ApiTraceCallSignature(const QString &name,
184                           const QStringList &argNames);
185     ~ApiTraceCallSignature();
186
187     QString name() const
188     {
189         return m_name;
190     }
191     QStringList argNames() const
192     {
193         return m_argNames;
194     }
195
196     QUrl helpUrl() const;
197     void setHelpUrl(const QUrl &url);
198
199 private:
200     QString m_name;
201     QStringList m_argNames;
202     QUrl m_helpUrl;
203 };
204
205 class ApiTraceEvent
206 {
207 public:
208     enum Type {
209         None  = 0,
210         Call  = 1 << 0,
211         Frame = 1 << 1
212     };
213 public:
214     ApiTraceEvent();
215     ApiTraceEvent(Type t);
216     virtual ~ApiTraceEvent();
217
218     Type type() const { return (Type)m_type; }
219
220     virtual QStaticText staticText() const = 0;
221     virtual int numChildren() const = 0;
222
223     QVariantMap stateParameters() const;
224     ApiTraceState *state() const;
225     void setState(ApiTraceState *state);
226     bool hasState() const
227     {
228         return m_state && !m_state->isEmpty();
229     }
230
231 protected:
232     int m_type : 4;
233     mutable bool m_hasBinaryData;
234     mutable int m_binaryDataIndex:8;
235     ApiTraceState *m_state;
236
237     mutable QStaticText *m_staticText;
238 };
239 Q_DECLARE_METATYPE(ApiTraceEvent*);
240
241 class ApiTraceCall : public ApiTraceEvent
242 {
243 public:
244     ApiTraceCall(ApiTraceFrame *parentFrame, TraceLoader *loader,
245                  const trace::Call *tcall);
246     ~ApiTraceCall();
247
248     int index() const;
249     QString name() const;
250     QStringList argNames() const;
251     QVector<QVariant> arguments() const;
252     QVariant returnValue() const;
253     trace::CallFlags flags() const;
254     QUrl helpUrl() const;
255     void setHelpUrl(const QUrl &url);
256     ApiTraceFrame *parentFrame()const;
257     void setParentFrame(ApiTraceFrame *frame);
258
259     bool hasError() const;
260     QString error() const;
261     void setError(const QString &msg);
262
263     QVector<QVariant> originalValues() const;
264
265     bool edited() const;
266     void setEditedValues(const QVector<QVariant> &lst);
267     QVector<QVariant> editedValues() const;
268     void revert();
269
270     bool contains(const QString &str,
271                   Qt::CaseSensitivity sensitivity) const;
272
273     ApiTrace *parentTrace() const;
274
275     QString toHtml() const;
276     QString searchText() const;
277     QStaticText staticText() const;
278     int numChildren() const;
279     bool hasBinaryData() const;
280     int binaryDataIndex() const;
281 private:
282     int m_index;
283     ApiTraceCallSignature *m_signature;
284     QVector<QVariant> m_argValues;
285     QVariant m_returnValue;
286     trace::CallFlags m_flags;
287     ApiTraceFrame *m_parentFrame;
288
289     QVector<QVariant> m_editedValues;
290
291     QString m_error;
292
293     mutable QString m_richText;
294     mutable QString m_searchText;
295 };
296 Q_DECLARE_METATYPE(ApiTraceCall*);
297
298 class ApiTraceFrame : public ApiTraceEvent
299 {
300 public:
301     ApiTraceFrame(ApiTrace *parent=0);
302     ~ApiTraceFrame();
303     int number;
304
305     bool isEmpty() const;
306
307     void setParentTrace(ApiTrace *parent);
308     ApiTrace *parentTrace() const;
309
310     void setNumChildren(int num);
311     int numChildren() const;
312     int numChildrenToLoad() const;
313     QStaticText staticText() const;
314
315     int callIndex(ApiTraceCall *call) const;
316     ApiTraceCall *call(int idx) const;
317     ApiTraceCall *callWithIndex(int index) const;
318     void addCall(ApiTraceCall *call);
319     QVector<ApiTraceCall*> calls() const;
320     void setCalls(const QVector<ApiTraceCall*> &calls,
321                   quint64 binaryDataSize);
322
323     ApiTraceCall *findNextCall(ApiTraceCall *from,
324                                const QString &str,
325                                Qt::CaseSensitivity sensitivity) const;
326
327     ApiTraceCall *findPrevCall(ApiTraceCall *from,
328                                const QString &str,
329                                Qt::CaseSensitivity sensitivity) const;
330
331     int binaryDataSize() const;
332
333     bool isLoaded() const;
334     void setLoaded(bool l);
335
336     void setLastCallIndex(unsigned index);
337     unsigned lastCallIndex() const;
338
339     void setThumbnail(const QImage & thumbnail);
340     const QImage & thumbnail() const;
341
342 private:
343     ApiTrace *m_parentTrace;
344     quint64 m_binaryDataSize;
345     QVector<ApiTraceCall*> m_calls;
346     bool m_loaded;
347     unsigned m_callsToLoad;
348     unsigned m_lastCallIndex;
349     QImage m_thumbnail;
350 };
351 Q_DECLARE_METATYPE(ApiTraceFrame*);
352
353
354 #endif