blob: 7cb07f00aa1331e814c6d7025deffe76498a36fc [file] [log] [blame]
Zack Rusin20b1f6d2011-09-06 11:50:07 -04001#include "traceloader.h"
2
Zack Rusin3176ebe2011-09-06 21:11:36 -04003#include "apitrace.h"
Zack Rusin20b1f6d2011-09-06 11:50:07 -04004#include <QDebug>
5#include <QFile>
6
7#define FRAMES_TO_CACHE 100
8
9static ApiTraceCall *
José Fonsecab4a3d142011-10-27 07:43:19 +010010apiCallFromTraceCall(const trace::Call *call,
Zack Rusin20b1f6d2011-09-06 11:50:07 -040011 const QHash<QString, QUrl> &helpHash,
Zack Rusinebf971e2011-09-06 17:44:43 -040012 ApiTraceFrame *frame,
13 TraceLoader *loader)
Zack Rusin20b1f6d2011-09-06 11:50:07 -040014{
Zack Rusinebf971e2011-09-06 17:44:43 -040015 ApiTraceCall *apiCall = new ApiTraceCall(frame, loader, call);
Zack Rusin20b1f6d2011-09-06 11:50:07 -040016
17 apiCall->setHelpUrl(helpHash.value(apiCall->name()));
18
19 return apiCall;
20}
21
Zack Rusinebf971e2011-09-06 17:44:43 -040022TraceLoader::TraceLoader(QObject *parent)
Zack Rusin20b1f6d2011-09-06 11:50:07 -040023 : QObject(parent),
Zack Rusin20b1f6d2011-09-06 11:50:07 -040024 m_frameMarker(ApiTrace::FrameMarker_SwapBuffers)
25{
26}
27
28TraceLoader::~TraceLoader()
29{
30 m_parser.close();
Zack Rusin081e59d2011-09-21 00:25:03 -040031 qDeleteAll(m_signatures);
32 qDeleteAll(m_enumSignatures);
Zack Rusin20b1f6d2011-09-06 11:50:07 -040033}
34
35void TraceLoader::loadTrace(const QString &filename)
36{
37 if (m_helpHash.isEmpty()) {
38 loadHelpFile();
39 }
40
Zack Rusindaf82af2011-09-24 13:42:53 -040041 if (!m_frameBookmarks.isEmpty()) {
42 qDeleteAll(m_signatures);
43 qDeleteAll(m_enumSignatures);
44 m_signatures.clear();
45 m_enumSignatures.clear();
46 m_frameBookmarks.clear();
47 m_createdFrames.clear();
48 m_parser.close();
49 }
50
Zack Rusin20b1f6d2011-09-06 11:50:07 -040051 if (!m_parser.open(filename.toLatin1())) {
52 qDebug() << "error: failed to open " << filename;
53 return;
54 }
Zack Rusin59b79552011-09-21 00:37:03 -040055
Zack Rusin20b1f6d2011-09-06 11:50:07 -040056 emit startedParsing();
57
58 if (m_parser.supportsOffsets()) {
Zack Rusinac92a212011-09-06 18:25:34 -040059 scanTrace();
Zack Rusin20b1f6d2011-09-06 11:50:07 -040060 } else {
Zack Rusinac92a212011-09-06 18:25:34 -040061 //Load the entire file into memory
62 parseTrace();
Zack Rusin20b1f6d2011-09-06 11:50:07 -040063 }
Zack Rusin20b1f6d2011-09-06 11:50:07 -040064 emit finishedParsing();
65}
66
Zack Rusin3176ebe2011-09-06 21:11:36 -040067void TraceLoader::loadFrame(ApiTraceFrame *currentFrame)
Zack Rusin20b1f6d2011-09-06 11:50:07 -040068{
Zack Rusin8f98c3a2011-09-11 18:21:29 -040069 fetchFrameContents(currentFrame);
Zack Rusin20b1f6d2011-09-06 11:50:07 -040070}
71
72void TraceLoader::setFrameMarker(ApiTrace::FrameMarker marker)
73{
74 m_frameMarker = marker;
75}
76
José Fonsecab4a3d142011-10-27 07:43:19 +010077bool TraceLoader::isCallAFrameMarker(const trace::Call *call) const
Zack Rusin20b1f6d2011-09-06 11:50:07 -040078{
79 std::string name = call->name();
80
81 switch (m_frameMarker) {
82 case ApiTrace::FrameMarker_SwapBuffers:
Zack Rusinac92a212011-09-06 18:25:34 -040083 return name.find("SwapBuffers") != std::string::npos ||
84 name == "CGLFlushDrawable" ||
85 name == "glFrameTerminatorGREMEDY";
86 break;
Zack Rusin20b1f6d2011-09-06 11:50:07 -040087 case ApiTrace::FrameMarker_Flush:
Zack Rusinac92a212011-09-06 18:25:34 -040088 return name == "glFlush";
89 break;
Zack Rusin20b1f6d2011-09-06 11:50:07 -040090 case ApiTrace::FrameMarker_Finish:
Zack Rusinac92a212011-09-06 18:25:34 -040091 return name == "glFinish";
92 break;
Zack Rusin20b1f6d2011-09-06 11:50:07 -040093 case ApiTrace::FrameMarker_Clear:
Zack Rusinac92a212011-09-06 18:25:34 -040094 return name == "glClear";
95 break;
Zack Rusin20b1f6d2011-09-06 11:50:07 -040096 }
97 return false;
98}
99
100int TraceLoader::numberOfFrames() const
101{
José Fonseca61e61f72011-09-11 16:53:34 +0100102 return m_frameBookmarks.size();
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400103}
104
105int TraceLoader::numberOfCallsInFrame(int frameIdx) const
106{
José Fonseca61e61f72011-09-11 16:53:34 +0100107 if (frameIdx > m_frameBookmarks.size()) {
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400108 return 0;
109 }
José Fonseca61e61f72011-09-11 16:53:34 +0100110 FrameBookmarks::const_iterator itr =
111 m_frameBookmarks.find(frameIdx);
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400112 return itr->numberOfCalls;
113}
114
115void TraceLoader::loadHelpFile()
116{
Zack Rusinac92a212011-09-06 18:25:34 -0400117 QFile file(":/resources/glreference.tsv");
118 if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
119 QString line;
120 while (!file.atEnd()) {
121 line = file.readLine();
122 QString function = line.section('\t', 0, 0).trimmed();
123 QUrl url = QUrl(line.section('\t', 1, 1).trimmed());
124 //qDebug()<<"function = "<<function<<", url = "<<url.toString();
125 m_helpHash.insert(function, url);
126 }
127 } else {
128 qWarning() << "Couldn't open reference file "
129 << file.fileName();
130 }
131 file.close();
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400132}
133
134void TraceLoader::scanTrace()
135{
Zack Rusinac92a212011-09-06 18:25:34 -0400136 QList<ApiTraceFrame*> frames;
137 ApiTraceFrame *currentFrame = 0;
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400138
José Fonsecab4a3d142011-10-27 07:43:19 +0100139 trace::Call *call;
140 trace::ParseBookmark startBookmark;
Zack Rusinac92a212011-09-06 18:25:34 -0400141 int numOfFrames = 0;
142 int numOfCalls = 0;
Zack Rusinac92a212011-09-06 18:25:34 -0400143 int lastPercentReport = 0;
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400144
José Fonseca61e61f72011-09-11 16:53:34 +0100145 m_parser.getBookmark(startBookmark);
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400146
Zack Rusinac92a212011-09-06 18:25:34 -0400147 while ((call = m_parser.scan_call())) {
148 ++numOfCalls;
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400149
Zack Rusinac92a212011-09-06 18:25:34 -0400150 if (isCallAFrameMarker(call)) {
José Fonseca61e61f72011-09-11 16:53:34 +0100151 FrameBookmark frameBookmark(startBookmark);
152 frameBookmark.numberOfCalls = numOfCalls;
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400153
Zack Rusinac92a212011-09-06 18:25:34 -0400154 currentFrame = new ApiTraceFrame();
155 currentFrame->number = numOfFrames;
156 currentFrame->setNumChildren(numOfCalls);
Zack Rusin851d0b02011-09-14 22:04:07 -0400157 currentFrame->setLastCallIndex(call->no);
Zack Rusinac92a212011-09-06 18:25:34 -0400158 frames.append(currentFrame);
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400159
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400160 m_createdFrames.append(currentFrame);
José Fonseca61e61f72011-09-11 16:53:34 +0100161 m_frameBookmarks[numOfFrames] = frameBookmark;
Zack Rusinac92a212011-09-06 18:25:34 -0400162 ++numOfFrames;
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400163
Zack Rusinac92a212011-09-06 18:25:34 -0400164 if (m_parser.percentRead() - lastPercentReport >= 5) {
165 emit parsed(m_parser.percentRead());
166 lastPercentReport = m_parser.percentRead();
167 }
José Fonseca61e61f72011-09-11 16:53:34 +0100168 m_parser.getBookmark(startBookmark);
Zack Rusinac92a212011-09-06 18:25:34 -0400169 numOfCalls = 0;
170 }
Zack Rusinac92a212011-09-06 18:25:34 -0400171 delete call;
172 }
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400173
Zack Rusinac92a212011-09-06 18:25:34 -0400174 if (numOfCalls) {
José Fonsecab4a3d142011-10-27 07:43:19 +0100175 //trace::File::Bookmark endBookmark = m_parser.currentBookmark();
José Fonseca61e61f72011-09-11 16:53:34 +0100176 FrameBookmark frameBookmark(startBookmark);
177 frameBookmark.numberOfCalls = numOfCalls;
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400178
Zack Rusinac92a212011-09-06 18:25:34 -0400179 currentFrame = new ApiTraceFrame();
180 currentFrame->number = numOfFrames;
181 currentFrame->setNumChildren(numOfCalls);
182 frames.append(currentFrame);
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400183
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400184 m_createdFrames.append(currentFrame);
José Fonseca61e61f72011-09-11 16:53:34 +0100185 m_frameBookmarks[numOfFrames] = frameBookmark;
Zack Rusinac92a212011-09-06 18:25:34 -0400186 ++numOfFrames;
187 }
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400188
Zack Rusinac92a212011-09-06 18:25:34 -0400189 emit parsed(100);
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400190
Zack Rusinac92a212011-09-06 18:25:34 -0400191 emit framesLoaded(frames);
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400192}
193
194void TraceLoader::parseTrace()
195{
Zack Rusinac92a212011-09-06 18:25:34 -0400196 QList<ApiTraceFrame*> frames;
197 ApiTraceFrame *currentFrame = 0;
198 int frameCount = 0;
199 QVector<ApiTraceCall*> calls;
200 quint64 binaryDataSize = 0;
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400201
Zack Rusinac92a212011-09-06 18:25:34 -0400202 int lastPercentReport = 0;
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400203
José Fonsecab4a3d142011-10-27 07:43:19 +0100204 trace::Call *call = m_parser.parse_call();
Zack Rusinac92a212011-09-06 18:25:34 -0400205 while (call) {
206 //std::cout << *call;
207 if (!currentFrame) {
208 currentFrame = new ApiTraceFrame();
209 currentFrame->number = frameCount;
210 ++frameCount;
211 }
212 ApiTraceCall *apiCall =
213 apiCallFromTraceCall(call, m_helpHash, currentFrame, this);
214 calls.append(apiCall);
215 if (apiCall->hasBinaryData()) {
216 QByteArray data =
217 apiCall->arguments()[apiCall->binaryDataIndex()].toByteArray();
218 binaryDataSize += data.size();
219 }
220 if (ApiTrace::isCallAFrameMarker(apiCall,
221 m_frameMarker)) {
222 calls.squeeze();
223 currentFrame->setCalls(calls, binaryDataSize);
224 calls.clear();
225 frames.append(currentFrame);
226 currentFrame = 0;
227 binaryDataSize = 0;
228 if (frames.count() >= FRAMES_TO_CACHE) {
229 emit framesLoaded(frames);
230 frames.clear();
231 }
232 if (m_parser.percentRead() - lastPercentReport >= 5) {
233 emit parsed(m_parser.percentRead());
234 lastPercentReport = m_parser.percentRead();
235 }
236 }
237 delete call;
238 call = m_parser.parse_call();
239 }
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400240
Zack Rusinac92a212011-09-06 18:25:34 -0400241 //last frames won't have markers
242 // it's just a bunch of Delete calls for every object
243 // after the last SwapBuffers
244 if (currentFrame) {
245 calls.squeeze();
246 currentFrame->setCalls(calls, binaryDataSize);
247 frames.append(currentFrame);
248 currentFrame = 0;
249 }
250 if (frames.count()) {
251 emit framesLoaded(frames);
252 }
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400253}
254
255
Zack Rusinebf971e2011-09-06 17:44:43 -0400256ApiTraceCallSignature * TraceLoader::signature(unsigned id)
257{
258 if (id >= m_signatures.count()) {
259 m_signatures.resize(id + 1);
260 return NULL;
261 } else {
262 return m_signatures[id];
263 }
264}
265
266void TraceLoader::addSignature(unsigned id, ApiTraceCallSignature *signature)
267{
268 m_signatures[id] = signature;
269}
270
271ApiTraceEnumSignature * TraceLoader::enumSignature(unsigned id)
272{
273 if (id >= m_enumSignatures.count()) {
274 m_enumSignatures.resize(id + 1);
275 return NULL;
276 } else {
277 return m_enumSignatures[id];
278 }
279}
280
281void TraceLoader::addEnumSignature(unsigned id, ApiTraceEnumSignature *signature)
282{
283 m_enumSignatures[id] = signature;
284}
285
Zack Rusinad513b32011-09-25 14:33:41 -0400286void TraceLoader::searchNext(const ApiTrace::SearchRequest &request)
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400287{
288 Q_ASSERT(m_parser.supportsOffsets());
289 if (m_parser.supportsOffsets()) {
Zack Rusinad513b32011-09-25 14:33:41 -0400290 int startFrame = m_createdFrames.indexOf(request.frame);
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400291 const FrameBookmark &frameBookmark = m_frameBookmarks[startFrame];
292 m_parser.setBookmark(frameBookmark.start);
José Fonsecab4a3d142011-10-27 07:43:19 +0100293 trace::Call *call = 0;
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400294 while ((call = m_parser.parse_call())) {
295
Zack Rusinad513b32011-09-25 14:33:41 -0400296 if (callContains(call, request.text, request.cs)) {
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400297 unsigned frameIdx = callInFrame(call->no);
298 ApiTraceFrame *frame = m_createdFrames[frameIdx];
299 const QVector<ApiTraceCall*> calls =
300 fetchFrameContents(frame);
301 for (int i = 0; i < calls.count(); ++i) {
302 if (calls[i]->index() == call->no) {
Zack Rusinad513b32011-09-25 14:33:41 -0400303 emit searchResult(request, ApiTrace::SearchResult_Found,
304 calls[i]);
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400305 break;
306 }
307 }
308 delete call;
309 return;
310 }
311
312 delete call;
313 }
314 }
Zack Rusinad513b32011-09-25 14:33:41 -0400315 emit searchResult(request, ApiTrace::SearchResult_NotFound, 0);
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400316}
317
Zack Rusinad513b32011-09-25 14:33:41 -0400318void TraceLoader::searchPrev(const ApiTrace::SearchRequest &request)
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400319{
Zack Rusin121e3162011-09-13 01:35:12 -0400320 Q_ASSERT(m_parser.supportsOffsets());
321 if (m_parser.supportsOffsets()) {
Zack Rusinad513b32011-09-25 14:33:41 -0400322 int startFrame = m_createdFrames.indexOf(request.frame);
José Fonsecab4a3d142011-10-27 07:43:19 +0100323 trace::Call *call = 0;
324 QList<trace::Call*> frameCalls;
Zack Rusin121e3162011-09-13 01:35:12 -0400325 int frameIdx = startFrame;
326
327 const FrameBookmark &frameBookmark = m_frameBookmarks[frameIdx];
328 int numCallsToParse = frameBookmark.numberOfCalls;
329 m_parser.setBookmark(frameBookmark.start);
330
331 while ((call = m_parser.parse_call())) {
332
333 frameCalls.append(call);
334 --numCallsToParse;
335
336 if (numCallsToParse == 0) {
337 bool foundCall = searchCallsBackwards(frameCalls,
338 frameIdx,
Zack Rusinad513b32011-09-25 14:33:41 -0400339 request);
Zack Rusin121e3162011-09-13 01:35:12 -0400340
341 qDeleteAll(frameCalls);
342 frameCalls.clear();
343 if (foundCall) {
344 return;
345 }
346
347 --frameIdx;
348
349 if (frameIdx >= 0) {
350 const FrameBookmark &frameBookmark =
351 m_frameBookmarks[frameIdx];
352 m_parser.setBookmark(frameBookmark.start);
353 numCallsToParse = frameBookmark.numberOfCalls;
354 }
355 }
356 }
357 }
Zack Rusinad513b32011-09-25 14:33:41 -0400358 emit searchResult(request, ApiTrace::SearchResult_NotFound, 0);
Zack Rusin121e3162011-09-13 01:35:12 -0400359}
360
José Fonsecab4a3d142011-10-27 07:43:19 +0100361bool TraceLoader::searchCallsBackwards(const QList<trace::Call*> &calls,
Zack Rusin121e3162011-09-13 01:35:12 -0400362 int frameIdx,
Zack Rusinad513b32011-09-25 14:33:41 -0400363 const ApiTrace::SearchRequest &request)
Zack Rusin121e3162011-09-13 01:35:12 -0400364{
365 for (int i = calls.count() - 1; i >= 0; --i) {
José Fonsecab4a3d142011-10-27 07:43:19 +0100366 trace::Call *call = calls[i];
Zack Rusinad513b32011-09-25 14:33:41 -0400367 if (callContains(call, request.text, request.cs)) {
Zack Rusin121e3162011-09-13 01:35:12 -0400368 ApiTraceFrame *frame = m_createdFrames[frameIdx];
369 const QVector<ApiTraceCall*> apiCalls =
370 fetchFrameContents(frame);
371 for (int i = 0; i < apiCalls.count(); ++i) {
372 if (apiCalls[i]->index() == call->no) {
Zack Rusinad513b32011-09-25 14:33:41 -0400373 emit searchResult(request,
374 ApiTrace::SearchResult_Found,
375 apiCalls[i]);
Zack Rusin121e3162011-09-13 01:35:12 -0400376 break;
377 }
378 }
379 return true;
380 }
381 }
382 return false;
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400383}
384
385int TraceLoader::callInFrame(int callIdx) const
386{
387 unsigned numCalls = 0;
388
389 for (int frameIdx = 0; frameIdx <= m_frameBookmarks.size(); ++frameIdx) {
390 const FrameBookmark &frameBookmark = m_frameBookmarks[frameIdx];
391 unsigned firstCall = numCalls;
392 unsigned endCall = numCalls + frameBookmark.numberOfCalls;
393 if (firstCall <= callIdx && endCall > callIdx) {
394 return frameIdx;
395 }
396 numCalls = endCall;
397 }
398 Q_ASSERT(!"call not in the trace");
399 return 0;
400}
401
José Fonsecab4a3d142011-10-27 07:43:19 +0100402bool TraceLoader::callContains(trace::Call *call,
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400403 const QString &str,
404 Qt::CaseSensitivity sensitivity)
405{
406 /*
José Fonsecab4a3d142011-10-27 07:43:19 +0100407 * FIXME: do string comparison directly on trace::Call
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400408 */
409 ApiTraceCall *apiCall = apiCallFromTraceCall(call, m_helpHash,
410 0, this);
411 bool result = apiCall->contains(str, sensitivity);
412 delete apiCall;
413 return result;
414}
415
416QVector<ApiTraceCall*>
417TraceLoader::fetchFrameContents(ApiTraceFrame *currentFrame)
418{
419 Q_ASSERT(currentFrame);
Zack Rusin99f84fa2011-09-19 23:44:25 -0400420
Zack Rusin447f4a52011-09-19 23:45:39 -0400421 if (currentFrame->isLoaded()) {
Zack Rusin99f84fa2011-09-19 23:44:25 -0400422 return currentFrame->calls();
423 }
424
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400425 if (m_parser.supportsOffsets()) {
426 unsigned frameIdx = currentFrame->number;
427 int numOfCalls = numberOfCallsInFrame(frameIdx);
428
429 if (numOfCalls) {
430 quint64 binaryDataSize = 0;
431 QVector<ApiTraceCall*> calls(numOfCalls);
432 const FrameBookmark &frameBookmark = m_frameBookmarks[frameIdx];
433
434 m_parser.setBookmark(frameBookmark.start);
435
José Fonsecab4a3d142011-10-27 07:43:19 +0100436 trace::Call *call;
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400437 int parsedCalls = 0;
438 while ((call = m_parser.parse_call())) {
439 ApiTraceCall *apiCall =
440 apiCallFromTraceCall(call, m_helpHash,
441 currentFrame, this);
442 calls[parsedCalls] = apiCall;
443 Q_ASSERT(calls[parsedCalls]);
444 if (apiCall->hasBinaryData()) {
445 QByteArray data =
446 apiCall->arguments()[
447 apiCall->binaryDataIndex()].toByteArray();
448 binaryDataSize += data.size();
449 }
450
451 ++parsedCalls;
452
453 delete call;
454
455 if (ApiTrace::isCallAFrameMarker(apiCall, m_frameMarker)) {
456 break;
457 }
458
459 }
460 assert(parsedCalls == numOfCalls);
461 Q_ASSERT(parsedCalls == calls.size());
462 calls.squeeze();
463
464 Q_ASSERT(parsedCalls == currentFrame->numChildrenToLoad());
465 emit frameContentsLoaded(currentFrame,
466 calls, binaryDataSize);
467 return calls;
468 }
469 }
470 return QVector<ApiTraceCall*>();
471}
472
Zack Rusin93e4d152011-09-13 02:23:39 -0400473void TraceLoader::findFrameStart(ApiTraceFrame *frame)
474{
Zack Rusin99f84fa2011-09-19 23:44:25 -0400475 if (!frame->isLoaded()) {
476 loadFrame(frame);
477 }
Zack Rusin93e4d152011-09-13 02:23:39 -0400478 emit foundFrameStart(frame);
479}
480
481void TraceLoader::findFrameEnd(ApiTraceFrame *frame)
482{
Zack Rusin99f84fa2011-09-19 23:44:25 -0400483 if (!frame->isLoaded()) {
484 loadFrame(frame);
485 }
Zack Rusin93e4d152011-09-13 02:23:39 -0400486 emit foundFrameEnd(frame);
487}
488
Zack Rusinda7579b2011-09-13 17:33:05 -0400489void TraceLoader::findCallIndex(int index)
490{
491 int frameIdx = callInFrame(index);
492 ApiTraceFrame *frame = m_createdFrames[frameIdx];
493 QVector<ApiTraceCall*> calls = fetchFrameContents(frame);
494 QVector<ApiTraceCall*>::const_iterator itr;
495 ApiTraceCall *call = 0;
496 for (itr = calls.constBegin(); itr != calls.constEnd(); ++itr) {
497 if ((*itr)->index() == index) {
498 call = *itr;
499 }
500 }
501 Q_ASSERT(call);
502 emit foundCallIndex(call);
503}
504
Zack Rusinad513b32011-09-25 14:33:41 -0400505void TraceLoader::search(const ApiTrace::SearchRequest &request)
506{
507 if (request.direction == ApiTrace::SearchRequest::Next) {
508 searchNext(request);
509 } else {
510 searchPrev(request);
511 }
512}
513
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400514#include "traceloader.moc"