]> git.cworth.org Git - apitrace/blob - gui/loaderthread.cpp
Don't change immutable values.
[apitrace] / gui / loaderthread.cpp
1 #include "loaderthread.h"
2
3 #include "trace_parser.hpp"
4
5 #include <QFile>
6 #include <QHash>
7 #include <QUrl>
8
9 #include <QDebug>
10
11 #define FRAMES_TO_CACHE 100
12
13 static ApiTraceCall *
14 apiCallFromTraceCall(const Trace::Call *call,
15                      const QHash<QString, QUrl> &helpHash)
16 {
17     ApiTraceCall *apiCall = new ApiTraceCall(call);
18
19     apiCall->setHelpUrl(helpHash.value(apiCall->name()));
20
21     return apiCall;
22 }
23
24 LoaderThread::LoaderThread(QObject *parent)
25     : QThread(parent),
26       m_frameMarker(ApiTrace::FrameMarker_SwapBuffers)
27 {
28 }
29
30 void LoaderThread::run()
31 {
32     QList<ApiTraceFrame*> frames;
33     ApiTraceFrame *currentFrame = 0;
34     int frameCount = 0;
35
36     QHash<QString, QUrl> helpHash;
37
38
39     QFile file(":/resources/glreference.tsv");
40     if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
41         QString line;
42         while (!file.atEnd()) {
43             line = file.readLine();
44             QString function = line.section('\t', 0, 0).trimmed();
45             QUrl url = QUrl(line.section('\t', 1, 1).trimmed());
46             //qDebug()<<"function = "<<function<<", url = "<<url.toString();
47             helpHash.insert(function, url);
48         }
49     } else {
50         qWarning() << "Couldn't open reference file "
51                    << file.fileName();
52     }
53     file.close();
54
55     Trace::Parser p;
56     if (p.open(m_fileName.toLatin1().constData())) {
57         Trace::Call *call = p.parse_call();
58         while (call) {
59             //std::cout << *call;
60             if (!currentFrame) {
61                 currentFrame = new ApiTraceFrame();
62                 currentFrame->number = frameCount;
63                 ++frameCount;
64             }
65             ApiTraceCall *apiCall =
66                 apiCallFromTraceCall(call, helpHash);
67             apiCall->setParentFrame(currentFrame);
68             currentFrame->addCall(apiCall);
69             if (ApiTrace::isCallAFrameMarker(apiCall,
70                                              m_frameMarker)) {
71                 frames.append(currentFrame);
72                 currentFrame = 0;
73                 if (frames.count() >= FRAMES_TO_CACHE) {
74                     emit parsedFrames(frames);
75                     frames.clear();
76                 }
77             }
78             delete call;
79             call = p.parse_call();
80         }
81     }
82     //last frames won't have markers
83     //  it's just a bunch of Delete calls for every object
84     //  after the last SwapBuffers
85     if (currentFrame) {
86         frames.append(currentFrame);
87         currentFrame = 0;
88     }
89     if (frames.count()) {
90         emit parsedFrames(frames);
91     }
92 }
93
94 void LoaderThread::loadFile(const QString &fileName)
95 {
96     m_fileName = fileName;
97     start();
98 }
99
100 ApiTrace::FrameMarker LoaderThread::frameMarker() const
101 {
102     return m_frameMarker;
103 }
104
105 void LoaderThread::setFrameMarker(ApiTrace::FrameMarker marker)
106 {
107     Q_ASSERT(!isRunning());
108     m_frameMarker = marker;
109 }
110
111 #include "loaderthread.moc"