6e4dd6e8310d43efb4a88468346488591ca5ee6c
[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     if (reply->error() == QNetworkReply::NoError) {
114         QByteArray ba = reply->readAll();
115         QBuffer buf(&ba, this);
116         buf.open(QIODevice::ReadOnly);
117         buf.seek(0);
118         while (buf.canReadLine())
119         {
120             QString str(buf.readLine());
121             str.chop(1);
122             mfgList->addItem(str);
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     if (mfgList->currentItem() != NULL) {
136         QString url = settings->value(
137                 "remoteUrl", "http://mercury.wipsl.com/irwi/remotes/").toString() 
138             + alphabetList->currentItem()->text()
139             + "/" + current->text() + ".txt";
140         beginDownload(url, modelNetAM);
141     }
142 }
143
144 void SelectRemoteDlg::modelListDownloadFinished(QNetworkReply *reply)
145 {
146     modelList->clear();
147     if (reply->error() == QNetworkReply::NoError) {
148         QByteArray ba = reply->readAll();
149         QBuffer buf(&ba, this);
150         buf.open(QIODevice::ReadOnly);
151         buf.seek(0);
152         deviceNameMap->clear();
153         while (buf.canReadLine())
154         {
155             QString str(buf.readLine());
156             str.chop(1);
157             QStringList strlist = str.split(":");
158             if (strlist.count() == 2) {
159                 modelList->addItem(strlist[1]);
160                 deviceNameMap->insert(strlist[1], strlist[0]);
161             }
162         }
163     } else {
164         //qDebug() << (int)reply->error();
165     }
166     reply->close();
167     reply->deleteLater();
168     setBusy(false);
169 }
170
171 void SelectRemoteDlg::downloadRemote()
172 {
173     QListWidgetItem *current = modelList->currentItem();
174     if (current)
175     {
176         if (!current->text().isEmpty()) {
177             QString url = settings->value(
178                     "remoteUrl",
179                     "http://mercury.wipsl.com/irwi/remotes/").toString() 
180                     + alphabetList->currentItem()->text()
181                     + "/" + mfgList->currentItem()->text()
182                     + "/" + (*deviceNameMap)[current->text()];
183             beginDownload(url, remoteNetAM);
184             settings->setValue("remoteName", current->text());
185         }
186     }
187 }
188
189 void SelectRemoteDlg::remoteDownloadFinished(QNetworkReply *reply)
190 {
191     if (reply->error() == QNetworkReply::NoError) {
192         QFile file(settings->value("lircConf", "/etc/lircd.conf").toString());
193         if(file.open(QIODevice::WriteOnly))
194         {
195             file.write(reply->readAll());
196             file.close();
197         }
198     }
199     reply->close();
200     reply->deleteLater();
201
202     std::system("sudo /etc/init.d/lirc restart");
203
204     emit remoteDownloaded();
205     setBusy(false);
206     QMessageBox mbox(QMessageBox::Information, tr("Success"),
207             tr("Remote downloaded"), QMessageBox::Ok, this);
208     mbox.exec();
209     this->close();
210 }
211