blob: b5b530705cd0cfbebd1d3a6af80cf544c8e03be0 [file] [log] [blame]
#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,
bool useRegex);
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;
};