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