From ad513b3f5f6e3b1e460d9cf77479715cc05319b4 Mon Sep 17 00:00:00 2001 From: Zack Rusin Date: Sun, 25 Sep 2011 14:33:41 -0400 Subject: [PATCH] Skip over filtered calls when searching. --- gui/apitrace.cpp | 40 ++++++++++++++++++++++++---------------- gui/apitrace.h | 38 ++++++++++++++++++++++++++++++-------- gui/main.cpp | 3 ++- gui/mainwindow.cpp | 31 ++++++++++++++++++++++++++----- gui/mainwindow.h | 3 ++- gui/traceloader.cpp | 39 ++++++++++++++++++++++++--------------- gui/traceloader.h | 17 ++++++++--------- 7 files changed, 116 insertions(+), 55 deletions(-) diff --git a/gui/apitrace.cpp b/gui/apitrace.cpp index edf98b9..023a094 100644 --- a/gui/apitrace.cpp +++ b/gui/apitrace.cpp @@ -25,14 +25,12 @@ ApiTrace::ApiTrace() 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(this, SIGNAL(loaderSearch(ApiTrace::SearchRequest)), + m_loader, SLOT(search(ApiTrace::SearchRequest))); connect(m_loader, - SIGNAL(searchResult(ApiTrace::SearchResult,ApiTraceCall*)), + SIGNAL(searchResult(ApiTrace::SearchRequest,ApiTrace::SearchResult,ApiTraceCall*)), this, - SLOT(loaderSearchResult(ApiTrace::SearchResult,ApiTraceCall*))); + SLOT(loaderSearchResult(ApiTrace::SearchRequest,ApiTrace::SearchResult,ApiTraceCall*))); connect(this, SIGNAL(loaderFindFrameStart(ApiTraceFrame*)), m_loader, SLOT(findFrameStart(ApiTraceFrame*))); connect(this, SIGNAL(loaderFindFrameEnd(ApiTraceFrame*)), @@ -320,11 +318,13 @@ void ApiTrace::findNext(ApiTraceFrame *frame, { ApiTraceCall *foundCall = 0; int frameIdx = m_frames.indexOf(frame); + SearchRequest request(SearchRequest::Next, + frame, from, str, sensitivity); if (frame->isLoaded()) { foundCall = frame->findNextCall(from, str, sensitivity); if (foundCall) { - emit findResult(SearchResult_Found, foundCall); + emit findResult(request, SearchResult_Found, foundCall); return; } @@ -333,20 +333,23 @@ void ApiTrace::findNext(ApiTraceFrame *frame, frameIdx += 1; } + //for the rest of the frames we search from beginning + request.from = 0; for (int i = frameIdx; i < m_frames.count(); ++i) { ApiTraceFrame *frame = m_frames[i]; + request.frame = frame; if (!frame->isLoaded()) { - emit loaderSearchNext(i, str, sensitivity); + emit loaderSearch(request); return; } else { ApiTraceCall *call = frame->findNextCall(0, str, sensitivity); if (call) { - emit findResult(SearchResult_Found, call); + emit findResult(request, SearchResult_Found, call); return; } } } - emit findResult(SearchResult_Wrapped, 0); + emit findResult(request, SearchResult_Wrapped, 0); } void ApiTrace::findPrev(ApiTraceFrame *frame, @@ -356,11 +359,13 @@ void ApiTrace::findPrev(ApiTraceFrame *frame, { ApiTraceCall *foundCall = 0; int frameIdx = m_frames.indexOf(frame); + SearchRequest request(SearchRequest::Prev, + frame, from, str, sensitivity); if (frame->isLoaded()) { foundCall = frame->findPrevCall(from, str, sensitivity); if (foundCall) { - emit findResult(SearchResult_Found, foundCall); + emit findResult(request, SearchResult_Found, foundCall); return; } @@ -369,28 +374,31 @@ void ApiTrace::findPrev(ApiTraceFrame *frame, frameIdx -= 1; } + request.from = 0; for (int i = frameIdx; i >= 0; --i) { ApiTraceFrame *frame = m_frames[i]; + request.frame = frame; if (!frame->isLoaded()) { - emit loaderSearchPrev(i, str, sensitivity); + emit loaderSearch(request); return; } else { ApiTraceCall *call = frame->findPrevCall(0, str, sensitivity); if (call) { - emit findResult(SearchResult_Found, call); + emit findResult(request, SearchResult_Found, call); return; } } } - emit findResult(SearchResult_Wrapped, 0); + emit findResult(request, SearchResult_Wrapped, 0); } -void ApiTrace::loaderSearchResult(ApiTrace::SearchResult result, +void ApiTrace::loaderSearchResult(const ApiTrace::SearchRequest &request, + ApiTrace::SearchResult result, ApiTraceCall *call) { //qDebug()<<"Search result = "<searchText() +// <<", call idx = "<index(); + + if (request.direction == ApiTrace::SearchRequest::Next) { + m_trace->findNext(call->parentFrame(), call, + request.text, request.cs); + } else { + m_trace->findNext(call->parentFrame(), call, + request.text, request.cs); + } + } } break; case ApiTrace::SearchResult_Wrapped: diff --git a/gui/mainwindow.h b/gui/mainwindow.h index 0ae8ab7..3fde4c6 100644 --- a/gui/mainwindow.h +++ b/gui/mainwindow.h @@ -73,7 +73,8 @@ private slots: void slotTraceChanged(ApiTraceCall *call); void slotRetraceErrors(const QList &errors); void slotErrorSelected(QTreeWidgetItem *current); - void slotSearchResult(ApiTrace::SearchResult result, + void slotSearchResult(const ApiTrace::SearchRequest &request, + ApiTrace::SearchResult result, ApiTraceCall *call); void slotFoundFrameStart(ApiTraceFrame *frame); void slotFoundFrameEnd(ApiTraceFrame *frame); diff --git a/gui/traceloader.cpp b/gui/traceloader.cpp index cf9b37b..c6694a1 100644 --- a/gui/traceloader.cpp +++ b/gui/traceloader.cpp @@ -283,25 +283,25 @@ void TraceLoader::addEnumSignature(unsigned id, ApiTraceEnumSignature *signature m_enumSignatures[id] = signature; } -void TraceLoader::searchNext(int startFrame, - const QString &str, - Qt::CaseSensitivity sensitivity) +void TraceLoader::searchNext(const ApiTrace::SearchRequest &request) { Q_ASSERT(m_parser.supportsOffsets()); if (m_parser.supportsOffsets()) { + int startFrame = m_createdFrames.indexOf(request.frame); const FrameBookmark &frameBookmark = m_frameBookmarks[startFrame]; m_parser.setBookmark(frameBookmark.start); Trace::Call *call = 0; while ((call = m_parser.parse_call())) { - if (callContains(call, str, sensitivity)) { + if (callContains(call, request.text, request.cs)) { unsigned frameIdx = callInFrame(call->no); ApiTraceFrame *frame = m_createdFrames[frameIdx]; const QVector calls = fetchFrameContents(frame); for (int i = 0; i < calls.count(); ++i) { if (calls[i]->index() == call->no) { - emit searchResult(ApiTrace::SearchResult_Found, calls[i]); + emit searchResult(request, ApiTrace::SearchResult_Found, + calls[i]); break; } } @@ -312,15 +312,14 @@ void TraceLoader::searchNext(int startFrame, delete call; } } - emit searchResult(ApiTrace::SearchResult_NotFound, 0); + emit searchResult(request, ApiTrace::SearchResult_NotFound, 0); } -void TraceLoader::searchPrev(int startFrame, - const QString &str, - Qt::CaseSensitivity sensitivity) +void TraceLoader::searchPrev(const ApiTrace::SearchRequest &request) { Q_ASSERT(m_parser.supportsOffsets()); if (m_parser.supportsOffsets()) { + int startFrame = m_createdFrames.indexOf(request.frame); Trace::Call *call = 0; QList frameCalls; int frameIdx = startFrame; @@ -337,7 +336,7 @@ void TraceLoader::searchPrev(int startFrame, if (numCallsToParse == 0) { bool foundCall = searchCallsBackwards(frameCalls, frameIdx, - str, sensitivity); + request); qDeleteAll(frameCalls); frameCalls.clear(); @@ -356,23 +355,24 @@ void TraceLoader::searchPrev(int startFrame, } } } - emit searchResult(ApiTrace::SearchResult_NotFound, 0); + emit searchResult(request, ApiTrace::SearchResult_NotFound, 0); } bool TraceLoader::searchCallsBackwards(const QList &calls, int frameIdx, - const QString &str, - Qt::CaseSensitivity sensitivity) + const ApiTrace::SearchRequest &request) { for (int i = calls.count() - 1; i >= 0; --i) { Trace::Call *call = calls[i]; - if (callContains(call, str, sensitivity)) { + if (callContains(call, request.text, request.cs)) { ApiTraceFrame *frame = m_createdFrames[frameIdx]; const QVector apiCalls = fetchFrameContents(frame); for (int i = 0; i < apiCalls.count(); ++i) { if (apiCalls[i]->index() == call->no) { - emit searchResult(ApiTrace::SearchResult_Found, apiCalls[i]); + emit searchResult(request, + ApiTrace::SearchResult_Found, + apiCalls[i]); break; } } @@ -502,4 +502,13 @@ void TraceLoader::findCallIndex(int index) emit foundCallIndex(call); } +void TraceLoader::search(const ApiTrace::SearchRequest &request) +{ + if (request.direction == ApiTrace::SearchRequest::Next) { + searchNext(request); + } else { + searchPrev(request); + } +} + #include "traceloader.moc" diff --git a/gui/traceloader.h b/gui/traceloader.h index e950b09..b36cab8 100644 --- a/gui/traceloader.h +++ b/gui/traceloader.h @@ -28,15 +28,10 @@ public slots: void loadTrace(const QString &filename); void loadFrame(ApiTraceFrame *frame); void setFrameMarker(ApiTrace::FrameMarker marker); - void searchNext(int startFrame, - const QString &str, - Qt::CaseSensitivity sensitivity); - void searchPrev(int startFrame, - const QString &str, - Qt::CaseSensitivity sensitivity); void findFrameStart(ApiTraceFrame *frame); void findFrameEnd(ApiTraceFrame *frame); void findCallIndex(int index); + void search(const ApiTrace::SearchRequest &request); signals: void startedParsing(); @@ -48,7 +43,9 @@ signals: const QVector &calls, quint64 binaryDataSize); - void searchResult(ApiTrace::SearchResult result, ApiTraceCall *call); + void searchResult(const ApiTrace::SearchRequest &request, + ApiTrace::SearchResult result, + ApiTraceCall *call); void foundFrameStart(ApiTraceFrame *frame); void foundFrameEnd(ApiTraceFrame *frame); void foundCallIndex(ApiTraceCall *call); @@ -73,6 +70,9 @@ private: void scanTrace(); void parseTrace(); + 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, @@ -80,8 +80,7 @@ private: QVector fetchFrameContents(ApiTraceFrame *frame); bool searchCallsBackwards(const QList &calls, int frameIdx, - const QString &str, - Qt::CaseSensitivity sensitivity); + const ApiTrace::SearchRequest &request); private: Trace::Parser m_parser; -- 2.43.0