blob: daf3b3daf899da5902fc820ae3969c4331365691 [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:
59 void startedParsing();
Zack Rusinebf971e2011-09-06 17:44:43 -040060 void parsed(int percent);
José Fonseca67964382012-03-27 23:54:30 +010061 void guessedApi(int api);
Zack Rusin20b1f6d2011-09-06 11:50:07 -040062 void finishedParsing();
63
64 void framesLoaded(const QList<ApiTraceFrame*> &frames);
Zack Rusin8f98c3a2011-09-11 18:21:29 -040065 void frameContentsLoaded(ApiTraceFrame *frame,
Zack Rusind9d9d222013-10-11 18:02:26 -040066 const QVector<ApiTraceCall*> &topLevelItems,
Zack Rusin8f98c3a2011-09-11 18:21:29 -040067 const QVector<ApiTraceCall*> &calls,
68 quint64 binaryDataSize);
Zack Rusin20b1f6d2011-09-06 11:50:07 -040069
Zack Rusinad513b32011-09-25 14:33:41 -040070 void searchResult(const ApiTrace::SearchRequest &request,
71 ApiTrace::SearchResult result,
72 ApiTraceCall *call);
Zack Rusin93e4d152011-09-13 02:23:39 -040073 void foundFrameStart(ApiTraceFrame *frame);
74 void foundFrameEnd(ApiTraceFrame *frame);
Zack Rusinda7579b2011-09-13 17:33:05 -040075 void foundCallIndex(ApiTraceCall *call);
Zack Rusin20b1f6d2011-09-06 11:50:07 -040076private:
José Fonseca61e61f72011-09-11 16:53:34 +010077 struct FrameBookmark {
78 FrameBookmark()
Zack Rusin20b1f6d2011-09-06 11:50:07 -040079 : numberOfCalls(0)
80 {}
José Fonsecab4a3d142011-10-27 07:43:19 +010081 FrameBookmark(const trace::ParseBookmark &s)
Zack Rusin20b1f6d2011-09-06 11:50:07 -040082 : start(s),
83 numberOfCalls(0)
84 {}
85
José Fonsecab4a3d142011-10-27 07:43:19 +010086 trace::ParseBookmark start;
Zack Rusin20b1f6d2011-09-06 11:50:07 -040087 int numberOfCalls;
Zack Rusin20b1f6d2011-09-06 11:50:07 -040088 };
Zack Rusin20b1f6d2011-09-06 11:50:07 -040089 int numberOfFrames() const;
90 int numberOfCallsInFrame(int frameIdx) const;
91
92 void loadHelpFile();
José Fonseca67964382012-03-27 23:54:30 +010093 void guessApi(const trace::Call *call);
Zack Rusin20b1f6d2011-09-06 11:50:07 -040094 void scanTrace();
95 void parseTrace();
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,
103 Qt::CaseSensitivity sensitivity);
104 QVector<ApiTraceCall*> fetchFrameContents(ApiTraceFrame *frame);
José Fonsecab4a3d142011-10-27 07:43:19 +0100105 bool searchCallsBackwards(const QList<trace::Call*> &calls,
Zack Rusin121e3162011-09-13 01:35:12 -0400106 int frameIdx,
Zack Rusinad513b32011-09-25 14:33:41 -0400107 const ApiTrace::SearchRequest &request);
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400108
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400109private:
José Fonsecab4a3d142011-10-27 07:43:19 +0100110 trace::Parser m_parser;
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400111
José Fonseca61e61f72011-09-11 16:53:34 +0100112 typedef QMap<int, FrameBookmark> FrameBookmarks;
113 FrameBookmarks m_frameBookmarks;
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400114 QList<ApiTraceFrame*> m_createdFrames;
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400115
116 QHash<QString, QUrl> m_helpHash;
Zack Rusinebf971e2011-09-06 17:44:43 -0400117
118 QVector<ApiTraceCallSignature*> m_signatures;
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400119};