blob: edf98b9eb85e33985c1fb9be53151e67db2f6d51 [file] [log] [blame]
Zack Rusinf6667d12011-03-30 11:03:37 -04001#include "apitrace.h"
2
Zack Rusinebf971e2011-09-06 17:44:43 -04003#include "traceloader.h"
Zack Rusind809a062011-04-17 23:30:58 -04004#include "saverthread.h"
Zack Rusinf6667d12011-03-30 11:03:37 -04005
Zack Rusin3176ebe2011-09-06 21:11:36 -04006#include <QDebug>
Zack Rusin63efea82011-04-17 17:10:45 -04007#include <QDir>
Zack Rusinebf971e2011-09-06 17:44:43 -04008#include <QThread>
Zack Rusin63efea82011-04-17 17:10:45 -04009
Zack Rusinf6667d12011-03-30 11:03:37 -040010ApiTrace::ApiTrace()
Zack Rusin63efea82011-04-17 17:10:45 -040011 : m_frameMarker(ApiTrace::FrameMarker_SwapBuffers),
12 m_needsSaving(false)
Zack Rusinf6667d12011-03-30 11:03:37 -040013{
Zack Rusinebf971e2011-09-06 17:44:43 -040014 m_loader = new TraceLoader();
Zack Rusinf682e192011-09-07 01:36:41 -040015
Zack Rusinebf971e2011-09-06 17:44:43 -040016 connect(this, SIGNAL(loadTrace(QString)),
17 m_loader, SLOT(loadTrace(QString)));
Zack Rusin3176ebe2011-09-06 21:11:36 -040018 connect(this, SIGNAL(requestFrame(ApiTraceFrame*)),
19 m_loader, SLOT(loadFrame(ApiTraceFrame*)));
Zack Rusinebf971e2011-09-06 17:44:43 -040020 connect(m_loader, SIGNAL(framesLoaded(const QList<ApiTraceFrame*>)),
Zack Rusinf6667d12011-03-30 11:03:37 -040021 this, SLOT(addFrames(const QList<ApiTraceFrame*>)));
Zack Rusin8f98c3a2011-09-11 18:21:29 -040022 connect(m_loader,
23 SIGNAL(frameContentsLoaded(ApiTraceFrame*,QVector<ApiTraceCall*>,quint64)),
24 this,
25 SLOT(loaderFrameLoaded(ApiTraceFrame*,QVector<ApiTraceCall*>,quint64)));
Zack Rusinf682e192011-09-07 01:36:41 -040026 connect(m_loader, SIGNAL(finishedParsing()),
27 this, SLOT(finishedParsing()));
Zack Rusin8f98c3a2011-09-11 18:21:29 -040028 connect(this, SIGNAL(loaderSearchNext(int,QString,Qt::CaseSensitivity)),
29 m_loader, SLOT(searchNext(int,QString,Qt::CaseSensitivity)));
30 connect(this, SIGNAL(loaderSearchPrev(int,QString,Qt::CaseSensitivity)),
31 m_loader, SLOT(searchPrev(int,QString,Qt::CaseSensitivity)));
32 connect(m_loader,
33 SIGNAL(searchResult(ApiTrace::SearchResult,ApiTraceCall*)),
34 this,
35 SLOT(loaderSearchResult(ApiTrace::SearchResult,ApiTraceCall*)));
Zack Rusin93e4d152011-09-13 02:23:39 -040036 connect(this, SIGNAL(loaderFindFrameStart(ApiTraceFrame*)),
37 m_loader, SLOT(findFrameStart(ApiTraceFrame*)));
38 connect(this, SIGNAL(loaderFindFrameEnd(ApiTraceFrame*)),
39 m_loader, SLOT(findFrameEnd(ApiTraceFrame*)));
40 connect(m_loader, SIGNAL(foundFrameStart(ApiTraceFrame*)),
41 this, SIGNAL(foundFrameStart(ApiTraceFrame*)));
42 connect(m_loader, SIGNAL(foundFrameEnd(ApiTraceFrame*)),
43 this, SIGNAL(foundFrameEnd(ApiTraceFrame*)));
Zack Rusinda7579b2011-09-13 17:33:05 -040044 connect(this, SIGNAL(loaderFindCallIndex(int)),
45 m_loader, SLOT(findCallIndex(int)));
46 connect(m_loader, SIGNAL(foundCallIndex(ApiTraceCall*)),
47 this, SIGNAL(foundCallIndex(ApiTraceCall*)));
Zack Rusin8f98c3a2011-09-11 18:21:29 -040048
Zack Rusinebf971e2011-09-06 17:44:43 -040049
50 connect(m_loader, SIGNAL(startedParsing()),
Zack Rusinde4ea412011-03-30 11:30:08 -040051 this, SIGNAL(startedLoadingTrace()));
Zack Rusinebf971e2011-09-06 17:44:43 -040052 connect(m_loader, SIGNAL(parsed(int)),
53 this, SIGNAL(loaded(int)));
54 connect(m_loader, SIGNAL(finishedParsing()),
Zack Rusinde4ea412011-03-30 11:30:08 -040055 this, SIGNAL(finishedLoadingTrace()));
Zack Rusind809a062011-04-17 23:30:58 -040056
Zack Rusinebf971e2011-09-06 17:44:43 -040057
Zack Rusind809a062011-04-17 23:30:58 -040058 m_saver = new SaverThread(this);
Zack Rusin9af5bff2011-04-18 01:05:50 -040059 connect(m_saver, SIGNAL(traceSaved()),
60 this, SLOT(slotSaved()));
61 connect(m_saver, SIGNAL(traceSaved()),
62 this, SIGNAL(saved()));
Zack Rusinebf971e2011-09-06 17:44:43 -040063
64 m_loaderThread = new QThread();
65 m_loader->moveToThread(m_loaderThread);
66 m_loaderThread->start();
Zack Rusinf6667d12011-03-30 11:03:37 -040067}
68
69ApiTrace::~ApiTrace()
70{
Zack Rusinebf971e2011-09-06 17:44:43 -040071 m_loaderThread->quit();
72 m_loaderThread->deleteLater();
Zack Rusinf6667d12011-03-30 11:03:37 -040073 qDeleteAll(m_frames);
74 delete m_loader;
Zack Rusind809a062011-04-17 23:30:58 -040075 delete m_saver;
Zack Rusinf6667d12011-03-30 11:03:37 -040076}
77
78bool ApiTrace::isCallAFrameMarker(const ApiTraceCall *call,
79 ApiTrace::FrameMarker marker)
80{
Zack Rusinc5929572011-09-19 03:04:40 -040081 if (!call) {
Zack Rusinf6667d12011-03-30 11:03:37 -040082 return false;
Zack Rusinc5929572011-09-19 03:04:40 -040083 }
Zack Rusinf6667d12011-03-30 11:03:37 -040084
85 switch (marker) {
86 case FrameMarker_SwapBuffers:
José Fonseca3e9ff852011-06-06 19:37:09 +010087 return call->name().contains(QLatin1String("SwapBuffers")) ||
José Fonsecadb678122011-07-29 17:20:05 +010088 call->name() == QLatin1String("CGLFlushDrawable") ||
89 call->name() == QLatin1String("glFrameTerminatorGREMEDY");
Zack Rusinf6667d12011-03-30 11:03:37 -040090 case FrameMarker_Flush:
Zack Rusinead6aad2011-04-15 22:16:18 -040091 return call->name() == QLatin1String("glFlush");
Zack Rusinf6667d12011-03-30 11:03:37 -040092 case FrameMarker_Finish:
Zack Rusinead6aad2011-04-15 22:16:18 -040093 return call->name() == QLatin1String("glFinish");
Zack Rusinf6667d12011-03-30 11:03:37 -040094 case FrameMarker_Clear:
Zack Rusinead6aad2011-04-15 22:16:18 -040095 return call->name() == QLatin1String("glClear");
Zack Rusinf6667d12011-03-30 11:03:37 -040096 }
97
98 Q_ASSERT(!"unknown frame marker");
99
100 return false;
101}
102
103bool ApiTrace::isEmpty() const
104{
Zack Rusinc1743432011-09-13 17:58:58 -0400105 return m_frames.isEmpty();
Zack Rusinf6667d12011-03-30 11:03:37 -0400106}
107
108QString ApiTrace::fileName() const
109{
Zack Rusinc5929572011-09-19 03:04:40 -0400110 if (edited()) {
Zack Rusin63efea82011-04-17 17:10:45 -0400111 return m_tempFileName;
Zack Rusinc5929572011-09-19 03:04:40 -0400112 }
Zack Rusin63efea82011-04-17 17:10:45 -0400113
Zack Rusinf6667d12011-03-30 11:03:37 -0400114 return m_fileName;
115}
116
117ApiTrace::FrameMarker ApiTrace::frameMarker() const
118{
119 return m_frameMarker;
120}
121
Zack Rusinf6667d12011-03-30 11:03:37 -0400122QList<ApiTraceFrame*> ApiTrace::frames() const
123{
124 return m_frames;
125}
126
127ApiTraceFrame * ApiTrace::frameAt(int idx) const
128{
129 return m_frames.value(idx);
130}
131
132int ApiTrace::numFrames() const
133{
134 return m_frames.count();
135}
136
137int ApiTrace::numCallsInFrame(int idx) const
138{
139 const ApiTraceFrame *frame = frameAt(idx);
Zack Rusinc5929572011-09-19 03:04:40 -0400140 if (frame) {
Zack Rusin1d31b6c2011-04-26 22:30:25 -0400141 return frame->numChildren();
Zack Rusinc5929572011-09-19 03:04:40 -0400142 } else {
Zack Rusinf6667d12011-03-30 11:03:37 -0400143 return 0;
Zack Rusinc5929572011-09-19 03:04:40 -0400144 }
Zack Rusinf6667d12011-03-30 11:03:37 -0400145}
146
147void ApiTrace::setFileName(const QString &name)
148{
149 if (m_fileName != name) {
150 m_fileName = name;
Zack Rusindaf82af2011-09-24 13:42:53 -0400151 m_tempFileName = QString();
Zack Rusinf6667d12011-03-30 11:03:37 -0400152
Zack Rusinca164112011-04-11 02:23:09 -0400153 m_frames.clear();
Zack Rusin30069572011-04-20 18:21:11 -0400154 m_errors.clear();
155 m_editedCalls.clear();
Zack Rusindaf82af2011-09-24 13:42:53 -0400156 m_queuedErrors.clear();
Zack Rusin30069572011-04-20 18:21:11 -0400157 m_needsSaving = false;
Zack Rusinf6667d12011-03-30 11:03:37 -0400158 emit invalidated();
159
Zack Rusinebf971e2011-09-06 17:44:43 -0400160 emit loadTrace(m_fileName);
Zack Rusinf6667d12011-03-30 11:03:37 -0400161 }
162}
163
Zack Rusinf6667d12011-03-30 11:03:37 -0400164void ApiTrace::addFrames(const QList<ApiTraceFrame*> &frames)
165{
166 int currentFrames = m_frames.count();
167 int numNewFrames = frames.count();
Zack Rusinb56e03d2011-04-20 23:58:52 -0400168
169 emit beginAddingFrames(currentFrames, numNewFrames);
170
Zack Rusinf6667d12011-03-30 11:03:37 -0400171 m_frames += frames;
172
Zack Rusinf6667d12011-03-30 11:03:37 -0400173 foreach(ApiTraceFrame *frame, frames) {
Zack Rusinebf971e2011-09-06 17:44:43 -0400174 frame->setParentTrace(this);
Zack Rusinf6667d12011-03-30 11:03:37 -0400175 }
176
Zack Rusinb56e03d2011-04-20 23:58:52 -0400177 emit endAddingFrames();
Zack Rusinf6667d12011-03-30 11:03:37 -0400178}
179
Zack Rusinf04cf8a2011-04-12 23:21:52 -0400180ApiTraceCall * ApiTrace::callWithIndex(int idx) const
181{
Zack Rusinc1743432011-09-13 17:58:58 -0400182 for (int i = 0; i < m_frames.count(); ++i) {
183 ApiTraceCall *call = m_frames[i]->callWithIndex(idx);
Zack Rusinc5929572011-09-19 03:04:40 -0400184 if (call) {
Zack Rusinf04cf8a2011-04-12 23:21:52 -0400185 return call;
Zack Rusinc5929572011-09-19 03:04:40 -0400186 }
Zack Rusinf04cf8a2011-04-12 23:21:52 -0400187 }
188 return NULL;
189}
190
Zack Rusine2dfa2e2011-04-13 01:35:03 -0400191ApiTraceState ApiTrace::defaultState() const
192{
193 ApiTraceFrame *frame = frameAt(0);
Zack Rusinc5929572011-09-19 03:04:40 -0400194 if (!frame || !frame->isLoaded() || frame->isEmpty()) {
Zack Rusine2dfa2e2011-04-13 01:35:03 -0400195 return ApiTraceState();
Zack Rusinc5929572011-09-19 03:04:40 -0400196 }
Zack Rusine2dfa2e2011-04-13 01:35:03 -0400197
Zack Rusin851d0b02011-09-14 22:04:07 -0400198 ApiTraceCall *firstCall = frame->calls().first();
199 if (!firstCall->hasState()) {
200 return ApiTraceState();
201 }
202
203 return *firstCall->state();
Zack Rusine2dfa2e2011-04-13 01:35:03 -0400204}
205
Zack Rusin661842d2011-04-17 01:59:16 -0400206void ApiTrace::callEdited(ApiTraceCall *call)
207{
Zack Rusin63efea82011-04-17 17:10:45 -0400208 if (!m_editedCalls.contains(call)) {
209 //lets generate a temp filename
210 QString tempPath = QDir::tempPath();
Zack Rusin63efea82011-04-17 17:10:45 -0400211 m_tempFileName = QString::fromLatin1("%1/%2.edited")
212 .arg(tempPath)
213 .arg(m_fileName);
Zack Rusin63efea82011-04-17 17:10:45 -0400214 }
Zack Rusin661842d2011-04-17 01:59:16 -0400215 m_editedCalls.insert(call);
Zack Rusin9af5bff2011-04-18 01:05:50 -0400216 m_needsSaving = true;
Zack Rusin63efea82011-04-17 17:10:45 -0400217
Zack Rusin661842d2011-04-17 01:59:16 -0400218 emit changed(call);
219}
220
221void ApiTrace::callReverted(ApiTraceCall *call)
222{
223 m_editedCalls.remove(call);
Zack Rusin63efea82011-04-17 17:10:45 -0400224
225 if (m_editedCalls.isEmpty()) {
226 m_needsSaving = false;
227 }
Zack Rusin661842d2011-04-17 01:59:16 -0400228 emit changed(call);
229}
230
Zack Rusin0ddd2502011-04-17 02:34:45 -0400231bool ApiTrace::edited() const
Zack Rusin661842d2011-04-17 01:59:16 -0400232{
233 return !m_editedCalls.isEmpty();
234}
235
Zack Rusin63efea82011-04-17 17:10:45 -0400236bool ApiTrace::needsSaving() const
237{
238 return m_needsSaving;
239}
240
241void ApiTrace::save()
242{
243 QFileInfo fi(m_tempFileName);
244 QDir dir;
Zack Rusin9af5bff2011-04-18 01:05:50 -0400245 emit startedSaving();
Zack Rusin63efea82011-04-17 17:10:45 -0400246 dir.mkpath(fi.absolutePath());
Zack Rusin9b31ffc2011-09-13 23:58:45 -0400247 m_saver->saveFile(m_tempFileName,
248 m_fileName,
249 m_editedCalls);
Zack Rusin63efea82011-04-17 17:10:45 -0400250}
251
Zack Rusin9af5bff2011-04-18 01:05:50 -0400252void ApiTrace::slotSaved()
253{
254 m_needsSaving = false;
255}
256
257bool ApiTrace::isSaving() const
258{
259 return m_saver->isRunning();
260}
261
Zack Rusincc0b4912011-04-19 01:59:20 -0400262bool ApiTrace::hasErrors() const
263{
264 return !m_errors.isEmpty();
265}
266
Zack Rusin3176ebe2011-09-06 21:11:36 -0400267void ApiTrace::loadFrame(ApiTraceFrame *frame)
Zack Rusinac4dd9a2011-08-28 00:38:13 -0400268{
Zack Rusin1a9f7af2011-09-18 19:40:47 -0400269 Q_ASSERT(!frame->isLoaded());
Zack Rusin3176ebe2011-09-06 21:11:36 -0400270 emit requestFrame(frame);
Zack Rusin35c27932011-08-28 21:16:22 -0400271}
272
Zack Rusinf682e192011-09-07 01:36:41 -0400273void ApiTrace::finishedParsing()
274{
275 ApiTraceFrame *firstFrame = m_frames[0];
Zack Rusin1a9f7af2011-09-18 19:40:47 -0400276 if (firstFrame && !firstFrame->isLoaded()) {
Zack Rusinf682e192011-09-07 01:36:41 -0400277 loadFrame(firstFrame);
278 }
279}
280
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400281void ApiTrace::loaderFrameLoaded(ApiTraceFrame *frame,
282 const QVector<ApiTraceCall*> &calls,
283 quint64 binaryDataSize)
Zack Rusinf682e192011-09-07 01:36:41 -0400284{
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400285 Q_ASSERT(frame->numChildrenToLoad() == calls.size());
286 emit beginLoadingFrame(frame, calls.size());
287 frame->setCalls(calls, binaryDataSize);
Zack Rusinf682e192011-09-07 01:36:41 -0400288 emit endLoadingFrame(frame);
Zack Rusin10fd4772011-09-14 01:45:12 -0400289
290 if (!m_queuedErrors.isEmpty()) {
291 QList< QPair<ApiTraceFrame*, ApiTraceError> >::iterator itr;
292 for (itr = m_queuedErrors.begin(); itr != m_queuedErrors.end();
293 ++itr) {
294 const ApiTraceError &error = (*itr).second;
295 if ((*itr).first == frame) {
296 ApiTraceCall *call = frame->callWithIndex(error.callIndex);
297
298 if (!call) {
299 continue;
300 }
301
302 call->setError(error.message);
303 m_queuedErrors.erase(itr);
304
305 if (call->hasError()) {
306 m_errors.insert(call);
307 } else {
308 m_errors.remove(call);
309 }
310 emit changed(call);
311 }
312 }
313 }
Zack Rusinf682e192011-09-07 01:36:41 -0400314}
315
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400316void ApiTrace::findNext(ApiTraceFrame *frame,
317 ApiTraceCall *from,
318 const QString &str,
319 Qt::CaseSensitivity sensitivity)
320{
321 ApiTraceCall *foundCall = 0;
322 int frameIdx = m_frames.indexOf(frame);
323
Zack Rusin1a9f7af2011-09-18 19:40:47 -0400324 if (frame->isLoaded()) {
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400325 foundCall = frame->findNextCall(from, str, sensitivity);
326 if (foundCall) {
Zack Rusin1a9f7af2011-09-18 19:40:47 -0400327 emit findResult(SearchResult_Found, foundCall);
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400328 return;
329 }
330
331 //if the frame is loaded we already searched it above
332 // so skip it
333 frameIdx += 1;
334 }
335
336 for (int i = frameIdx; i < m_frames.count(); ++i) {
337 ApiTraceFrame *frame = m_frames[i];
Zack Rusin1a9f7af2011-09-18 19:40:47 -0400338 if (!frame->isLoaded()) {
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400339 emit loaderSearchNext(i, str, sensitivity);
340 return;
341 } else {
342 ApiTraceCall *call = frame->findNextCall(0, str, sensitivity);
343 if (call) {
Zack Rusin1a9f7af2011-09-18 19:40:47 -0400344 emit findResult(SearchResult_Found, call);
Zack Rusin121e3162011-09-13 01:35:12 -0400345 return;
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400346 }
347 }
348 }
Zack Rusin1a9f7af2011-09-18 19:40:47 -0400349 emit findResult(SearchResult_Wrapped, 0);
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400350}
351
352void ApiTrace::findPrev(ApiTraceFrame *frame,
353 ApiTraceCall *from,
354 const QString &str,
355 Qt::CaseSensitivity sensitivity)
356{
357 ApiTraceCall *foundCall = 0;
358 int frameIdx = m_frames.indexOf(frame);
359
Zack Rusin1a9f7af2011-09-18 19:40:47 -0400360 if (frame->isLoaded()) {
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400361 foundCall = frame->findPrevCall(from, str, sensitivity);
362 if (foundCall) {
Zack Rusin1a9f7af2011-09-18 19:40:47 -0400363 emit findResult(SearchResult_Found, foundCall);
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400364 return;
365 }
366
367 //if the frame is loaded we already searched it above
368 // so skip it
369 frameIdx -= 1;
370 }
371
Zack Rusin121e3162011-09-13 01:35:12 -0400372 for (int i = frameIdx; i >= 0; --i) {
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400373 ApiTraceFrame *frame = m_frames[i];
Zack Rusin1a9f7af2011-09-18 19:40:47 -0400374 if (!frame->isLoaded()) {
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400375 emit loaderSearchPrev(i, str, sensitivity);
376 return;
377 } else {
378 ApiTraceCall *call = frame->findPrevCall(0, str, sensitivity);
379 if (call) {
Zack Rusin1a9f7af2011-09-18 19:40:47 -0400380 emit findResult(SearchResult_Found, call);
Zack Rusin121e3162011-09-13 01:35:12 -0400381 return;
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400382 }
383 }
384 }
Zack Rusin1a9f7af2011-09-18 19:40:47 -0400385 emit findResult(SearchResult_Wrapped, 0);
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400386}
387
388void ApiTrace::loaderSearchResult(ApiTrace::SearchResult result,
389 ApiTraceCall *call)
390{
391 //qDebug()<<"Search result = "<<result
392 // <<", call is = "<<call;
393 emit findResult(result, call);
394}
395
Zack Rusin93e4d152011-09-13 02:23:39 -0400396void ApiTrace::findFrameStart(ApiTraceFrame *frame)
397{
Zack Rusin1a9f7af2011-09-18 19:40:47 -0400398 if (frame->isLoaded()) {
Zack Rusin93e4d152011-09-13 02:23:39 -0400399 emit foundFrameStart(frame);
400 } else {
401 emit loaderFindFrameStart(frame);
402 }
403}
404
405void ApiTrace::findFrameEnd(ApiTraceFrame *frame)
406{
Zack Rusin1a9f7af2011-09-18 19:40:47 -0400407 if (frame->isLoaded()) {
Zack Rusin93e4d152011-09-13 02:23:39 -0400408 emit foundFrameEnd(frame);
409 } else {
410 emit loaderFindFrameEnd(frame);
411 }
412}
413
Zack Rusinda7579b2011-09-13 17:33:05 -0400414void ApiTrace::findCallIndex(int index)
415{
416 int frameIdx = callInFrame(index);
417 ApiTraceFrame *frame = 0;
418
419 if (frameIdx < 0) {
420 emit foundCallIndex(0);
421 return;
422 }
423
424 frame = m_frames[frameIdx];
425
426 if (frame) {
Zack Rusin1a9f7af2011-09-18 19:40:47 -0400427 if (frame->isLoaded()) {
Zack Rusinda7579b2011-09-13 17:33:05 -0400428 ApiTraceCall *call = frame->callWithIndex(index);
429 emit foundCallIndex(call);
430 } else {
431 emit loaderFindCallIndex(index);
432 }
433 }
434}
435
436int ApiTrace::callInFrame(int callIdx) const
437{
438 unsigned numCalls = 0;
439
440 for (int frameIdx = 0; frameIdx <= m_frames.size(); ++frameIdx) {
441 const ApiTraceFrame *frame = m_frames[frameIdx];
Zack Rusin1a9f7af2011-09-18 19:40:47 -0400442 unsigned numCallsInFrame = frame->isLoaded()
Zack Rusinda7579b2011-09-13 17:33:05 -0400443 ? frame->numChildren()
444 : frame->numChildrenToLoad();
445 unsigned firstCall = numCalls;
446 unsigned endCall = numCalls + numCallsInFrame;
447 if (firstCall <= callIdx && endCall > callIdx) {
448 return frameIdx;
449 }
450 numCalls = endCall;
451 }
452
453 return -1;
454}
455
Zack Rusin10fd4772011-09-14 01:45:12 -0400456void ApiTrace::setCallError(const ApiTraceError &error)
457{
458 int frameIdx = callInFrame(error.callIndex);
459 ApiTraceFrame *frame = 0;
460
461 if (frameIdx < 0) {
462 return;
463 }
464 frame = m_frames[frameIdx];
465
Zack Rusin1a9f7af2011-09-18 19:40:47 -0400466 if (frame->isLoaded()) {
Zack Rusin10fd4772011-09-14 01:45:12 -0400467 ApiTraceCall *call = frame->callWithIndex(error.callIndex);
468 call->setError(error.message);
469 if (call->hasError()) {
470 m_errors.insert(call);
471 } else {
472 m_errors.remove(call);
473 }
474 emit changed(call);
475 } else {
476 emit requestFrame(frame);
477 m_queuedErrors.append(qMakePair(frame, error));
478 }
479}
480
Zack Rusinf6667d12011-03-30 11:03:37 -0400481#include "apitrace.moc"