Initial revision
[chise/xemacs-chise.git.1] / netinstall / ini.cc
diff --git a/netinstall/ini.cc b/netinstall/ini.cc
new file mode 100644 (file)
index 0000000..cd2a847
--- /dev/null
@@ -0,0 +1,187 @@
+/*
+ * 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 and parse the setup.ini file
+   from the mirror site.  A few support routines for the bison and
+   flex parsers are provided also.  We check to see if this setup.ini
+   is older than the one we used last time, and if so, warn the user. */
+
+#include "win32.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "ini.h"
+#include "resource.h"
+#include "concat.h"
+#include "state.h"
+#include "geturl.h"
+#include "dialog.h"
+#include "msg.h"
+#include "mkdir.h"
+#include "log.h"
+#include "reginfo.h"
+#include "version.h"
+
+unsigned int setup_timestamp = 0;
+char *setup_version = 0;
+
+extern "C" int yyparse ();
+/*extern int yydebug;*/
+
+static char *error_buf = 0;
+static int error_count = 0;
+
+void
+do_ini (HINSTANCE h)
+{
+  char *ini_file = get_url_to_string (concat (MIRROR_SITE, "/setup.ini", 0));
+  dismiss_url_status_dialog ();
+
+  if (!ini_file)
+    {
+      note (IDS_SETUPINI_MISSING, MIRROR_SITE);
+      next_dialog = IDD_SITE;
+      return;
+    }
+
+  package = 0;
+  npackages = 0;
+  setup_timestamp = 0;
+  setup_version = 0;
+
+  ini_init (ini_file);
+
+  setup_timestamp = 0;
+  /*yydebug = 1;*/
+
+  if (yyparse () || error_count > 0)
+    {
+      if (error_count == 1)
+       MessageBox (0, error_buf, "Parse Error", 0);
+      else
+       MessageBox (0, error_buf, "Parse Errors", 0);
+    }
+  else
+    {
+      /* save known-good setup.ini locally */
+      FILE *inif = fopen ("setup.ini", "wb");
+      if (inif)
+       {
+         fwrite (ini_file, 1, strlen (ini_file), inif);
+         fclose (inif);
+       }
+    }
+
+  if (root_dir)
+    {
+      mkdir_p (1, concat (root_dir, XEMACS_SETUP_DIR, 0));
+
+      unsigned int old_timestamp = 0;
+      FILE *ots = fopen (concat (root_dir, XEMACS_SETUP_DIR, "timestamp", 0), "rt");
+      if (ots)
+       {
+         fscanf (ots, "%u", &old_timestamp);
+         fclose (ots);
+         if (old_timestamp && setup_timestamp
+             && (old_timestamp > setup_timestamp))
+           {
+             int yn = yesno (IDS_OLD_SETUPINI);
+             if (yn == IDNO)
+               exit_setup (1);
+           }
+       }
+      if (setup_timestamp)
+       {
+         FILE *nts = fopen (concat (root_dir, XEMACS_SETUP_DIR, "timestamp", 0), "wt");
+         if (nts)
+           {
+             fprintf (nts, "%u", setup_timestamp);
+             fclose (nts);
+           }
+       }
+    }
+
+  msg ("setup_version is %s, our_version is %s", setup_version? setup_version : "(null)", version);
+  if (setup_version)
+    {
+      char *ini_version = canonicalize_version (setup_version);
+      char *our_version = canonicalize_version (version);
+      if (strcmp (our_version, ini_version) < 0)
+       note (IDS_OLD_SETUP_VERSION, version, setup_version);
+    }
+
+  next_dialog = IDD_CHOOSE;
+}
+
+extern "C" int yylineno;
+
+extern "C" int CDECL yyerror (char *s, ...)
+{
+  char buf[1000];
+  int len;
+  sprintf (buf, "setup.ini line %d: ", yylineno);
+  va_list args;
+  va_start (args, s);
+  vsprintf (buf + strlen (buf), s, args);
+  OutputDebugString (buf);
+  if (error_buf)
+    {
+      strcat (error_buf, "\n");
+      len = strlen (error_buf) + strlen (buf) + 5;
+      error_buf = (char *) realloc (error_buf, len);
+      strcat (error_buf, buf);
+    }
+  else
+    {
+      len = strlen (buf) + 5;
+      error_buf = (char *) malloc (len);
+      strcpy (error_buf, buf);
+    }
+  error_count++;
+  return 0;
+}
+
+extern "C" int CDECL fprintf (FILE *f, const char *s, ...);
+
+static char stderrbuf[1000];
+
+int CDECL
+fprintf (FILE *f, const char *fmt, ...)
+{
+  char buf[1000];
+  int rv;
+  va_list args;
+  va_start (args, fmt);
+  if (f == stderr)
+    {
+      rv = vsprintf (buf, fmt, args);
+      strcat (stderrbuf, buf);
+      if (char *nl = strchr (stderrbuf, '\n'))
+       {
+         *nl = 0;
+         /*OutputDebugString (stderrbuf);*/
+         MessageBox (0, buf, "XEmacs Setup", 0);
+         stderrbuf[0] = 0;
+       }
+      
+    }
+  else
+    {
+      rv = vfprintf (f, fmt, args);
+    }
+  return rv;
+}