This is kind of half-right. It helps make the package database code
self-contained (since that needs to use check_for_cached as part of
ScanDownloadedFiles), but also pulls apart the 'cache checking' and
'download file and put it in the cache'.  There's probably some scope
for an package_source interface for "where is the package cache download
location for this package from that site."
---
 download.cc       | 104 ++--------------------------------------------
 download.h        |   6 ---
 package_meta.cc   |   3 +-
 package_source.cc |  95 ++++++++++++++++++++++++++++++++++++++++++
 package_source.h  |   4 ++
 5 files changed, 103 insertions(+), 109 deletions(-)

diff --git a/download.cc b/download.cc
index fbe36e5..4aba83e 100644
--- a/download.cc
+++ b/download.cc
@@ -19,7 +19,7 @@
 #include "csu_util/rfc1738.h"
 
 #include "download.h"
-  
+
 #include "win32.h"
 
 #include <stdio.h>
@@ -28,7 +28,6 @@
 #include <vector>
 
 #include "resource.h"
-#include "msg.h"
 #include "dialog.h"
 #include "geturl.h"
 #include "state.h"
@@ -48,110 +47,13 @@
 
 extern ThreeBarProgressPage Progress;
 
-// Return true if selected checks pass, false if they don't and the
-// user chooses to delete the file; otherwise throw an exception.
-static bool
-validateCachedPackage (const std::string& fullname, packagesource & pkgsource,
-                       Feedback &feedback, bool check_hash, bool check_size)
-{
-  try
-    {
-      if (check_size)
-       pkgsource.check_size_and_cache (fullname);
-      if (check_hash)
-       pkgsource.check_hash (feedback);
-      return true;
-    }
-  catch (Exception *e)
-    {
-      pkgsource.set_cached ("");
-      const char *filename = fullname.c_str ();
-      if (strncmp (filename, "file://", 7) == 0)
-       filename += 7;
-      if (e->errNo() == APPERR_CORRUPT_PACKAGE
-         && yesno (feedback.owner(), IDS_QUERY_CORRUPT, filename) == IDYES)
-       remove (filename);
-      else
-       throw e;
-    }
-  return false;
-}
-
-/* 0 if not cached; may throw exception if validation fails.
- */
-int
-check_for_cached (packagesource & pkgsource, Feedback &feedback,
-                  bool mirror_mode, bool check_hash)
-{
-  /* If the packagesource doesn't have a filename, it can't possibly be in the
-     cache */
-  if (!pkgsource.Canonical())
-    {
-      return 0;
-    }
-
-  /* Note that the cache dir is represented by a mirror site of 
file://local_dir */
-  std::string prefix = "file://" + local_dir + "/";
-  std::string fullname = prefix + pkgsource.Canonical();
-
-  if (mirror_mode)
-    {
-      /* Just assume correctness of mirror. */
-      if (!pkgsource.Cached())
-       pkgsource.set_cached (fullname);
-      return 1;
-    }
-
-  // Already found one, which we can assume to have the right size.
-  if (pkgsource.Cached())
-    {
-      if (validateCachedPackage (pkgsource.Cached(), pkgsource, feedback,
-                                check_hash, false))
-       return 1;
-      // If we get here, pkgsource.Cached() was corrupt and deleted.
-      pkgsource.set_cached ("");
-    }
-
-  /*
-     1) is there a legacy version in the cache dir available.
-  */
-  if (io_stream::exists (fullname))
-    {
-      if (validateCachedPackage (fullname, pkgsource, feedback, check_hash, 
true))
-       return 1;
-      // If we get here, fullname was corrupt and deleted, but it
-      // might have been cached.
-      pkgsource.set_cached ("");
-    }
-
-  /*
-     2) is there a version from one of the selected mirror sites available ?
-  */
-  for (packagesource::sitestype::const_iterator n = pkgsource.sites.begin();
-       n != pkgsource.sites.end(); ++n)
-  {
-    std::string fullname = prefix + rfc1738_escape_part (n->key) + "/" +
-      pkgsource.Canonical ();
-    if (io_stream::exists(fullname))
-       {
-         if (validateCachedPackage (fullname, pkgsource, feedback, check_hash,
-                                    true))
-           return 1;
-         // If we get here, fullname was corrupt and deleted, but it
-         // might have been cached.
-         pkgsource.set_cached ("");
-       }
-  }
-  return 0;
-}
-
 /* download a file from a mirror site to the local cache. */
 static int
 download_one (packagesource & pkgsource, Feedback &feedback)
 {
   try
     {
-      if (check_for_cached (pkgsource, feedback))
+      if (pkgsource.check_for_cached(feedback))
         return 0;
     }
   catch (Exception * e)
@@ -295,7 +197,7 @@ do_download_thread (HINSTANCE h, HWND owner)
 
       try
         {
-          if (!check_for_cached (*version.source(), feedback))
+          if (!(version.source()->check_for_cached(feedback)))
             total_download_bytes += version.source()->size;
         }
       catch (Exception * e)
diff --git a/download.h b/download.h
index 3f65153..e887c92 100644
--- a/download.h
+++ b/download.h
@@ -16,10 +16,4 @@
 #ifndef SETUP_DOWNLOAD_H
 #define SETUP_DOWNLOAD_H
 
-#include "Feedback.h"
-
-class packagesource;
-int check_for_cached (packagesource & pkgsource, Feedback &feedback,
-                      bool mirror_mode = false, bool check_hash = true);
-
 #endif /* SETUP_DOWNLOAD_H */
diff --git a/package_meta.cc b/package_meta.cc
index 0c5e2f5..4baea34 100644
--- a/package_meta.cc
+++ b/package_meta.cc
@@ -41,7 +41,6 @@
 #include <functional>
 
 #include "Generic.h"
-#include "download.h"
 #include "Exception.h"
 #include "resource.h"
 
@@ -841,7 +840,7 @@ packagemeta::scan (const packageversion &pkg, bool 
mirror_mode, Feedback &feedba
 
   try
     {
-      if (!check_for_cached (*(pkg.source ()), feedback, mirror_mode, false)
+      if (!pkg.source()->check_for_cached(feedback, mirror_mode, false)
           && ::source == IDC_SOURCE_LOCALDIR)
         return false;
     }
diff --git a/package_source.cc b/package_source.cc
index a652a3b..bc90158 100644
--- a/package_source.cc
+++ b/package_source.cc
@@ -25,6 +25,9 @@
 #include "filemanip.h"
 #include "io_stream.h"
 #include "Feedback.h"
+#include "csu_util/rfc1738.h"
+#include "resource.h"
+#include "state.h"
 
 site::site (const std::string& newkey) : key(newkey)
 {
@@ -185,3 +188,95 @@ packagesource::check_md5 (const std::string fullname, 
Feedback &feedback) const
   Log (LOG_BABBLE) << "MD5 verified OK: " << fullname << " "
     << md5.str() << endLog;
 }
+
+// Return true if selected checks pass, false if they don't and the
+// user chooses to delete the file; otherwise throw an exception.
+static bool
+validateCachedPackage (const std::string& fullname, packagesource &pkgsource,
+                       Feedback &feedback, bool check_hash, bool check_size)
+{
+  try
+    {
+      if (check_size)
+        pkgsource.check_size_and_cache (fullname);
+      if (check_hash)
+        pkgsource.check_hash (feedback);
+      return true;
+    }
+  catch (Exception *e)
+    {
+      pkgsource.set_cached ("");
+      const char *filename = fullname.c_str ();
+      if (strncmp (filename, "file://", 7) == 0)
+        filename += 7;
+      if (e->errNo() == APPERR_CORRUPT_PACKAGE
+          && yesno (feedback.owner(), IDS_QUERY_CORRUPT, filename) == IDYES)
+        remove (filename);
+      else
+        throw e;
+    }
+  return false;
+}
+
+int
+packagesource::check_for_cached (Feedback &feedback, bool mirror_mode,
+                                 bool check_hash)
+{
+  /* If the packagesource doesn't have a filename, it can't possibly be in the
+     cache */
+  if (!Canonical())
+    {
+      return 0;
+    }
+
+  /* Note that the cache dir is represented by a mirror site of 
file://local_dir */
+  std::string prefix = "file://" + local_dir + "/";
+  std::string fullname = prefix + Canonical();
+
+  if (mirror_mode)
+    {
+      /* Just assume correctness of mirror. */
+      if (!Cached())
+        set_cached (fullname);
+      return 1;
+    }
+
+  // Already found one, which we can assume to have the right size.
+  if (Cached())
+    {
+      if (validateCachedPackage (Cached(), *this, feedback, check_hash, false))
+        return 1;
+      // If we get here, this.Cached() was corrupt and deleted.
+      set_cached ("");
+    }
+
+  /*
+     1) is there a legacy version in the cache dir available.
+  */
+  if (io_stream::exists (fullname))
+    {
+      if (validateCachedPackage (fullname, *this, feedback, check_hash, true))
+        return 1;
+      // If we get here, fullname was corrupt and deleted, but it
+      // might have been cached.
+      set_cached ("");
+    }
+
+  /*
+     2) is there a version from one of the selected mirror sites available ?
+  */
+  for (packagesource::sitestype::const_iterator n = sites.begin();
+       n != sites.end(); ++n)
+  {
+    std::string fullname = prefix + rfc1738_escape_part (n->key) + "/" + 
Canonical ();
+    if (io_stream::exists(fullname))
+        {
+          if (validateCachedPackage (fullname, *this, feedback, check_hash, 
true))
+            return 1;
+          // If we get here, fullname was corrupt and deleted, but it
+          // might have been cached.
+          set_cached ("");
+        }
+  }
+  return 0;
+}
diff --git a/package_source.h b/package_source.h
index 663a603..52efc4b 100644
--- a/package_source.h
+++ b/package_source.h
@@ -85,6 +85,10 @@ public:
   typedef std::vector <site> sitestype;
   sitestype sites;
 
+  /* returns 0 if not cached; may throw exception if validation fails. */
+  int check_for_cached (Feedback &feedback, bool mirror_mode = false,
+                        bool check_hash = true);
+
 private:
   std::string canonical;
   /* For progress reporting.  */
-- 
2.43.0

Reply via email to