diff options
author | Werner Koch <[email protected]> | 2010-03-01 12:49:17 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2010-03-01 12:49:17 +0000 |
commit | 30a4096fbbfc85d006de83cff857f2d68115daac (patch) | |
tree | 706b105db6c35d35669c14190c9a3fe5a6d8e24a /jnlib/w32-reg.c | |
parent | First batch of changes to support W32CE. (diff) | |
download | gnupg-30a4096fbbfc85d006de83cff857f2d68115daac.tar.gz gnupg-30a4096fbbfc85d006de83cff857f2d68115daac.zip |
Finished jnlib port to CE.
Diffstat (limited to 'jnlib/w32-reg.c')
-rw-r--r-- | jnlib/w32-reg.c | 134 |
1 files changed, 132 insertions, 2 deletions
diff --git a/jnlib/w32-reg.c b/jnlib/w32-reg.c index e6bd911c5..5809c32bb 100644 --- a/jnlib/w32-reg.c +++ b/jnlib/w32-reg.c @@ -28,8 +28,10 @@ #include <windows.h> #include "libjnlib-config.h" +#include "utf8conv.h" #include "w32help.h" + static HKEY get_root_key(const char *root) { @@ -62,14 +64,78 @@ get_root_key(const char *root) char * read_w32_registry_string (const char *root, const char *dir, const char *name) { +#ifdef HAVE_W32CE_SYSTEM HKEY root_key, key_handle; DWORD n1, nbytes, type; char *result = NULL; + wchar_t *wdir, *wname; if ( !(root_key = get_root_key(root) ) ) return NULL; - if ( RegOpenKeyEx( root_key, dir, 0, KEY_READ, &key_handle ) ) + wdir = utf8_to_wchar (dir); + if (!wdir) + return NULL; + + if (RegOpenKeyEx (root_key, wdir, 0, KEY_READ, &key_handle) ) + { + if (root) + { + jnlib_free (wdir); + return NULL; /* No need for a RegClose, so return immediately. */ + } + /* It seems to be common practise to fall back to HKLM. */ + if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, wdir, 0, KEY_READ, &key_handle) ) + { + jnlib_free (wdir); + return NULL; /* Still no need for a RegClose. */ + } + } + jnlib_free (wdir); + + if (name) + { + wname = utf8_to_wchar (name); + if (!wname) + goto leave; + } + else + wname = NULL; + + nbytes = 2; + if (RegQueryValueEx (key_handle, wname, 0, NULL, NULL, &nbytes)) + goto leave; + result = jnlib_malloc ((n1=nbytes+2)); + if (!result) + goto leave; + if (RegQueryValueEx (key_handle, wname, 0, &type, result, &n1)) + { + jnlib_free (result); + result = NULL; + goto leave; + } + result[nbytes] = 0; /* Make sure it is a string. */ + result[nbytes+1] = 0; + if (type == REG_SZ || type == REG_EXPAND_SZ) + { + wchar_t *tmp = (void*)result; + result = wchar_to_utf8 (tmp); + jnlib_free (tmp); + } + + leave: + jnlib_free (wname); + RegCloseKey (key_handle); + return result; +#else /*!HAVE_W32CE_SYSTEM*/ + HKEY root_key, key_handle; + DWORD n1, nbytes, type; + char *result = NULL; + + if ( !(root_key = get_root_key(root) ) ) + return NULL; + + if (RegOpenKeyEx (root_key, dir, 0, KEY_READ, &key_handle) ) { if (root) return NULL; /* No need for a RegClose, so return immediately. */ @@ -142,15 +208,79 @@ read_w32_registry_string (const char *root, const char *dir, const char *name) leave: RegCloseKey (key_handle); return result; +#endif /*!HAVE_W32CE_SYSTEM*/ } +/* Note: This code is not well tested. However, it is not used in + GnuPG. */ int write_w32_registry_string (const char *root, const char *dir, const char *name, const char *value) { HKEY root_key, reg_key; +#ifdef HAVE_W32CE_SYSTEM + wchar_t *wdir, *wname, *wvalue; + DWORD disp; + + if ( !(root_key = get_root_key(root) ) ) + return -1; + + wdir = utf8_to_wchar (dir); + if (!wdir) + return -1; + + if (RegOpenKeyEx (root_key, wdir, 0, 0, ®_key)) + { + jnlib_free (wdir); + return -1; + } + jnlib_free (wdir); + + if (name) + { + wname = utf8_to_wchar (name); + if (!wname) + return -1; + } + else + wname = NULL; + + wvalue = utf8_to_wchar (value); + if (wvalue) + { + jnlib_free (wname); + return -1; + } + + if (RegSetValueEx (reg_key, wname, 0, REG_SZ, + (BYTE *)wvalue, wcslen (wvalue)) != ERROR_SUCCESS ) + { + + if (RegCreateKeyEx (root_key, wname, 0, NULL, 0, 0, NULL, + ®_key, &disp) != ERROR_SUCCESS) + { + RegCloseKey(reg_key); + jnlib_free (wname); + jnlib_free (wvalue); + return -1; + } + if (RegSetValueEx (reg_key, wname, 0, REG_SZ, + (BYTE *)wvalue, wcslen (wvalue)) != ERROR_SUCCESS ) + { + RegCloseKey(reg_key); + jnlib_free (wname); + jnlib_free (wvalue); + return -1; + } + } + jnlib_free (wname); + jnlib_free (wvalue); + RegCloseKey (reg_key); + return 0; +#else /*!HAVE_W32CE_SYSTEM*/ + if ( !(root_key = get_root_key(root) ) ) return -1; @@ -175,8 +305,8 @@ write_w32_registry_string (const char *root, const char *dir, } RegCloseKey (reg_key); - return 0; +#endif /*!HAVE_W32CE_SYSTEM*/ } #endif /*HAVE_W32_SYSTEM*/ |