X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Fselectremotedlg.cpp;h=8b1085efb5f51be3a4262782dbf0aeeb2f354223;hb=25589f8d9af69b7be64a606236f180f005dfd739;hp=898c6e144a3b016c6d29dc361634320569e998b1;hpb=e31b792996b7d8586c5f16b246d8e46cfab657af;p=irwi diff --git a/src/selectremotedlg.cpp b/src/selectremotedlg.cpp index 898c6e1..8b1085e 100644 --- a/src/selectremotedlg.cpp +++ b/src/selectremotedlg.cpp @@ -1,51 +1,43 @@ #include "selectremotedlg.h" -#include "remotelist.h" -#include "model.h" +#include "remote.h" +#include "remotelistwidgetitem.h" +#include "onlinepollerthread.h" -#include - -#include #include #include #include #include #include #include -#include -#include -#include -#include -#include #include #include #include #include -#include -#include SelectRemoteDlg::SelectRemoteDlg(QWidget *parent) : QDialog(parent) { + onlinePollerThread = NULL; this->setWindowTitle(tr("Select remote")); this->setMinimumHeight(320); - deviceNameMap = new QMap(); - settings = new QSettings(this); - remoteList = NULL; - layout = new QHBoxLayout(this); alphabetList = new QListWidget(this); alphabetList->setMaximumWidth(96); layout->addWidget(alphabetList); - connect(alphabetList, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), - this, SLOT(alphabetItemChanged(QListWidgetItem*, QListWidgetItem*))); + connect(alphabetList, + SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), + this, + SLOT(alphabetItemChanged(QListWidgetItem*, QListWidgetItem*))); mfgList = new QListWidget(this); layout->addWidget(mfgList); - connect(mfgList, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), - this, SLOT(mfgItemChanged(QListWidgetItem*, QListWidgetItem*))); + connect(mfgList, + SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), + this, + SLOT(mfgItemChanged(QListWidgetItem*, QListWidgetItem*))); modelList = new QListWidget(this); layout->addWidget(modelList); @@ -56,43 +48,32 @@ SelectRemoteDlg::SelectRemoteDlg(QWidget *parent) this, SLOT(downloadRemote())); this->setLayout(layout); - - //TODO caching? - listNetAM = new QNetworkAccessManager(this); - connect(listNetAM, SIGNAL(finished(QNetworkReply*)), - this, SLOT(listDownloadFinished(QNetworkReply*))); - - remoteNetAM = new QNetworkAccessManager(this); - connect(remoteNetAM, SIGNAL(finished(QNetworkReply*)), - this, SLOT(remoteDownloadFinished(QNetworkReply*))); - beginDownload(settings->value("dbUrl", - "http://mercury.wipsl.com/irwi/db.xml").toString(), listNetAM); + connect(&remoteDBMgr, SIGNAL(dbReady(RemoteDB*)), + this, SLOT(setDB(RemoteDB*))); } SelectRemoteDlg::~SelectRemoteDlg() { delete layout; - delete settings; - delete listNetAM; - delete remoteNetAM; - delete deviceNameMap; - if (remoteList) - { - delete remoteList; + if (onlinePollerThread != NULL) { + onlinePollerThread->stop(); + onlinePollerThread->wait(); + delete onlinePollerThread; + onlinePollerThread = NULL; } } -void SelectRemoteDlg::setBusy(bool busy) +void SelectRemoteDlg::setDB(RemoteDB *db) { - setAttribute(Qt::WA_Maemo5ShowProgressIndicator, busy); - setEnabled(!busy); + remoteDB = db; + alphabetList->addItems(remoteDB->keys()); + setBusy(false); } -void SelectRemoteDlg::beginDownload(const QString &url, - QNetworkAccessManager *nam) +void SelectRemoteDlg::setBusy(bool busy) { - nam->get(QNetworkRequest(QUrl(url))); - setBusy(true); + setAttribute(Qt::WA_Maemo5ShowProgressIndicator, busy); + setEnabled(!busy); } void SelectRemoteDlg::alphabetItemChanged(QListWidgetItem *current, @@ -102,87 +83,65 @@ void SelectRemoteDlg::alphabetItemChanged(QListWidgetItem *current, modelList->clear(); if (current) { - mfgList->addItems(remoteList->manufacturers(current->text())); + mfgList->addItems((*remoteDB)[current->text()].keys()); } } -void SelectRemoteDlg::listDownloadFinished(QNetworkReply *reply) -{ - if (reply->error() == QNetworkReply::NoError) { - QByteArray ba = reply->readAll(); - QBuffer buf(&ba, this); - buf.open(QIODevice::ReadOnly); - buf.seek(0); - QDomDocument doc; - doc.setContent(&buf); - remoteList = new RemoteList(doc); - QStringList alist = remoteList->letters(); - for (int i = 0; i < alist.size(); ++i) - { - alphabetList->addItem(QString(alist[i])); - } - } else { - //qDebug() << (int)reply->error(); - } - reply->close(); - reply->deleteLater(); - setBusy(false); -} - void SelectRemoteDlg::mfgItemChanged(QListWidgetItem *current, QListWidgetItem * /*previous*/) { modelList->clear(); - deviceNameMap->clear(); if (current) { - QList models = remoteList->models(current->text()); - for (int i = 0; i < models.size(); ++i) - { - modelList->addItem(models[i].name); - deviceNameMap->insert(models[i].name, models[i].file); + RemoteList remotes = + (*remoteDB)[alphabetList->currentItem()->text()][current->text()]; + foreach(Remote *remote, remotes) { + modelList->addItem(new RemoteListWidgetItem(remote)); } - } } void SelectRemoteDlg::downloadRemote() { - QListWidgetItem *currentModel = modelList->currentItem(); + RemoteListWidgetItem *currentModel = + static_cast(modelList->currentItem()); if (currentModel) { - QString name = currentModel->text(); - if (!name.isEmpty()) { - QString url = settings->value( - "remoteUrl", - "http://mercury.wipsl.com/irwi/uploaded/").toString() - + (*deviceNameMap)[name]; - beginDownload(url, remoteNetAM); - settings->setValue("remoteName", name); - } + setBusy(); + connect(currentModel->remote(), SIGNAL(saveFinished()), + this, SLOT(close())); + currentModel->remote()->saveToFile(); + + emit remoteChanged(*(currentModel->remote())); } } -void SelectRemoteDlg::remoteDownloadFinished(QNetworkReply *reply) +void SelectRemoteDlg::getDB() { - if (reply->error() == QNetworkReply::NoError) { - QFile file(settings->value("lircConf", "/etc/lircd.conf").toString()); - if(file.open(QIODevice::WriteOnly)) - { - file.write(reply->readAll()); - file.close(); - } + if (onlinePollerThread != NULL) { + onlinePollerThread->stop(); + onlinePollerThread->wait(); + delete onlinePollerThread; + onlinePollerThread = NULL; } - reply->close(); - reply->deleteLater(); + remoteDBMgr.getDBAsync(); +} - std::system("sudo /etc/init.d/lirc reload"); +void SelectRemoteDlg::refreshDB() +{ + setBusy(true); + if (onlinePollerThread != NULL) { + delete onlinePollerThread; + } + onlinePollerThread = new OnlinePollerThread(); + connect(onlinePollerThread, SIGNAL(online()), + this, SLOT(getDB())); + onlinePollerThread->run(); +} - emit remoteDownloaded(); - setBusy(false); - QMessageBox mbox(QMessageBox::Information, tr("Success"), - tr("Remote downloaded"), QMessageBox::Ok, this); - mbox.exec(); - this->close(); +void SelectRemoteDlg::showEvent(QShowEvent *event) +{ + refreshDB(); + QDialog::showEvent(event); }