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