view netinstall/site.cc @ 981:0205cafe98ff

[xemacs-hg @ 2002-08-30 08:25:48 by youngs] Don't look now, but 21.5.9 is on its way out the door! Don't forget what good 'ol Ma used to say... "Eat your brussels sprouts, little Johnny, so you can grow up big and strong."
author youngs
date Fri, 30 Aug 2002 08:26:22 +0000
parents 3078fd1074e8
children
line wrap: on
line source

/*
 * Copyright (c) 2000, Red Hat, Inc.
 *
 *     This program is free software; you can redistribute it and/or modify
 *     it under the terms of the GNU General Public License as published by
 *     the Free Software Foundation; either version 2 of the License, or
 *     (at your option) any later version.
 *
 *     A copy of the GNU General Public License can be found at
 *     http://www.gnu.org/
 *
 * Written by DJ Delorie <dj@cygnus.com>
 *
 */

/* The purpose of this file is to get the list of mirror sites and ask
   the user which mirror site they want to download from. */

#include "win32.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "dialog.h"
#include "resource.h"
#include "state.h"
#include "geturl.h"
#include "msg.h"
#include "concat.h"
#include "regedit.h"
#include "reginfo.h"
#include "log.h"

#include "port.h"

#define NO_IDX (-1)
#define OTHER_IDX (-2)

typedef struct {
  char *url;
  char *displayed_url;
  char *sort_key;
} site_list_type;

static site_list_type *site_list = 0;
static int list_idx = NO_IDX;
static int mirror_idx = NO_IDX;

static void
check_if_enable_next (HWND h)
{
  EnableWindow (GetDlgItem (h, IDOK), (mirror_idx != NO_IDX) ? 1 : 0);
}

static void
load_dialog (HWND h)
{
  HWND listbox = GetDlgItem (h, IDC_URL_LIST);
  SendMessage (listbox, LB_SETCURSEL, list_idx, 0);
  check_if_enable_next (h);
}

static void
save_dialog (HWND h)
{
  HWND listbox = GetDlgItem (h, IDC_URL_LIST);
  list_idx = SendMessage (listbox, LB_GETCURSEL, 0, 0);
  if (list_idx == LB_ERR)
    {
      mirror_site = 0;
      mirror_idx = NO_IDX;
      list_idx = NO_IDX;
    }
  else
    {
      mirror_idx = SendMessage (listbox, LB_GETITEMDATA, list_idx, 0);
      if (mirror_idx == OTHER_IDX)
	mirror_site = 0;
      else
	mirror_site = site_list[mirror_idx].url;
    }
}

static void
get_root_dir ()
{
  int issystem, isnative;
  if (root_dir)
    return;
  root_dir = find_root_location (&issystem, &isnative);
}

void
save_site_url ()
{
  if (! MIRROR_SITE)
    return;

  get_root_dir ();
  if (! root_dir)
    return;
  
  FILE *f = fopen (concat (root_dir, XEMACS_SETUP_DIR, "last-mirror", 0), "wb");
  if (!f)
    return;
  fprintf (f, "%s\n", MIRROR_SITE);
  fclose (f);
}

static BOOL
dialog_cmd (HWND h, int id, HWND hwndctl, UINT code)
{
  switch (id)
    {

    case IDC_URL_LIST:
      save_dialog (h);
      check_if_enable_next (h);
      break;

    case IDOK:
      save_dialog (h);
      if (mirror_idx == OTHER_IDX)
	NEXT (IDD_OTHER_URL);
      else
	{
	  other_url = 0;
	  save_site_url ();
	  NEXT (IDD_S_LOAD_INI);
	}
      break;

    case IDC_BACK:
      save_dialog (h);
      NEXT (IDD_NET);
      break;

    case IDCANCEL:
      NEXT (0);
      break;
    }
  return FALSE;
}

static BOOL CALLBACK
dialog_proc (HWND h, UINT message, WPARAM wParam, LPARAM lParam)
{
  int i, j;
  HWND listbox;
  switch (message)
    {
    case WM_INITDIALOG:
      listbox = GetDlgItem (h, IDC_URL_LIST);
      for (i=0; site_list[i].url; i++)
	{
	  j = SendMessage (listbox, LB_ADDSTRING, 0, (LPARAM)site_list[i].displayed_url);
	  SendMessage (listbox, LB_SETITEMDATA, j, i);
	}
      j = SendMessage (listbox, LB_ADDSTRING, 0, (LPARAM)"Other URL");
      SendMessage (listbox, LB_SETITEMDATA, j, OTHER_IDX);
      load_dialog (h);
      return FALSE;
    case WM_COMMAND:
      return HANDLE_WM_COMMAND (h, wParam, lParam, dialog_cmd);
    }
  return FALSE;
}

