Html entity handling improved. Fixed a bug in source that caused segmentation fault...
[jenirok] / src / gui / resultwindow.cpp
1 /*
2  * This file is part of Jenirok.
3  *
4  * Jenirok is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * Jenirok is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with Jenirok.  If not, see <http://www.gnu.org/licenses/>.
16  *
17  */
18
19 #include <QtCore/QDebug>
20 #include <QtCore/QVariant>
21 #include <QtCore/QString>
22 #include <QtGui/QLabel>
23 #include <QtGui/QListWidgetItem>
24 #include <QtGui/QMessageBox>
25 #include "resultwindow.h"
26 #include "settings.h"
27 #include "db.h"
28 #include "cache.h"
29 #include "source.h"
30 #include "sourcecoreconfig.h"
31
32 ResultWindow::ResultWindow(QWidget* parent): QMainWindow(parent),
33 source_(0), list_(0), connectionManager_(0)
34 {
35     setAttribute(Qt::WA_Maemo5StackedWindow);
36     setWindowTitle(tr("Search results"));
37 }
38
39 ResultWindow::~ResultWindow()
40 {
41     delete connectionManager_;
42     connectionManager_ = 0;
43 }
44
45 void ResultWindow::search(SearchDialog::SearchDetails& details)
46 {
47     if(!list_)
48     {
49         list_ = new QListWidget(this);
50         setCentralWidget(list_);
51         connect(list_, SIGNAL(itemClicked(QListWidgetItem*)), this,
52                 SLOT(itemClicked(QListWidgetItem*)));
53     }
54     else
55     {
56         list_->clear();
57     }
58
59     Source::SourceId id = Source::stringToId(Settings::instance()->get("source"));
60
61     if(!source_ || id != sourceId_)
62     {
63         sourceId_ = id;
64
65         if(source_)
66         {
67             delete source_;
68             source_ = 0;
69         }
70
71         source_ = Source::getSource(sourceId_);
72         Q_ASSERT(source_ != 0);
73         source_->setTimeout(REQUEST_TIMEOUT);
74
75         connect(source_, SIGNAL(resultAvailable(Source::Result const&,
76                                                Source::SearchDetails const&)),
77                                                this, SLOT(resultAvailable(Source::Result const&,
78                                                                           Source::SearchDetails const&)));
79
80         connect(source_, SIGNAL(requestFinished(QVector <Source::Result> const&,
81                                                Source::SearchDetails const&, bool)),
82                                                this, SLOT(requestFinished(QVector <Source::Result> const&,
83                                                                           Source::SearchDetails const&, bool)));
84     }
85
86     SourceCoreConfig* config = SourceCoreConfig::getCoreConfig(sourceId_);
87
88     Q_ASSERT(config != 0);
89
90     config->apply(source_);
91     delete config;
92
93     Source::SearchType type;
94
95     switch(details.type)
96     {
97     case 0:
98         type = Source::PERSONS;
99         break;
100     case 1:
101         type = Source::YELLOW_PAGES;
102         break;
103     default:
104         qDebug() << "Unknown search type: " << details.type;
105         return;
106     }
107
108     show();
109     setAttribute(Qt::WA_Maemo5ShowProgressIndicator, true);
110
111     if(!connectionManager_)
112     {
113         connectionManager_ = new ConnectionManager();
114     }
115
116     connectionManager_->connect();
117
118     source_->abort();
119     source_->search(Source::SearchDetails(details.name, details.location, type));
120
121 }
122
123 void ResultWindow::resultAvailable(Source::Result const& result,
124                                    Source::SearchDetails const& details)
125 {
126     Q_UNUSED(details);
127
128     if(!result.number.isEmpty())
129     {
130         Cache::instance().addItem(result);
131     }
132
133     QString row = result.name;
134
135     if(!result.street.isEmpty())
136     {
137         row += ", " + result.street;
138     }
139
140     if(!result.city.isEmpty())
141     {
142         row += ", " + result.city;
143     }
144
145     QListWidgetItem* item = new QListWidgetItem(row, list_);
146     QMap <QString, QVariant> data;
147     data["name"] = QVariant(result.name);
148     data["street"] = QVariant(result.street);
149     data["city"] = QVariant(result.city);
150     data["number"] = QVariant(result.number);
151
152     item->setData(Qt::UserRole, QVariant(data));
153
154     list_->addItem(item);
155 }
156
157 void ResultWindow::requestFinished(QVector <Source::Result> const& results,
158                                    Source::SearchDetails const& details,
159                                    bool error)
160 {
161     Q_UNUSED(details);
162
163     if(error)
164     {
165         QString errorString;
166         Source::Error error = source_->error();
167
168         switch(error)
169         {
170         case Source::CONNECTION_FAILURE:
171             errorString = tr("Connection to server failed");
172             break;
173         case Source::INVALID_LOGIN:
174             errorString = tr("Invalid login details");
175             break;
176         case Source::TIMEOUT:
177             errorString = tr("Request timed out");
178             break;
179         default:
180             errorString = tr("Searching failed:") + " " + source_->errorString();
181             break;
182         }
183
184         QMessageBox::critical(this, tr("Error"), errorString);
185     }
186
187     if(results.size() == 0)
188     {
189         QLabel* info = new QLabel(tr("No results found"));
190         info->setAlignment(Qt::AlignCenter);
191         setCentralWidget(info);
192         list_ = 0;
193     }
194
195     setAttribute(Qt::WA_Maemo5ShowProgressIndicator, false);
196
197 }
198
199 void ResultWindow::itemClicked(QListWidgetItem* item)
200 {
201     QMap <QString, QVariant> data = item->data(Qt::UserRole).toMap();
202     Source::Result details;
203     details.name = data["name"].toString();
204     details.street = data["street"].toString();
205     details.city = data["city"].toString();
206     details.number = data["number"].toString();
207
208     emit itemSelected(details);
209 }
210
211 void ResultWindow::setVisible(bool visible)
212 {
213     QMainWindow::setVisible(visible);
214
215     if(!visible && source_)
216     {
217         source_->abort();
218
219
220     }
221 }
222
223
224