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