c8b7305e3941e18ccfe3c29e886cf6c8e931e779
[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::beginDownload(const QString &url, QNetworkAccessManager *nam)
83 {
84     nam->get(QNetworkRequest(QUrl(url)));
85 }
86
87 void SelectRemoteDlg::alphabetItemChanged(QListWidgetItem *current,
88                                       QListWidgetItem *previous)
89 {
90     QString url = settings->value("remoteUrl",
91             "http://mercury.wipsl.com/irwi/remotes/").toString() +
92             current->text() + ".txt";
93     beginDownload(url, mfgNetAM);
94 }
95
96 void SelectRemoteDlg::mfgListDownloadFinished(QNetworkReply *reply)
97 {
98     mfgList->clear();
99     if (reply->error() == QNetworkReply::NoError) {
100         QByteArray ba = reply->readAll();
101         QBuffer buf(&ba, this);
102         buf.open(QIODevice::ReadOnly);
103         buf.seek(0);
104         while (buf.canReadLine())
105         {
106             QString str(buf.readLine());
107             str.chop(1);
108             mfgList->addItem(str);
109         }
110     } else {
111         //qDebug() << (int)reply->error();
112     }
113     reply->close();
114     reply->deleteLater();
115 }
116
117 void SelectRemoteDlg::mfgItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
118 {
119     if (mfgList->currentItem() != NULL) {
120         QString url = settings->value(
121                 "remoteUrl", "http://mercury.wipsl.com/irwi/remotes/").toString() 
122             + alphabetList->currentItem()->text()
123             + "/" + current->text() + ".txt";
124         beginDownload(url, modelNetAM);
125     }
126 }
127
128 void SelectRemoteDlg::modelListDownloadFinished(QNetworkReply *reply)
129 {
130     modelList->clear();
131     if (reply->error() == QNetworkReply::NoError) {
132         QByteArray ba = reply->readAll();
133         QBuffer buf(&ba, this);
134         buf.open(QIODevice::ReadOnly);
135         buf.seek(0);
136         deviceNameMap->clear();
137         while (buf.canReadLine())
138         {
139             QString str(buf.readLine());
140             str.chop(1);
141             QStringList strlist = str.split(":");
142             if (strlist.count() == 2) {
143                 modelList->addItem(strlist[1]);
144                 deviceNameMap->insert(strlist[1], strlist[0]);
145             }
146         }
147     } else {
148         //qDebug() << (int)reply->error();
149     }
150     reply->close();
151     reply->deleteLater();
152 }
153
154 void SelectRemoteDlg::modelItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
155 {
156     if (current)
157     {
158         if (!current->text().isEmpty()) {
159             QString url = settings->value(
160                     "remoteUrl",
161                     "http://mercury.wipsl.com/irwi/remotes/").toString() 
162                     + alphabetList->currentItem()->text()
163                     + "/" + mfgList->currentItem()->text()
164                     + "/" + (*deviceNameMap)[current->text()];
165             beginDownload(url, remoteNetAM);
166             settings->setValue("remoteName", current->text());
167         }
168     }
169 }
170
171 void SelectRemoteDlg::remoteDownloadFinished(QNetworkReply *reply)
172 {
173     if (reply->error() == QNetworkReply::NoError) {
174         QFile file(settings->value("lircConf", "/etc/lircd.conf").toString());
175         if(file.open(QIODevice::WriteOnly))
176         {
177             file.write(reply->readAll());
178             file.close();
179         }
180     }
181     reply->close();
182     reply->deleteLater();
183
184     std::system("lircctl restart");
185
186     QMessageBox mbox(QMessageBox::Information, tr("Success"),
187             tr("Remote downloaded"), QMessageBox::Ok, this, Qt::Popup);
188     mbox.exec();
189     this->close();
190 }
191