Skip to content

Commit f9d43fd

Browse files
committed
GUI2: show last results
1 parent 449dfc1 commit f9d43fd

6 files changed

Lines changed: 116 additions & 38 deletions

File tree

gui2/mainwindow.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ MainWindow::MainWindow(QWidget *parent) :
1515
solution.load(QDir::homePath() + "/.staticanalysis.xml");
1616

1717
connect(ui->projectwidget, SIGNAL(scan()), this, SLOT(scan()));
18+
connect(ui->projectwidget, SIGNAL(log()), this, SLOT(log()));
1819

1920
// TODO: right now we don't show anything on the status bar
2021
this->statusBar()->hide();

gui2/projectwidget.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ class ProjectWidget : public QWidget {
99
public:
1010
explicit ProjectWidget(QWidget *parent = 0);
1111
void setProject(const QString &projectName_);
12-
QString getProjectName() const { return projectName; }
12+
QString getProjectName() const {
13+
return projectName;
14+
}
1315

1416
signals:
1517
void scan();

gui2/resultsform.cpp

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,42 @@ void ResultsForm::scanFinished()
177177
}
178178
}
179179

180-
void ResultsForm::showResults(const QString & /*projectName*/ )
180+
static QString lastResultFile(const QString &projectName)
181181
{
182-
// Load last results..
182+
QString ret;
183+
184+
ApplicationSettings settings;
185+
QDir dir(settings.resultsFolder);
186+
dir.setSorting(QDir::Name);
187+
dir.setNameFilters(QStringList() << "*.xml");
188+
dir.setFilter(QDir::Files | QDir::NoDotAndDotDot);
189+
foreach(const QFileInfo fileinfo, dir.entryInfoList()) {
190+
const QString filename = fileinfo.canonicalFilePath();
191+
QFile file(filename);
192+
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
193+
continue;
194+
195+
QDomDocument doc;
196+
if (!doc.setContent(&file))
197+
continue;
198+
199+
const QDomElement rootElement = doc.documentElement();
200+
if (rootElement.tagName() != "results")
201+
continue;
202+
203+
const QDomElement metaElement = rootElement.firstChildElement("meta");
204+
if (metaElement.isNull())
205+
continue;
206+
207+
const QDomElement projectElement = metaElement.firstChildElement("project");
208+
if (projectElement.text() == projectName)
209+
ret = filename;
210+
}
211+
212+
return ret;
213+
}
214+
215+
void ResultsForm::showResults(const QString & projectName)
216+
{
217+
resultsmodel->load(lastResultFile(projectName));
183218
}

gui2/resultsmodel.cpp

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,48 @@ void ResultsModel::addresult(const QString &errmsg)
2929
}
3030
}
3131

