summaryrefslogtreecommitdiff
path: root/rbutil/rbutilqt/themesinstallwindow.cpp
diff options
context:
space:
mode:
authorDominik Riebeling <Dominik.Riebeling@gmail.com>2009-03-31 19:50:43 +0000
committerDominik Riebeling <Dominik.Riebeling@gmail.com>2009-03-31 19:50:43 +0000
commit270106d151af76140737a080f2ff50db9b3fbfbe (patch)
tree5d8cf5e64fdffd19ef8939ffbb0f9cfc14c9c308 /rbutil/rbutilqt/themesinstallwindow.cpp
parente2c69c59c45aa890aa6b5ae22a3c4a7939ec7b2d (diff)
downloadrockbox-270106d151af76140737a080f2ff50db9b3fbfbe.zip
rockbox-270106d151af76140737a080f2ff50db9b3fbfbe.tar.gz
rockbox-270106d151af76140737a080f2ff50db9b3fbfbe.tar.bz2
rockbox-270106d151af76140737a080f2ff50db9b3fbfbe.tar.xz
Rename ThemeInstall class files to actually match the class name.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@20594 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'rbutil/rbutilqt/themesinstallwindow.cpp')
-rw-r--r--rbutil/rbutilqt/themesinstallwindow.cpp335
1 files changed, 335 insertions, 0 deletions
diff --git a/rbutil/rbutilqt/themesinstallwindow.cpp b/rbutil/rbutilqt/themesinstallwindow.cpp
new file mode 100644
index 0000000..fb3fbe4
--- /dev/null
+++ b/rbutil/rbutilqt/themesinstallwindow.cpp
@@ -0,0 +1,335 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ *
+ * Copyright (C) 2007 by Dominik Riebeling
+ * $Id$
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#include <QtGui>
+
+#include "ui_themesinstallfrm.h"
+#include "themesinstallwindow.h"
+#include "installzip.h"
+#include "progressloggergui.h"
+#include "utils.h"
+
+ThemesInstallWindow::ThemesInstallWindow(QWidget *parent) : QDialog(parent)
+{
+ ui.setupUi(this);
+ ui.listThemes->setAlternatingRowColors(true);
+ ui.listThemes->setSelectionMode(QAbstractItemView::ExtendedSelection);
+ ui.listThemes->setSortingEnabled(true);
+ ui.themePreview->clear();
+ ui.themePreview->setText(tr("no theme selected"));
+ ui.labelSize->setText(tr("no selection"));
+
+ connect(ui.buttonCancel, SIGNAL(clicked()), this, SLOT(close()));
+ connect(ui.buttonOk, SIGNAL(clicked()), this, SLOT(accept()));
+ connect(ui.listThemes, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)),
+ this, SLOT(updateDetails(QListWidgetItem*, QListWidgetItem*)));
+ connect(ui.listThemes, SIGNAL(itemSelectionChanged()), this, SLOT(updateSize()));
+ connect(&igetter, SIGNAL(done(bool)), this, SLOT(updateImage(bool)));
+}
+
+ThemesInstallWindow::~ThemesInstallWindow()
+{
+ if(infocachedir!="")
+ recRmdir(infocachedir);
+}
+
+
+void ThemesInstallWindow::downloadInfo()
+{
+ // try to get the current build information
+ getter = new HttpGet(this);
+
+ qDebug() << "downloading themes info";
+ themesInfo.open();
+ qDebug() << "file:" << themesInfo.fileName();
+ themesInfo.close();
+
+ QUrl url;
+ url = QUrl(settings->themeUrl() + "/rbutilqt.php?target="
+ + settings->curConfigure_Modelname());
+ qDebug() << "downloadInfo()" << url;
+ qDebug() << url.queryItems();
+ if(settings->cacheOffline())
+ getter->setCache(true);
+ getter->setFile(&themesInfo);
+
+ connect(getter, SIGNAL(done(bool)), this, SLOT(downloadDone(bool)));
+ connect(logger, SIGNAL(aborted()), getter, SLOT(abort()));
+ getter->getFile(url);
+}
+
+
+void ThemesInstallWindow::downloadDone(int id, bool error)
+{
+ downloadDone(error);
+ qDebug() << "downloadDone(bool) =" << id << error;
+}
+
+
+void ThemesInstallWindow::downloadDone(bool error)
+{
+ qDebug() << "downloadDone(bool) =" << error;
+
+ disconnect(logger, SIGNAL(aborted()), getter, SLOT(abort()));
+ disconnect(logger, SIGNAL(aborted()), this, SLOT(close()));
+ themesInfo.open();
+
+ QSettings iniDetails(themesInfo.fileName(), QSettings::IniFormat, this);
+ QStringList tl = iniDetails.childGroups();
+ qDebug() << iniDetails.value("error/code").toString()
+ << iniDetails.value("error/description").toString()
+ << iniDetails.value("error/query").toString();
+
+ if(error) {
+ logger->addItem(tr("Network error: %1.\n"
+ "Please check your network and proxy settings.")
+ .arg(getter->errorString()), LOGERROR);
+ getter->abort();
+ logger->abort();
+ disconnect(getter, SIGNAL(done(bool)), this, SLOT(downloadDone(bool)));
+ connect(logger, SIGNAL(closed()), this, SLOT(close()));
+ return;
+ }
+ // handle possible error codes
+ if(iniDetails.value("error/code").toInt() != 0 || !iniDetails.contains("error/code")) {
+ qDebug() << "error!";
+ logger->addItem(tr("the following error occured:\n%1")
+ .arg(iniDetails.value("error/description", "unknown error").toString()), LOGERROR);
+ logger->abort();
+ connect(logger, SIGNAL(closed()), this, SLOT(close()));
+ return;
+ }
+ logger->addItem(tr("done."), LOGOK);
+ logger->abort();
+ logger->close();
+
+ // setup list
+ for(int i = 0; i < tl.size(); i++) {
+ iniDetails.beginGroup(tl.at(i));
+ // skip all themes without name field set (i.e. error section)
+ if(iniDetails.value("name").toString().isEmpty()) {
+ iniDetails.endGroup();
+ continue;
+ }
+ qDebug() << "adding theme:" << tl.at(i);
+ QListWidgetItem *w = new QListWidgetItem;
+ w->setData(Qt::DisplayRole, iniDetails.value("name").toString());
+ w->setData(Qt::UserRole, tl.at(i));
+ ui.listThemes->addItem(w);
+
+ iniDetails.endGroup();
+ }
+ // check if there's a themes "MOTD" available
+ if(iniDetails.contains("status/msg")) {
+ // check if there's a localized msg available
+ QString lang = settings->curLang().split("_").at(0);
+ QString msg;
+ if(iniDetails.contains("status/msg." + lang))
+ msg = iniDetails.value("status/msg." + lang).toString();
+ else
+ msg = iniDetails.value("status/msg").toString();
+ qDebug() << "[Themes] MOTD" << msg;
+ if(!msg.isEmpty())
+ QMessageBox::information(this, tr("Information"), msg);
+ }
+}
+
+
+void ThemesInstallWindow::updateSize(void)
+{
+ long size = 0;
+ // sum up size for all selected themes
+ QSettings iniDetails(themesInfo.fileName(), QSettings::IniFormat, this);
+ int items = ui.listThemes->selectedItems().size();
+ for(int i = 0; i < items; i++) {
+ iniDetails.beginGroup(ui.listThemes->selectedItems()
+ .at(i)->data(Qt::UserRole).toString());
+ size += iniDetails.value("size").toInt();
+ iniDetails.endGroup();
+ }
+ ui.labelSize->setText(tr("Download size %L1 kiB (%n item(s))", "", items)
+ .arg((size + 512) / 1024));
+}
+
+
+void ThemesInstallWindow::updateDetails(QListWidgetItem* cur, QListWidgetItem* prev)
+{
+ if(cur == prev)
+ return;
+
+ QSettings iniDetails(themesInfo.fileName(), QSettings::IniFormat, this);
+
+ QCoreApplication::processEvents();
+ ui.themeDescription->setText(tr("fetching details for %1")
+ .arg(cur->data(Qt::DisplayRole).toString()));
+ ui.themePreview->clear();
+ ui.themePreview->setText(tr("fetching preview ..."));
+
+ iniDetails.beginGroup(cur->data(Qt::UserRole).toString());
+
+ QUrl img, txt;
+ txt = QUrl(QString(settings->themeUrl() + "/"
+ + iniDetails.value("descriptionfile").toString()));
+ img = QUrl(QString(settings->themeUrl() + "/"
+ + iniDetails.value("image").toString()));
+
+ QString text;
+ text = tr("<b>Author:</b> %1<hr/>").arg(iniDetails.value("author",
+ tr("unknown")).toString());
+ text += tr("<b>Version:</b> %1<hr/>").arg(iniDetails.value("version",
+ tr("unknown")).toString());
+ text += tr("<b>Description:</b> %1<hr/>").arg(iniDetails.value("about",
+ tr("no description")).toString());
+
+ ui.themeDescription->setHtml(text);
+ iniDetails.endGroup();
+
+ igetter.abort();
+ if(!settings->cacheDisabled())
+ igetter.setCache(true);
+ else
+ {
+ if(infocachedir=="")
+ {
+ infocachedir = QDir::tempPath() + "rbutil-themeinfo";
+ QDir d = QDir::temp();
+ d.mkdir("rbutil-themeinfo");
+ }
+ igetter.setCache(infocachedir);
+ }
+
+ igetter.getFile(img);
+}
+
+
+void ThemesInstallWindow::updateImage(bool error)
+{
+ qDebug() << "updateImage(bool) =" << error;
+
+ if(error) {
+ ui.themePreview->clear();
+ ui.themePreview->setText(tr("Retrieving theme preview failed.\n"
+ "HTTP response code: %1").arg(igetter.httpResponse()));
+ return;
+ }
+
+ QPixmap p;
+ if(!error) {
+ imgData = igetter.readAll();
+ if(imgData.isNull()) return;
+ p.loadFromData(imgData);
+ if(p.isNull()) {
+ ui.themePreview->clear();
+ ui.themePreview->setText(tr("no theme preview"));
+ }
+ else
+ ui.themePreview->setPixmap(p);
+ }
+}
+
+
+void ThemesInstallWindow::resizeEvent(QResizeEvent* e)
+{
+ qDebug() << "resizeEvent(QResizeEvent*) =" << e;
+
+ QPixmap p, q;
+ QSize img;
+ img.setHeight(ui.themePreview->height());
+ img.setWidth(ui.themePreview->width());
+
+ p.loadFromData(imgData);
+ if(p.isNull()) return;
+ q = p.scaled(img, Qt::KeepAspectRatio, Qt::SmoothTransformation);
+ ui.themePreview->setScaledContents(false);
+ ui.themePreview->setPixmap(p);
+}
+
+
+
+void ThemesInstallWindow::show()
+{
+ QDialog::show();
+ logger = new ProgressLoggerGui(this);
+ logger->show();
+ logger->addItem(tr("getting themes information ..."), LOGINFO);
+
+ connect(logger, SIGNAL(aborted()), this, SLOT(close()));
+
+ downloadInfo();
+
+}
+
+
+void ThemesInstallWindow::abort()
+{
+ igetter.abort();
+ logger->abort();
+ this->close();
+}
+
+
+void ThemesInstallWindow::accept()
+{
+ if(ui.listThemes->selectedItems().size() == 0) {
+ this->close();
+ return;
+ }
+ QStringList themes;
+ QStringList names;
+ QStringList version;
+ QString zip;
+ QSettings iniDetails(themesInfo.fileName(), QSettings::IniFormat, this);
+ for(int i = 0; i < ui.listThemes->selectedItems().size(); i++) {
+ iniDetails.beginGroup(ui.listThemes->selectedItems().at(i)->data(Qt::UserRole).toString());
+ zip = settings->themeUrl()
+ + "/" + iniDetails.value("archive").toString();
+ themes.append(zip);
+ names.append("Theme: " +
+ ui.listThemes->selectedItems().at(i)->data(Qt::DisplayRole).toString());
+ // if no version info is available use installation (current) date
+ version.append(iniDetails.value("version",
+ QDate().currentDate().toString("yyyyMMdd")).toString());
+ iniDetails.endGroup();
+ }
+ qDebug() << "installing themes:" << themes;
+
+ logger = new ProgressLoggerGui(this);
+ logger->show();
+ QString mountPoint = settings->mountpoint();
+ qDebug() << "mountpoint:" << mountPoint;
+ // show dialog with error if mount point is wrong
+ if(!QFileInfo(mountPoint).isDir()) {
+ logger->addItem(tr("Mount point is wrong!"),LOGERROR);
+ logger->abort();
+ return;
+ }
+
+ installer = new ZipInstaller(this);
+ installer->setUrl(themes);
+ installer->setLogSection(names);
+ installer->setLogVersion(version);
+ installer->setMountPoint(mountPoint);
+ if(!settings->cacheDisabled())
+ installer->setCache(true);
+
+ connect(logger, SIGNAL(closed()), this, SLOT(close()));
+ installer->install(logger);
+
+}
+