blob: b5b530705cd0cfbebd1d3a6af80cf544c8e03be0 [file] [log] [blame]
Jose Fonseca9653f952015-05-19 16:32:43 +01001#pragma once
Zack Rusin20b1f6d2011-09-06 11:50:07 -04002
3
4#include "apitrace.h"
5#include "trace_file.hpp"
6#include "trace_parser.hpp"
7
8#include <QObject>
9#include <QList>
10#include <QMap>
Lawrence L Love59befce2014-03-20 18:47:39 -070011#include <QStack>
Zack Rusin20b1f6d2011-09-06 11:50:07 -040012
13class TraceLoader : public QObject
14{
15 Q_OBJECT
16public:
Zack Rusinebf971e2011-09-06 17:44:43 -040017 TraceLoader(QObject *parent=0);
Zack Rusin20b1f6d2011-09-06 11:50:07 -040018 ~TraceLoader();
19
Zack Rusinebf971e2011-09-06 17:44:43 -040020
21 ApiTraceCallSignature *signature(unsigned id);
22 void addSignature(unsigned id, ApiTraceCallSignature *signature);
23
José Fonseca446ca502014-12-19 16:22:39 +000024 trace::EnumSig *enumSignature(unsigned id);
Zack Rusinebf971e2011-09-06 17:44:43 -040025
Lawrence L Love59befce2014-03-20 18:47:39 -070026private:
27 class FrameContents
28 {
29 public:
30 FrameContents(int numOfCalls=0);
31
32 bool load(TraceLoader *loader, ApiTraceFrame* frame,
33 QHash<QString, QUrl> helpHash, trace::Parser &parser);
34 void reset();
35 int topLevelCount() const;
36 int allCallsCount() const;
37 QVector<ApiTraceCall*> topLevelCalls() const;
38 QVector<ApiTraceCall*> allCalls() const;
39 quint64 binaryDataSize() const;
40 bool isEmpty();
41
42 private:
43 QStack <ApiTraceCall*> m_groups;
44 QVector<ApiTraceCall*> m_topLevelItems;
45 QVector<ApiTraceCall*> m_allCalls;
46 quint64 m_binaryDataSize;
47 int m_parsedCalls;
48 };
49
Zack Rusin20b1f6d2011-09-06 11:50:07 -040050public slots:
51 void loadTrace(const QString &filename);
Zack Rusin3176ebe2011-09-06 21:11:36 -040052 void loadFrame(ApiTraceFrame *frame);
Zack Rusin93e4d152011-09-13 02:23:39 -040053 void findFrameStart(ApiTraceFrame *frame);
54 void findFrameEnd(ApiTraceFrame *frame);
Zack Rusinda7579b2011-09-13 17:33:05 -040055 void findCallIndex(int index);
Zack Rusinad513b32011-09-25 14:33:41 -040056 void search(const ApiTrace::SearchRequest &request);
Zack Rusin20b1f6d2011-09-06 11:50:07 -040057
58signals:
Jose Fonseca8f0846c2015-11-10 19:53:55 +000059 void parseProblem(const QString &message);
Zack Rusin20b1f6d2011-09-06 11:50:07 -040060 void startedParsing();
Zack Rusinebf971e2011-09-06 17:44:43 -040061 void parsed(int percent);
José Fonseca67964382012-03-27 23:54:30 +010062 void guessedApi(int api);
Zack Rusin20b1f6d2011-09-06 11:50:07 -040063 void finishedParsing();
64
65 void framesLoaded(const QList<ApiTraceFrame*> &frames);
Zack Rusin8f98c3a2011-09-11 18:21:29 -040066 void frameContentsLoaded(ApiTraceFrame *frame,
Zack Rusind9d9d222013-10-11 18:02:26 -040067 const QVector<ApiTraceCall*> &topLevelItems,
Zack Rusin8f98c3a2011-09-11 18:21:29 -040068 const QVector<ApiTraceCall*> &calls,
69 quint64 binaryDataSize);
Zack Rusin20b1f6d2011-09-06 11:50:07 -040070
Zack Rusinad513b32011-09-25 14:33:41 -040071 void searchResult(const ApiTrace::SearchRequest &request,
72 ApiTrace::SearchResult result,
73 ApiTraceCall *call);
Zack Rusin93e4d152011-09-13 02:23:39 -040074 void foundFrameStart(ApiTraceFrame *frame);
75 void foundFrameEnd(ApiTraceFrame *frame);
Zack Rusinda7579b2011-09-13 17:33:05 -040076 void foundCallIndex(ApiTraceCall *call);
Zack Rusin20b1f6d2011-09-06 11:50:07 -040077private:
José Fonseca61e61f72011-09-11 16:53:34 +010078 struct FrameBookmark {
79 FrameBookmark()
Zack Rusin20b1f6d2011-09-06 11:50:07 -040080 : numberOfCalls(0)
81 {}
José Fonsecab4a3d142011-10-27 07:43:19 +010082 FrameBookmark(const trace::ParseBookmark &s)
Zack Rusin20b1f6d2011-09-06 11:50:07 -040083 : start(s),
84 numberOfCalls(0)
85 {}
86
José Fonsecab4a3d142011-10-27 07:43:19 +010087 trace::ParseBookmark start;
Zack Rusin20b1f6d2011-09-06 11:50:07 -040088 int numberOfCalls;
Zack Rusin20b1f6d2011-09-06 11:50:07 -040089 };
Zack Rusin20b1f6d2011-09-06 11:50:07 -040090 int numberOfFrames() const;
91 int numberOfCallsInFrame(int frameIdx) const;
92
93 void loadHelpFile();
José Fonseca67964382012-03-27 23:54:30 +010094 void guessApi(const trace::Call *call);
Zack Rusin20b1f6d2011-09-06 11:50:07 -040095 void scanTrace();
Zack Rusinebf971e2011-09-06 17:44:43 -040096
Zack Rusinad513b32011-09-25 14:33:41 -040097 void searchNext(const ApiTrace::SearchRequest &request);
98 void searchPrev(const ApiTrace::SearchRequest &request);
99
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400100 int callInFrame(int callIdx) const;
José Fonsecab4a3d142011-10-27 07:43:19 +0100101 bool callContains(trace::Call *call,
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400102 const QString &str,
Ruslan Kabatsayev75d69052019-02-20 13:41:18 +0300103 Qt::CaseSensitivity sensitivity,
104 bool useRegex);
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400105 QVector<ApiTraceCall*> fetchFrameContents(ApiTraceFrame *frame);
José Fonsecab4a3d142011-10-27 07:43:19 +0100106 bool searchCallsBackwards(const QList<trace::Call*> &calls,
Zack Rusin121e3162011-09-13 01:35:12 -0400107 int frameIdx,
Zack Rusinad513b32011-09-25 14:33:41 -0400108 const ApiTrace::SearchRequest &request);
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400109
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400110private:
José Fonsecab4a3d142011-10-27 07:43:19 +0100111 trace::Parser m_parser;
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400112
José Fonseca61e61f72011-09-11 16:53:34 +0100113 typedef QMap<int, FrameBookmark> FrameBookmarks;
114 FrameBookmarks m_frameBookmarks;
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400115 QList<ApiTraceFrame*> m_createdFrames;
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400116
117 QHash<QString, QUrl> m_helpHash;
Zack Rusinebf971e2011-09-06 17:44:43 -0400118
119 QVector<ApiTraceCallSignature*> m_signatures;
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400120};