From 2e04d05b34fe34d44e7234ca71bf59c19f93b566 Mon Sep 17 00:00:00 2001
From: RigoLigoRLC <rigoligo03@gmail.com>
Date: Thu, 2 Dec 2021 18:20:28 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=BF=AB=E9=80=9F=E4=BB=8E?=
 =?UTF-8?q?=E5=BA=94=E7=94=A8=E5=88=97=E8=A1=A8=E8=BF=9B=E5=85=A5=E5=BA=94?=
 =?UTF-8?q?=E7=94=A8=E8=AF=A6=E6=83=85=E6=97=B6=E7=9A=84=E5=B4=A9=E6=BA=83?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

正确地断开过期的信号,正确地处理过期的请求
---
 gui/page/spkpageappdetails.cpp |  1 +
 gui/page/spkpageapplist.cpp    |  1 +
 src/spkresource.cpp            | 31 ++++++++++++++++++++-----------
 3 files changed, 22 insertions(+), 11 deletions(-)

diff --git a/gui/page/spkpageappdetails.cpp b/gui/page/spkpageappdetails.cpp
index 55f7bbc..a613436 100644
--- a/gui/page/spkpageappdetails.cpp
+++ b/gui/page/spkpageappdetails.cpp
@@ -148,6 +148,7 @@ namespace SpkUi
   void SpkPageAppDetails::ResourceAcquisitionFinished(int id, ResourceResult result)
   {
     QPixmap icon;
+//    qDebug() << "PageAppDetails: Resource" << id << "acquired";
     if(!id)
     {
       // id == 0, icon
diff --git a/gui/page/spkpageapplist.cpp b/gui/page/spkpageapplist.cpp
index 7b22297..17045d5 100644
--- a/gui/page/spkpageapplist.cpp
+++ b/gui/page/spkpageapplist.cpp
@@ -97,6 +97,7 @@ namespace SpkUi
   void SpkPageAppList::ResourceAcquisitionFinished(int id, ResourceResult result)
   {
     QPixmap icon;
+//    qDebug() << "PageAppList: Resource" << id << "acquired";
     auto item = mAppItemList[id];
     if(result.status == SpkResource::ResourceStatus::Ready)
     {
diff --git a/src/spkresource.cpp b/src/spkresource.cpp
index 22ecccc..43f62bc 100644
--- a/src/spkresource.cpp
+++ b/src/spkresource.cpp
@@ -74,7 +74,7 @@ void SpkResource::ResourceDownloaded()
     if(!QDir().mkpath(path))
     {
       sWarn(tr("Cache directory \"%1\" cannot be created.").arg(path));
-      return;
+      goto ContinueNext;
     }
   }
   if(writeCache.open(QFile::WriteOnly))
@@ -85,32 +85,41 @@ void SpkResource::ResourceDownloaded()
   else
     sWarn("Save cache to \"" + cacheFile + "\" failed! Msg: " + writeCache.errorString());
 
+  qInfo() << "Resource " << reply->property("dest_file").toString() << " downloaded";
+
   // Tell ResourceContext
-  AcquisitionFinish(id, ret);
+  if(!reply->property("outdated").toBool())
+    AcquisitionFinish(id, ret);
+
+ContinueNext:
   // Start next possible mission
   TryBeginAwaitingTasks();
 }
 
 void SpkResource::Acquire(SpkPageBase *dest, bool stopOngoing, bool clearQueue)
 {
+  for(auto &i : mWorkingRequests.keys())
+  {
+    // Don't let an outdated task falsely report a finish signal.
+    // This is the designed way of stopping it from emitting a finish signal
+    i->setProperty("outdated", true);
+    // And abort as requested.
+    if(stopOngoing)
+      i->abort();
+    delete i;
+  }
+
   if(stopOngoing)
   {
-    for(auto &i : mWorkingRequests.keys())
-    {
-      // Don't let forced abort falsely report a finish signal. Disconnect them first.
-      i->disconnect(i, &QNetworkReply::finished, this, &SpkResource::ResourceDownloaded);
-      i->abort();
-      delete i;
-    }
     mWorkingRequests.clear();
-
     mRequestSemaphore->release(mMaximumConcurrent); // Release all semaphore users
   }
 
   if(clearQueue)
     mAwaitingRequests.clear();
 
-  disconnect(this, SLOT(AcquisitionFinish(int, ResourceResult)));
+  auto discResult = disconnect(this, SIGNAL(AcquisitionFinish(int, ResourceResult)), nullptr, nullptr);
+//  qDebug() << "SpkResource: Acquisition disconnection" << (discResult ? "success" : "failure");
 
   connect(this, &SpkResource::AcquisitionFinish,
           dest, &SpkPageBase::ResourceAcquisitionFinished,