Skip to content

Commit

Permalink
Skip over filtered calls when searching.
Browse files Browse the repository at this point in the history
  • Loading branch information
zackr committed Sep 25, 2011
1 parent bde6db8 commit ad513b3
Show file tree
Hide file tree
Showing 7 changed files with 116 additions and 55 deletions.
40 changes: 24 additions & 16 deletions gui/apitrace.cpp
Expand Up @@ -25,14 +25,12 @@ ApiTrace::ApiTrace()
SLOT(loaderFrameLoaded(ApiTraceFrame*,QVector<ApiTraceCall*>,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*)),
Expand Down Expand Up @@ -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;
}

Expand All @@ -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,
Expand All @@ -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;
}

Expand All @@ -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 = "<<result
// <<", call is = "<<call;
emit findResult(result, call);
emit findResult(request, result, call);
}

void ApiTrace::findFrameStart(ApiTraceFrame *frame)
Expand Down
38 changes: 30 additions & 8 deletions gui/apitrace.h
Expand Up @@ -25,6 +25,31 @@ class ApiTrace : public QObject
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);
Expand Down Expand Up @@ -87,7 +112,8 @@ public slots:
void changed(ApiTraceCall *call);
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);
Expand All @@ -99,12 +125,7 @@ public slots:
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);
Expand All @@ -116,7 +137,8 @@ private slots:
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:
Expand Down
3 changes: 2 additions & 1 deletion gui/main.cpp
Expand Up @@ -11,7 +11,7 @@ Q_DECLARE_METATYPE(QList<ApiTraceFrame*>);
Q_DECLARE_METATYPE(QVector<ApiTraceCall*>);
Q_DECLARE_METATYPE(Qt::CaseSensitivity);
Q_DECLARE_METATYPE(ApiTrace::SearchResult);

Q_DECLARE_METATYPE(ApiTrace::SearchRequest);

int main(int argc, char **argv)
{
Expand All @@ -22,6 +22,7 @@ int main(int argc, char **argv)
qRegisterMetaType<ApiTraceState>();
qRegisterMetaType<Qt::CaseSensitivity>();
qRegisterMetaType<ApiTrace::SearchResult>();
qRegisterMetaType<ApiTrace::SearchRequest>();
MainWindow window;

window.show();
Expand Down
31 changes: 26 additions & 5 deletions gui/mainwindow.cpp
Expand Up @@ -705,8 +705,8 @@ void MainWindow::initConnections()
this, SLOT(slotSaved()));
connect(m_trace, SIGNAL(changed(ApiTraceCall*)),
this, SLOT(slotTraceChanged(ApiTraceCall*)));
connect(m_trace, SIGNAL(findResult(ApiTrace::SearchResult,ApiTraceCall*)),
this, SLOT(slotSearchResult(ApiTrace::SearchResult,ApiTraceCall*)));
connect(m_trace, SIGNAL(findResult(ApiTrace::SearchRequest,ApiTrace::SearchResult,ApiTraceCall*)),
this, SLOT(slotSearchResult(ApiTrace::SearchRequest,ApiTrace::SearchResult,ApiTraceCall*)));
connect(m_trace, SIGNAL(foundFrameStart(ApiTraceFrame*)),
this, SLOT(slotFoundFrameStart(ApiTraceFrame*)));
connect(m_trace, SIGNAL(foundFrameEnd(ApiTraceFrame*)),
Expand Down Expand Up @@ -1093,7 +1093,8 @@ void MainWindow::loadProgess(int percent)
m_progressBar->setValue(percent);
}

void MainWindow::slotSearchResult(ApiTrace::SearchResult result,
void MainWindow::slotSearchResult(const ApiTrace::SearchRequest &request,
ApiTrace::SearchResult result,
ApiTraceCall *call)
{
switch (result) {
Expand All @@ -1102,8 +1103,28 @@ void MainWindow::slotSearchResult(ApiTrace::SearchResult result,
break;
case ApiTrace::SearchResult_Found: {
QModelIndex index = m_proxyModel->indexForCall(call);
m_ui.callView->setCurrentIndex(index);
m_searchWidget->setFound(true);

if (index.isValid()) {
m_ui.callView->setCurrentIndex(index);
m_searchWidget->setFound(true);
} else {
//call is filtered out, so continue searching but from the
// filtered call
if (!call) {
qDebug()<<"Error: search success with no call";
return;
}
// qDebug()<<"filtered! search from "<<call->searchText()
// <<", call idx = "<<call->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:
Expand Down
3 changes: 2 additions & 1 deletion gui/mainwindow.h
Expand Up @@ -73,7 +73,8 @@ private slots:
void slotTraceChanged(ApiTraceCall *call);
void slotRetraceErrors(const QList<ApiTraceError> &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);
Expand Down
39 changes: 24 additions & 15 deletions gui/traceloader.cpp
Expand Up @@ -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<ApiTraceCall*> 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;
}
}
Expand All @@ -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<Trace::Call*> frameCalls;
int frameIdx = startFrame;
Expand All @@ -337,7 +336,7 @@ void TraceLoader::searchPrev(int startFrame,
if (numCallsToParse == 0) {
bool foundCall = searchCallsBackwards(frameCalls,
frameIdx,
str, sensitivity);
request);

qDeleteAll(frameCalls);
frameCalls.clear();
Expand All @@ -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<Trace::Call*> &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<ApiTraceCall*> 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;
}
}
Expand Down Expand Up @@ -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"

0 comments on commit ad513b3

Please sign in to comment.