Mercurial > hg > xemacs-beta
diff netinstall/regedit.cc @ 448:3078fd1074e8 r21-2-39
Import from CVS: tag r21-2-39
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:38:25 +0200 |
parents | |
children | 3d3049ae1304 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/netinstall/regedit.cc Mon Aug 13 11:38:25 2007 +0200 @@ -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); +} +