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