00001 #include "selectremotedlg.h"
00002
00003 #include <cstdlib>
00004
00005 #include <QDebug>
00006 #include <QHBoxLayout>
00007 #include <QLabel>
00008 #include <QString>
00009 #include <QListWidget>
00010 #include <QListWidgetItem>
00011 #include <QSettings>
00012 #include <QtNetwork/QNetworkAccessManager>
00013 #include <QtNetwork/QNetworkReply>
00014 #include <QBuffer>
00015 #include <QByteArray>
00016 #include <QFile>
00017 #include <QMap>
00018 #include <QMessageBox>
00019 #include <QPushButton>
00020 #include <QListWidgetItem>
00021
00022 SelectRemoteDlg::SelectRemoteDlg(QWidget *parent)
00023 : QDialog(parent)
00024 {
00025 this->setWindowTitle(tr("Select remote"));
00026 this->setMinimumHeight(320);
00027
00028 deviceNameMap = new QMap<QString, QString>();
00029
00030
00031 mfgNetAM = new QNetworkAccessManager(this);
00032 connect(mfgNetAM, SIGNAL(finished(QNetworkReply*)),
00033 this, SLOT(mfgListDownloadFinished(QNetworkReply*)));
00034
00035 modelNetAM = new QNetworkAccessManager(this);
00036 connect(modelNetAM, SIGNAL(finished(QNetworkReply*)),
00037 this, SLOT(modelListDownloadFinished(QNetworkReply*)));
00038
00039 remoteNetAM = new QNetworkAccessManager(this);
00040 connect(remoteNetAM, SIGNAL(finished(QNetworkReply*)),
00041 this, SLOT(remoteDownloadFinished(QNetworkReply*)));
00042
00043 settings = new QSettings(this);
00044
00045 layout = new QHBoxLayout(this);
00046
00047 alphabetList = new QListWidget(this);
00048 alphabetList->setMaximumWidth(96);
00049 for (char c = 'a'; c <= 'z'; ++c)
00050 {
00051 alphabetList->addItem(QString(c));
00052 }
00053 layout->addWidget(alphabetList);
00054 connect(alphabetList, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)),
00055 this, SLOT(alphabetItemChanged(QListWidgetItem*, QListWidgetItem*)));
00056
00057 mfgList = new QListWidget(this);
00058 layout->addWidget(mfgList);
00059 connect(mfgList, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)),
00060 this, SLOT(mfgItemChanged(QListWidgetItem*, QListWidgetItem*)));
00061
00062 modelList = new QListWidget(this);
00063 layout->addWidget(modelList);
00064
00065 downloadBtn = new QPushButton(tr("Download"), this);
00066 layout->addWidget(downloadBtn);
00067 connect(downloadBtn, SIGNAL(clicked()),
00068 this, SLOT(downloadRemote()));
00069
00070 this->setLayout(layout);
00071 }
00072
00073 SelectRemoteDlg::~SelectRemoteDlg()
00074 {
00075 delete layout;
00076 layout = NULL;
00077 delete settings;
00078 settings = NULL;
00079 delete mfgNetAM;
00080 mfgNetAM = NULL;
00081 delete modelNetAM;
00082 modelNetAM = NULL;
00083 delete remoteNetAM;
00084 remoteNetAM = NULL;
00085 delete deviceNameMap;
00086 deviceNameMap = NULL;
00087 }
00088
00089 void SelectRemoteDlg::setBusy(bool busy)
00090 {
00091 setAttribute(Qt::WA_Maemo5ShowProgressIndicator, busy);
00092 setEnabled(!busy);
00093 }
00094
00095 void SelectRemoteDlg::beginDownload(const QString &url, QNetworkAccessManager *nam)
00096 {
00097 nam->get(QNetworkRequest(QUrl(url)));
00098 setBusy(true);
00099 }
00100
00101 void SelectRemoteDlg::alphabetItemChanged(QListWidgetItem *current,
00102 QListWidgetItem * )
00103 {
00104 QString url = settings->value("remoteUrl",
00105 "http://mercury.wipsl.com/irwi/remotes/").toString() +
00106 current->text() + ".txt";
00107 beginDownload(url, mfgNetAM);
00108 }
00109
00110 void SelectRemoteDlg::mfgListDownloadFinished(QNetworkReply *reply)
00111 {
00112 mfgList->clear();
00113 modelList->clear();
00114 if (reply->error() == QNetworkReply::NoError) {
00115 QByteArray ba = reply->readAll();
00116 QBuffer buf(&ba, this);
00117 buf.open(QIODevice::ReadOnly);
00118 buf.seek(0);
00119 while (buf.canReadLine())
00120 {
00121 QString str(buf.readLine());
00122 str.chop(1);
00123 mfgList->addItem(str);
00124 }
00125 } else {
00126
00127 }
00128 reply->close();
00129 reply->deleteLater();
00130 setBusy(false);
00131 }
00132
00133 void SelectRemoteDlg::mfgItemChanged(QListWidgetItem *current,
00134 QListWidgetItem * )
00135 {
00136 if (mfgList->currentItem() != NULL) {
00137 QString url = settings->value(
00138 "remoteUrl", "http://mercury.wipsl.com/irwi/remotes/").toString()
00139 + alphabetList->currentItem()->text()
00140 + "/" + current->text() + ".txt";
00141 beginDownload(url, modelNetAM);
00142 }
00143 }
00144
00145 void SelectRemoteDlg::modelListDownloadFinished(QNetworkReply *reply)
00146 {
00147 modelList->clear();
00148 if (reply->error() == QNetworkReply::NoError) {
00149 QByteArray ba = reply->readAll();
00150 QBuffer buf(&ba, this);
00151 buf.open(QIODevice::ReadOnly);
00152 buf.seek(0);
00153 deviceNameMap->clear();
00154 while (buf.canReadLine())
00155 {
00156 QString str(buf.readLine());
00157 str.chop(1);
00158 QStringList strlist = str.split(":");
00159 if (strlist.count() == 2) {
00160 modelList->addItem(strlist[1]);
00161 deviceNameMap->insert(strlist[1], strlist[0]);
00162 }
00163 }
00164 } else {
00165
00166 }
00167 reply->close();
00168 reply->deleteLater();
00169 setBusy(false);
00170 }
00171
00172 void SelectRemoteDlg::downloadRemote()
00173 {
00174 QListWidgetItem *currentAlpha = alphabetList->currentItem();
00175 QListWidgetItem *currentMfg = mfgList->currentItem();
00176 QListWidgetItem *currentModel = modelList->currentItem();
00177 if (currentModel && currentMfg && currentAlpha)
00178 {
00179 if (!currentModel->text().isEmpty()) {
00180 QString url = settings->value(
00181 "remoteUrl",
00182 "http://mercury.wipsl.com/irwi/remotes/").toString()
00183 + currentAlpha->text()
00184 + "/" + currentMfg->text()
00185 + "/" + (*deviceNameMap)[currentModel->text()];
00186 beginDownload(url, remoteNetAM);
00187 settings->setValue("remoteName", currentModel->text());
00188 }
00189 }
00190 }
00191
00192 void SelectRemoteDlg::remoteDownloadFinished(QNetworkReply *reply)
00193 {
00194 if (reply->error() == QNetworkReply::NoError) {
00195 QFile file(settings->value("lircConf", "/etc/lircd.conf").toString());
00196 if(file.open(QIODevice::WriteOnly))
00197 {
00198 file.write(reply->readAll());
00199 file.close();
00200 }
00201 }
00202 reply->close();
00203 reply->deleteLater();
00204
00205 std::system("sudo /etc/init.d/lirc restart");
00206
00207 emit remoteDownloaded();
00208 setBusy(false);
00209 QMessageBox mbox(QMessageBox::Information, tr("Success"),
00210 tr("Remote downloaded"), QMessageBox::Ok, this);
00211 mbox.exec();
00212 this->close();
00213 }
00214