blob: d72599241029f3792e421ed849691416ee3c811e [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,
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 McCabec6f924e2012-06-01 13:40:05 -0700108 void bindThumbnails(const ImageHash &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);
Jose Fonseca8f0846c2015-11-10 19:53:55 +0000113 void problemLoadingTrace(const QString &message);
Zack Rusinde4ea412011-03-30 11:30:08 -0400114 void startedLoadingTrace();
Zack Rusinebf971e2011-09-06 17:44:43 -0400115 void loaded(int percent);
Zack Rusinde4ea412011-03-30 11:30:08 -0400116 void finishedLoadingTrace();
Zack Rusinf6667d12011-03-30 11:03:37 -0400117 void invalidated();
118 void framesInvalidated();
Dan McCabe10bd4242012-03-05 17:20:40 -0800119 void changed(ApiTraceEvent *event);
Zack Rusin9af5bff2011-04-18 01:05:50 -0400120 void startedSaving();
121 void saved();
Zack Rusinad513b32011-09-25 14:33:41 -0400122 void findResult(const ApiTrace::SearchRequest &request,
123 ApiTrace::SearchResult result,
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400124 ApiTraceCall *call);
Zack Rusinf6667d12011-03-30 11:03:37 -0400125
Zack Rusinb56e03d2011-04-20 23:58:52 -0400126 void beginAddingFrames(int oldCount, int numAdded);
127 void endAddingFrames();
Zack Rusinf682e192011-09-07 01:36:41 -0400128 void beginLoadingFrame(ApiTraceFrame *frame, int numAdded);
129 void endLoadingFrame(ApiTraceFrame *frame);
Zack Rusin93e4d152011-09-13 02:23:39 -0400130 void foundFrameStart(ApiTraceFrame *frame);
131 void foundFrameEnd(ApiTraceFrame *frame);
Zack Rusinda7579b2011-09-13 17:33:05 -0400132 void foundCallIndex(ApiTraceCall *call);
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400133
134signals:
Zack Rusinad513b32011-09-25 14:33:41 -0400135 void loaderSearch(const ApiTrace::SearchRequest &request);
Zack Rusin93e4d152011-09-13 02:23:39 -0400136 void loaderFindFrameStart(ApiTraceFrame *frame);
137 void loaderFindFrameEnd(ApiTraceFrame *frame);
Zack Rusinda7579b2011-09-13 17:33:05 -0400138 void loaderFindCallIndex(int index);
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400139
Zack Rusinf6667d12011-03-30 11:03:37 -0400140private slots:
141 void addFrames(const QList<ApiTraceFrame*> &frames);
Zack Rusin9af5bff2011-04-18 01:05:50 -0400142 void slotSaved();
José Fonseca67964382012-03-27 23:54:30 +0100143 void guessedApi(int api);
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400144 void loaderFrameLoaded(ApiTraceFrame *frame,
Zack Rusind9d9d222013-10-11 18:02:26 -0400145 const QVector<ApiTraceCall*> &topLevelItems,
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400146 const QVector<ApiTraceCall*> &calls,
147 quint64 binaryDataSize);
Zack Rusinad513b32011-09-25 14:33:41 -0400148 void loaderSearchResult(const ApiTrace::SearchRequest &request,
149 ApiTrace::SearchResult result,
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400150 ApiTraceCall *call);
Zack Rusinf682e192011-09-07 01:36:41 -0400151
Zack Rusinf6667d12011-03-30 11:03:37 -0400152private:
Zack Rusinda7579b2011-09-13 17:33:05 -0400153 int callInFrame(int callIdx) const;
Zack Rusin18d094e2011-10-07 23:55:55 -0400154 bool isFrameLoading(ApiTraceFrame *frame) const;
Dan McCabed1395322012-06-01 13:40:03 -0700155
156 void missingThumbnail(int callIdx);
Zack Rusinf6667d12011-03-30 11:03:37 -0400157private:
158 QString m_fileName;
Zack Rusin63efea82011-04-17 17:10:45 -0400159 QString m_tempFileName;
Zack Rusinf6667d12011-03-30 11:03:37 -0400160
161 QList<ApiTraceFrame*> m_frames;
José Fonseca67964382012-03-27 23:54:30 +0100162 trace::API m_api;
Zack Rusinf6667d12011-03-30 11:03:37 -0400163
Zack Rusinebf971e2011-09-06 17:44:43 -0400164 TraceLoader *m_loader;
165 QThread *m_loaderThread;
Zack Rusind809a062011-04-17 23:30:58 -0400166 SaverThread *m_saver;
Zack Rusin661842d2011-04-17 01:59:16 -0400167
168 QSet<ApiTraceCall*> m_editedCalls;
Zack Rusin63efea82011-04-17 17:10:45 -0400169
170 bool m_needsSaving;
Zack Rusincc0b4912011-04-19 01:59:20 -0400171
172 QSet<ApiTraceCall*> m_errors;
Zack Rusin10fd4772011-09-14 01:45:12 -0400173 QList< QPair<ApiTraceFrame*, ApiTraceError> > m_queuedErrors;
Zack Rusin18d094e2011-10-07 23:55:55 -0400174 QSet<ApiTraceFrame*> m_loadingFrames;
Dan McCabed1395322012-06-01 13:40:03 -0700175
176 QSet<int> m_missingThumbnails;
Dan McCabec6f924e2012-06-01 13:40:05 -0700177
178 ImageHash m_thumbnails;
Zack Rusinf6667d12011-03-30 11:03:37 -0400179};