]> git.cworth.org Git - apitrace/blob - gui/apitrace.h
Use skiplist-based FastCallSet within trace::CallSet
[apitrace] / gui / apitrace.h
1 #ifndef APITRACE_H
2 #define APITRACE_H
3
4 #include "apitracecall.h"
5
6 #include "trace_api.hpp"
7
8 #include <QObject>
9 #include <QSet>
10
11 class TraceLoader;
12 class SaverThread;
13 class QThread;
14
15 class ApiTrace : public QObject
16 {
17     Q_OBJECT
18 public:
19     enum SearchResult {
20         SearchResult_NotFound,
21         SearchResult_Found,
22         SearchResult_Wrapped
23     };
24     struct SearchRequest {
25         enum Direction {
26             Next,
27             Prev
28         };
29         SearchRequest()
30             : direction(Next)
31         {}
32         SearchRequest(Direction dir,
33                       ApiTraceFrame *f,
34                       ApiTraceCall *call,
35                       QString str,
36                       Qt::CaseSensitivity caseSens)
37             : direction(dir),
38               frame(f),
39               from(call),
40               text(str),
41               cs(caseSens)
42         {}
43         Direction direction;
44         ApiTraceFrame *frame;
45         ApiTraceCall *from;
46         QString text;
47         Qt::CaseSensitivity cs;
48     };
49
50 public:
51     ApiTrace();
52     ~ApiTrace();
53
54     bool isEmpty() const;
55
56     QString fileName() const;
57
58     ApiTraceState defaultState() const;
59
60     ApiTraceCall *callWithIndex(int idx) const;
61
62     const QList<ApiTraceFrame*> & frames() const;
63     ApiTraceFrame *frameAt(int idx) const;
64     int numFrames() const;
65     int numCallsInFrame(int idx) const;
66
67     void callEdited(ApiTraceCall *call);
68     void callReverted(ApiTraceCall *call);
69     void callError(ApiTraceCall *call);
70
71     bool edited() const;
72     bool needsSaving() const;
73
74     bool isSaving() const;
75
76     bool hasErrors() const;
77
78     trace::API api() const;
79
80 public slots:
81     void setFileName(const QString &name);
82     void save();
83     void loadFrame(ApiTraceFrame *frame);
84     void findNext(ApiTraceFrame *frame,
85                   ApiTraceCall *call,
86                   const QString &str,
87                   Qt::CaseSensitivity sensitivity);
88     void findPrev(ApiTraceFrame *frame,
89                   ApiTraceCall *call,
90                   const QString &str,
91                   Qt::CaseSensitivity sensitivity);
92     void findFrameStart(ApiTraceFrame *frame);
93     void findFrameEnd(ApiTraceFrame *frame);
94     void findCallIndex(int index);
95     void setCallError(const ApiTraceError &error);
96
97     void bindThumbnailsToFrames(const QList<QImage> &thumbnails);
98
99 signals:
100     void loadTrace(const QString &name);
101     void requestFrame(ApiTraceFrame *frame);
102     void startedLoadingTrace();
103     void loaded(int percent);
104     void finishedLoadingTrace();
105     void invalidated();
106     void framesInvalidated();
107     void changed(ApiTraceEvent *event);
108     void startedSaving();
109     void saved();
110     void findResult(const ApiTrace::SearchRequest &request,
111                     ApiTrace::SearchResult result,
112                     ApiTraceCall *call);
113
114     void beginAddingFrames(int oldCount, int numAdded);
115     void endAddingFrames();
116     void beginLoadingFrame(ApiTraceFrame *frame, int numAdded);
117     void endLoadingFrame(ApiTraceFrame *frame);
118     void foundFrameStart(ApiTraceFrame *frame);
119     void foundFrameEnd(ApiTraceFrame *frame);
120     void foundCallIndex(ApiTraceCall *call);
121
122 signals:
123     void loaderSearch(const ApiTrace::SearchRequest &request);
124     void loaderFindFrameStart(ApiTraceFrame *frame);
125     void loaderFindFrameEnd(ApiTraceFrame *frame);
126     void loaderFindCallIndex(int index);
127
128 private slots:
129     void addFrames(const QList<ApiTraceFrame*> &frames);
130     void slotSaved();
131     void guessedApi(int api);
132     void finishedParsing();
133     void loaderFrameLoaded(ApiTraceFrame *frame,
134                            const QVector<ApiTraceCall*> &calls,
135                            quint64 binaryDataSize);
136     void loaderSearchResult(const ApiTrace::SearchRequest &request,
137                             ApiTrace::SearchResult result,
138                             ApiTraceCall *call);
139
140 private:
141     int callInFrame(int callIdx) const;
142     bool isFrameLoading(ApiTraceFrame *frame) const;
143 private:
144     QString m_fileName;
145     QString m_tempFileName;
146
147     QList<ApiTraceFrame*> m_frames;
148     trace::API m_api;
149
150     TraceLoader *m_loader;
151     QThread     *m_loaderThread;
152     SaverThread  *m_saver;
153
154     QSet<ApiTraceCall*> m_editedCalls;
155
156     bool m_needsSaving;
157
158     QSet<ApiTraceCall*> m_errors;
159     QList< QPair<ApiTraceFrame*, ApiTraceError> > m_queuedErrors;
160     QSet<ApiTraceFrame*> m_loadingFrames;
161 };
162
163 #endif