1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
|
#pragma once
#include "apitrace.h"
#include "trace_file.hpp"
#include "trace_parser.hpp"
#include <QObject>
#include <QList>
#include <QMap>
#include <QStack>
class TraceLoader : public QObject
{
Q_OBJECT
public:
TraceLoader(QObject *parent=0);
~TraceLoader();
ApiTraceCallSignature *signature(unsigned id);
void addSignature(unsigned id, ApiTraceCallSignature *signature);
trace::EnumSig *enumSignature(unsigned id);
private:
class FrameContents
{
public:
FrameContents(int numOfCalls=0);
bool load(TraceLoader *loader, ApiTraceFrame* frame,
QHash<QString, QUrl> helpHash, trace::Parser &parser);
void reset();
int topLevelCount() const;
int allCallsCount() const;
QVector<ApiTraceCall*> topLevelCalls() const;
QVector<ApiTraceCall*> allCalls() const;
quint64 binaryDataSize() const;
bool isEmpty();
private:
QStack <ApiTraceCall*> m_groups;
QVector<ApiTraceCall*> m_topLevelItems;
QVector<ApiTraceCall*> m_allCalls;
quint64 m_binaryDataSize;
int m_parsedCalls;
};
public slots:
void loadTrace(const QString &filename);
void loadFrame(ApiTraceFrame *frame);
void findFrameStart(ApiTraceFrame *frame);
void findFrameEnd(ApiTraceFrame *frame);
void findCallIndex(int index);
void search(const ApiTrace::SearchRequest &request);
signals:
void parseProblem(const QString &message);
void startedParsing();
void parsed(int percent);
void guessedApi(int api);
void finishedParsing();
void framesLoaded(const QList<ApiTraceFrame*> &frames);
void frameContentsLoaded(ApiTraceFrame *frame,
const QVector<ApiTraceCall*> &topLevelItems,
const QVector<ApiTraceCall*> &calls,
quint64 binaryDataSize);
void searchResult(const ApiTrace::SearchRequest &request,
ApiTrace::SearchResult result,
ApiTraceCall *call);
void foundFrameStart(ApiTraceFrame *frame);
void foundFrameEnd(ApiTraceFrame *frame);
void foundCallIndex(ApiTraceCall *call);
private:
struct FrameBookmark {
FrameBookmark()
: numberOfCalls(0)
{}
FrameBookmark(const trace::ParseBookmark &s)
: start(s),
numberOfCalls(0)
{}
trace::ParseBookmark start;
int numberOfCalls;
};
int numberOfFrames() const;
int numberOfCallsInFrame(int frameIdx) const;
void loadHelpFile();
void guessApi(const trace::Call *call);
void scanTrace();
void searchNext(const ApiTrace::SearchRequest &request);
void searchPrev(const ApiTrace::SearchRequest &request);
int callInFrame(int callIdx) const;
bool callContains(trace::Call *call,
const QString &str,
Qt::CaseSensitivity sensitivity);
QVector<ApiTraceCall*> fetchFrameContents(ApiTraceFrame *frame);
bool searchCallsBackwards(const QList<trace::Call*> &calls,
int frameIdx,
const ApiTrace::SearchRequest &request);
private:
trace::Parser m_parser;
typedef QMap<int, FrameBookmark> FrameBookmarks;
FrameBookmarks m_frameBookmarks;
QList<ApiTraceFrame*> m_createdFrames;
QHash<QString, QUrl> m_helpHash;
QVector<ApiTraceCallSignature*> m_signatures;
};
|