Skip to content

Commit 5e14abf

Browse files
committed
GUI: Read errors from report XML file.
This commits adds new "Open XML" item to File-menu. Selecting this menuitem allows user to select report file to open. When the file is read the error data is printed to debug output. Later patches will implement adding error data back to the GUI.
1 parent 81449a8 commit 5e14abf

9 files changed

Lines changed: 186 additions & 7 deletions

File tree

gui/main.ui

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373
<property name="title">
7474
<string>&amp;File</string>
7575
</property>
76+
<addaction name="mActionOpenXML"/>
7677
<addaction name="mActionSave"/>
7778
<addaction name="mActionQuit"/>
7879
</widget>
@@ -347,6 +348,11 @@
347348
<string>Error categories</string>
348349
</property>
349350
</action>
351+
<action name="mActionOpenXML">
352+
<property name="text">
353+
<string>&amp;Open XML...</string>
354+
</property>
355+
</action>
350356
</widget>
351357
<customwidgets>
352358
<customwidget>

gui/mainwindow.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ MainWindow::MainWindow() :
5656
connect(mUI.mActionCheckDirectory, SIGNAL(triggered()), this, SLOT(CheckDirectory()));
5757
connect(mUI.mActionSettings, SIGNAL(triggered()), this, SLOT(ProgramSettings()));
5858
connect(mUI.mActionClearResults, SIGNAL(triggered()), this, SLOT(ClearResults()));
59+
connect(mUI.mActionOpenXML, SIGNAL(triggered()), this, SLOT(OpenXML()));
5960

6061
connect(mUI.mActionShowStyle, SIGNAL(toggled(bool)), this, SLOT(ShowStyle(bool)));
6162
connect(mUI.mActionShowErrors, SIGNAL(toggled(bool)), this, SLOT(ShowErrors(bool)));
@@ -431,6 +432,22 @@ void MainWindow::ClearResults()
431432
mUI.mActionSave->setEnabled(false);
432433
}
433434

