blob: 65a179d90f787d88ced3195fd58b028e54107942 [file] [log] [blame]
Zack Rusin20b1f6d2011-09-06 11:50:07 -04001#ifndef TRACELOADER_H
2#define TRACELOADER_H
3
4
5#include "apitrace.h"
6#include "trace_file.hpp"
7#include "trace_parser.hpp"
8
9#include <QObject>
10#include <QList>
11#include <QMap>
Lawrence L Love59befce2014-03-20 18:47:39 -070012#include <QStack>
Zack Rusin20b1f6d2011-09-06 11:50:07 -040013
14class TraceLoader : public QObject
15{
16 Q_OBJECT
17public:
Zack Rusinebf971e2011-09-06 17:44:43 -040018 TraceLoader(QObject *parent=0);
Zack Rusin20b1f6d2011-09-06 11:50:07 -040019 ~TraceLoader();
20
Zack Rusinebf971e2011-09-06 17:44:43 -040021
22 ApiTraceCallSignature *signature(unsigned id);
23 void addSignature(unsigned id, ApiTraceCallSignature *signature);
24
José Fonseca446ca502014-12-19 16:22:39 +000025 trace::EnumSig *enumSignature(unsigned id);
Zack Rusinebf971e2011-09-06 17:44:43 -040026
Lawrence L Love59befce2014-03-20 18:47:39 -070027private:
28 class FrameContents
29 {
30 public:
31 FrameContents(int numOfCalls=0);
32
33 bool load(TraceLoader *loader, ApiTraceFrame* frame,
34 QHash<QString, QUrl> helpHash, trace::Parser &parser);
35 void reset();
36 int topLevelCount() const;
37 int allCallsCount() const;
38 QVector<ApiTraceCall*> topLevelCalls() const;
39 QVector<ApiTraceCall*> allCalls() const;
40 quint64 binaryDataSize() const;
41 bool isEmpty();
42
43 private:
44 QStack <ApiTraceCall*> m_groups;
45 QVector<ApiTraceCall*> m_topLevelItems;
46 QVector<ApiTraceCall*> m_allCalls;
47 quint64 m_binaryDataSize;
48 int m_parsedCalls;
49 };
50
Zack Rusin20b1f6d2011-09-06 11:50:07 -040051public slots:
52 void loadTrace(const QString &filename);
Zack Rusin3176ebe2011-09-06 21:11:36 -040053 void loadFrame(ApiTraceFrame *frame);
Zack Rusin93e4d152011-09-13 02:23:39 -040054 void findFrameStart(ApiTraceFrame *frame);
55 void findFrameEnd(ApiTraceFrame *frame);
Zack Rusinda7579b2011-09-13 17:33:05 -040056 void findCallIndex(int index);
Zack Rusinad513b32011-09-25 14:33:41 -040057 void search(const ApiTrace::SearchRequest &request);
Zack Rusin20b1f6d2011-09-06 11:50:07 -040058
59signals:
60 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();
96 void parseTrace();
Zack Rusinebf971e2011-09-06 17:44:43 -040097
Zack Rusinad513b32011-09-25 14:33:41 -040098 void searchNext(const ApiTrace::SearchRequest &request);
99 void searchPrev(const ApiTrace::SearchRequest &request);
100
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400101 int callInFrame(int callIdx) const;
José Fonsecab4a3d142011-10-27 07:43:19 +0100102 bool callContains(trace::Call *call,
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400103 const QString &str,
104 Qt::CaseSensitivity sensitivity);
105 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};
121
122#endif