32+
static QString getstr(const QDomElement element, const QString &tagName)
33+
{
34+
const QDomElement child = element.firstChildElement(tagName);
35+
return child.isNull() ? QString() : child.text();
36+
}
37+
38+
bool ResultsModel::load(const QString &fileName)
39+
{
40+
QFile file(fileName);
41+
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
42+
return false;
43+
44+
QDomDocument doc;
45+
if (!doc.setContent(&file))
46+
return false;
47+
48+
const QDomElement rootElement = doc.documentElement();
49+
if (rootElement.tagName() != "results")
50+
return false;
51+
52+
const QDomElement resultsElement = rootElement.firstChildElement("results");
53+
if (resultsElement.isNull())
54+
return false;
55+
56+
delete rootNode;
57+
rootNode = new Node;
58+
59+
for (QDomElement element = resultsElement.firstChildElement(); !element.isNull(); element = element.nextSiblingElement()) {
60+
if (element.tagName() == "result") {
61+
Node *node = new Node(getstr(element,"file"),
62+
getstr(element,"line"),
63+
getstr(element,"severity"),
64+
getstr(element,"text"));
65+
node->parent = rootNode;
66+
rootNode->children.append(node);
67+
}
68+
}
69+
70+
this->reset();
71+
return true;
72+
}
73+
3274
bool ResultsModel::save(const QString &fileName, const QString &projectName) const
3375
{
3476
QFile file(fileName);
@@ -135,10 +177,8 @@ QVariant ResultsModel::data(const QModelIndex &index, int role) const
135177
return QVariant();
136178

137179
switch (index.column()) {
138-
case 0: {
139-
int pos = node->filename.lastIndexOf("/");
140-
return (pos > 0) ? node->filename.mid(pos+1) : node->filename;
141-
}
180+
case 0:
181+
return node->filename;
142182
case 1:
143183
return node->line;
144184
case 2:

gui2/resultsmodel.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class ResultsModel : public QAbstractItemModel {
3939
void clear();
4040
void addresult(const QString &errmsg);
4141

42+
bool load(const QString &fileName);
4243
bool save(const QString &fileName, const QString &projectName) const;
4344

4445
private:

test/testmemleak.cpp

Lines changed: 30 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,7 @@ class TestMemleakInFunction : public TestFixture {
129129
errout.str("");
130130

131131
Settings settings1;
132-
if (!settings)
133-
{
132+
if (!settings) {
134133
LOAD_LIB("gtk.cfg");
135134
settings1.library = _lib;
136135
settings = &settings1;
@@ -5985,26 +5984,26 @@ class TestMemleakStructMember : public TestFixture {
59855984
"[test.c:12]: (error) Memory leak: a.c\n"
59865985
"[test.c:12]: (error) Memory leak: a.m\n", errout.str());
59875986
const char code_err_glib[] = "struct A {\n"
5988-
" FILE* f;\n"
5989-
" char* c;\n"
5990-
" void* m;\n"
5991-
"};\n"
5992-
"\n"
5993-
"void func() {\n"
5994-
" struct A a;\n"
5995-
" a.f = fopen(\"test\", \"r\");\n"
5996-
" a.c = new char[12];\n"
5997-
" a.m = g_malloc(12);\n"
5998-
"}\n";
5987+
" FILE* f;\n"
5988+
" char* c;\n"
5989+
" void* m;\n"
5990+
"};\n"
5991+
"\n"
5992+
"void func() {\n"
5993+
" struct A a;\n"
5994+
" a.f = fopen(\"test\", \"r\");\n"
5995+
" a.c = new char[12];\n"
5996+
" a.m = g_malloc(12);\n"
5997+
"}\n";
59995998

60005999
check(code_err_glib, "test.cpp");
60016000
ASSERT_EQUALS("", errout.str());
60026001
check(code_err_glib, "test.c");
60036002
TODO_ASSERT_EQUALS("[test.c:12]: (error) Memory leak: a.f\n"
6004-
"[test.c:12]: (error) Memory leak: a.c\n"
6005-
"[test.c:12]: (error) Memory leak: a.m\n",
6006-
"[test.c:12]: (error) Memory leak: a.f\n"
6007-
"[test.c:12]: (error) Memory leak: a.c\n", errout.str());
6003+
"[test.c:12]: (error) Memory leak: a.c\n"
6004+
"[test.c:12]: (error) Memory leak: a.m\n",
6005+
"[test.c:12]: (error) Memory leak: a.f\n"
6006+
"[test.c:12]: (error) Memory leak: a.c\n", errout.str());
60086007

60096008
// Test OK case
60106009
const char code_ok[] = "struct A {\n"
@@ -6028,20 +6027,20 @@ class TestMemleakStructMember : public TestFixture {
60286027
check(code_ok, "test.c");
60296028
ASSERT_EQUALS("", errout.str());
60306029
const char code_ok_glib[] = "struct A {\n"
6031-
" FILE* f;\n"
6032-
" char* c;\n"
6033-
" void* m;\n"
6034-
"};\n"
6035-
"\n"
6036-
"void func() {\n"
6037-
" struct A a;\n"
6038-
" a.f = fopen(\"test\", \"r\");\n"
6039-
" a.c = new char[12];\n"
6040-
" a.m = g_malloc(12);\n"
6041-
" fclose(a.f);\n"
6042-
" delete [] a.c;\n"
6043-
" g_free(a.m);\n"
6044-
"}\n";
6030+
" FILE* f;\n"
6031+
" char* c;\n"
6032+
" void* m;\n"
6033+
"};\n"
6034+
"\n"
6035+
"void func() {\n"
6036+
" struct A a;\n"
6037+
" a.f = fopen(\"test\", \"r\");\n"
6038+
" a.c = new char[12];\n"
6039+
" a.m = g_malloc(12);\n"
6040+
" fclose(a.f);\n"
6041+
" delete [] a.c;\n"
6042+
" g_free(a.m);\n"
6043+
"}\n";
60456044

60466045
check(code_ok_glib, "test.cpp");
60476046
ASSERT_EQUALS("", errout.str());

0 commit comments

Comments
 (0)