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