Added a download button to selectremotedlg
[irwi] / src / selectremotedlg.cpp
1 #include "selectremotedlg.h"
2
3 #include <cstdlib>
4
5 #include <QDebug>
6 #include <QHBoxLayout>
7 #include <QLabel>
8 #include <QString>
9 #include <QListWidget>
10 #include <QListWidgetItem>
11 #include <QSettings>
12 #include <QtNetwork/QNetworkAccessManager>
13 #include <QtNetwork/QNetworkReply>
14 #include <QBuffer>
15 #include <QByteArray>
16 #include <QFile>
17 #include <QMap>
18 #include <QMessageBox>
19 #include <QPushButton>
20 #include <QListWidgetItem>
21
22 SelectRemoteDlg::SelectRemoteDlg(QWidget *parent)
23     : QDialog(parent)
24 {
25     this->setWindowTitle(tr("Select remote"));
26
27     deviceNameMap = new QMap<QString, QString>();
28
29     //TODO caching?
30     mfgNetAM = new QNetworkAccessManager(this);
31     connect(mfgNetAM, SIGNAL(finished(QNetworkReply*)), 
32             this,  SLOT(mfgListDownloadFinished(QNetworkReply*)));
33
34     modelNetAM = new QNetworkAccessManager(this);
35     connect(modelNetAM, SIGNAL(finished(QNetworkReply*)), 
36             this,  SLOT(modelListDownloadFinished(QNetworkReply*)));
37
38     remoteNetAM = new QNetworkAccessManager(this);
39     connect(remoteNetAM, SIGNAL(finished(QNetworkReply*)), 
40             this,  SLOT(remoteDownloadFinished(QNetworkReply*)));
41     
42     settings = new QSettings(this);
43
44     layout = new QHBoxLayout(this);
45
46     alphabetList = new QListWidget(this);
47     for (char c = 'a'; c <= 'z'; ++c)
48     {
49         alphabetList->addItem(QString(c));
50     }
51     layout->addWidget(alphabetList);
52     connect(alphabetList, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)),
53                 this, SLOT(alphabetItemChanged(QListWidgetItem*, QListWidgetItem*)));
54     
55     mfgList = new QListWidget(this);
56     layout->addWidget(mfgList);
57     connect(mfgList, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)),
58                 this, SLOT(mfgItemChanged(QListWidgetItem*, QListWidgetItem*)));
59
60     modelList = new QListWidget(this);
61     layout->addWidget(modelList);
62
63     downloadBtn = new QPushButton(tr("Download"), this);
64     layout->addWidget(downloadBtn);
65     connect(downloadBtn, SIGNAL(clicked()), 
66             this, SLOT(downloadRemote()));
67
68     this->setLayout(layout);
69 }
70
71 SelectRemoteDlg::~SelectRemoteDlg()
72 {
73     delete layout;
74     layout = NULL;
75     delete settings;
76     settings = NULL;
77     delete mfgNetAM;
78     mfgNetAM = NULL;
79     delete modelNetAM;
80     modelNetAM = NULL;
81     delete remoteNetAM;
82     remoteNetAM = NULL;
83     delete deviceNameMap;
84     deviceNameMap = NULL;
85 }
86
87 void SelectRemoteDlg::setBusy(bool busy)
88 {
89     setAttribute(Qt::WA_Maemo5ShowProgressIndicator, busy);
90     setEnabled(!busy);
91 }
92
93 void SelectRemoteDlg::beginDownload(const QString &url, QNetworkAccessManager *nam)
94 {
95     nam->get(QNetworkRequest(QUrl(url)));
96     setBusy(true);
97 }
98
99 void SelectRemoteDlg::alphabetItemChanged(QListWidgetItem *current,
100                                       QListWidgetItem * /*previous*/)
101 {
102     QString url = settings->value("remoteUrl",
103             "http://mercury.wipsl.com/irwi/remotes/").toString() +
104             current->text() + ".txt";
105     beginDownload(url, mfgNetAM);
106 }
107
108 void SelectRemoteDlg::mfgListDownloadFinished(QNetworkReply *reply)
109 {
110     mfgList->clear();
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         while (buf.canReadLine())
117         {
118             QString str(buf.readLine());
119             str.chop(1);
120             mfgList->addItem(str);
121         }
122     } else {
123         //qDebug() << (int)reply->error();
124     }
125     reply->close();
126     reply->deleteLater();
127     setBusy(false);
128 }
129
130 void SelectRemoteDlg::mfgItemChanged(QListWidgetItem *current,
131                                      QListWidgetItem * /*previous*/)
132 {
133     if (mfgList->currentItem() != NULL) {
134         QString url = settings->value(
135                 "remoteUrl", "http://mercury.wipsl.com/irwi/remotes/").toString() 
136             + alphabetList->currentItem()->text()
137             + "/" + current->text() + ".txt";
138         beginDownload(url, modelNetAM);
139     }
140 }
141
142 void SelectRemoteDlg::modelListDownloadFinished(QNetworkReply *reply)
143 {
144     modelList->clear();
145     if (reply->error() == QNetworkReply::NoError) {
146         QByteArray ba = reply->readAll();
147         QBuffer buf(&ba, this);
148         buf.open(QIODevice::ReadOnly);
149         buf.seek(0);
150         deviceNameMap->clear();
151         while (buf.canReadLine())
152         {
153             QString str(buf.readLine());
154             str.chop(1);
155             QStringList strlist = str.split(":");
156             if (strlist.count() == 2) {
157                 modelList->addItem(strlist[1]);
158                 deviceNameMap->insert(strlist[1], strlist[0]);
159             }
160         }
161     } else {
162         //qDebug() << (int)reply->error();
163     }
164     reply->close();
165     reply->deleteLater();
166     setBusy(false);
167 }
168
169 void SelectRemoteDlg::downloadRemote()
170 {
171     QListWidgetItem *current = modelList->currentItem();
172     if (current)
173     {
174         if (!current->text().isEmpty()) {
175             QString url = settings->value(
176                     "remoteUrl",
177                     "http://mercury.wipsl.com/irwi/remotes/").toString() 
178                     + alphabetList->currentItem()->text()
179                     + "/" + mfgList->currentItem()->text()
180                     + "/" + (*deviceNameMap)[current->text()];
181             beginDownload(url, remoteNetAM);
182             settings->setValue("remoteName", current->text());
183         }
184     }
185 }
186
187 void SelectRemoteDlg::remoteDownloadFinished(QNetworkReply *reply)
188 {
189     if (reply->error() == QNetworkReply::NoError) {
190         QFile file(settings->value("lircConf", "/etc/lircd.conf").toString());
191         if(file.open(QIODevice::WriteOnly))
192         {
193             file.write(reply->readAll());
194             file.close();
195         }
196     }
197     reply->close();
198     reply->deleteLater();
199
200     std::system("lircctl restart");
201
202     emit remoteDownloaded();
203     setBusy(false);
204     QMessageBox mbox(QMessageBox::Information, tr("Success"),
205             tr("Remote downloaded"), QMessageBox::Ok, this);
206     mbox.exec();
207     this->close();
208 }
209