From 4ccc8c0daee16f19e45a9d10c03f50c2864c2043 Mon Sep 17 00:00:00 2001
From: metanoia1989 <sogaxili@gmail.com>
Date: Sat, 6 Mar 2021 17:00:55 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E5=8F=96=E6=B6=88=E4=B8=8B?=
 =?UTF-8?q?=E8=BD=BD=E7=9A=84=E9=97=AA=E9=80=80=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/downloadworker.cpp | 53 ++++++++++++++++++++++++------------------
 src/widget.cpp         | 17 --------------
 src/workerthreads.cpp  | 18 +++++++-------
 src/workerthreads.h    |  1 -
 4 files changed, 38 insertions(+), 51 deletions(-)

diff --git a/src/downloadworker.cpp b/src/downloadworker.cpp
index 2d95f47..e02af2e 100644
--- a/src/downloadworker.cpp
+++ b/src/downloadworker.cpp
@@ -7,6 +7,8 @@
 #include <QDebug>
 #include <QThread>
 #include <QRegularExpression>
+#include <QFileInfo>
+#include <QDir>
 
 DownloadWorker::DownloadWorker(QObject *parent)
 {
@@ -49,19 +51,22 @@ void DownloadWorker::doWork()
             }
         });
         connect(reply, &QNetworkReply::finished, mgr, &QNetworkAccessManager::deleteLater);
-        connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater);
         connect(reply, &QNetworkReply::readyRead, this, &DownloadWorker::dataReady);
         connect(reply, &QNetworkReply::finished, this, &DownloadWorker::slotFinish);
         connect(reply, &QNetworkReply::downloadProgress, this, &DownloadWorker::handleProcess);
+//        connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater);
+        connect(reply, &QNetworkReply::finished, this, &DownloadWorker::doStop);
 
 }
 
 void DownloadWorker::doStop()
 {
-    reply->disconnect();
-    reply->aboutToClose();
-    reply->deleteLater();
-    reply = nullptr;
+    if (reply) {
+        reply->disconnect();
+        reply->aboutToClose();
+        reply->deleteLater();
+        reply = nullptr;
+    }
 }
 
 void DownloadWorker::dataReady()
@@ -95,17 +100,19 @@ DownloadController::DownloadController(QObject *parent)
         "sucdn4.jerrywang.top",
         "sucdn5.jerrywang.top"
     };
