#include "apitracecall.h"
+#include "trace_api.hpp"
+
#include <QObject>
#include <QSet>
{
Q_OBJECT
public:
- enum FrameMarker {
- FrameMarker_SwapBuffers,
- FrameMarker_Flush,
- FrameMarker_Finish,
- FrameMarker_Clear
- };
enum SearchResult {
- SearchNotFound,
- SearchFound,
- SearchWrapped
+ SearchResult_NotFound,
+ SearchResult_Found,
+ SearchResult_Wrapped
+ };
+ struct SearchRequest {
+ enum Direction {
+ Next,
+ Prev
+ };
+ SearchRequest()
+ : direction(Next)
+ {}
+ SearchRequest(Direction dir,
+ ApiTraceFrame *f,
+ ApiTraceCall *call,
+ QString str,
+ Qt::CaseSensitivity caseSens)
+ : direction(dir),
+ frame(f),
+ from(call),
+ text(str),
+ cs(caseSens)
+ {}
+ Direction direction;
+ ApiTraceFrame *frame;
+ ApiTraceCall *from;
+ QString text;
+ Qt::CaseSensitivity cs;
};
- static bool isCallAFrameMarker(const ApiTraceCall *call,
- FrameMarker marker);
public:
ApiTrace();
~ApiTrace();
QString fileName() const;
- FrameMarker frameMarker() const;
-
ApiTraceState defaultState() const;
- QVector<ApiTraceCall*> calls() const;
ApiTraceCall *callWithIndex(int idx) const;
- int numCalls() const;
- QList<ApiTraceFrame*> frames() const;
+ const QList<ApiTraceFrame*> & frames() const;
ApiTraceFrame *frameAt(int idx) const;
int numFrames() const;
int numCallsInFrame(int idx) const;
bool hasErrors() const;
+ trace::API api() const;
+
public slots:
void setFileName(const QString &name);
- void setFrameMarker(FrameMarker marker);
void save();
void loadFrame(ApiTraceFrame *frame);
void findNext(ApiTraceFrame *frame,
ApiTraceCall *call,
const QString &str,
Qt::CaseSensitivity sensitivity);
+ void findFrameStart(ApiTraceFrame *frame);
+ void findFrameEnd(ApiTraceFrame *frame);
+ void findCallIndex(int index);
+ void setCallError(const ApiTraceError &error);
+ void bindThumbnailsToFrames(const QList<QImage> &thumbnails);
signals:
void loadTrace(const QString &name);
void finishedLoadingTrace();
void invalidated();
void framesInvalidated();
- void changed(ApiTraceCall *call);
+ void changed(ApiTraceEvent *event);
void startedSaving();
void saved();
- void findResult(ApiTrace::SearchResult result,
+ void findResult(const ApiTrace::SearchRequest &request,
+ ApiTrace::SearchResult result,
ApiTraceCall *call);
void beginAddingFrames(int oldCount, int numAdded);
void endAddingFrames();
- void callsAdded(int oldCount, int numAdded);
void beginLoadingFrame(ApiTraceFrame *frame, int numAdded);
void endLoadingFrame(ApiTraceFrame *frame);
-
+ void foundFrameStart(ApiTraceFrame *frame);
+ void foundFrameEnd(ApiTraceFrame *frame);
+ void foundCallIndex(ApiTraceCall *call);
signals:
- void loaderSearchNext(int startFrame,
- const QString &str,
- Qt::CaseSensitivity sensitivity);
- void loaderSearchPrev(int startFrame,
- const QString &str,
- Qt::CaseSensitivity sensitivity);
+ void loaderSearch(const ApiTrace::SearchRequest &request);
+ void loaderFindFrameStart(ApiTraceFrame *frame);
+ void loaderFindFrameEnd(ApiTraceFrame *frame);
+ void loaderFindCallIndex(int index);
private slots:
void addFrames(const QList<ApiTraceFrame*> &frames);
void slotSaved();
+ void guessedApi(int api);
void finishedParsing();
void loaderFrameLoaded(ApiTraceFrame *frame,
const QVector<ApiTraceCall*> &calls,
quint64 binaryDataSize);
- void loaderSearchResult(ApiTrace::SearchResult result,
+ void loaderSearchResult(const ApiTrace::SearchRequest &request,
+ ApiTrace::SearchResult result,
ApiTraceCall *call);
private:
- void detectFrames();
+ int callInFrame(int callIdx) const;
+ bool isFrameLoading(ApiTraceFrame *frame) const;
private:
QString m_fileName;
QString m_tempFileName;
QList<ApiTraceFrame*> m_frames;
- QVector<ApiTraceCall*> m_calls;
-
- FrameMarker m_frameMarker;
+ trace::API m_api;
TraceLoader *m_loader;
QThread *m_loaderThread;
bool m_needsSaving;
QSet<ApiTraceCall*> m_errors;
+ QList< QPair<ApiTraceFrame*, ApiTraceError> > m_queuedErrors;
+ QSet<ApiTraceFrame*> m_loadingFrames;
};
#endif