Initial revision
[chise/xemacs-chise.git.1] / netinstall / regedit.cc
diff --git a/netinstall/regedit.cc b/netinstall/regedit.cc
new file mode 100644 (file)
index 0000000..0c69495
--- /dev/null
@@ -0,0 +1,219 @@
+/*
+ * 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>
+ *
+ */
+
+/* Manipulate the registry for XEmacs. */
+
+#include "win32.h"
+
+#include <stdio.h>
+#if defined(CYGWIN) || defined(MINGW)
+#include <cygwin/version.h>
+#include <sys/mount.h>
+#endif
+
+#include "reginfo.h"
+#include "regedit.h"
+#include "msg.h"
+#include "resource.h"
+#include "dialog.h"
+
+static char *
+find_cygwin_mount (HKEY rkey, int *istext)
+{
+  char buf[1000];
+  char *retval = 0;
+  HKEY key;
+  DWORD retvallen = 0;
+  DWORD flags = 0;
+  DWORD type;
+
+#if defined(CYGWIN) || defined(MINGW)
+  sprintf (buf, "Software\\%s\\%s\\%s\\/",
+          CYGWIN_INFO_CYGNUS_REGISTRY_NAME,
+          CYGWIN_INFO_CYGWIN_REGISTRY_NAME,
+          CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME);
+
+  if (RegOpenKeyEx (rkey, buf, 0, KEY_READ, &key) != ERROR_SUCCESS)
+    return 0;
+
+  if (RegQueryValueEx (key, "native", 0, &type, 0, &retvallen)
+      == ERROR_SUCCESS)
+    {
+      retval = new char[retvallen+1];
+      if (RegQueryValueEx (key, "native", 0, &type, (BYTE *)retval, &retvallen)
+         != ERROR_SUCCESS)
+       {
+         delete retval;
+         retval = 0;
+       }
+    }
+
+  retvallen = sizeof (flags);
+  RegQueryValueEx (key, "flags", 0, &type, (BYTE *)&flags, &retvallen);
+
+  RegCloseKey (key);
+
+  if (retval)
+    *istext = (flags & MOUNT_BINARY) ? 0 : 1;
+  return retval;
+#else
+  return 0;
+#endif
+}
+
+static char *
+find_xemacs_root (HKEY rkey, int* isnative)
+{
+  char buf[1000];
+  char *retval = 0;
+  HKEY key;
+  DWORD retvallen = 0;
+  DWORD type;
+  DWORD itype;
+
+  sprintf (buf, "Software\\%s\\%s",
+          XEMACS_INFO_XEMACS_ORG_REGISTRY_NAME,
+          XEMACS_INFO_XEMACS_REGISTRY_NAME);
+
+  if (RegOpenKeyEx (rkey, buf, 0, KEY_READ, &key) != ERROR_SUCCESS)
+    return 0;
+
+  if (RegQueryValueEx (key, XEMACS_INFO_XEMACS_ROOT_KEY,
+                      0, &type, 0, &retvallen) == ERROR_SUCCESS)
+    {
+      retval = new char[retvallen+1];
+      if (RegQueryValueEx (key, XEMACS_INFO_XEMACS_ROOT_KEY,
+                          0, &type, (BYTE *)retval, &retvallen) 
+         != ERROR_SUCCESS)
+       {
+         delete retval;
+         retval = 0;
+       }
+    }
+
+  retvallen = sizeof (itype);
+  RegQueryValueEx (key, XEMACS_INFO_XEMACS_ROOT_TYPE, 
+                  0, &type, (BYTE *)&itype, &retvallen);
+
+  if (itype == 1)
+    *isnative = 1;
+  else
+    *isnative = 0;
+
+  RegCloseKey (key);
+
+  return retval;
+}
+
+char *
+find_root_location (int *issystem, int *isnative)
+{
+  char *rv;
+  if ((rv = find_xemacs_root (HKEY_CURRENT_USER, isnative)))
+    {
+      *issystem = 0;
+      return rv;
+    }
+  else if ((rv = find_xemacs_root (HKEY_LOCAL_MACHINE, isnative)))
+    {
+      *issystem = 1;
+      return rv;
+    }
+  return 0;
+}
+
+char *
+find_cygwin_root (int *issystem)
+{
+  char *rv;
+  int istext;
+  if ((rv = find_cygwin_mount (HKEY_CURRENT_USER, &istext)))
+    {
+      *issystem = 0;
+      return rv;
+    }
+  else if ((rv = find_cygwin_mount (HKEY_LOCAL_MACHINE, &istext)))
+    {
+      *issystem = 1;
+      return rv;
+    }
+  return 0;
+}
+
+void
+create_xemacs_root (char *path, int issystem, int isnative)
+{
+  char buf[1000];
+  HKEY key;
+  DWORD disposition;
+  DWORD itype = isnative ? 1 : 0;
+
+  remove_xemacs_root ();
+
+  sprintf (buf, "Software\\%s\\%s",
+          XEMACS_INFO_XEMACS_ORG_REGISTRY_NAME,
+          XEMACS_INFO_XEMACS_REGISTRY_NAME);
+
+  HKEY kr = issystem ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
+  if (RegCreateKeyEx (kr, buf, 0, "XEmacs", 0, KEY_ALL_ACCESS,
+                     0, &key, &disposition) != ERROR_SUCCESS)
+    fatal ("create_xemacs_root");
+
+  RegSetValueEx (key, XEMACS_INFO_XEMACS_ROOT_KEY, 
+                0, REG_SZ, (BYTE *)path, strlen (path)+1);
+  RegSetValueEx (key, XEMACS_INFO_XEMACS_ROOT_TYPE, 
+                0, REG_DWORD, (BYTE *)&itype, sizeof (itype));
+}
+
+void
+set_app_path (char *exe, char* path, int issystem)
+{
+  char buf[1000];
+  HKEY key;
+  DWORD disposition;
+
+  sprintf (buf, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\%s",
+          exe);
+
+  HKEY kr = issystem ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
+  RegDeleteKey (kr, buf);
+  
+  if (RegCreateKeyEx (kr, buf, 0, "XEmacs", 0, KEY_ALL_ACCESS,
+                     0, &key, &disposition) != ERROR_SUCCESS)
+    fatal ("set_app_path");
+
+  RegSetValueEx (key, "Path", 
+                0, REG_SZ, (BYTE *)path, strlen (path)+1);
+}
+
+static void
+remove1 (HKEY rkey)
+{
+  char buf[1000];
+
+  sprintf (buf, "Software\\%s\\%s",
+          XEMACS_INFO_XEMACS_ORG_REGISTRY_NAME,
+          XEMACS_INFO_XEMACS_REGISTRY_NAME);
+
+  RegDeleteKey (rkey, buf);
+}
+
+void
+remove_xemacs_root ()
+{
+  remove1 (HKEY_LOCAL_MACHINE);
+  remove1 (HKEY_CURRENT_USER);
+}
+