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*)),
{
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;
}
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,
{
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;
}
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)
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);
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);
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);
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:
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)
{
qRegisterMetaType<ApiTraceState>();
qRegisterMetaType<Qt::CaseSensitivity>();
qRegisterMetaType<ApiTrace::SearchResult>();
+ qRegisterMetaType<ApiTrace::SearchRequest>();
MainWindow window;
window.show();
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*)),
m_progressBar->setValue(percent);
}
-void MainWindow::slotSearchResult(ApiTrace::SearchResult result,
+void MainWindow::slotSearchResult(const ApiTrace::SearchRequest &request,
+ ApiTrace::SearchResult result,
ApiTraceCall *call)
{
switch (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:
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);
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;
}
}
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;
if (numCallsToParse == 0) {
bool foundCall = searchCallsBackwards(frameCalls,
frameIdx,
- str, sensitivity);
+ request);
qDeleteAll(frameCalls);
frameCalls.clear();
}
}
}
- 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;
}
}
emit foundCallIndex(call);
}
+void TraceLoader::search(const ApiTrace::SearchRequest &request)
+{
+ if (request.direction == ApiTrace::SearchRequest::Next) {
+ searchNext(request);
+ } else {
+ searchPrev(request);
+ }
+}
+
#include "traceloader.moc"
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();
const QVector<ApiTraceCall*> &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);
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,
QVector<ApiTraceCall*> fetchFrameContents(ApiTraceFrame *frame);
bool searchCallsBackwards(const QList<Trace::Call*> &calls,
int frameIdx,
- const QString &str,
- Qt::CaseSensitivity sensitivity);
+ const ApiTrace::SearchRequest &request);
private:
Trace::Parser m_parser;