X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=gui%2Fapitrace.cpp;h=bff1686a9a3076add8058fcad199a483b9b5e873;hb=8f98c3a529e7ef88e4111ef22cf8411916a9a065;hp=d6a9e41375c2cda6ef5f39eb43084e21d2b35cc0;hpb=46963dad18214fc45b248ecdc9f5931cf417705d;p=apitrace diff --git a/gui/apitrace.cpp b/gui/apitrace.cpp index d6a9e41..bff1686 100644 --- a/gui/apitrace.cpp +++ b/gui/apitrace.cpp @@ -3,6 +3,7 @@ #include "traceloader.h" #include "saverthread.h" +#include #include #include @@ -11,12 +12,28 @@ ApiTrace::ApiTrace() m_needsSaving(false) { m_loader = new TraceLoader(); + connect(this, SIGNAL(loadTrace(QString)), m_loader, SLOT(loadTrace(QString))); + connect(this, SIGNAL(requestFrame(ApiTraceFrame*)), + m_loader, SLOT(loadFrame(ApiTraceFrame*))); connect(m_loader, SIGNAL(framesLoaded(const QList)), this, SLOT(addFrames(const QList))); - connect(m_loader, SIGNAL(frameLoaded(int,QVector,quint64)), - this, SLOT(fillFrame(int,QVector,quint64))); + connect(m_loader, + SIGNAL(frameContentsLoaded(ApiTraceFrame*,QVector,quint64)), + this, + SLOT(loaderFrameLoaded(ApiTraceFrame*,QVector,quint64))); + connect(m_loader, SIGNAL(finishedParsing()), + this, SLOT(finishedParsing())); + connect(this, SIGNAL(loaderSearchNext(int,QString,Qt::CaseSensitivity)), + m_loader, SLOT(searchNext(int,QString,Qt::CaseSensitivity))); + connect(this, SIGNAL(loaderSearchPrev(int,QString,Qt::CaseSensitivity)), + m_loader, SLOT(searchPrev(int,QString,Qt::CaseSensitivity))); + connect(m_loader, + SIGNAL(searchResult(ApiTrace::SearchResult,ApiTraceCall*)), + this, + SLOT(loaderSearchResult(ApiTrace::SearchResult,ApiTraceCall*))); + connect(m_loader, SIGNAL(startedParsing()), this, SIGNAL(startedLoadingTrace())); @@ -94,11 +111,6 @@ QVector ApiTrace::calls() const return m_calls; } -ApiTraceCall * ApiTrace::callAt(int idx) const -{ - return m_calls.value(idx); -} - int ApiTrace::numCalls() const { return m_calls.count(); @@ -302,9 +314,106 @@ bool ApiTrace::hasErrors() const return !m_errors.isEmpty(); } -void ApiTrace::fillFrame(int frameIdx, const QVector &calls, - quint64 binaryDataSize) +void ApiTrace::loadFrame(ApiTraceFrame *frame) +{ + Q_ASSERT(!frame->loaded()); + emit requestFrame(frame); +} + +void ApiTrace::finishedParsing() +{ + ApiTraceFrame *firstFrame = m_frames[0]; + if (firstFrame && !firstFrame->loaded()) { + loadFrame(firstFrame); + } +} + +void ApiTrace::loaderFrameLoaded(ApiTraceFrame *frame, + const QVector &calls, + quint64 binaryDataSize) +{ + Q_ASSERT(frame->numChildrenToLoad() == calls.size()); + emit beginLoadingFrame(frame, calls.size()); + frame->setCalls(calls, binaryDataSize); + emit endLoadingFrame(frame); +} + +void ApiTrace::findNext(ApiTraceFrame *frame, + ApiTraceCall *from, + const QString &str, + Qt::CaseSensitivity sensitivity) +{ + ApiTraceCall *foundCall = 0; + int frameIdx = m_frames.indexOf(frame); + + if (frame->loaded()) { + foundCall = frame->findNextCall(from, str, sensitivity); + if (foundCall) { + emit findResult(SearchFound, foundCall); + return; + } + + //if the frame is loaded we already searched it above + // so skip it + frameIdx += 1; + } + + for (int i = frameIdx; i < m_frames.count(); ++i) { + ApiTraceFrame *frame = m_frames[i]; + if (!frame->loaded()) { + emit loaderSearchNext(i, str, sensitivity); + return; + } else { + ApiTraceCall *call = frame->findNextCall(0, str, sensitivity); + if (call) { + emit findResult(SearchFound, call); + } + } + } + emit findResult(SearchWrapped, 0); +} + +void ApiTrace::findPrev(ApiTraceFrame *frame, + ApiTraceCall *from, + const QString &str, + Qt::CaseSensitivity sensitivity) +{ + ApiTraceCall *foundCall = 0; + int frameIdx = m_frames.indexOf(frame); + + if (frame->loaded()) { + foundCall = frame->findPrevCall(from, str, sensitivity); + if (foundCall) { + emit findResult(SearchFound, foundCall); + return; + } + + //if the frame is loaded we already searched it above + // so skip it + frameIdx -= 1; + } + + for (int i = frameIdx; i <= 0; --i) { + ApiTraceFrame *frame = m_frames[i]; + if (!frame->loaded()) { + emit loaderSearchPrev(i, str, sensitivity); + return; + } else { + ApiTraceCall *call = frame->findPrevCall(0, str, sensitivity); + if (call) { + emit findResult(SearchFound, call); + } + } + } + emit findResult(SearchWrapped, 0); +} + +void ApiTrace::loaderSearchResult(ApiTrace::SearchResult result, + ApiTraceCall *call) { + //qDebug()<<"Search result = "<