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