/* 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;
}