Ignore:
Timestamp:
May 3, 2016, 2:14:41 PM (9 years ago)
Author:
Silvan Scherrer
Message:

smplayer: update vendor to version 16.4

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified smplayer/vendor/current/src/updatechecker.cpp

    r163 r175  
    11/*  smplayer, GUI front-end for mplayer.
    2     Copyright (C) 2006-2014 Ricardo Villalba <rvm@users.sourceforge.net>
     2    Copyright (C) 2006-2016 Ricardo Villalba <rvm@users.sourceforge.net>
    33
    44    This program is free software; you can redistribute it and/or modify
     
    1818
    1919#include "updatechecker.h"
     20#include "updatecheckerdata.h"
    2021#include "version.h"
    21 #include <QSettings>
     22#include "links.h"
    2223#include <QUrl>
    2324#include <QNetworkAccessManager>
     
    2728#include <QDate>
    2829#include <QDateTime>
    29 
    30 void UpdateCheckerData::save(QSettings * set) {
    31         set->beginGroup("update_checker");
    32         set->setValue("checked_date", last_checked);
    33         set->setValue("enabled", enabled);
    34         set->setValue("days_to_check", days_to_check);
    35         set->setValue("last_known_version", last_known_version);
    36         set->endGroup();
    37 }
    38 
    39 void UpdateCheckerData::load(QSettings * set) {
    40         set->beginGroup("update_checker");
    41         last_checked = set->value("checked_date", 0).toDate();
    42         enabled = set->value("enabled", true).toBool();
    43         days_to_check = set->value("days_to_check", 7).toInt();
    44         last_known_version = set->value("last_known_version", Version::with_revision()).toString();
    45         set->endGroup();
    46 }
    47 
    48 UpdateChecker::UpdateChecker(QObject * parent, UpdateCheckerData * data) : QObject(parent)
     30#include <QStringList>
     31#include <QMessageBox>
     32#include <QDesktopServices>
     33#include <QTemporaryFile>
     34#include <QSettings>
     35#include <QDebug>
     36
     37
     38UpdateChecker::UpdateChecker(QWidget * parent, UpdateCheckerData * data) : QObject(parent)
     39        , net_manager(0)
     40        , d(0)
    4941{
    5042        d = data;
     43
     44        check_url = URL_VERSION_INFO;
     45        user_agent = "SMPlayer";
     46
     47        /*
     48        It looks like some distro maintainers disable this update checker...
     49        This is a very very bad idea. Main reason: in order to play Youtube videos
     50        with SMPlayer a very recent version is required. Distros usually provide
     51        ancient versions...
     52        If you remove the possibility to inform the user about new versions they will
     53        probably use a version with broken support for Youtube like forever.
     54
     55        If you still want to disable this option, the correct way to do it is by
     56        removing the UPDATE_CHECKER define in smplayer.pro, and not by removing the
     57        following code.
     58        */
     59
     60        connect(this, SIGNAL(newVersionFound(const QString &)),
     61            this, SLOT(reportNewVersionAvailable(const QString &)));
     62
     63        connect(this, SIGNAL(noNewVersionFound(const QString &)),
     64            this, SLOT(reportNoNewVersionFound(const QString &)));
     65
     66        connect(this, SIGNAL(errorOcurred(int, QString)), this, SLOT(reportError(int, QString)));
     67
     68        net_manager = new QNetworkAccessManager(this);
    5169
    5270        QDate now = QDate::currentDate();
     
    5472        int days = QDateTime(d->last_checked).daysTo(QDateTime(now));
    5573
    56         qDebug("UpdateChecker::UpdateChecker: enabled: %d", d->enabled);
    57         qDebug("UpdateChecker::UpdateChecker: days_to_check: %d", d->days_to_check);
    58         qDebug("UpdateChecker::UpdateChecker: days since last check: %d", days);
     74        qDebug() << "UpdateChecker::UpdateChecker: enabled:" << d->enabled;
     75        qDebug() << "UpdateChecker::UpdateChecker: days_to_check:" << d->days_to_check;
     76        qDebug() << "UpdateChecker::UpdateChecker: days since last check:" <<  days;
    5977
    6078        if ((!d->enabled) || (days < d->days_to_check)) return;
    6179
    62         net_manager = new QNetworkAccessManager();
    63         QUrl url("http://updates.smplayer.info/current_version");
    64 
    65         QNetworkRequest req(url);
    66         req.setRawHeader("User-Agent", "SMPlayer");
     80        QNetworkRequest req(check_url);
     81        req.setRawHeader("User-Agent", user_agent);
    6782        QNetworkReply *reply = net_manager->get(req);
    6883        connect(reply, SIGNAL(finished()), this, SLOT(gotReply()));
     
    7287}
    7388
     89// Force a check, requested by the user
     90void UpdateChecker::check() {
     91        qDebug("UpdateChecker::check");
     92
     93        QNetworkRequest req(check_url);
     94        req.setRawHeader("User-Agent", user_agent);
     95        QNetworkReply *reply = net_manager->get(req);
     96        connect(reply, SIGNAL(finished()), this, SLOT(gotReplyFromUserRequest()));
     97}
     98
     99QString UpdateChecker::parseVersion(const QByteArray & data, const QString & name) {
     100        QTemporaryFile tf;
     101        tf.open();
     102        tf.write(data);
     103        tf.close();
     104        QString tfile = tf.fileName();
     105        qDebug() << "UpdateChecker::parseVersion: tfile:" << tfile;
     106
     107        #ifdef Q_OS_WIN
     108        QString grname = "windows";
     109        #else
     110        QString grname = "linux";
     111        #endif
     112        QSettings set(tfile, QSettings::IniFormat);
     113        set.beginGroup(grname);
     114        QString version = set.value(name, "").toString();
     115        set.endGroup();
     116        return version;
     117}
     118
    74119void UpdateChecker::gotReply() {
    75120        qDebug("UpdateChecker::gotReply");
     
    79124        if (reply) {
    80125                if (reply->error() == QNetworkReply::NoError) {
    81                         //read data from reply
    82                         QRegExp rx_version("^version=(.*)");
    83                         QString version;
    84                         while (reply->canReadLine()) {
    85                                 QByteArray line = reply->readLine().trimmed();
    86                                 //qDebug("line: %s", line.constData());
    87                                 if (rx_version.indexIn(line) != -1) {
    88                                         version = rx_version.cap(1);
    89                                         //qDebug("version: %s", version.toUtf8().constData());
    90                                         break;
    91                                 }
    92                         }
     126                        QString version = parseVersion(reply->readAll(), "stable");
    93127                        if (!version.isEmpty()) {
    94128                                d->last_checked = QDate::currentDate();
    95                                 //qDebug("last known: %s version: %s", d->last_known_version.toUtf8().constData(), version.toUtf8().constData());
    96                                 //qDebug("version_with_revision: %s", Version::with_revision().toUtf8().constData());
    97                                 if ((d->last_known_version != version) && (version > Version::with_revision())) {
    98                                         qDebug("UpdateChecker::gotReply: new version found: %s", version.toUtf8().constData());
     129                                qDebug() << "UpdateChecker::gotReply: last known version:" << d->last_known_version << "received version:" << version;
     130                                qDebug() << "UpdateChecker::gotReply: installed version:" << Version::with_revision();
     131                                if ((d->last_known_version != version) && (formattedVersion(version) > formattedVersion(Version::with_revision()))) {
     132                                        qDebug() << "UpdateChecker::gotReply: new version found:" << version;
    99133                                        emit newVersionFound(version);
    100134                                }
     
    109143}
    110144
     145void UpdateChecker::gotReplyFromUserRequest() {
     146        qDebug("UpdateChecker::gotReplyFromUserRequest");
     147
     148        QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
     149
     150        if (reply) {
     151                if (reply->error() == QNetworkReply::NoError) {
     152                        QString version = parseVersion(reply->readAll(), "unstable");
     153                        if (!version.isEmpty()) {
     154                                if ((formattedVersion(version) > formattedVersion(Version::with_revision()))) {
     155                                        qDebug("UpdateChecker::gotReplyFromUserRequest: new version found: %s", version.toUtf8().constData());
     156                                        emit newVersionFound(version);
     157                                } else {
     158                                        emit noNewVersionFound(version);
     159                                }
     160                        } else {
     161                                emit errorOcurred(1, tr("Failed to get the latest version number") );
     162                        }
     163                } else {
     164                        int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
     165                        qDebug("UpdateChecker::gotReplyFromUserRequest: status: %d", status);
     166                        emit errorOcurred((int)reply->error(), reply->errorString());
     167                }
     168                reply->deleteLater();
     169        }
     170}
     171
    111172void UpdateChecker::saveVersion(QString v) {
    112173        d->last_known_version = v;
    113174}
    114175
     176QString UpdateChecker::formattedVersion(const QString & version) {
     177        int n1 = 0, n2 = 0, n3 = 0, n4 = 0;
     178        QStringList l = version.split(".");
     179        int c = l.count();
     180        if (c >= 1) n1 = l[0].toInt();
     181        if (c >= 2) n2 = l[1].toInt();
     182        if (c >= 3) n3 = l[2].toInt();
     183        if (c >= 4) n4 = l[3].toInt();
     184
     185        QString res = QString("%1.%2.%3.%4").arg(n1, 2, 10, QChar('0'))
     186                                                                                .arg(n2, 2, 10, QChar('0'))
     187                                                                                .arg(n3, 2, 10, QChar('0'))
     188                                                                                .arg(n4, 4, 10, QChar('0'));
     189        //qDebug() << "UpdateChecker::formattedVersion:" << res;
     190        return res;
     191}
     192
     193void UpdateChecker::reportNewVersionAvailable(const QString & new_version) {
     194        QWidget * p = qobject_cast<QWidget*>(parent());
     195
     196        QMessageBox::StandardButton button = QMessageBox::information(p, tr("New version available"),
     197                tr("A new version of SMPlayer is available.") + "<br><br>" +
     198                tr("Installed version: %1").arg(Version::with_revision()) + "<br>" +
     199                tr("Available version: %1").arg(new_version) + "<br><br>" +
     200                tr("Would you like to know more about this new version?"),
     201                QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
     202
     203        if (button == QMessageBox::Yes) {
     204                QDesktopServices::openUrl(QUrl(URL_CHANGES));
     205        }
     206
     207        saveVersion(new_version);
     208}
     209
     210void UpdateChecker::reportNoNewVersionFound(const QString & version) {
     211        QWidget * p = qobject_cast<QWidget*>(parent());
     212
     213        QMessageBox::information(p, tr("Checking for updates"),
     214                tr("Congratulations, SMPlayer is up to date.") + "<br><br>" +
     215                tr("Installed version: %1").arg(Version::with_revision()) + "<br>" +
     216                tr("Available version: %1").arg(version));
     217}
     218
     219void UpdateChecker::reportError(int error_number, QString error_str) {
     220        QWidget * p = qobject_cast<QWidget*>(parent());
     221        QMessageBox::warning(p, tr("Error"),
     222                tr("An error happened while trying to retrieve information about the latest version available.") +
     223                "<br>" + tr("Error code: %1").arg(error_number) + "<br>" + error_str);
     224}
     225
    115226#include "moc_updatechecker.cpp"
    116227
Note: See TracChangeset for help on using the changeset viewer.