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