blob: cb8d66fbb128b6db571d5572c3f611271785372d [file] [log] [blame]
Jose Fonseca9653f952015-05-19 16:32:43 +01001#pragma once
Zack Rusinf6667d12011-03-30 11:03:37 -04002
3#include "apitracecall.h"
4
José Fonseca67964382012-03-27 23:54:30 +01005#include "trace_api.hpp"
6
Zack Rusinf6667d12011-03-30 11:03:37 -04007#include <QObject>
Zack Rusin661842d2011-04-17 01:59:16 -04008#include <QSet>
Zack Rusinf6667d12011-03-30 11:03:37 -04009
Zack Rusinebf971e2011-09-06 17:44:43 -040010class TraceLoader;
Zack Rusind809a062011-04-17 23:30:58 -040011class SaverThread;
Zack Rusinebf971e2011-09-06 17:44:43 -040012class QThread;
Zack Rusinf6667d12011-03-30 11:03:37 -040013
Dan McCabe88938852012-06-01 13:40:04 -070014typedef void (*ThumbnailCallback)(void *object, int thumbnailIdx);
Dan McCabec6f924e2012-06-01 13:40:05 -070015typedef QHash<int, QImage> ImageHash;
Dan McCabe88938852012-06-01 13:40:04 -070016
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,
Ruslan Kabatsayev75d69052019-02-20 13:41:18 +030038 Qt::CaseSensitivity caseSens,
39 bool useRegex)
Zack Rusinad513b32011-09-25 14:33:41 -040040 : direction(dir),
41 frame(f),
42 from(call),
43 text(str),
Ruslan Kabatsayev75d69052019-02-20 13:41:18 +030044 cs(caseSens),
45 useRegex(useRegex)
Zack Rusinad513b32011-09-25 14:33:41 -040046 {}
47 Direction direction;
48 ApiTraceFrame *frame;
49 ApiTraceCall *from;
50 QString text;
51 Qt::CaseSensitivity cs;
Ruslan Kabatsayev75d69052019-02-20 13:41:18 +030052 bool useRegex;
Zack Rusinad513b32011-09-25 14:33:41 -040053 };
Zack Rusin8f98c3a2011-09-11 18:21:29 -040054
Zack Rusinf6667d12011-03-30 11:03:37 -040055public:
56 ApiTrace();
57 ~ApiTrace();
58
59 bool isEmpty() const;
60
61 QString fileName() const;
62
Zack Rusine2dfa2e2011-04-13 01:35:03 -040063 ApiTraceState defaultState() const;
64
Zack Rusinf04cf8a2011-04-12 23:21:52 -040065 ApiTraceCall *callWithIndex(int idx) const;
Zack Rusinf6667d12011-03-30 11:03:37 -040066
José Fonseca34500442012-03-24 07:56:45 +000067 const QList<ApiTraceFrame*> & frames() const;
Zack Rusinf6667d12011-03-30 11:03:37 -040068 ApiTraceFrame *frameAt(int idx) const;
69 int numFrames() const;
70 int numCallsInFrame(int idx) const;
71
Zack Rusin661842d2011-04-17 01:59:16 -040072 void callEdited(ApiTraceCall *call);
73 void callReverted(ApiTraceCall *call);
Zack Rusinb53b1612011-04-19 01:33:58 -040074 void callError(ApiTraceCall *call);
Zack Rusin661842d2011-04-17 01:59:16 -040075
Zack Rusin0ddd2502011-04-17 02:34:45 -040076 bool edited() const;
Zack Rusin63efea82011-04-17 17:10:45 -040077 bool needsSaving() const;
Zack Rusin661842d2011-04-17 01:59:16 -040078
Zack Rusin9af5bff2011-04-18 01:05:50 -040079 bool isSaving() const;
80
Zack Rusincc0b4912011-04-19 01:59:20 -040081 bool hasErrors() const;
82
José Fonseca67964382012-03-27 23:54:30 +010083 trace::API api() const;
84
Dan McCabed1395322012-06-01 13:40:03 -070085 void missingThumbnail(ApiTraceFrame* frame);
86 void missingThumbnail(ApiTraceCall* call);
87
88 bool isMissingThumbnails() const;
89 void resetMissingThumbnails();
90
Dan McCabe88938852012-06-01 13:40:04 -070091 void iterateMissingThumbnails(void *object, ThumbnailCallback cb);
92
Zack Rusinf6667d12011-03-30 11:03:37 -040093public slots:
94 void setFileName(const QString &name);
Zack Rusin63efea82011-04-17 17:10:45 -040095 void save();
Lawrence L Love55d98e62014-02-21 16:46:30 -080096 void finishedParsing();
Zack Rusin3176ebe2011-09-06 21:11:36 -040097 void loadFrame(ApiTraceFrame *frame);
Zack Rusin8f98c3a2011-09-11 18:21:29 -040098 void findNext(ApiTraceFrame *frame,
99 ApiTraceCall *call,
100 const QString &str,
Ruslan Kabatsayev75d69052019-02-20 13:41:18 +0300101 Qt::CaseSensitivity sensitivity,
102 bool useRegex);
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400103 void findPrev(ApiTraceFrame *frame,
104 ApiTraceCall *call,
105 const QString &str,
Ruslan Kabatsayev75d69052019-02-20 13:41:18 +0300106 Qt::CaseSensitivity sensitivity,
107 bool useRegex);
Zack Rusin93e4d152011-09-13 02:23:39 -0400108 void findFrameStart(ApiTraceFrame *frame);
109 void findFrameEnd(ApiTraceFrame *frame);
Zack Rusinda7579b2011-09-13 17:33:05 -0400110 void findCallIndex(int index);
Zack Rusin10fd4772011-09-14 01:45:12 -0400111 void setCallError(const ApiTraceError &error);
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400112
Dan McCabec6f924e2012-06-01 13:40:05 -0700113 void bindThumbnails(const ImageHash &thumbnails);
Zack Rusinf6667d12011-03-30 11:03:37 -0400114
115signals:
Zack Rusinebf971e2011-09-06 17:44:43 -0400116 void loadTrace(const QString &name);
Zack Rusin3176ebe2011-09-06 21:11:36 -0400117 void requestFrame(ApiTraceFrame *frame);
Jose Fonseca8f0846c2015-11-10 19:53:55 +0000118 void problemLoadingTrace(const QString &message);
Zack Rusinde4ea412011-03-30 11:30:08 -0400119 void startedLoadingTrace();
Zack Rusinebf971e2011-09-06 17:44:43 -0400120 void loaded(int percent);
Zack Rusinde4ea412011-03-30 11:30:08 -0400121 void finishedLoadingTrace();
Zack Rusinf6667d12011-03-30 11:03:37 -0400122 void invalidated();
123 void framesInvalidated();
Dan McCabe10bd4242012-03-05 17:20:40 -0800124 void changed(ApiTraceEvent *event);
Zack Rusin9af5bff2011-04-18 01:05:50 -0400125 void startedSaving();
126 void saved();
Zack Rusinad513b32011-09-25 14:33:41 -0400127 void findResult(const ApiTrace::SearchRequest &request,
128 ApiTrace::SearchResult result,
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400129 ApiTraceCall *call);
Zack Rusinf6667d12011-03-30 11:03:37 -0400130
Zack Rusinb56e03d2011-04-20 23:58:52 -0400131 void beginAddingFrames(int oldCount, int numAdded);
132 void endAddingFrames();
Zack Rusinf682e192011-09-07 01:36:41 -0400133 void beginLoadingFrame(ApiTraceFrame *frame, int numAdded);
134 void endLoadingFrame(ApiTraceFrame *frame);
Zack Rusin93e4d152011-09-13 02:23:39 -0400135 void foundFrameStart(ApiTraceFrame *frame);
136 void foundFrameEnd(ApiTraceFrame *frame);
Zack Rusinda7579b2011-09-13 17:33:05 -0400137 void foundCallIndex(ApiTraceCall *call);
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400138
139signals:
Zack Rusinad513b32011-09-25 14:33:41 -0400140 void loaderSearch(const ApiTrace::SearchRequest &request);
Zack Rusin93e4d152011-09-13 02:23:39 -0400141 void loaderFindFrameStart(ApiTraceFrame *frame);
142 void loaderFindFrameEnd(ApiTraceFrame *frame);
Zack Rusinda7579b2011-09-13 17:33:05 -0400143 void loaderFindCallIndex(int index);
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400144
Zack Rusinf6667d12011-03-30 11:03:37 -0400145private slots:
146 void addFrames(const QList<ApiTraceFrame*> &frames);
Zack Rusin9af5bff2011-04-18 01:05:50 -0400147 void slotSaved();
José Fonseca67964382012-03-27 23:54:30 +0100148 void guessedApi(int api);
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400149 void loaderFrameLoaded(ApiTraceFrame *frame,
Zack Rusind9d9d222013-10-11 18:02:26 -0400150 const QVector<ApiTraceCall*> &topLevelItems,
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400151 const QVector<ApiTraceCall*> &calls,
152 quint64 binaryDataSize);
Zack Rusinad513b32011-09-25 14:33:41 -0400153 void loaderSearchResult(const ApiTrace::SearchRequest &request,
154 ApiTrace::SearchResult result,
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400155 ApiTraceCall *call);
Zack Rusinf682e192011-09-07 01:36:41 -0400156
Zack Rusinf6667d12011-03-30 11:03:37 -0400157private:
Zack Rusinda7579b2011-09-13 17:33:05 -0400158 int callInFrame(int callIdx) const;
Zack Rusin18d094e2011-10-07 23:55:55 -0400159 bool isFrameLoading(ApiTraceFrame *frame) const;
Dan McCabed1395322012-06-01 13:40:03 -0700160
161 void missingThumbnail(int callIdx);
Zack Rusinf6667d12011-03-30 11:03:37 -0400162private:
163 QString m_fileName;
Zack Rusin63efea82011-04-17 17:10:45 -0400164 QString m_tempFileName;
Zack Rusinf6667d12011-03-30 11:03:37 -0400165
166 QList<ApiTraceFrame*> m_frames;
José Fonseca67964382012-03-27 23:54:30 +0100167 trace::API m_api;
Zack Rusinf6667d12011-03-30 11:03:37 -0400168
Zack Rusinebf971e2011-09-06 17:44:43 -0400169 TraceLoader *m_loader;
170 QThread *m_loaderThread;
Zack Rusind809a062011-04-17 23:30:58 -0400171 SaverThread *m_saver;
Zack Rusin661842d2011-04-17 01:59:16 -0400172
173 QSet<ApiTraceCall*> m_editedCalls;
Zack Rusin63efea82011-04-17 17:10:45 -0400174
175 bool m_needsSaving;
Zack Rusincc0b4912011-04-19 01:59:20 -0400176
177 QSet<ApiTraceCall*> m_errors;
Zack Rusin10fd4772011-09-14 01:45:12 -0400178 QList< QPair<ApiTraceFrame*, ApiTraceError> > m_queuedErrors;
Zack Rusin18d094e2011-10-07 23:55:55 -0400179 QSet<ApiTraceFrame*> m_loadingFrames;
Dan McCabed1395322012-06-01 13:40:03 -0700180
181 QSet<int> m_missingThumbnails;
Dan McCabec6f924e2012-06-01 13:40:05 -0700182
183 ImageHash m_thumbnails;
Zack Rusinf6667d12011-03-30 11:03:37 -0400184};