From 2fdfe55edddeb6895f524f6401bc9b4eb828372b Mon Sep 17 00:00:00 2001 From: libretroadmin Date: Sun, 27 Nov 2022 12:45:21 +0100 Subject: [PATCH] (Qt) Start ripping out thumbnail pack download code --- ui/drivers/qt/qt_downloads.cpp | 314 --------------------------------- ui/drivers/qt/qt_playlist.cpp | 14 +- ui/drivers/ui_qt.cpp | 7 - ui/drivers/ui_qt.h | 13 -- 4 files changed, 1 insertion(+), 347 deletions(-) diff --git a/ui/drivers/qt/qt_downloads.cpp b/ui/drivers/qt/qt_downloads.cpp index 97113bb7f9..0f80e1580f 100644 --- a/ui/drivers/qt/qt_downloads.cpp +++ b/ui/drivers/qt/qt_downloads.cpp @@ -32,323 +32,9 @@ extern "C" { #define USER_AGENT "RetroArch-WIMP/" PACKAGE_VERSION #define PARTIAL_EXTENSION ".partial" #define TEMP_EXTENSION ".tmp" -#define THUMBNAILPACK_URL_HEADER "http://thumbnailpacks.libretro.com/" -#define THUMBNAILPACK_EXTENSION ".zip" #define THUMBNAIL_URL_HEADER "https://thumbnails.libretro.com/" #define THUMBNAIL_IMAGE_EXTENSION ".png" -static void cb_extract_thumbnail_pack(retro_task_t *task, - void *task_data, void *user_data, const char *err) -{ - decompress_task_data_t *dec = (decompress_task_data_t*)task_data; - MainWindow *mainwindow = (MainWindow*)user_data; - - if (err) - RARCH_ERR("%s", err); - - if (dec) - { - if (filestream_exists(dec->source_file)) - filestream_delete(dec->source_file); - - free(dec->source_file); - free(dec); - } - - mainwindow->onThumbnailPackExtractFinished(string_is_empty(err)); -} - -void MainWindow::onThumbnailPackDownloadNetworkError(QNetworkReply::NetworkError code) -{ - QByteArray errorStringArray; - QNetworkReply *reply = m_thumbnailPackDownloadReply.data(); - const char *errorStringData = NULL; - - m_thumbnailPackDownloadProgressDialog->cancel(); - - if (!reply) - return; - - errorStringArray = reply->errorString().toUtf8(); - errorStringData = errorStringArray.constData(); - - RARCH_ERR("[Qt]: Network error code %d received: %s\n", - code, errorStringData); - -#if 0 - /* Deleting the reply here seems to cause a strange - * heap-use-after-free crash. */ - reply->disconnect(); - reply->abort(); - reply->deleteLater(); -#endif -} - -void MainWindow::onThumbnailPackDownloadNetworkSslErrors(const QList &errors) -{ - QNetworkReply *reply = m_thumbnailPackDownloadReply.data(); - int i; - - if (!reply) - return; - - for (i = 0; i < errors.count(); i++) - { - const QSslError &error = errors.at(i); - QString string = - QString("Ignoring SSL error code ") - + QString::number(error.error()) - + ": " - + error.errorString(); - QByteArray stringArray = string.toUtf8(); - const char *stringData = stringArray.constData(); - RARCH_ERR("[Qt]: %s\n", stringData); - } - - /* Ignore all SSL errors for now, like self-signed, expired etc. */ - reply->ignoreSslErrors(); -} - -void MainWindow::onThumbnailPackDownloadCanceled() -{ - m_thumbnailPackDownloadProgressDialog->cancel(); -} - -void MainWindow::onThumbnailPackDownloadFinished() -{ - QString system; - QNetworkReply *reply = m_thumbnailPackDownloadReply.data(); - QNetworkReply::NetworkError error; - int code; - - m_thumbnailPackDownloadProgressDialog->cancel(); - - /* At least on Linux, the progress dialog will refuse - * to hide itself and will stay on screen in a corrupted - * way if we happen to show an error message in this function. - * processEvents() will sometimes fix it, other times not... - * seems random. */ - qApp->processEvents(); - - if (!reply) - return; - - system = reply->property("system").toString(); - - error = reply->error(); - code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); - - if (m_thumbnailPackDownloadFile.isOpen()) - m_thumbnailPackDownloadFile.close(); - - if (code != 200) - { - QUrl redirectUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); - - if (!redirectUrl.isEmpty()) - { - QByteArray redirectUrlArray = redirectUrl.toString().toUtf8(); - const char *redirectUrlData = redirectUrlArray.constData(); - - RARCH_LOG("[Qt]: Thumbnail pack download got redirect with HTTP code %d: %s\n", code, redirectUrlData); - - reply->disconnect(); - reply->abort(); - reply->deleteLater(); - - downloadAllThumbnails(system, redirectUrl); - - return; - } - - emit showErrorMessageDeferred(QString(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_NETWORK_ERROR)) + ": HTTP Code " + QString::number(code)); - - m_thumbnailPackDownloadFile.remove(); - - RARCH_ERR("[Qt]: Thumbnail pack download failed with HTTP status code: %d\n", code); - - reply->disconnect(); - reply->abort(); - reply->deleteLater(); - - return; - } - - if (error == QNetworkReply::NoError) - { - int index = m_thumbnailPackDownloadFile.fileName().lastIndexOf(PARTIAL_EXTENSION); - QString newFileName = m_thumbnailPackDownloadFile.fileName().left(index); - QFile newFile(newFileName); - - /* rename() requires the old file to be deleted first if it exists */ - if (newFile.exists() && !newFile.remove()) - RARCH_ERR("[Qt]: Thumbnail pack download finished, but old file could not be deleted.\n"); - else - { - if (m_thumbnailPackDownloadFile.rename(newFileName)) - { - settings_t *settings = config_get_ptr(); - - if (settings) - { - RARCH_LOG("[Qt]: Thumbnail pack download finished successfully.\n"); - emit extractArchiveDeferred(newFileName, settings->paths.directory_thumbnails, TEMP_EXTENSION, cb_extract_thumbnail_pack); - } - } - else - { - RARCH_ERR("[Qt]: Thumbnail pack download finished, but temp file could not be renamed.\n"); - emit showErrorMessageDeferred(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_COULD_NOT_RENAME_FILE)); - } - } - } - else - { - QByteArray errorArray = reply->errorString().toUtf8(); - const char *errorData = errorArray.constData(); - - m_thumbnailPackDownloadFile.remove(); - - RARCH_ERR("[Qt]: Thumbnail pack download ended prematurely: %s\n", errorData); - emit showErrorMessageDeferred(QString(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_NETWORK_ERROR)) + ": Code " + QString::number(code) + ": " + errorData); - } - - reply->disconnect(); - reply->close(); -} - -void MainWindow::onThumbnailPackDownloadProgress(qint64 bytesReceived, qint64 bytesTotal) -{ - QNetworkReply *reply = m_thumbnailPackDownloadReply.data(); - int progress = (bytesReceived / (float)bytesTotal) * 100.0f; - - if (!reply) - return; - - m_thumbnailPackDownloadProgressDialog->setValue(progress); -} - -void MainWindow::onThumbnailPackDownloadReadyRead() -{ - QNetworkReply *reply = m_thumbnailPackDownloadReply.data(); - - if (reply) - m_thumbnailPackDownloadFile.write(reply->readAll()); -} - -void MainWindow::downloadAllThumbnails(QString system, QUrl url) -{ - QString urlString; - QNetworkRequest request; - QByteArray urlArray; - QNetworkReply *reply = NULL; - settings_t *settings = config_get_ptr(); - const char *urlData = NULL; - - if (!settings) - return; - - urlString = - QString(THUMBNAILPACK_URL_HEADER) - + system - + THUMBNAILPACK_EXTENSION; - - if (url.isEmpty()) - url = urlString; - - request.setUrl(url); - - urlArray = url.toString().toUtf8(); - urlData = urlArray.constData(); - - if (m_thumbnailPackDownloadFile.isOpen()) - { - RARCH_ERR("[Qt]: File is already open.\n"); - return; - } - else - { - QDir dir; - const char *path_dir_thumbnails = settings->paths.directory_thumbnails; - QString dirString = QString(path_dir_thumbnails); - QString fileName = - dirString - + "/" - + system - + THUMBNAILPACK_EXTENSION - + PARTIAL_EXTENSION; - QByteArray fileNameArray = fileName.toUtf8(); - const char *fileNameData = fileNameArray.constData(); - - dir.mkpath(dirString); - - m_thumbnailPackDownloadFile.setFileName(fileName); - - if (!m_thumbnailPackDownloadFile.open(QIODevice::WriteOnly)) - { - m_thumbnailPackDownloadProgressDialog->cancel(); - showMessageBox(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_FILE_WRITE_OPEN_FAILED), MainWindow::MSGBOX_TYPE_ERROR, Qt::ApplicationModal, false); - RARCH_ERR("[Qt]: Could not open file for writing: %s\n", fileNameData); - return; - } - } - - RARCH_LOG("[Qt]: Starting thumbnail pack download...\n"); - RARCH_LOG("[Qt]: Downloading URL %s\n", urlData); - - request.setHeader(QNetworkRequest::UserAgentHeader, USER_AGENT); - - m_thumbnailPackDownloadProgressDialog->setWindowModality(Qt::NonModal); - m_thumbnailPackDownloadProgressDialog->setMinimumDuration(0); - m_thumbnailPackDownloadProgressDialog->setRange(0, 100); - m_thumbnailPackDownloadProgressDialog->setAutoClose(true); - m_thumbnailPackDownloadProgressDialog->setAutoReset(true); - m_thumbnailPackDownloadProgressDialog->setValue(0); - m_thumbnailPackDownloadProgressDialog->setLabelText(QString(msg_hash_to_str(MSG_DOWNLOADING)) + "..."); - m_thumbnailPackDownloadProgressDialog->setCancelButtonText(tr("Cancel")); - m_thumbnailPackDownloadProgressDialog->show(); - - m_thumbnailPackDownloadReply = m_networkManager->get(request); - - reply = m_thumbnailPackDownloadReply.data(); - reply->setProperty("system", system); - - /* Make sure any previous connection is removed first */ - disconnect(m_thumbnailPackDownloadProgressDialog, SIGNAL(canceled()), reply, SLOT(abort())); - connect(m_thumbnailPackDownloadProgressDialog, SIGNAL(canceled()), reply, SLOT(abort())); - - connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onThumbnailPackDownloadNetworkError(QNetworkReply::NetworkError))); - connect(reply, SIGNAL(sslErrors(const QList&)), this, SLOT(onThumbnailPackDownloadNetworkSslErrors(const QList&))); - connect(reply, SIGNAL(finished()), this, SLOT(onThumbnailPackDownloadFinished())); - connect(reply, SIGNAL(readyRead()), this, SLOT(onThumbnailPackDownloadReadyRead())); - connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(onThumbnailPackDownloadProgress(qint64, qint64))); -} - -void MainWindow::onThumbnailPackExtractFinished(bool success) -{ - m_updateProgressDialog->cancel(); - - if (!success) - { - RARCH_ERR("[Qt]: Thumbnail pack extraction failed.\n"); - emit showErrorMessageDeferred(msg_hash_to_str(MSG_DECOMPRESSION_FAILED)); - return; - } - - RARCH_LOG("[Qt]: Thumbnail pack extracted successfully.\n"); - - emit showInfoMessageDeferred(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_THUMBNAIL_PACK_DOWNLOADED_SUCCESSFULLY)); - - QNetworkReply *reply = m_thumbnailPackDownloadReply.data(); - - m_playlistModel->reloadSystemThumbnails(reply->property("system").toString()); - reply->deleteLater(); - updateVisibleItems(); - - /* Reload thumbnail image */ - emit itemChanged(); -} - void MainWindow::onThumbnailDownloadNetworkError(QNetworkReply::NetworkError code) { QByteArray errorStringArray; diff --git a/ui/drivers/qt/qt_playlist.cpp b/ui/drivers/qt/qt_playlist.cpp index 434467bec9..0f7c265c39 100644 --- a/ui/drivers/qt/qt_playlist.cpp +++ b/ui/drivers/qt/qt_playlist.cpp @@ -814,7 +814,6 @@ void MainWindow::onPlaylistWidgetContextMenuRequested(const QPoint&) QScopedPointer newPlaylistAction; QScopedPointer deletePlaylistAction; QScopedPointer renamePlaylistAction; - QScopedPointer downloadAllThumbnailsEntireSystemAction; QScopedPointer downloadAllThumbnailsThisPlaylistAction; QPointer selectedAction; playlist_config_t playlist_config; @@ -966,10 +965,8 @@ void MainWindow::onPlaylistWidgetContextMenuRequested(const QPoint&) downloadAllThumbnailsMenu->setObjectName("downloadAllThumbnailsMenu"); downloadAllThumbnailsThisPlaylistAction.reset(new QAction(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_DOWNLOAD_ALL_THUMBNAILS_THIS_PLAYLIST), downloadAllThumbnailsMenu.data())); - downloadAllThumbnailsEntireSystemAction.reset(new QAction(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_QT_DOWNLOAD_ALL_THUMBNAILS_ENTIRE_SYSTEM), downloadAllThumbnailsMenu.data())); downloadAllThumbnailsMenu->addAction(downloadAllThumbnailsThisPlaylistAction.data()); - downloadAllThumbnailsMenu->addAction(downloadAllThumbnailsEntireSystemAction.data()); menu->addMenu(downloadAllThumbnailsMenu.data()); } @@ -1115,17 +1112,8 @@ void MainWindow::onPlaylistWidgetContextMenuRequested(const QPoint&) } else if (selectedItem && !specialPlaylist && selectedAction->parent() == downloadAllThumbnailsMenu.data()) { - if (selectedAction == downloadAllThumbnailsEntireSystemAction.data()) - { - int row = m_listWidget->row(selectedItem); - - if (row >= 0) - downloadAllThumbnails(currentPlaylistFileInfo.completeBaseName()); - } - else if (selectedAction == downloadAllThumbnailsThisPlaylistAction.data()) - { + if (selectedAction == downloadAllThumbnailsThisPlaylistAction.data()) downloadPlaylistThumbnails(currentPlaylistPath); - } } setCoreActions(); diff --git a/ui/drivers/ui_qt.cpp b/ui/drivers/ui_qt.cpp index 51afe37ee0..56fad02d6c 100644 --- a/ui/drivers/ui_qt.cpp +++ b/ui/drivers/ui_qt.cpp @@ -1200,9 +1200,6 @@ MainWindow::MainWindow(QWidget *parent) : ,m_thumbnailDownloadFile() ,m_thumbnailDownloadReply() ,m_pendingThumbnailDownloadTypes() - ,m_thumbnailPackDownloadProgressDialog(new QProgressDialog()) - ,m_thumbnailPackDownloadFile() - ,m_thumbnailPackDownloadReply() ,m_playlistThumbnailDownloadProgressDialog(new QProgressDialog()) ,m_playlistThumbnailDownloadFile() ,m_playlistThumbnailDownloadReply() @@ -1248,7 +1245,6 @@ MainWindow::MainWindow(QWidget *parent) : * they show as soon as they're constructed. */ m_updateProgressDialog->cancel(); m_thumbnailDownloadProgressDialog->cancel(); - m_thumbnailPackDownloadProgressDialog->cancel(); m_playlistThumbnailDownloadProgressDialog->cancel(); m_gridProgressWidget = new QWidget(); @@ -1522,9 +1518,6 @@ MainWindow::MainWindow(QWidget *parent) : connect(m_thumbnailDownloadProgressDialog, SIGNAL(canceled()), m_thumbnailDownloadProgressDialog, SLOT(cancel())); connect(m_thumbnailDownloadProgressDialog, SIGNAL(canceled()), this, SLOT(onThumbnailDownloadCanceled())); - connect(m_thumbnailPackDownloadProgressDialog, SIGNAL(canceled()), m_thumbnailPackDownloadProgressDialog, SLOT(cancel())); - connect(m_thumbnailPackDownloadProgressDialog, SIGNAL(canceled()), this, SLOT(onThumbnailPackDownloadCanceled())); - connect(this, SIGNAL(itemChanged()), this, SLOT(onItemChanged())); connect(this, SIGNAL(gotThumbnailDownload(QString,QString)), this, SLOT(onDownloadThumbnail(QString,QString))); diff --git a/ui/drivers/ui_qt.h b/ui/drivers/ui_qt.h index aaacd70ad1..58dd9b673d 100644 --- a/ui/drivers/ui_qt.h +++ b/ui/drivers/ui_qt.h @@ -463,10 +463,8 @@ public slots: void onFileDropWidgetContextMenuRequested(const QPoint &pos); void showAbout(); void showDocs(); - void onThumbnailPackExtractFinished(bool success); void deferReloadShaderParams(); void downloadThumbnail(QString system, QString title, QUrl url = QUrl()); - void downloadAllThumbnails(QString system, QUrl url = QUrl()); void downloadPlaylistThumbnails(QString playlistPath); void downloadNextPlaylistThumbnail(QString system, QString title, QString type, QUrl url = QUrl()); void changeThumbnailType(ThumbnailType type); @@ -516,13 +514,6 @@ private slots: void onThumbnailDownloadCanceled(); void onDownloadThumbnail(QString system, QString title); - void onThumbnailPackDownloadNetworkError(QNetworkReply::NetworkError code); - void onThumbnailPackDownloadNetworkSslErrors(const QList &errors); - void onThumbnailPackDownloadFinished(); - void onThumbnailPackDownloadProgress(qint64 bytesReceived, qint64 bytesTotal); - void onThumbnailPackDownloadReadyRead(); - void onThumbnailPackDownloadCanceled(); - void onPlaylistThumbnailDownloadNetworkError(QNetworkReply::NetworkError code); void onPlaylistThumbnailDownloadNetworkSslErrors(const QList &errors); void onPlaylistThumbnailDownloadFinished(); @@ -619,10 +610,6 @@ private: QPointer m_thumbnailDownloadReply; QStringList m_pendingThumbnailDownloadTypes; - QProgressDialog *m_thumbnailPackDownloadProgressDialog; - QFile m_thumbnailPackDownloadFile; - QPointer m_thumbnailPackDownloadReply; - QProgressDialog *m_playlistThumbnailDownloadProgressDialog; QFile m_playlistThumbnailDownloadFile; QPointer m_playlistThumbnailDownloadReply;