More tests for remotelist
[irwi] / src / selectremotedlg.cpp
1 #include "selectremotedlg.h"
2
3 #include "remotelist.h"
4 #include "model.h"
5
6 #include <cstdlib>
7
8 #include <QDebug>
9 #include <QHBoxLayout>
10 #include <QLabel>
11 #include <QString>
12 #include <QListWidget>
13 #include <QListWidgetItem>
14 #include <QSettings>
15 #include <QtNetwork/QNetworkAccessManager>
16 #include <QtNetwork/QNetworkReply>
17 #include <QBuffer>
18 #include <QByteArray>
19 #include <QFile>
20 #include <QMap>
21 #include <QList>
22 #include <QMessageBox>
23 #include <QPushButton>
24 #include <QListWidgetItem>
25
26 SelectRemoteDlg::SelectRemoteDlg(QWidget *parent)
27     : QDialog(parent)
28 {
29     this->setWindowTitle(tr("Select remote"));
30     this->setMinimumHeight(320);
31
32     deviceNameMap = new QMap<QString, QString>();
33     settings = new QSettings(this);
34     remoteList = NULL;
35
36     layout = new QHBoxLayout(this);
37
38     alphabetList = new QListWidget(this);
39     alphabetList->setMaximumWidth(96);
40     layout->addWidget(alphabetList);
41     connect(alphabetList, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)),
42                 this, SLOT(alphabetItemChanged(QListWidgetItem*, QListWidgetItem*)));
43     
44     mfgList = new QListWidget(this);
45     layout->addWidget(mfgList);
46     connect(mfgList, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)),
47                 this, SLOT(mfgItemChanged(QListWidgetItem*, QListWidgetItem*)));
48
49     modelList = new QListWidget(this);
50     layout->addWidget(modelList);
51
52     downloadBtn = new QPushButton(tr("Download"), this);
53     layout->addWidget(downloadBtn);
54     connect(downloadBtn, SIGNAL(clicked()), 
55             this, SLOT(downloadRemote()));
56
57     this->setLayout(layout);
58
59     //TODO caching?
60     listNetAM = new QNetworkAccessManager(this);
61     connect(listNetAM, SIGNAL(finished(QNetworkReply*)), 
62             this,  SLOT(listDownloadFinished(QNetworkReply*)));
63
64     remoteNetAM = new QNetworkAccessManager(this);
65     connect(remoteNetAM, SIGNAL(finished(QNetworkReply*)), 
66             this,  SLOT(remoteDownloadFinished(QNetworkReply*)));
67     beginDownload(settings->value("dbUrl", 
68                 "http://mercury.wipsl.com/irwi/db.xml").toString, listNetAM); 
69 }
70
71 SelectRemoteDlg::~SelectRemoteDlg()
72 {
73     delete layout;
74     layout = NULL;
75     delete settings;
76     settings = NULL;
77     delete listNetAM;
78     listNetAM = NULL;
79     delete remoteNetAM;
80     remoteNetAM = NULL;
81     delete deviceNameMap;
82     deviceNameMap = NULL;
83     if (remoteList)
84     {
85         delete remoteList;
86         remoteList = NULL;
87     }
88 }
89
90 void SelectRemoteDlg::setBusy(bool busy)
91 {
92     setAttribute(Qt::WA_Maemo5ShowProgressIndicator, busy);
93     setEnabled(!busy);
94 }
95
96 void SelectRemoteDlg::beginDownload(const QString &url, QNetworkAccessManager *nam)
97 {
98     nam->get(QNetworkRequest(QUrl(url)));
99     setBusy(true);
100 }
101
102 void SelectRemoteDlg::alphabetItemChanged(QListWidgetItem *current,
103                                       QListWidgetItem * /*previous*/)
104 {
105     mfgList->clear();
106     modelList->clear();
107     if (current)
108     {
109         mfgList->addItems(remoteList->manufacturers(current->text()));
110     }
111 }
112
113 void SelectRemoteDlg::listDownloadFinished(QNetworkReply *reply)
114 {
115     if (reply->error() == QNetworkReply::NoError) {
116         QByteArray ba = reply->readAll();
117         QBuffer buf(&ba, this);
118         buf.open(QIODevice::ReadOnly);
119         buf.seek(0);
120         remoteList = new RemoteList(buf);
121         alist = remoteList->letters();
122         for (int i = 0; i < alist.size(); ++i)
123         {
124             alphabetList->addItem(QString(alist[i]));
125         }
126     } else {
127         //qDebug() << (int)reply->error();
128     }
129     reply->close();
130     reply->deleteLater();
131     setBusy(false);
132 }
133
134 void SelectRemoteDlg::mfgItemChanged(QListWidgetItem *current,
135                                      QListWidgetItem * /*previous*/)
136 {
137     modelList->clear();
138     deviceNameMap->clear();
139     if (current)
140     {
141         QList<Model> models = remoteList->models(current->text());
142         for (int i = 0; i < models.size(); ++i)
143         {
144             modelList->addItem(models[i].name);
145             deviceNameMap->insert(models[i].name, models[i].file);
146         }
147
148     }
149 }
150
151 void SelectRemoteDlg::downloadRemote()
152 {
153     QListWidgetItem *currentModel = modelList->currentItem();
154     if (currentModel)
155     {
156         QString name = currentModel->text();
157         if (!name.isEmpty()) {
158             QString url = settings->value(
159                     "remoteUrl",
160                     "http://mercury.wipsl.com/irwi/uploaded/").toString() 
161                     + (*deviceNameMap)[name];
162             beginDownload(url, remoteNetAM);
163             settings->setValue("remoteName", name);
164         }
165     }
166 }
167
168 void SelectRemoteDlg::remoteDownloadFinished(QNetworkReply *reply)
169 {
170     if (reply->error() == QNetworkReply::NoError) {
171         QFile file(settings->value("lircConf", "/etc/lircd.conf").toString());
172         if(file.open(QIODevice::WriteOnly))
173         {
174             file.write(reply->readAll());
175             file.close();
176         }
177     }
178     reply->close();
179     reply->deleteLater();
180
181     std::system("sudo /etc/init.d/lirc reload");
182
183     emit remoteDownloaded();
184     setBusy(false);
185     QMessageBox mbox(QMessageBox::Information, tr("Success"),
186             tr("Remote downloaded"), QMessageBox::Ok, this);
187     mbox.exec();
188     this->close();
189 }
190