static int CDECL
site_sort (const void *va, const void *vb)
{
  site_list_type *a = (site_list_type *)va;
  site_list_type *b = (site_list_type *)vb;
  return strcmp (a->sort_key, b->sort_key);
}

static int
get_site_list (HINSTANCE h)
{
  char mirror_url[1000];
  if (LoadString (h, IDS_MIRROR_LST, mirror_url, sizeof (mirror_url)) <= 0)
    return 1;
  char *mirrors = get_url_to_string (mirror_url);
  dismiss_url_status_dialog ();
  if (!mirrors)
    return 1;

  char *bol, *eol, *nl;

  
  /* null plus account for possibly missing NL plus account for "Other
    URL" from previous run. */
  int nmirrors = 3;

  for (bol=mirrors; *bol; bol++)
    if (*bol == '\n')
      nmirrors ++;

  site_list = (site_list_type *) malloc (nmirrors * sizeof (site_list_type));
  nmirrors = 0;

  nl = mirrors;
  while (*nl)
    {
      bol = nl;
      for (eol = bol; *eol && *eol != '\n'; eol++) ;
      if (*eol)
	nl = eol+1;
      else
	nl = eol;
      while (eol > bol && eol[-1] == '\r')
	eol--;
      *eol = 0;
      if (bol[0] != '#' && bol[0] > ' ')
	{
	  char *semi = strchr (bol, ';');
	  if (semi)
	    *semi = 0;
	  site_list[nmirrors].url = _strdup (bol);
	  site_list[nmirrors].displayed_url = _strdup (bol);
	  char *dot = strchr (site_list[nmirrors].displayed_url, '.');
	  if (dot)
	    {
	      dot = strchr (dot, '/');
	      if (dot)
		*dot = 0;
	    }
	  site_list[nmirrors].sort_key = (char *) malloc (2*strlen (bol) + 3);

	  dot = site_list[nmirrors].displayed_url;
	  dot += strlen (dot);
	  char *dp = site_list[nmirrors].sort_key;
	  while (dot != site_list[nmirrors].displayed_url)
	    {
	      if (*dot == '.' || *dot == '/')
		{
		  char *sp;
		  if (dot[3] == 0)
		    *dp++ = '~'; /* sort .com/.edu/.org together */
		  for (sp=dot+1; *sp && *sp != '.' && *sp != '/';)
		    *dp++ = *sp++;
		  *dp++ = ' ';
		}
	      dot--;
	    }
	  *dp++ = ' ';
	  strcpy (dp, site_list[nmirrors].displayed_url);

	  nmirrors++;
	}
    }
  site_list[nmirrors].url = 0;

  qsort (site_list, nmirrors, sizeof (site_list_type), site_sort);

  return 0;
}

/* List of machines that should not be used by default when saved
   in "last-mirror". */
#define NOSAVE1 "ftp://ftp.xemacs.org/"
#define NOSAVE1_LEN (sizeof ("ftp://ftp.xemacs.org/") - 1)

static void
get_initial_list_idx ()
{
  get_root_dir ();
  if (! root_dir)
    return;

  FILE *f = fopen (concat (root_dir, XEMACS_SETUP_DIR, "last-mirror", 0), "rt");
  if (!f)
    return;

  char site[1000];
  site[0]='\0';
  char * fg_ret = fgets (site, 1000, f);
  fclose (f);
  if (! fg_ret)
    return;

  char *eos = site + strlen (site) - 1;
  while (eos >= site && (*eos == '\n' || *eos == '\r'))
    *eos-- = '\0';

  if (eos < site)
    return;

  int i;
  for (i = 0; site_list[i].url; i++)
    if (strcmp (site_list[i].url, site) == 0)
      break;

  if (! site_list[i].url)
    {
      /* Don't default to certain machines ever since they suffer
	 from bandwidth limitations. */
      if (strnicmp (site, NOSAVE1, NOSAVE1_LEN) == 0)
	return;
      site_list[i].displayed_url =
      site_list[i].url = _strdup (site);
      site_list[i+1].url = 0;
    }

  mirror_idx = list_idx = i;
}

void
do_site (HINSTANCE h)
{
  int rv = 0;

  if (site_list == 0)
    if (get_site_list (h))
      {
	NEXT (IDD_NET);
	return;
      }

  get_initial_list_idx ();

  rv = DialogBox (h, MAKEINTRESOURCE (IDD_SITE), 0, dialog_proc);
  if (rv == -1)
    fatal (IDS_DIALOG_FAILED);

  if (mirror_idx != OTHER_IDX)
    log (0, "site: %s", mirror_site);
}