this, SIGNAL(foundFrameStart(ApiTraceFrame*)));
connect(m_loader, SIGNAL(foundFrameEnd(ApiTraceFrame*)),
this, SIGNAL(foundFrameEnd(ApiTraceFrame*)));
+ connect(this, SIGNAL(loaderFindCallIndex(int)),
+ m_loader, SLOT(findCallIndex(int)));
+ connect(m_loader, SIGNAL(foundCallIndex(ApiTraceCall*)),
+ this, SIGNAL(foundCallIndex(ApiTraceCall*)));
connect(m_loader, SIGNAL(startedParsing()),
}
}
+void ApiTrace::findCallIndex(int index)
+{
+ int frameIdx = callInFrame(index);
+ ApiTraceFrame *frame = 0;
+
+ if (frameIdx < 0) {
+ emit foundCallIndex(0);
+ return;
+ }
+
+ frame = m_frames[frameIdx];
+
+ if (frame) {
+ if (frame->loaded()) {
+ ApiTraceCall *call = frame->callWithIndex(index);
+ emit foundCallIndex(call);
+ } else {
+ emit loaderFindCallIndex(index);
+ }
+ }
+}
+
+int ApiTrace::callInFrame(int callIdx) const
+{
+ unsigned numCalls = 0;
+
+ for (int frameIdx = 0; frameIdx <= m_frames.size(); ++frameIdx) {
+ const ApiTraceFrame *frame = m_frames[frameIdx];
+ unsigned numCallsInFrame = frame->loaded()
+ ? frame->numChildren()
+ : frame->numChildrenToLoad();
+ unsigned firstCall = numCalls;
+ unsigned endCall = numCalls + numCallsInFrame;
+ if (firstCall <= callIdx && endCall > callIdx) {
+ return frameIdx;
+ }
+ numCalls = endCall;
+ }
+
+ return -1;
+}
+
#include "apitrace.moc"
Qt::CaseSensitivity sensitivity);
void findFrameStart(ApiTraceFrame *frame);
void findFrameEnd(ApiTraceFrame *frame);
+ void findCallIndex(int index);
signals:
void endLoadingFrame(ApiTraceFrame *frame);
void foundFrameStart(ApiTraceFrame *frame);
void foundFrameEnd(ApiTraceFrame *frame);
-
+ void foundCallIndex(ApiTraceCall *call);
signals:
void loaderSearchNext(int startFrame,
Qt::CaseSensitivity sensitivity);
void loaderFindFrameStart(ApiTraceFrame *frame);
void loaderFindFrameEnd(ApiTraceFrame *frame);
+ void loaderFindCallIndex(int index);
private slots:
void addFrames(const QList<ApiTraceFrame*> &frames);
private:
void detectFrames();
+ int callInFrame(int callIdx) const;
private:
QString m_fileName;
QString m_tempFileName;
return m_calls.value(idx);
}
+
+ApiTraceCall * ApiTraceFrame::callWithIndex(int index) const
+{
+ QVector<ApiTraceCall*>::const_iterator itr;
+ for (itr = m_calls.constBegin(); itr != m_calls.constEnd(); ++itr) {
+ if ((*itr)->index() == index) {
+ return *itr;
+ }
+ }
+ return 0;
+}
+
int ApiTraceFrame::callIndex(ApiTraceCall *call) const
{
return m_calls.indexOf(call);
int callIndex(ApiTraceCall *call) const;
ApiTraceCall *call(int idx) const;
+ ApiTraceCall *callWithIndex(int index) const;
void addCall(ApiTraceCall *call);
QVector<ApiTraceCall*> calls() const;
void setCalls(const QVector<ApiTraceCall*> &calls,
this, SLOT(slotFoundFrameStart(ApiTraceFrame*)));
connect(m_trace, SIGNAL(foundFrameEnd(ApiTraceFrame*)),
this, SLOT(slotFoundFrameEnd(ApiTraceFrame*)));
+ connect(m_trace, SIGNAL(foundCallIndex(ApiTraceCall*)),
+ this, SLOT(slotJumpToResult(ApiTraceCall*)));
connect(m_retracer, SIGNAL(finished(const QString&)),
this, SLOT(replayFinished(const QString&)));
void MainWindow::slotJumpTo(int callNum)
{
- QModelIndex index = m_proxyModel->callIndex(callNum);
- if (index.isValid()) {
- m_ui.callView->setCurrentIndex(index);
- }
+ m_trace->findCallIndex(callNum);
}
void MainWindow::createdTrace(const QString &path)
} while (itr != calls.constBegin());
}
+void MainWindow::slotJumpToResult(ApiTraceCall *call)
+{
+ QModelIndex index = m_proxyModel->indexForCall(call);
+ if (index.isValid()) {
+ m_ui.callView->setCurrentIndex(index);
+ }
+}
+
#include "mainwindow.moc"
ApiTraceCall *call);
void slotFoundFrameStart(ApiTraceFrame *frame);
void slotFoundFrameEnd(ApiTraceFrame *frame);
+ void slotJumpToResult(ApiTraceCall *call);
private:
void initObjects();
emit foundFrameEnd(frame);
}
+void TraceLoader::findCallIndex(int index)
+{
+ int frameIdx = callInFrame(index);
+ ApiTraceFrame *frame = m_createdFrames[frameIdx];
+ QVector<ApiTraceCall*> calls = fetchFrameContents(frame);
+ QVector<ApiTraceCall*>::const_iterator itr;
+ ApiTraceCall *call = 0;
+ for (itr = calls.constBegin(); itr != calls.constEnd(); ++itr) {
+ if ((*itr)->index() == index) {
+ call = *itr;
+ }
+ }
+ Q_ASSERT(call);
+ emit foundCallIndex(call);
+}
+
#include "traceloader.moc"
Qt::CaseSensitivity sensitivity);
void findFrameStart(ApiTraceFrame *frame);
void findFrameEnd(ApiTraceFrame *frame);
+ void findCallIndex(int index);
signals:
void startedParsing();
void searchResult(ApiTrace::SearchResult result, ApiTraceCall *call);
void foundFrameStart(ApiTraceFrame *frame);
void foundFrameEnd(ApiTraceFrame *frame);
+ void foundCallIndex(ApiTraceCall *call);
private:
struct FrameBookmark {
FrameBookmark()