-    this->threadNum =  domains.size() > 6 ? 6 : domains.size();
+    this->threadNum =  domains.size() > 4 ? 4 : domains.size();
 }
 
 DownloadController::~DownloadController()
 {
-    for(int i = 0; i < workers.size(); i++) {
-        workers.at(i)->doStop();
-        workers.at(i)->disconnect();
-        workers.at(i)->deleteLater();
+    if (workers.size() > 0) {
+        for(int i = 0; i < workers.size(); i++) {
+            workers.at(i)->doStop();
+            workers.at(i)->disconnect();
+            workers.at(i)->deleteLater();
+        }
+        workers.clear();
     }
-    workers.clear();
 }
 
 void DownloadController::setFilename(QString filename)
@@ -123,6 +130,10 @@ void DownloadController::setThreadNum(int threadNum)
  */
 void DownloadController::startDownload(const QString &url)
 {
+
+
+    finish = 0;
+
     // 下载任务等分,计算每个线程的下载数据
     fileSize = getFileSize(url);
     if (fileSize == 0) {
@@ -141,8 +152,10 @@ void DownloadController::startDownload(const QString &url)
     ranges[threadNum-1].second = fileSize; // 余数部分加入最后一个
 
     // 打开文件
+    QDir tmpdir("/tmp/spark-store");
     file = new QFile;
-    file->setFileName(filename);
+    file->setFileName(tmpdir.absoluteFilePath(filename));
+
     if (file->exists())
         file->remove();
     if (!file->open(QIODevice::WriteOnly)) {
@@ -180,7 +193,9 @@ void DownloadController::stopDownload()
         workers.at(i)->deleteLater();
     }
     workers.clear();
-//    file->flush();
+
+    qDebug() << "文件下载路径:" << QFileInfo(file->fileName()).absoluteFilePath();
+    file->flush();
     file->close();
     delete file;
     file = nullptr;
@@ -200,17 +215,9 @@ void DownloadController::handleProcess()
 void DownloadController::chunkDownloadFinish()
 {
     finish++;
+    qDebug() << QString("已下载了%1块,共%2块!!!").arg(finish).arg(threadNum);
     if (finish == threadNum) {
-        file->flush();
-        file->close();
-        delete file;
-        file = nullptr;
-        for(int i = 0; i < workers.size(); i++) {
-            workers.at(i)->doStop();
-            workers.at(i)->disconnect();
-            workers.at(i)->deleteLater();
-        }
-        workers.clear();
+        stopDownload();
         emit downloadFinished();
     }
 }
diff --git a/src/widget.cpp b/src/widget.cpp
index eea5a78..f3c05bc 100644
--- a/src/widget.cpp
+++ b/src/widget.cpp
@@ -566,10 +566,6 @@ void Widget::startRequest(QUrl url, QString fileName)
     isdownload=true;
     download_list[allDownload-1].free=false;
 
-//    reply = manager->get(QNetworkRequest(url));
-//    connect(reply,SIGNAL(finished()),this,SLOT(httpFinished()));
-//    connect(reply,SIGNAL(readyRead()),this,SLOT(httpReadyRead()));
-//    connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(updateDataReadProgress(qint64,qint64)));
     connect(downloadController, &DownloadController::downloadProcess, this, &Widget::updateDataReadProgress);
     connect(downloadController, &DownloadController::downloadFinished, this, &Widget::httpFinished);
     connect(downloadController, &DownloadController::errorOccur, [this](QString msg){
@@ -807,12 +803,6 @@ void Widget::sltAppinfoFinish()
 
 void Widget::httpFinished() // 完成下载
 {
-//    file->flush();
-//    file->close();
-//    reply->deleteLater();
-//    reply = nullptr;
-//    delete file;
-//    file = nullptr;
     isdownload=false;
     isBusy=false;
     download_list[nowDownload-1].readyInstall();
@@ -823,13 +813,6 @@ void Widget::httpFinished() // 完成下载
             nowDownload+=1;
         }
         QString fileName=download_list[nowDownload-1].getName();
-//        file = new QFile(fileName);
-//        if(!file->open(QIODevice::WriteOnly))
-//        {
-//            delete file;
-//            file = nullptr;
-//            return ;
-//        }
         startRequest(urList.at(nowDownload-1), fileName);
     }
 }
diff --git a/src/workerthreads.cpp b/src/workerthreads.cpp
index 9adbe63..a869cd5 100644
--- a/src/workerthreads.cpp
+++ b/src/workerthreads.cpp
@@ -16,6 +16,7 @@ void SpkAppInfoLoaderThread::run()
     httpClient->get(targetUrl.toString())
         .header("content-type", "application/json")
         .onResponse([this](QByteArray json_array) {
+            qDebug() << "请求应用信息 " << json_array;
             QString urladdress, deatils, more, packagename, appweb;
             bool isInstalled;
 
@@ -83,7 +84,8 @@ void SpkAppInfoLoaderThread::run()
                 .onError([this](QString errorStr) {
                     Widget::sendNotification(tr("Failed to load application icon."));
                 })
-                .timeout(10 * 100)
+                .block()
+                .timeout(5 * 100)
                 .exec(); 
 
 
@@ -103,27 +105,23 @@ void SpkAppInfoLoaderThread::run()
                         qDebug() << "截图下载失败";
 //                        Widget::sendNotification(tr("Failed to load application screenshot."));
                     })
-                    .timeout(10 * 100)
+                    .block()
+                    .timeout(4 * 100)
                     .exec(); 
             }
             emit finishAllLoading();
 
+            httpClient->deleteLater();
         })
         .onError([](QString errorStr) {
             Widget::sendNotification(tr("Failed to download app info. Please check internet connection."));
         })
-        .timeout(10 * 100)
+        .timeout(5 * 100)
+        .block()
         .exec(); 
 
 }
 
-SpkAppInfoLoaderThread::~SpkAppInfoLoaderThread()
-{
-    if (httpClient) {
-        httpClient->deleteLater();
-        httpClient = nullptr;
-    }
-}
 
 void SpkAppInfoLoaderThread::setUrl(const QUrl &url)
 {
diff --git a/src/workerthreads.h b/src/workerthreads.h
index 1ccf232..dc3535f 100644
--- a/src/workerthreads.h
+++ b/src/workerthreads.h
@@ -17,7 +17,6 @@ class SpkAppInfoLoaderThread Q_DECL_FINAL : public QThread
 public:
     //explicit SpkAppInfoLoaderThread() = default;
     void run() Q_DECL_OVERRIDE;
-    ~SpkAppInfoLoaderThread();
 public slots:
     void setUrl(const QUrl &url);
     void setServer(const QString &server);