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 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
|
#pragma once
#include "apitracecall.h"
#include "trace_api.hpp"
#include <QObject>
#include <QSet>
class TraceLoader;
class SaverThread;
class QThread;
typedef void (*ThumbnailCallback)(void *object, int thumbnailIdx);
typedef QHash<int, QImage> ImageHash;
class ApiTrace : public QObject
{
Q_OBJECT
public:
enum SearchResult {
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;
};
public:
ApiTrace();
~ApiTrace();
bool isEmpty() const;
QString fileName() const;
ApiTraceState defaultState() const;
ApiTraceCall *callWithIndex(int idx) const;
const QList<ApiTraceFrame*> & frames() const;
ApiTraceFrame *frameAt(int idx) const;
int numFrames() const;
int numCallsInFrame(int idx) const;
void callEdited(ApiTraceCall *call);
void callReverted(ApiTraceCall *call);
void callError(ApiTraceCall *call);
bool edited() const;
bool needsSaving() const;
bool isSaving() const;
bool hasErrors() const;
trace::API api() const;
void missingThumbnail(ApiTraceFrame* frame);
void missingThumbnail(ApiTraceCall* call);
bool isMissingThumbnails() const;
void resetMissingThumbnails();
void iterateMissingThumbnails(void *object, ThumbnailCallback cb);
public slots:
void setFileName(const QString &name);
void save();
void finishedParsing();
void loadFrame(ApiTraceFrame *frame);
void findNext(ApiTraceFrame *frame,
ApiTraceCall *call,
const QString &str,
Qt::CaseSensitivity sensitivity);
void findPrev(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 bindThumbnails(const ImageHash &thumbnails);
signals:
void loadTrace(const QString &name);
void requestFrame(ApiTraceFrame *frame);
void problemLoadingTrace(const QString &message);
void startedLoadingTrace();
void loaded(int percent);
void finishedLoadingTrace();
void invalidated();
void framesInvalidated();
void changed(ApiTraceEvent *event);
void startedSaving();
void saved();
void findResult(const ApiTrace::SearchRequest &request,
ApiTrace::SearchResult result,
ApiTraceCall *call);
void beginAddingFrames(int oldCount, int numAdded);
void endAddingFrames();
void beginLoadingFrame(ApiTraceFrame *frame, int numAdded);
void endLoadingFrame(ApiTraceFrame *frame);
void foundFrameStart(ApiTraceFrame *frame);
void foundFrameEnd(ApiTraceFrame *frame);
void foundCallIndex(ApiTraceCall *call);
signals:
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 loaderFrameLoaded(ApiTraceFrame *frame,
const QVector<ApiTraceCall*> &topLevelItems,
const QVector<ApiTraceCall*> &calls,
quint64 binaryDataSize);
void loaderSearchResult(const ApiTrace::SearchRequest &request,
ApiTrace::SearchResult result,
ApiTraceCall *call);
private:
int callInFrame(int callIdx) const;
bool isFrameLoading(ApiTraceFrame *frame) const;
void missingThumbnail(int callIdx);
private:
QString m_fileName;
QString m_tempFileName;
QList<ApiTraceFrame*> m_frames;
trace::API m_api;
TraceLoader *m_loader;
QThread *m_loaderThread;
SaverThread *m_saver;
QSet<ApiTraceCall*> m_editedCalls;
bool m_needsSaving;
QSet<ApiTraceCall*> m_errors;
QList< QPair<ApiTraceFrame*, ApiTraceError> > m_queuedErrors;
QSet<ApiTraceFrame*> m_loadingFrames;
QSet<int> m_missingThumbnails;
ImageHash m_thumbnails;
};
|