blob: 6110c5972d6416752bc82a1c0472812625907549 [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)
José Fonseca5cd8d992012-03-25 23:12:20 +010023 : QObject(parent)
Zack Rusin20b1f6d2011-09-06 11:50:07 -040024{
25}
26
27TraceLoader::~TraceLoader()
28{
29 m_parser.close();
Zack Rusin081e59d2011-09-21 00:25:03 -040030 qDeleteAll(m_signatures);
31 qDeleteAll(m_enumSignatures);
Zack Rusin20b1f6d2011-09-06 11:50:07 -040032}
33
34void TraceLoader::loadTrace(const QString &filename)
35{
36 if (m_helpHash.isEmpty()) {
37 loadHelpFile();
38 }
39
Zack Rusindaf82af2011-09-24 13:42:53 -040040 if (!m_frameBookmarks.isEmpty()) {
41 qDeleteAll(m_signatures);
42 qDeleteAll(m_enumSignatures);
43 m_signatures.clear();
44 m_enumSignatures.clear();
45 m_frameBookmarks.clear();
46 m_createdFrames.clear();
47 m_parser.close();
48 }
49
Zack Rusin20b1f6d2011-09-06 11:50:07 -040050 if (!m_parser.open(filename.toLatin1())) {
51 qDebug() << "error: failed to open " << filename;
52 return;
53 }
Zack Rusin59b79552011-09-21 00:37:03 -040054
Zack Rusin20b1f6d2011-09-06 11:50:07 -040055 emit startedParsing();
56
57 if (m_parser.supportsOffsets()) {
Zack Rusinac92a212011-09-06 18:25:34 -040058 scanTrace();
Zack Rusin20b1f6d2011-09-06 11:50:07 -040059 } else {
Zack Rusinac92a212011-09-06 18:25:34 -040060 //Load the entire file into memory
61 parseTrace();
Zack Rusin20b1f6d2011-09-06 11:50:07 -040062 }
José Fonseca67964382012-03-27 23:54:30 +010063 emit guessedApi(static_cast<int>(m_parser.api));
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
Zack Rusin20b1f6d2011-09-06 11:50:07 -040072int TraceLoader::numberOfFrames() const
73{
José Fonseca61e61f72011-09-11 16:53:34 +010074 return m_frameBookmarks.size();
Zack Rusin20b1f6d2011-09-06 11:50:07 -040075}
76
77int TraceLoader::numberOfCallsInFrame(int frameIdx) const
78{
José Fonseca6bfa32f2012-03-22 16:26:47 +000079 if (frameIdx >= m_frameBookmarks.size()) {
Zack Rusin20b1f6d2011-09-06 11:50:07 -040080 return 0;
81 }
José Fonseca61e61f72011-09-11 16:53:34 +010082 FrameBookmarks::const_iterator itr =
83 m_frameBookmarks.find(frameIdx);
Zack Rusin20b1f6d2011-09-06 11:50:07 -040084 return itr->numberOfCalls;
85}
86
87void TraceLoader::loadHelpFile()
88{
Zack Rusinac92a212011-09-06 18:25:34 -040089 QFile file(":/resources/glreference.tsv");
90 if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
91 QString line;
92 while (!file.atEnd()) {
93 line = file.readLine();
94 QString function = line.section('\t', 0, 0).trimmed();
95 QUrl url = QUrl(line.section('\t', 1, 1).trimmed());
96 //qDebug()<<"function = "<<function<<", url = "<<url.toString();
97 m_helpHash.insert(function, url);
98 }
99 } else {
100 qWarning() << "Couldn't open reference file "
101 << file.fileName();
102 }
103 file.close();
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400104}
105
106void TraceLoader::scanTrace()
107{
Zack Rusinac92a212011-09-06 18:25:34 -0400108 QList<ApiTraceFrame*> frames;
109 ApiTraceFrame *currentFrame = 0;
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400110
José Fonsecab4a3d142011-10-27 07:43:19 +0100111 trace::Call *call;
112 trace::ParseBookmark startBookmark;
Zack Rusinac92a212011-09-06 18:25:34 -0400113 int numOfFrames = 0;
114 int numOfCalls = 0;
Zack Rusinac92a212011-09-06 18:25:34 -0400115 int lastPercentReport = 0;
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400116
José Fonseca61e61f72011-09-11 16:53:34 +0100117 m_parser.getBookmark(startBookmark);
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400118
Zack Rusinac92a212011-09-06 18:25:34 -0400119 while ((call = m_parser.scan_call())) {
120 ++numOfCalls;
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400121
José Fonseca5cd8d992012-03-25 23:12:20 +0100122 if (call->flags & trace::CALL_FLAG_END_FRAME) {
José Fonseca61e61f72011-09-11 16:53:34 +0100123 FrameBookmark frameBookmark(startBookmark);
124 frameBookmark.numberOfCalls = numOfCalls;
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400125
Zack Rusinac92a212011-09-06 18:25:34 -0400126 currentFrame = new ApiTraceFrame();
127 currentFrame->number = numOfFrames;
128 currentFrame->setNumChildren(numOfCalls);
Zack Rusin851d0b02011-09-14 22:04:07 -0400129 currentFrame->setLastCallIndex(call->no);
Zack Rusinac92a212011-09-06 18:25:34 -0400130 frames.append(currentFrame);
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400131
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400132 m_createdFrames.append(currentFrame);
José Fonseca61e61f72011-09-11 16:53:34 +0100133 m_frameBookmarks[numOfFrames] = frameBookmark;
Zack Rusinac92a212011-09-06 18:25:34 -0400134 ++numOfFrames;
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400135
Zack Rusinac92a212011-09-06 18:25:34 -0400136 if (m_parser.percentRead() - lastPercentReport >= 5) {
137 emit parsed(m_parser.percentRead());
138 lastPercentReport = m_parser.percentRead();
139 }
José Fonseca61e61f72011-09-11 16:53:34 +0100140 m_parser.getBookmark(startBookmark);
Zack Rusinac92a212011-09-06 18:25:34 -0400141 numOfCalls = 0;
142 }
Zack Rusinac92a212011-09-06 18:25:34 -0400143 delete call;
144 }
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400145
Zack Rusinac92a212011-09-06 18:25:34 -0400146 if (numOfCalls) {
José Fonsecab4a3d142011-10-27 07:43:19 +0100147 //trace::File::Bookmark endBookmark = m_parser.currentBookmark();
José Fonseca61e61f72011-09-11 16:53:34 +0100148 FrameBookmark frameBookmark(startBookmark);
149 frameBookmark.numberOfCalls = numOfCalls;
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400150
Zack Rusinac92a212011-09-06 18:25:34 -0400151 currentFrame = new ApiTraceFrame();
152 currentFrame->number = numOfFrames;
153 currentFrame->setNumChildren(numOfCalls);
154 frames.append(currentFrame);
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400155
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400156 m_createdFrames.append(currentFrame);
José Fonseca61e61f72011-09-11 16:53:34 +0100157 m_frameBookmarks[numOfFrames] = frameBookmark;
Zack Rusinac92a212011-09-06 18:25:34 -0400158 ++numOfFrames;
159 }
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400160
Zack Rusinac92a212011-09-06 18:25:34 -0400161 emit parsed(100);
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400162
Zack Rusinac92a212011-09-06 18:25:34 -0400163 emit framesLoaded(frames);
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400164}
165
166void TraceLoader::parseTrace()
167{
Zack Rusinac92a212011-09-06 18:25:34 -0400168 QList<ApiTraceFrame*> frames;
169 ApiTraceFrame *currentFrame = 0;
170 int frameCount = 0;
171 QVector<ApiTraceCall*> calls;
172 quint64 binaryDataSize = 0;
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400173
Zack Rusinac92a212011-09-06 18:25:34 -0400174 int lastPercentReport = 0;
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400175
José Fonsecab4a3d142011-10-27 07:43:19 +0100176 trace::Call *call = m_parser.parse_call();
Zack Rusinac92a212011-09-06 18:25:34 -0400177 while (call) {
178 //std::cout << *call;
179 if (!currentFrame) {
180 currentFrame = new ApiTraceFrame();
181 currentFrame->number = frameCount;
182 ++frameCount;
183 }
184 ApiTraceCall *apiCall =
185 apiCallFromTraceCall(call, m_helpHash, currentFrame, this);
186 calls.append(apiCall);
187 if (apiCall->hasBinaryData()) {
188 QByteArray data =
189 apiCall->arguments()[apiCall->binaryDataIndex()].toByteArray();
190 binaryDataSize += data.size();
191 }
José Fonseca5cd8d992012-03-25 23:12:20 +0100192 if (call->flags & trace::CALL_FLAG_END_FRAME) {
Zack Rusinac92a212011-09-06 18:25:34 -0400193 calls.squeeze();
194 currentFrame->setCalls(calls, binaryDataSize);
195 calls.clear();
196 frames.append(currentFrame);
197 currentFrame = 0;
198 binaryDataSize = 0;
199 if (frames.count() >= FRAMES_TO_CACHE) {
200 emit framesLoaded(frames);
201 frames.clear();
202 }
203 if (m_parser.percentRead() - lastPercentReport >= 5) {
204 emit parsed(m_parser.percentRead());
205 lastPercentReport = m_parser.percentRead();
206 }
207 }
208 delete call;
209 call = m_parser.parse_call();
210 }
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400211
Zack Rusinac92a212011-09-06 18:25:34 -0400212 //last frames won't have markers
213 // it's just a bunch of Delete calls for every object
214 // after the last SwapBuffers
215 if (currentFrame) {
216 calls.squeeze();
217 currentFrame->setCalls(calls, binaryDataSize);
218 frames.append(currentFrame);
219 currentFrame = 0;
220 }
221 if (frames.count()) {
222 emit framesLoaded(frames);
223 }
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400224}
225
226
Zack Rusinebf971e2011-09-06 17:44:43 -0400227ApiTraceCallSignature * TraceLoader::signature(unsigned id)
228{
229 if (id >= m_signatures.count()) {
230 m_signatures.resize(id + 1);
231 return NULL;
232 } else {
233 return m_signatures[id];
234 }
235}
236
237void TraceLoader::addSignature(unsigned id, ApiTraceCallSignature *signature)
238{
239 m_signatures[id] = signature;
240}
241
242ApiTraceEnumSignature * TraceLoader::enumSignature(unsigned id)
243{
244 if (id >= m_enumSignatures.count()) {
245 m_enumSignatures.resize(id + 1);
246 return NULL;
247 } else {
248 return m_enumSignatures[id];
249 }
250}
251
252void TraceLoader::addEnumSignature(unsigned id, ApiTraceEnumSignature *signature)
253{
254 m_enumSignatures[id] = signature;
255}
256
Zack Rusinad513b32011-09-25 14:33:41 -0400257void TraceLoader::searchNext(const ApiTrace::SearchRequest &request)
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400258{
259 Q_ASSERT(m_parser.supportsOffsets());
260 if (m_parser.supportsOffsets()) {
Zack Rusinad513b32011-09-25 14:33:41 -0400261 int startFrame = m_createdFrames.indexOf(request.frame);
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400262 const FrameBookmark &frameBookmark = m_frameBookmarks[startFrame];
263 m_parser.setBookmark(frameBookmark.start);
José Fonsecab4a3d142011-10-27 07:43:19 +0100264 trace::Call *call = 0;
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400265 while ((call = m_parser.parse_call())) {
266
Zack Rusinad513b32011-09-25 14:33:41 -0400267 if (callContains(call, request.text, request.cs)) {
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400268 unsigned frameIdx = callInFrame(call->no);
269 ApiTraceFrame *frame = m_createdFrames[frameIdx];
270 const QVector<ApiTraceCall*> calls =
271 fetchFrameContents(frame);
272 for (int i = 0; i < calls.count(); ++i) {
273 if (calls[i]->index() == call->no) {
Zack Rusinad513b32011-09-25 14:33:41 -0400274 emit searchResult(request, ApiTrace::SearchResult_Found,
275 calls[i]);
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400276 break;
277 }
278 }
279 delete call;
280 return;
281 }
282
283 delete call;
284 }
285 }
Zack Rusinad513b32011-09-25 14:33:41 -0400286 emit searchResult(request, ApiTrace::SearchResult_NotFound, 0);
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400287}
288
Zack Rusinad513b32011-09-25 14:33:41 -0400289void TraceLoader::searchPrev(const ApiTrace::SearchRequest &request)
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400290{
Zack Rusin121e3162011-09-13 01:35:12 -0400291 Q_ASSERT(m_parser.supportsOffsets());
292 if (m_parser.supportsOffsets()) {
Zack Rusinad513b32011-09-25 14:33:41 -0400293 int startFrame = m_createdFrames.indexOf(request.frame);
José Fonsecab4a3d142011-10-27 07:43:19 +0100294 trace::Call *call = 0;
295 QList<trace::Call*> frameCalls;
Zack Rusin121e3162011-09-13 01:35:12 -0400296 int frameIdx = startFrame;
297
298 const FrameBookmark &frameBookmark = m_frameBookmarks[frameIdx];
299 int numCallsToParse = frameBookmark.numberOfCalls;
300 m_parser.setBookmark(frameBookmark.start);
301
302 while ((call = m_parser.parse_call())) {
303
304 frameCalls.append(call);
305 --numCallsToParse;
306
307 if (numCallsToParse == 0) {
308 bool foundCall = searchCallsBackwards(frameCalls,
309 frameIdx,
Zack Rusinad513b32011-09-25 14:33:41 -0400310 request);
Zack Rusin121e3162011-09-13 01:35:12 -0400311
312 qDeleteAll(frameCalls);
313 frameCalls.clear();
314 if (foundCall) {
315 return;
316 }
317
318 --frameIdx;
319
320 if (frameIdx >= 0) {
321 const FrameBookmark &frameBookmark =
322 m_frameBookmarks[frameIdx];
323 m_parser.setBookmark(frameBookmark.start);
324 numCallsToParse = frameBookmark.numberOfCalls;
325 }
326 }
327 }
328 }
Zack Rusinad513b32011-09-25 14:33:41 -0400329 emit searchResult(request, ApiTrace::SearchResult_NotFound, 0);
Zack Rusin121e3162011-09-13 01:35:12 -0400330}
331
José Fonsecab4a3d142011-10-27 07:43:19 +0100332bool TraceLoader::searchCallsBackwards(const QList<trace::Call*> &calls,
Zack Rusin121e3162011-09-13 01:35:12 -0400333 int frameIdx,
Zack Rusinad513b32011-09-25 14:33:41 -0400334 const ApiTrace::SearchRequest &request)
Zack Rusin121e3162011-09-13 01:35:12 -0400335{
336 for (int i = calls.count() - 1; i >= 0; --i) {
José Fonsecab4a3d142011-10-27 07:43:19 +0100337 trace::Call *call = calls[i];
Zack Rusinad513b32011-09-25 14:33:41 -0400338 if (callContains(call, request.text, request.cs)) {
Zack Rusin121e3162011-09-13 01:35:12 -0400339 ApiTraceFrame *frame = m_createdFrames[frameIdx];
340 const QVector<ApiTraceCall*> apiCalls =
341 fetchFrameContents(frame);
342 for (int i = 0; i < apiCalls.count(); ++i) {
343 if (apiCalls[i]->index() == call->no) {
Zack Rusinad513b32011-09-25 14:33:41 -0400344 emit searchResult(request,
345 ApiTrace::SearchResult_Found,
346 apiCalls[i]);
Zack Rusin121e3162011-09-13 01:35:12 -0400347 break;
348 }
349 }
350 return true;
351 }
352 }
353 return false;
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400354}
355
356int TraceLoader::callInFrame(int callIdx) const
357{
358 unsigned numCalls = 0;
359
José Fonseca6bfa32f2012-03-22 16:26:47 +0000360 for (int frameIdx = 0; frameIdx < m_frameBookmarks.size(); ++frameIdx) {
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400361 const FrameBookmark &frameBookmark = m_frameBookmarks[frameIdx];
362 unsigned firstCall = numCalls;
363 unsigned endCall = numCalls + frameBookmark.numberOfCalls;
364 if (firstCall <= callIdx && endCall > callIdx) {
365 return frameIdx;
366 }
367 numCalls = endCall;
368 }
369 Q_ASSERT(!"call not in the trace");
370 return 0;
371}
372
José Fonsecab4a3d142011-10-27 07:43:19 +0100373bool TraceLoader::callContains(trace::Call *call,
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400374 const QString &str,
375 Qt::CaseSensitivity sensitivity)
376{
377 /*
José Fonsecab4a3d142011-10-27 07:43:19 +0100378 * FIXME: do string comparison directly on trace::Call
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400379 */
380 ApiTraceCall *apiCall = apiCallFromTraceCall(call, m_helpHash,
381 0, this);
382 bool result = apiCall->contains(str, sensitivity);
383 delete apiCall;
384 return result;
385}
386
387QVector<ApiTraceCall*>
388TraceLoader::fetchFrameContents(ApiTraceFrame *currentFrame)
389{
390 Q_ASSERT(currentFrame);
Zack Rusin99f84fa2011-09-19 23:44:25 -0400391
Zack Rusin447f4a52011-09-19 23:45:39 -0400392 if (currentFrame->isLoaded()) {
Zack Rusin99f84fa2011-09-19 23:44:25 -0400393 return currentFrame->calls();
394 }
395
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400396 if (m_parser.supportsOffsets()) {
397 unsigned frameIdx = currentFrame->number;
398 int numOfCalls = numberOfCallsInFrame(frameIdx);
399
400 if (numOfCalls) {
401 quint64 binaryDataSize = 0;
402 QVector<ApiTraceCall*> calls(numOfCalls);
403 const FrameBookmark &frameBookmark = m_frameBookmarks[frameIdx];
404
405 m_parser.setBookmark(frameBookmark.start);
406
José Fonsecab4a3d142011-10-27 07:43:19 +0100407 trace::Call *call;
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400408 int parsedCalls = 0;
409 while ((call = m_parser.parse_call())) {
410 ApiTraceCall *apiCall =
411 apiCallFromTraceCall(call, m_helpHash,
412 currentFrame, this);
José Fonsecacaa84282013-04-11 18:54:06 +0100413 Q_ASSERT(apiCall);
414 Q_ASSERT(parsedCalls < calls.size());
415 calls[parsedCalls++] = apiCall;
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400416 if (apiCall->hasBinaryData()) {
417 QByteArray data =
418 apiCall->arguments()[
419 apiCall->binaryDataIndex()].toByteArray();
420 binaryDataSize += data.size();
421 }
422
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400423 delete call;
424
José Fonseca5cd8d992012-03-25 23:12:20 +0100425 if (apiCall->flags() & trace::CALL_FLAG_END_FRAME) {
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400426 break;
427 }
428
429 }
José Fonsecacaa84282013-04-11 18:54:06 +0100430 // There can be fewer parsed calls when call in different
431 // threads cross the frame boundary
432 Q_ASSERT(parsedCalls <= numOfCalls);
433 Q_ASSERT(parsedCalls <= calls.size());
434 calls.resize(parsedCalls);
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400435 calls.squeeze();
436
José Fonsecacaa84282013-04-11 18:54:06 +0100437 Q_ASSERT(parsedCalls <= currentFrame->numChildrenToLoad());
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400438 emit frameContentsLoaded(currentFrame,
439 calls, binaryDataSize);
440 return calls;
441 }
442 }
443 return QVector<ApiTraceCall*>();
444}
445
Zack Rusin93e4d152011-09-13 02:23:39 -0400446void TraceLoader::findFrameStart(ApiTraceFrame *frame)
447{
Zack Rusin99f84fa2011-09-19 23:44:25 -0400448 if (!frame->isLoaded()) {
449 loadFrame(frame);
450 }
Zack Rusin93e4d152011-09-13 02:23:39 -0400451 emit foundFrameStart(frame);
452}
453
454void TraceLoader::findFrameEnd(ApiTraceFrame *frame)
455{
Zack Rusin99f84fa2011-09-19 23:44:25 -0400456 if (!frame->isLoaded()) {
457 loadFrame(frame);
458 }
Zack Rusin93e4d152011-09-13 02:23:39 -0400459 emit foundFrameEnd(frame);
460}
461
Zack Rusinda7579b2011-09-13 17:33:05 -0400462void TraceLoader::findCallIndex(int index)
463{
464 int frameIdx = callInFrame(index);
465 ApiTraceFrame *frame = m_createdFrames[frameIdx];
466 QVector<ApiTraceCall*> calls = fetchFrameContents(frame);
467 QVector<ApiTraceCall*>::const_iterator itr;
468 ApiTraceCall *call = 0;
469 for (itr = calls.constBegin(); itr != calls.constEnd(); ++itr) {
470 if ((*itr)->index() == index) {
471 call = *itr;
472 }
473 }
José Fonsecacaa84282013-04-11 18:54:06 +0100474 if (call) {
475 emit foundCallIndex(call);
476 }
Zack Rusinda7579b2011-09-13 17:33:05 -0400477}
478
Zack Rusinad513b32011-09-25 14:33:41 -0400479void TraceLoader::search(const ApiTrace::SearchRequest &request)
480{
481 if (request.direction == ApiTrace::SearchRequest::Next) {
482 searchNext(request);
483 } else {
484 searchPrev(request);
485 }
486}
487
Zack Rusin20b1f6d2011-09-06 11:50:07 -0400488#include "traceloader.moc"