blob: 3714f6511aba47f84845ba529de3f430da12a208 [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
25 ApiTraceEnumSignature *enumSignature(unsigned id);
26 void addEnumSignature(unsigned id, ApiTraceEnumSignature *signature);
27
Lawrence L Love59befce2014-03-20 18:47:39 -070028private:
29 class FrameContents
30 {
31 public:
32 FrameContents(int numOfCalls=0);
33
34 bool load(TraceLoader *loader, ApiTraceFrame* frame,
35 QHash<QString, QUrl> helpHash, trace::Parser &parser);
36 void reset();
37 int topLevelCount() const;
38 int allCallsCount() const;
39 QVector<ApiTraceCall*> topLevelCalls() const;
40 QVector<ApiTraceCall*> allCalls() const;
41 quint64 binaryDataSize() const;
42 bool isEmpty();
43
44 private:
45 QStack <ApiTraceCall*> m_groups;
46 QVector<ApiTraceCall*> m_topLevelItems;
47 QVector<ApiTraceCall*> m_allCalls;
48 quint64 m_binaryDataSize;
49 int m_parsedCalls;
50 };
51
Zack Rusin20b1f6d2011-09-06 11:50:07 -040052public slots:
53 void loadTrace(const QString &filename);
Zack Rusin3176ebe2011-09-06 21:11:36 -040054 void loadFrame(ApiTraceFrame *frame);
Zack Rusin93e4d152011-09-13 02:23:39 -040055 void findFrameStart(ApiTraceFrame *frame);
56 void findFrameEnd(ApiTraceFrame *frame);
Zack Rusinda7579b2011-09-13 17:33:05 -040057 void findCallIndex(int index);
Zack Rusinad513b32011-09-25 14:33:41 -040058 void search(const ApiTrace::SearchRequest &request);
Zack Rusin20b1f6d2011-09-06 11:50:07 -040059
60signals:
61 void startedParsing();
Zack Rusinebf971e2011-09-06 17:44:43 -040062 void parsed(int percent);
José Fonseca67964382012-03-27 23:54:30 +010063 void guessedApi(int api);
Zack Rusin20b1f6d2011-09-06 11:50:07 -040064 void finishedParsing();
65
66 void framesLoaded(const QList<ApiTraceFrame*> &frames);
Zack Rusin8f98c3a2011-09-11 18:21:29 -040067 void frameContentsLoaded(ApiTraceFrame *frame,
Zack Rusind9d9d222013-10-11 18:02:26 -040068 const QVector<ApiTraceCall*> &topLevelItems,
Zack Rusin8f98c3a2011-09-11 18:21:29 -040069 const QVector<ApiTraceCall*> &calls,
70 quint64 binaryDataSize);
Zack Rusin20b1f6d2011-09-06 11:50:07 -040071
Zack Rusinad513b32011-09-25 14:33:41 -040072 void searchResult(const ApiTrace::SearchRequest &request,
73 ApiTrace::SearchResult result,
74 ApiTraceCall *call);
Zack Rusin93e4d152011-09-13 02:23:39 -040075 void foundFrameStart(ApiTraceFrame *frame);
76 void foundFrameEnd(ApiTraceFrame *frame);
Zack Rusinda7579b2011-09-13 17:33:05 -040077 void foundCallIndex(ApiTraceCall *call);
Zack Rusin20b1f6d2011-09-06 11:50:07 -040078private:
José Fonseca61e61f72011-09-11 16:53:34 +010079 struct FrameBookmark {
80 FrameBookmark()
Zack Rusin20b1f6d2011-09-06 11:50:07 -040081 : numberOfCalls(0)
82 {}
José Fonsecab4a3d142011-10-27 07:43:19 +010083 FrameBookmark(const trace::ParseBookmark &s)
Zack Rusin20b1f6d2011-09-06 11:50:07 -040084 : start(s),
85 numberOfCalls(0)
86 {}
87
José Fonsecab4a3d142011-10-27 07:43:19 +010088 trace::ParseBookmark start;
Zack Rusin20b1f6d2011-09-06 11:50:07 -040089 int numberOfCalls;
Zack Rusin20b1f6d2011-09-06 11:50:07 -040090 };
Zack Rusin20b1f6d2011-09-06 11:50:07 -040091 int numberOfFrames() const;
92 int numberOfCallsInFrame(int frameIdx) const;
93
94 void loadHelpFile();
José Fonseca67964382012-03-27 23:54:30 +010095 void guessApi(const trace::Call *call);
Zack Rusin20b1f6d2011-09-06 11:50:07 -040096 void scanTrace();
97 void parseTrace();
Zack Rusinebf971e2011-09-06 17:44:43 -040098
Zack Rusinad513b32011-09-25 14:33:41 -040099 void searchNext(const ApiTrace::SearchRequest &request);
100 void searchPrev(const ApiTrace::SearchRequest &request);
101
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400102 int callInFrame(int callIdx) const;
José Fonsecab4a3d142011-10-27 07:43:19 +0100103 bool callContains(trace::Call *call,
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400104 const QString &str,
105 Qt::CaseSensitivity sensitivity);
106 QVector<ApiTraceCall*> fetchFrameContents(ApiTraceFrame *frame);
José Fonsecab4a3d142011-10-27 07:43:19 +0100107 bool searchCallsBackwards(const QList<trace::Call*> &calls,
Zack Rusin121e3162011-09-13 01:35:12 -0400108 int frameIdx,
Zack Rusinad513b32011-09-25 14:33:41 -0400109 const ApiTrace::SearchRequest &request);
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400110
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400111private:
José Fonsecab4a3d142011-10-27 07:43:19 +0100112 trace::Parser m_parser;
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400113
José Fonseca61e61f72011-09-11 16:53:34 +0100114 typedef QMap<int, FrameBookmark> FrameBookmarks;
115 FrameBookmarks m_frameBookmarks;
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400116 QList<ApiTraceFrame*> m_createdFrames;
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400117
118 QHash<QString, QUrl> m_helpHash;
Zack Rusinebf971e2011-09-06 17:44:43 -0400119
120 QVector<ApiTraceCallSignature*> m_signatures;
121 QVector<ApiTraceEnumSignature*> m_enumSignatures;
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400122};
123
124#endif