435+
void MainWindow::OpenXML()
436+
{
437+
QString selectedFilter;
438+
QString filter(tr("XML files (*.xml)"));
439+
QString selectedFile = QFileDialog::getOpenFileName(this,
440+
tr("Open the report file"),
441+
QString(),
442+
filter,
443+
&selectedFilter);
444+
445+
if (!selectedFile.isEmpty())
446+
{
447+
mUI.mResults->ReadErrorsXml(selectedFile);
448+
}
449+
}
450+
434451
void MainWindow::EnableCheckButtons(bool enable)
435452
{
436453
mUI.mActionStop->setEnabled(!enable);

gui/mainwindow.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,12 @@ public slots:
6767
*/
6868
void ClearResults();
6969

70+
/**
71+
* @brief Slot to open XML report file
72+
*
73+
*/
74+
void OpenXML();
75+
7076
/**
7177
* @brief Show errors with type "style"
7278
* @param checked Should errors be shown (true) or hidden (false)

gui/report.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,17 @@ bool Report::Create()
4141
return succeed;
4242
}
4343

44+
bool Report::Open()
45+
{
46+
bool succeed = false;
47+
if (!mFile.isOpen())
48+
{
49+
mFile.setFileName(mFilename);
50+
succeed = mFile.open(QIODevice::ReadOnly | QIODevice::Text);
51+
}
52+
return succeed;
53+
}
54+
4455
void Report::Close()
4556
{
4657
if (mFile.isOpen())

gui/report.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,12 @@ class Report : public QObject
5050
*/
5151
virtual bool Create();
5252

53+
/**
54+
* @brief Open the existing report (file).
55+
* @return true if succeeded, false if file could not be created.
56+
*/
57+
virtual bool Open();
58+
5359
/**
5460
* @brief Close the report (file).
5561
*/

gui/resultsview.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,3 +217,29 @@ void ResultsView::DisableProgressbar()
217217
{
218218
mUI.mProgress->setEnabled(false);
219219
}
220+
221+
void ResultsView::ReadErrorsXml(const QString &filename)
222+
{
223+
XmlReport *report = new XmlReport(filename, this);
224+
if (report)
225+
{
226+
if (report->Open())
227+
report->Read();
228+
else
229+
{
230+
QMessageBox msgBox;
231+
msgBox.setText(tr("Failed to read the report."));
232+
msgBox.setIcon(QMessageBox::Critical);
233+
msgBox.exec();
234+
}
235+
delete report;
236+
report = NULL;
237+
}
238+
else
239+
{
240+
QMessageBox msgBox;
241+
msgBox.setText(tr("Failed to read the report."));
242+
msgBox.setIcon(QMessageBox::Critical);
243+
msgBox.exec();
244+
}
245+
}

gui/resultsview.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,14 @@ class ResultsView : public QWidget
129129
void Translate();
130130

131131
void DisableProgressbar();
132+
133+
/**
134+
* @brief Read errors from report XML file.
135+
* @param filename Report file to read.
136+
*
137+
*/
138+
void ReadErrorsXml(const QString &filename);
139+
132140
signals:
133141

134142
/**

gui/xmlreport.cpp

Lines changed: 84 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,27 @@
1818

1919
#include <QFile>
2020
#include <QXmlStreamWriter>
21+
#include <qdebug>
2122
#include "xmlreport.h"
2223

24+
static const char ResultElementName[] = "results";
25+
static const char ErrorElementName[] = "error";
26+
static const char FilenameAttribute[] = "file";
27+
static const char LineAttribute[] = "line";
28+
static const char IdAttribute[] = "id";
29+
static const char SeverityAttribute[] = "severity";
30+
static const char MsgAttribute[] = "msg";
31+
2332
XmlReport::XmlReport(const QString &filename, QObject * parent) :
2433
Report(filename, parent),
34+
mXmlReader(NULL),
2535
mXmlWriter(NULL)
2636
{
2737
}
2838

2939
XmlReport::~XmlReport()
3040
{
41+
delete mXmlReader;
3142
delete mXmlWriter;
3243
Close();
3344
}
@@ -43,11 +54,22 @@ bool XmlReport::Create()
4354
return success;
4455
}
4556

57+
bool XmlReport::Open()
58+
{
59+
bool success = false;
60+
if (Report::Open())
61+
{
62+
mXmlReader = new QXmlStreamReader(Report::GetFile());
63+
success = true;
64+
}
65+
return success;
66+
}
67+
4668
void XmlReport::WriteHeader()
4769
{
4870
mXmlWriter->setAutoFormatting(true);
4971
mXmlWriter->writeStartDocument();
50-
mXmlWriter->writeStartElement("results");
72+
mXmlWriter->writeStartElement(ResultElementName);
5173
}
5274

5375
void XmlReport::WriteFooter()
@@ -65,11 +87,66 @@ void XmlReport::WriteError(const QStringList &files, const QStringList &lines,
6587
The callstack seems to be ignored here aswell, instead last item of the stack is used
6688
*/
6789

68-
mXmlWriter->writeStartElement("error");
69-
mXmlWriter->writeAttribute("file", files[files.size() - 1]);
70-
mXmlWriter->writeAttribute("line", lines[lines.size() - 1]);
71-
mXmlWriter->writeAttribute("id", id);
72-
mXmlWriter->writeAttribute("severity", severity);
73-
mXmlWriter->writeAttribute("msg", msg);
90+
mXmlWriter->writeStartElement(ErrorElementName);
91+
mXmlWriter->writeAttribute(FilenameAttribute, files[files.size() - 1]);
92+
mXmlWriter->writeAttribute(LineAttribute, lines[lines.size() - 1]);
93+
mXmlWriter->writeAttribute(IdAttribute, id);
94+
mXmlWriter->writeAttribute(SeverityAttribute, severity);
95+
mXmlWriter->writeAttribute(MsgAttribute, msg);
7496
mXmlWriter->writeEndElement();
7597
}
98+
99+
void XmlReport::Read()
100+
{
101+
bool insideResults = false;
102+
if (!mXmlReader)
103+
{
104+
qDebug() << "You must Open() the file before reading it!";
105+
return;
106+
}
107+
while (!mXmlReader->atEnd())
108+
{
109+
switch (mXmlReader->readNext())
110+
{
111+
case QXmlStreamReader::StartElement:
112+
if (mXmlReader->name() == ResultElementName)
113+
insideResults = true;
114+
115+
// Read error element from inside result element
116+
if (insideResults && mXmlReader->name() == ErrorElementName)
117+
ReadError(mXmlReader);
118+
break;
119+
120+
case QXmlStreamReader::EndElement:
121+
if (mXmlReader->name() == ResultElementName)
122+
insideResults = false;
123+
break;
124+
125+
// Not handled
126+
case QXmlStreamReader::NoToken:
127+
case QXmlStreamReader::Invalid:
128+
case QXmlStreamReader::StartDocument:
129+
case QXmlStreamReader::EndDocument:
130+
case QXmlStreamReader::Characters:
131+
case QXmlStreamReader::Comment:
132+
case QXmlStreamReader::DTD:
133+
case QXmlStreamReader::EntityReference:
134+
case QXmlStreamReader::ProcessingInstruction:
135+
break;
136+
}
137+
}
138+
}
139+
140+
void XmlReport::ReadError(QXmlStreamReader *reader)
141+
{
142+
if (reader->name().toString() == ErrorElementName)
143+
{
144+
QXmlStreamAttributes attribs = reader->attributes();
145+
QString filename = attribs.value("", FilenameAttribute).toString();
146+
QString line = attribs.value("", LineAttribute).toString();
147+
QString id = attribs.value("", IdAttribute).toString();
148+
QString severity = attribs.value("", SeverityAttribute).toString();
149+
QString msg = attribs.value("", MsgAttribute).toString();
150+
qDebug() << "Error: " << filename << " " << line << " " << id << " " << severity << " " << msg;
151+
}
152+
}

gui/xmlreport.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include <QString>
2424
#include <QStringList>
2525
#include <QFile>
26+
#include <QXmlStreamReader>
2627
#include <QXmlStreamWriter>
2728
#include "report.h"
2829

@@ -47,6 +48,11 @@ class XmlReport : public Report
4748
*/
4849
virtual bool Create();
4950

51+
/**
52+
* @brief Open existing report file.
53+
*/
54+
bool Open();
55+
5056
/**
5157
* @brief Write report header.
5258
*/
@@ -63,7 +69,23 @@ class XmlReport : public Report
6369
virtual void WriteError(const QStringList &files, const QStringList &lines,
6470
const QString &id, const QString &severity, const QString &msg);
6571

72+
/**
73+
* @brief Read contents of the report file.
74+
*/
75+
void Read();
76+
77+
protected:
78+
/**
79+
* @brief Read and parse error item from XML stream.
80+
* @param reader XML stream reader to use.
81+
*/
82+
void ReadError(QXmlStreamReader *reader);
83+
6684
private:
85+
/**
86+
* @brief XML stream reader for reading the report in XML format.
87+
*/
88+
QXmlStreamReader *mXmlReader;
6789

6890
/**
6991
* @brief XML stream writer for writing the report in XML format.

0 commit comments

Comments
 (0)