Danish Eniro search fixed.
[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), timer_(0), searching_(false), retries_(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     show();
60     setAttribute(Qt::WA_Maemo5ShowProgressIndicator, true);
61
62     if(!connectionManager_)
63     {
64         connectionManager_ = new ConnectionManager();
65     }
66
67     connectionManager_->connect();
68
69     Source::SourceId id = Source::stringToId(Settings::instance()->get("source"));
70
71     if(!source_ || id != sourceId_)
72     {
73         sourceId_ = id;
74
75         if(source_)
76         {
77             delete source_;
78             source_ = 0;
79         }
80
81         source_ = Source::getSource(sourceId_);
82         Q_ASSERT(source_ != 0);
83         source_->setTimeout(REQUEST_TIMEOUT);
84
85         connect(source_, SIGNAL(resultAvailable(Source::Result const&,
86                                                Source::SearchDetails const&)),
87                                                this, SLOT(resultAvailable(Source::Result const&,
88                                                                           Source::SearchDetails const&)));
89
90         connect(source_, SIGNAL(requestFinished(QVector <Source::Result> const&,
91                                                Source::SearchDetails const&, bool)),
92                                                this, SLOT(requestFinished(QVector <Source::Result> const&,
93                                                                           Source::SearchDetails const&, bool)));
94     }
95
96     SourceCoreConfig* config = SourceCoreConfig::getCoreConfig(sourceId_);
97
98     Q_ASSERT(config != 0);
99
100     config->apply(source_);
101     delete config;
102
103     if(searching_)
104     {
105         source_->abort();
106         timer_ = startTimer(SEARCH_INTERVAL);
107     }
108
109     while(timer_)
110     {
111         QApplication::processEvents(QEventLoop::WaitForMoreEvents);
112     }
113
114     list_->clear();
115     searching_ = true;
116     retries_ = 0;
117     currentSearch_ = Source::SearchDetails(details.name, details.location, details.type);
118     source_->search(currentSearch_);
119
120 }
121
122 void ResultWindow::resultAvailable(Source::Result const& result,
123                                    Source::SearchDetails const& details)
124 {
125     if(!list_)
126     {
127         return;
128     }
129
130     Q_UNUSED(details);
131
132     if(!result.number.isEmpty())
133     {
134         Cache::instance().addItem(result);
135     }
136
137     QString row = result.name;
138
139     if(!result.street.isEmpty())
140     {
141         row += ", " + result.street;
142     }
143
144     if(!result.city.isEmpty())
145     {
146         row += ", " + result.city;
147     }
148
149     QListWidgetItem* item = new QListWidgetItem(row, list_);
150     QMap <QString, QVariant> data;
151     data["name"] = QVariant(result.name);
152     data["street"] = QVariant(result.street);
153     data["city"] = QVariant(result.city);
154     data["number"] = QVariant(result.number);
155     data["country"] = QVariant(result.country);
156
157     item->setData(Qt::UserRole, QVariant(data));
158
159     list_->addItem(item);
160 }
161
162 void ResultWindow::requestFinished(QVector <Source::Result> const& results,
163                                    Source::SearchDetails const& details,
164                                    bool error)
165 {
166     Q_UNUSED(details);
167
168     if(error)
169     {
170         if(retries_ < RETRIES)
171         {
172             qDebug() << "Searching failed, retrying...";
173             retries_++;
174             list_->clear();
175             source_->search(currentSearch_);
176             return;
177         }
178
179         QString errorString;
180         Source::Error error = source_->error();
181
182         switch(error)
183         {
184         case Source::CONNECTION_FAILURE:
185             errorString = tr("Connection to server failed");
186             break;
187         case Source::INVALID_LOGIN:
188             errorString = tr("Invalid login details");
189             break;
190         case Source::TIMEOUT:
191             errorString = tr("Request timed out");
192             break;
193         default:
194             errorString = tr("Searching failed:") + " " + source_->errorString();
195             break;
196         }
197
198         QMessageBox::critical(this, tr("Error"), errorString);
199     }
200
201     if(results.size() == 0)
202     {
203         QLabel* info = new QLabel(tr("No results found"));
204         info->setAlignment(Qt::AlignCenter);
205         setCentralWidget(info);
206         list_ = 0;
207     }
208
209     setAttribute(Qt::WA_Maemo5ShowProgressIndicator, false);
210
211     searching_ = false;
212
213 }
214
215 void ResultWindow::itemClicked(QListWidgetItem* item)
216 {
217     QMap <QString, QVariant> data = item->data(Qt::UserRole).toMap();
218     Source::Result details;
219     details.name = data["name"].toString();
220     details.street = data["street"].toString();
221     details.city = data["city"].toString();
222     details.number = data["number"].toString();
223     details.country = data["country"].toString();
224
225     emit itemSelected(details);
226 }
227
228 void ResultWindow::setVisible(bool visible)
229 {
230     if(!visible && source_)
231     {
232         source_->abort();
233     }
234
235     QMainWindow::setVisible(visible);
236 }
237
238 void ResultWindow::timerEvent(QTimerEvent* event)
239 {
240     Q_UNUSED(event);
241
242     killTimer(timer_);
243     timer_ = 0;
244 }
245
246