diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index aca36f9b2..4e1878ebb 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,12 @@ +2009-10-20 Corinna Vinschen + + * registry.cc (reg_key::get_int): Add alternative implementation + taking WCHAR strings. + (reg_key::set_int): Ditto. + (reg_key::get_string): Ditto. + (reg_key::set_string): Ditto. + * registry.h (struct reg_key): Add prototypes for added methods. + 2009-10-20 Corinna Vinschen * smallprint.cc (__small_vsprintf): Simplify UNICODE string handling diff --git a/winsup/cygwin/registry.cc b/winsup/cygwin/registry.cc index 47f8642f1..1fdf20a79 100644 --- a/winsup/cygwin/registry.cc +++ b/winsup/cygwin/registry.cc @@ -115,8 +115,25 @@ reg_key::get_int (const char *name, int def) if (key_is_invalid) return def; - LONG res = RegQueryValueExA (key, name, 0, &type, (unsigned char *) &dst, - &size); + LONG res = RegQueryValueExA (key, name, 0, &type, (LPBYTE) &dst, &size); + + if (type != REG_DWORD || res != ERROR_SUCCESS) + return def; + + return dst; +} + +int +reg_key::get_int (const PWCHAR name, int def) +{ + DWORD type; + DWORD dst; + DWORD size = sizeof (dst); + + if (key_is_invalid) + return def; + + LONG res = RegQueryValueExW (key, name, 0, &type, (LPBYTE) &dst, &size); if (type != REG_DWORD || res != ERROR_SUCCESS) return def; @@ -134,14 +151,25 @@ reg_key::set_int (const char *name, int val) return key_is_invalid; return (int) RegSetValueExA (key, name, 0, REG_DWORD, - (unsigned char *) &value, sizeof (value)); + (const BYTE *) &value, sizeof (value)); +} + +int +reg_key::set_int (const PWCHAR name, int val) +{ + DWORD value = val; + if (key_is_invalid) + return key_is_invalid; + + return (int) RegSetValueExW (key, name, 0, REG_DWORD, + (const BYTE *) &value, sizeof (value)); } /* Given the current registry key, return the specific string value requested. Return zero on success, non-zero on failure. */ int -reg_key::get_string (const char *name, char *dst, size_t max, const char * def) +reg_key::get_string (const char *name, char *dst, size_t max, const char *def) { DWORD size = max; DWORD type; @@ -150,13 +178,30 @@ reg_key::get_string (const char *name, char *dst, size_t max, const char * def) if (key_is_invalid) res = key_is_invalid; else - res = RegQueryValueExA (key, name, 0, &type, (unsigned char *) dst, &size); + res = RegQueryValueExA (key, name, 0, &type, (LPBYTE) dst, &size); if ((def != 0) && ((type != REG_SZ) || (res != ERROR_SUCCESS))) strcpy (dst, def); return (int) res; } +int +reg_key::get_string (const PWCHAR name, PWCHAR dst, size_t max, const PWCHAR def) +{ + DWORD size = max; + DWORD type; + LONG res; + + if (key_is_invalid) + res = key_is_invalid; + else + res = RegQueryValueExW (key, name, 0, &type, (LPBYTE) dst, &size); + + if ((def != 0) && ((type != REG_SZ) || (res != ERROR_SUCCESS))) + wcscpy (dst, def); + return (int) res; +} + /* Given the current registry key, set a specific string value. */ int @@ -164,10 +209,19 @@ reg_key::set_string (const char *name, const char *src) { if (key_is_invalid) return key_is_invalid; - return (int) RegSetValueExA (key, name, 0, REG_SZ, (unsigned char*) src, + return (int) RegSetValueExA (key, name, 0, REG_SZ, (const BYTE*) src, strlen (src) + 1); } +int +reg_key::set_string (const PWCHAR name, const PWCHAR src) +{ + if (key_is_invalid) + return key_is_invalid; + return (int) RegSetValueExW (key, name, 0, REG_SZ, (const BYTE*) src, + (wcslen (src) + 1) * sizeof (WCHAR)); +} + /* Return the handle to key. */ HKEY diff --git a/winsup/cygwin/registry.h b/winsup/cygwin/registry.h index bd2f388cb..b14c3afb5 100644 --- a/winsup/cygwin/registry.h +++ b/winsup/cygwin/registry.h @@ -30,10 +30,17 @@ public: int killvalue (const char *name); HKEY get_key (); - int get_int (const char *,int def); - int get_string (const char *, char *buf, size_t len, const char *def); - int set_string (const char *,const char *); - int set_int (const char *, int val); + + int get_int (const char *, int); + int get_int (const PWCHAR, int); + int get_string (const char *, char *, size_t, const char *); + int get_string (const PWCHAR, PWCHAR, size_t, const PWCHAR); + + int set_int (const char *, int); + int set_int (const PWCHAR, int); + int set_string (const char *, const char *); + int set_string (const PWCHAR, const PWCHAR); + bool created () const {return _disposition & REG_CREATED_NEW_KEY;} ~reg_key ();