Fixed some warnings.
[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,
118                                      QListWidgetItem * /*previous*/)
119 {
120     if (mfgList->currentItem() != NULL) {
121         QString url = settings->value(
122                 "remoteUrl", "http://mercury.wipsl.com/irwi/remotes/").toString() 
123             + alphabetList->currentItem()->text()
124             + "/" + current->text() + ".txt";
125         beginDownload(url, modelNetAM);
126     }
127 }
128
129 void SelectRemoteDlg::modelListDownloadFinished(QNetworkReply *reply)
130 {
131     modelList->clear();
132     if (reply->error() == QNetworkReply::NoError) {
133         QByteArray ba = reply->readAll();
134         QBuffer buf(&ba, this);
135         buf.open(QIODevice::ReadOnly);
136         buf.seek(0);
137         deviceNameMap->clear();
138         while (buf.canReadLine())
139         {
140             QString str(buf.readLine());
141             str.chop(1);
142             QStringList strlist = str.split(":");
143             if (strlist.count() == 2) {
144                 modelList->addItem(strlist[1]);
145                 deviceNameMap->insert(strlist[1], strlist[0]);
146             }
147         }
148     } else {
149         //qDebug() << (int)reply->error();
150     }
151     reply->close();
152     reply->deleteLater();
153 }
154
155 void SelectRemoteDlg::modelItemChanged(QListWidgetItem *current,
156                                        QListWidgetItem * /*previous*/)
157 {
158     if (current)
159     {
160         if (!current->text().isEmpty()) {
161             QString url = settings->value(
162                     "remoteUrl",
163                     "http://mercury.wipsl.com/irwi/remotes/").toString() 
164                     + alphabetList->currentItem()->text()
165                     + "/" + mfgList->currentItem()->text()
166                     + "/" + (*deviceNameMap)[current->text()];
167             beginDownload(url, remoteNetAM);
168             settings->setValue("remoteName", current->text());
169         }
170     }
171 }
172
173 void SelectRemoteDlg::remoteDownloadFinished(QNetworkReply *reply)
174 {
175     if (reply->error() == QNetworkReply::NoError) {
176         QFile file(settings->value("lircConf", "/etc/lircd.conf").toString());
177         if(file.open(QIODevice::WriteOnly))
178         {
179             file.write(reply->readAll());
180             file.close();
181         }
182     }
183     reply->close();
184     reply->deleteLater();
185
186     std::system("lircctl restart");
187
188     QMessageBox mbox(QMessageBox::Information, tr("Success"),
189             tr("Remote downloaded"), QMessageBox::Ok, this, Qt::Popup);
190     mbox.exec();
191     this->close();
192 }
193