]> cygwin.com Git - cygwin-apps/setup.git/blobdiff - download.cc
* download.cc (get_file_size): Check for INVALID_HANDLE_VALUE instead
[cygwin-apps/setup.git] / download.cc
index a4d67fc3a738e4d4fb01e7cab87844a269bb168d..dfca299ecfb8c2e3c40e0a0ead7761406e3e245f 100644 (file)
 /* The purpose of this file is to download all the files we need to
    do the installation. */
 
+static char *cvsid = "\n%%% $Id$\n";
+
 #include "win32.h"
 
 #include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
 
 #include "resource.h"
 #include "msg.h"
 #include "geturl.h"
 #include "state.h"
 #include "mkdir.h"
+#include "log.h"
 
 #define pi (package[i].info[package[i].trust])
 
+static DWORD
+get_file_size (char *name)
+{
+  HANDLE h;
+  WIN32_FIND_DATA buf;
+  DWORD ret = 0;
+
+  h = FindFirstFileA (name, &buf);
+  if (h != INVALID_HANDLE_VALUE)
+    {
+      if (buf.nFileSizeHigh == 0)
+       ret = buf.nFileSizeLow;
+      FindClose (h);
+    }
+  return ret;
+}
+
+static int
+download_one (char *name, int expected_size)
+{
+  char *local = name;
+  int errors = 0;
+
+  DWORD size;
+  if ((size = get_file_size (local)) > 0)
+    if (size == expected_size)
+      return 0;
+
+  mkdir_p (0, local);
+
+  if (get_url_to_file (concat (MIRROR_SITE, "/", name, 0),
+                      concat (local, ".tmp", 0),
+                      expected_size))
+    {
+      note (IDS_DOWNLOAD_FAILED, name);
+      return 1;
+    }
+  else
+    {
+      size = get_file_size (concat (local, ".tmp", 0));
+      if (size == expected_size)
+       {
+         log (0, "Downloaded %s", local);
+         rename (concat (local, ".tmp", 0), local);
+       }
+      else
+       {
+         log (0, "Download %s wrong size (%d actual vs %d expected)",
+              local, size, expected_size);
+         note (IDS_DOWNLOAD_SHORT, local, size, expected_size);
+         return 1;
+       }
+    }
+
+  return 0;
+}
+
 void
 do_download (HINSTANCE h)
 {
   int i;
-  if (source == IDC_SOURCE_DOWNLOAD)
-    next_dialog = 0;
-  else
-    next_dialog = IDD_S_INSTALL;
+  int errors = 0;
 
   for (i=0; i<npackages; i++)
-    if (package[i].action != ACTION_SAME)
+    if (package[i].action == ACTION_NEW || package[i].action == ACTION_UPGRADE)
       {
-       char *local = pi.install;
-
-       struct stat s;
-       if (stat (local, &s) >= 0)
-         if (s.st_size == pi.install_size)
-           continue;
-
-       mkdir_p (0, local);
-
-       if (get_url_to_file (concat (MIRROR_SITE, "/", pi.install, 0),
-                            concat (local, ".tmp", 0),
-                            pi.install_size))
-         {
-           package[i].action = ACTION_ERROR;
-           continue;
-         }
-       else
-         {
-           stat (concat (local, ".tmp", 0), &s);
-           if (s.st_size == pi.install_size)
-             {
-               rename (concat (local, ".tmp", 0), local);
-             }
-           else
-             {
-               note (IDS_DOWNLOAD_SHORT, local, s.st_size, pi.install_size);
-               package[i].action = ACTION_ERROR;
-             }
-         }
+       int e = download_one (pi.install, pi.install_size);
+       if (package[i].srcaction == SRCACTION_YES && pi.source)
+         e += download_one (pi.source, pi.source_size);
+       errors += e;
+       if (e)
+         package[i].action = ACTION_ERROR;
       }
 
   dismiss_url_status_dialog ();
+
+  if (errors)
+    {
+      if (yesno (IDS_DOWNLOAD_INCOMPLETE) == IDYES)
+       {
+         next_dialog = IDD_SITE;
+         return;
+       }
+    }
+
+  if (source == IDC_SOURCE_DOWNLOAD)
+    {
+      if (errors)
+       exit_msg = IDS_DOWNLOAD_INCOMPLETE;
+      else
+       exit_msg = IDS_DOWNLOAD_COMPLETE;
+      next_dialog = 0;
+    }
+  else
+    next_dialog = IDD_S_INSTALL;
 }
This page took 0.025515 seconds and 5 git commands to generate.