blob: 88211668fba99478c8ffd3269b9daeac9491760e [file] [log] [blame]
Zack Rusinf6667d12011-03-30 11:03:37 -04001#ifndef APITRACE_H
2#define APITRACE_H
3
4#include "apitracecall.h"
5
José Fonseca67964382012-03-27 23:54:30 +01006#include "trace_api.hpp"
7
Zack Rusinf6667d12011-03-30 11:03:37 -04008#include <QObject>
Zack Rusin661842d2011-04-17 01:59:16 -04009#include <QSet>
Zack Rusinf6667d12011-03-30 11:03:37 -040010
Zack Rusinebf971e2011-09-06 17:44:43 -040011class TraceLoader;
Zack Rusind809a062011-04-17 23:30:58 -040012class SaverThread;
Zack Rusinebf971e2011-09-06 17:44:43 -040013class QThread;
Zack Rusinf6667d12011-03-30 11:03:37 -040014
Dan McCabe88938852012-06-01 13:40:04 -070015typedef void (*ThumbnailCallback)(void *object, int thumbnailIdx);
16
Zack Rusinf6667d12011-03-30 11:03:37 -040017class ApiTrace : public QObject
18{
19 Q_OBJECT
20public:
Zack Rusin8f98c3a2011-09-11 18:21:29 -040021 enum SearchResult {
Zack Rusin1a9f7af2011-09-18 19:40:47 -040022 SearchResult_NotFound,
23 SearchResult_Found,
24 SearchResult_Wrapped
Zack Rusin8f98c3a2011-09-11 18:21:29 -040025 };
Zack Rusinad513b32011-09-25 14:33:41 -040026 struct SearchRequest {
27 enum Direction {
28 Next,
29 Prev
30 };
31 SearchRequest()
32 : direction(Next)
33 {}
34 SearchRequest(Direction dir,
35 ApiTraceFrame *f,
36 ApiTraceCall *call,
37 QString str,
38 Qt::CaseSensitivity caseSens)
39 : direction(dir),
40 frame(f),
41 from(call),
42 text(str),
43 cs(caseSens)
44 {}
45 Direction direction;
46 ApiTraceFrame *frame;
47 ApiTraceCall *from;
48 QString text;
49 Qt::CaseSensitivity cs;
50 };
Zack Rusin8f98c3a2011-09-11 18:21:29 -040051
Zack Rusinf6667d12011-03-30 11:03:37 -040052public:
53 ApiTrace();
54 ~ApiTrace();
55
56 bool isEmpty() const;
57
58 QString fileName() const;
59
Zack Rusine2dfa2e2011-04-13 01:35:03 -040060 ApiTraceState defaultState() const;
61
Zack Rusinf04cf8a2011-04-12 23:21:52 -040062 ApiTraceCall *callWithIndex(int idx) const;
Zack Rusinf6667d12011-03-30 11:03:37 -040063
José Fonseca34500442012-03-24 07:56:45 +000064 const QList<ApiTraceFrame*> & frames() const;
Zack Rusinf6667d12011-03-30 11:03:37 -040065 ApiTraceFrame *frameAt(int idx) const;
66 int numFrames() const;
67 int numCallsInFrame(int idx) const;
68
Zack Rusin661842d2011-04-17 01:59:16 -040069 void callEdited(ApiTraceCall *call);
70 void callReverted(ApiTraceCall *call);
Zack Rusinb53b1612011-04-19 01:33:58 -040071 void callError(ApiTraceCall *call);
Zack Rusin661842d2011-04-17 01:59:16 -040072
Zack Rusin0ddd2502011-04-17 02:34:45 -040073 bool edited() const;
Zack Rusin63efea82011-04-17 17:10:45 -040074 bool needsSaving() const;
Zack Rusin661842d2011-04-17 01:59:16 -040075
Zack Rusin9af5bff2011-04-18 01:05:50 -040076 bool isSaving() const;
77
Zack Rusincc0b4912011-04-19 01:59:20 -040078 bool hasErrors() const;
79
José Fonseca67964382012-03-27 23:54:30 +010080 trace::API api() const;
81
Dan McCabed1395322012-06-01 13:40:03 -070082 void missingThumbnail(ApiTraceFrame* frame);
83 void missingThumbnail(ApiTraceCall* call);
84
85 bool isMissingThumbnails() const;
86 void resetMissingThumbnails();
87
Dan McCabe88938852012-06-01 13:40:04 -070088 void iterateMissingThumbnails(void *object, ThumbnailCallback cb);
89
Zack Rusinf6667d12011-03-30 11:03:37 -040090public slots:
91 void setFileName(const QString &name);
Zack Rusin63efea82011-04-17 17:10:45 -040092 void save();
Lawrence L Love55d98e62014-02-21 16:46:30 -080093 void finishedParsing();
Zack Rusin3176ebe2011-09-06 21:11:36 -040094 void loadFrame(ApiTraceFrame *frame);
Zack Rusin8f98c3a2011-09-11 18:21:29 -040095 void findNext(ApiTraceFrame *frame,
96 ApiTraceCall *call,
97 const QString &str,
98 Qt::CaseSensitivity sensitivity);
99 void findPrev(ApiTraceFrame *frame,
100 ApiTraceCall *call,
101 const QString &str,
102 Qt::CaseSensitivity sensitivity);
Zack Rusin93e4d152011-09-13 02:23:39 -0400103 void findFrameStart(ApiTraceFrame *frame);
104 void findFrameEnd(ApiTraceFrame *frame);
Zack Rusinda7579b2011-09-13 17:33:05 -0400105 void findCallIndex(int index);
Zack Rusin10fd4772011-09-14 01:45:12 -0400106 void setCallError(const ApiTraceError &error);
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400107
Dan McCabe10bd4242012-03-05 17:20:40 -0800108 void bindThumbnailsToFrames(const QList<QImage> &thumbnails);
Zack Rusinf6667d12011-03-30 11:03:37 -0400109
110signals:
Zack Rusinebf971e2011-09-06 17:44:43 -0400111 void loadTrace(const QString &name);
Zack Rusin3176ebe2011-09-06 21:11:36 -0400112 void requestFrame(ApiTraceFrame *frame);
Zack Rusinde4ea412011-03-30 11:30:08 -0400113 void startedLoadingTrace();
Zack Rusinebf971e2011-09-06 17:44:43 -0400114 void loaded(int percent);
Zack Rusinde4ea412011-03-30 11:30:08 -0400115 void finishedLoadingTrace();
Zack Rusinf6667d12011-03-30 11:03:37 -0400116 void invalidated();
117 void framesInvalidated();
Dan McCabe10bd4242012-03-05 17:20:40 -0800118 void changed(ApiTraceEvent *event);
Zack Rusin9af5bff2011-04-18 01:05:50 -0400119 void startedSaving();
120 void saved();
Zack Rusinad513b32011-09-25 14:33:41 -0400121 void findResult(const ApiTrace::SearchRequest &request,
122 ApiTrace::SearchResult result,
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400123 ApiTraceCall *call);
Zack Rusinf6667d12011-03-30 11:03:37 -0400124
Zack Rusinb56e03d2011-04-20 23:58:52 -0400125 void beginAddingFrames(int oldCount, int numAdded);
126 void endAddingFrames();
Zack Rusinf682e192011-09-07 01:36:41 -0400127 void beginLoadingFrame(ApiTraceFrame *frame, int numAdded);
128 void endLoadingFrame(ApiTraceFrame *frame);
Zack Rusin93e4d152011-09-13 02:23:39 -0400129 void foundFrameStart(ApiTraceFrame *frame);
130 void foundFrameEnd(ApiTraceFrame *frame);
Zack Rusinda7579b2011-09-13 17:33:05 -0400131 void foundCallIndex(ApiTraceCall *call);
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400132
133signals:
Zack Rusinad513b32011-09-25 14:33:41 -0400134 void loaderSearch(const ApiTrace::SearchRequest &request);
Zack Rusin93e4d152011-09-13 02:23:39 -0400135 void loaderFindFrameStart(ApiTraceFrame *frame);
136 void loaderFindFrameEnd(ApiTraceFrame *frame);
Zack Rusinda7579b2011-09-13 17:33:05 -0400137 void loaderFindCallIndex(int index);
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400138
Zack Rusinf6667d12011-03-30 11:03:37 -0400139private slots:
140 void addFrames(const QList<ApiTraceFrame*> &frames);
Zack Rusin9af5bff2011-04-18 01:05:50 -0400141 void slotSaved();
José Fonseca67964382012-03-27 23:54:30 +0100142 void guessedApi(int api);
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400143 void loaderFrameLoaded(ApiTraceFrame *frame,
Zack Rusind9d9d222013-10-11 18:02:26 -0400144 const QVector<ApiTraceCall*> &topLevelItems,
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400145 const QVector<ApiTraceCall*> &calls,
146 quint64 binaryDataSize);
Zack Rusinad513b32011-09-25 14:33:41 -0400147 void loaderSearchResult(const ApiTrace::SearchRequest &request,
148 ApiTrace::SearchResult result,
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400149 ApiTraceCall *call);
Zack Rusinf682e192011-09-07 01:36:41 -0400150
Zack Rusinf6667d12011-03-30 11:03:37 -0400151private:
Zack Rusinda7579b2011-09-13 17:33:05 -0400152 int callInFrame(int callIdx) const;
Zack Rusin18d094e2011-10-07 23:55:55 -0400153 bool isFrameLoading(ApiTraceFrame *frame) const;
Dan McCabed1395322012-06-01 13:40:03 -0700154
155 void missingThumbnail(int callIdx);
Zack Rusinf6667d12011-03-30 11:03:37 -0400156private:
157 QString m_fileName;
Zack Rusin63efea82011-04-17 17:10:45 -0400158 QString m_tempFileName;
Zack Rusinf6667d12011-03-30 11:03:37 -0400159
160 QList<ApiTraceFrame*> m_frames;
José Fonseca67964382012-03-27 23:54:30 +0100161 trace::API m_api;
Zack Rusinf6667d12011-03-30 11:03:37 -0400162
Zack Rusinebf971e2011-09-06 17:44:43 -0400163 TraceLoader *m_loader;
164 QThread *m_loaderThread;
Zack Rusind809a062011-04-17 23:30:58 -0400165 SaverThread *m_saver;
Zack Rusin661842d2011-04-17 01:59:16 -0400166
167 QSet<ApiTraceCall*> m_editedCalls;
Zack Rusin63efea82011-04-17 17:10:45 -0400168
169 bool m_needsSaving;
Zack Rusincc0b4912011-04-19 01:59:20 -0400170
171 QSet<ApiTraceCall*> m_errors;
Zack Rusin10fd4772011-09-14 01:45:12 -0400172 QList< QPair<ApiTraceFrame*, ApiTraceError> > m_queuedErrors;
Zack Rusin18d094e2011-10-07 23:55:55 -0400173 QSet<ApiTraceFrame*> m_loadingFrames;
Dan McCabed1395322012-06-01 13:40:03 -0700174
175 QSet<int> m_missingThumbnails;
Zack Rusinf6667d12011-03-30 11:03:37 -0400176};
177
178#endif