blob: bf90d17daf5577a656893726579f4b3049259fe0 [file] [log] [blame]
Zack Rusinf6667d12011-03-30 11:03:37 -04001#ifndef APITRACE_H
2#define APITRACE_H
3
4#include "apitracecall.h"
5
6#include <QObject>
Zack Rusin661842d2011-04-17 01:59:16 -04007#include <QSet>
Zack Rusinf6667d12011-03-30 11:03:37 -04008
Zack Rusinebf971e2011-09-06 17:44:43 -04009class TraceLoader;
Zack Rusind809a062011-04-17 23:30:58 -040010class SaverThread;
Zack Rusinebf971e2011-09-06 17:44:43 -040011class QThread;
Zack Rusinf6667d12011-03-30 11:03:37 -040012
13class ApiTrace : public QObject
14{
15 Q_OBJECT
16public:
17 enum FrameMarker {
18 FrameMarker_SwapBuffers,
19 FrameMarker_Flush,
20 FrameMarker_Finish,
21 FrameMarker_Clear
22 };
Zack Rusin8f98c3a2011-09-11 18:21:29 -040023 enum SearchResult {
Zack Rusin1a9f7af2011-09-18 19:40:47 -040024 SearchResult_NotFound,
25 SearchResult_Found,
26 SearchResult_Wrapped
Zack Rusin8f98c3a2011-09-11 18:21:29 -040027 };
28
Zack Rusinf6667d12011-03-30 11:03:37 -040029 static bool isCallAFrameMarker(const ApiTraceCall *call,
30 FrameMarker marker);
31public:
32 ApiTrace();
33 ~ApiTrace();
34
35 bool isEmpty() const;
36
37 QString fileName() const;
38
39 FrameMarker frameMarker() const;
40
Zack Rusine2dfa2e2011-04-13 01:35:03 -040041 ApiTraceState defaultState() const;
42
Zack Rusinf04cf8a2011-04-12 23:21:52 -040043 ApiTraceCall *callWithIndex(int idx) const;
Zack Rusinf6667d12011-03-30 11:03:37 -040044
45 QList<ApiTraceFrame*> frames() const;
46 ApiTraceFrame *frameAt(int idx) const;
47 int numFrames() const;
48 int numCallsInFrame(int idx) const;
49
Zack Rusin661842d2011-04-17 01:59:16 -040050 void callEdited(ApiTraceCall *call);
51 void callReverted(ApiTraceCall *call);
Zack Rusinb53b1612011-04-19 01:33:58 -040052 void callError(ApiTraceCall *call);
Zack Rusin661842d2011-04-17 01:59:16 -040053
Zack Rusin0ddd2502011-04-17 02:34:45 -040054 bool edited() const;
Zack Rusin63efea82011-04-17 17:10:45 -040055 bool needsSaving() const;
Zack Rusin661842d2011-04-17 01:59:16 -040056
Zack Rusin9af5bff2011-04-18 01:05:50 -040057 bool isSaving() const;
58
Zack Rusincc0b4912011-04-19 01:59:20 -040059 bool hasErrors() const;
60
Zack Rusinf6667d12011-03-30 11:03:37 -040061public slots:
62 void setFileName(const QString &name);
Zack Rusin63efea82011-04-17 17:10:45 -040063 void save();
Zack Rusin3176ebe2011-09-06 21:11:36 -040064 void loadFrame(ApiTraceFrame *frame);
Zack Rusin8f98c3a2011-09-11 18:21:29 -040065 void findNext(ApiTraceFrame *frame,
66 ApiTraceCall *call,
67 const QString &str,
68 Qt::CaseSensitivity sensitivity);
69 void findPrev(ApiTraceFrame *frame,
70 ApiTraceCall *call,
71 const QString &str,
72 Qt::CaseSensitivity sensitivity);
Zack Rusin93e4d152011-09-13 02:23:39 -040073 void findFrameStart(ApiTraceFrame *frame);
74 void findFrameEnd(ApiTraceFrame *frame);
Zack Rusinda7579b2011-09-13 17:33:05 -040075 void findCallIndex(int index);
Zack Rusin10fd4772011-09-14 01:45:12 -040076 void setCallError(const ApiTraceError &error);
Zack Rusin8f98c3a2011-09-11 18:21:29 -040077
Zack Rusinf6667d12011-03-30 11:03:37 -040078
79signals:
Zack Rusinebf971e2011-09-06 17:44:43 -040080 void loadTrace(const QString &name);
Zack Rusin3176ebe2011-09-06 21:11:36 -040081 void requestFrame(ApiTraceFrame *frame);
Zack Rusinde4ea412011-03-30 11:30:08 -040082 void startedLoadingTrace();
Zack Rusinebf971e2011-09-06 17:44:43 -040083 void loaded(int percent);
Zack Rusinde4ea412011-03-30 11:30:08 -040084 void finishedLoadingTrace();
Zack Rusinf6667d12011-03-30 11:03:37 -040085 void invalidated();
86 void framesInvalidated();
Zack Rusin661842d2011-04-17 01:59:16 -040087 void changed(ApiTraceCall *call);
Zack Rusin9af5bff2011-04-18 01:05:50 -040088 void startedSaving();
89 void saved();
Zack Rusin8f98c3a2011-09-11 18:21:29 -040090 void findResult(ApiTrace::SearchResult result,
91 ApiTraceCall *call);
Zack Rusinf6667d12011-03-30 11:03:37 -040092
Zack Rusinb56e03d2011-04-20 23:58:52 -040093 void beginAddingFrames(int oldCount, int numAdded);
94 void endAddingFrames();
Zack Rusinf682e192011-09-07 01:36:41 -040095 void beginLoadingFrame(ApiTraceFrame *frame, int numAdded);
96 void endLoadingFrame(ApiTraceFrame *frame);
Zack Rusin93e4d152011-09-13 02:23:39 -040097 void foundFrameStart(ApiTraceFrame *frame);
98 void foundFrameEnd(ApiTraceFrame *frame);
Zack Rusinda7579b2011-09-13 17:33:05 -040099 void foundCallIndex(ApiTraceCall *call);
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400100
101signals:
102 void loaderSearchNext(int startFrame,
103 const QString &str,
104 Qt::CaseSensitivity sensitivity);
105 void loaderSearchPrev(int startFrame,
106 const QString &str,
107 Qt::CaseSensitivity sensitivity);
Zack Rusin93e4d152011-09-13 02:23:39 -0400108 void loaderFindFrameStart(ApiTraceFrame *frame);
109 void loaderFindFrameEnd(ApiTraceFrame *frame);
Zack Rusinda7579b2011-09-13 17:33:05 -0400110 void loaderFindCallIndex(int index);
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400111
Zack Rusinf6667d12011-03-30 11:03:37 -0400112private slots:
113 void addFrames(const QList<ApiTraceFrame*> &frames);
Zack Rusin9af5bff2011-04-18 01:05:50 -0400114 void slotSaved();
Zack Rusinf682e192011-09-07 01:36:41 -0400115 void finishedParsing();
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400116 void loaderFrameLoaded(ApiTraceFrame *frame,
117 const QVector<ApiTraceCall*> &calls,
118 quint64 binaryDataSize);
119 void loaderSearchResult(ApiTrace::SearchResult result,
120 ApiTraceCall *call);
Zack Rusinf682e192011-09-07 01:36:41 -0400121
Zack Rusinf6667d12011-03-30 11:03:37 -0400122private:
Zack Rusinda7579b2011-09-13 17:33:05 -0400123 int callInFrame(int callIdx) const;
Zack Rusinf6667d12011-03-30 11:03:37 -0400124private:
125 QString m_fileName;
Zack Rusin63efea82011-04-17 17:10:45 -0400126 QString m_tempFileName;
Zack Rusinf6667d12011-03-30 11:03:37 -0400127
128 QList<ApiTraceFrame*> m_frames;
Zack Rusin4d0ef5d2011-08-28 22:05:31 -0400129 QVector<ApiTraceCall*> m_calls;
Zack Rusinf6667d12011-03-30 11:03:37 -0400130
131 FrameMarker m_frameMarker;
132
Zack Rusinebf971e2011-09-06 17:44:43 -0400133 TraceLoader *m_loader;
134 QThread *m_loaderThread;
Zack Rusind809a062011-04-17 23:30:58 -0400135 SaverThread *m_saver;
Zack Rusin661842d2011-04-17 01:59:16 -0400136
137 QSet<ApiTraceCall*> m_editedCalls;
Zack Rusin63efea82011-04-17 17:10:45 -0400138
139 bool m_needsSaving;
Zack Rusincc0b4912011-04-19 01:59:20 -0400140
141 QSet<ApiTraceCall*> m_errors;
Zack Rusin10fd4772011-09-14 01:45:12 -0400142 QList< QPair<ApiTraceFrame*, ApiTraceError> > m_queuedErrors;
Zack Rusinf6667d12011-03-30 11:03:37 -0400143};
144
145#endif