You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mt...@apache.org on 2009/09/15 09:53:33 UTC

svn commit: r815199 - /commons/sandbox/runtime/trunk/src/main/native/os/win32/registry.c

Author: mturk
Date: Tue Sep 15 07:53:33 2009
New Revision: 815199

URL: http://svn.apache.org/viewvc?rev=815199&view=rev
Log:
Implement setting binary values as comma separated hexadecimal bytes

Modified:
    commons/sandbox/runtime/trunk/src/main/native/os/win32/registry.c

Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/registry.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/registry.c?rev=815199&r1=815198&r2=815199&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/registry.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/registry.c Tue Sep 15 07:53:33 2009
@@ -55,9 +55,9 @@
         sam |= KEY_READ;
     if (strchr(s, 'w'))
         sam |= KEY_WRITE;
-    if (strstr(s, "32"))
+    if (strchr(s, '3'))
         sam |= KEY_WOW64_32KEY;
-    else if (strstr(s, "64"))
+    else if (strchr(s, '6'))
         sam |= KEY_WOW64_64KEY;
     return sam;
 }
@@ -192,9 +192,10 @@
     INT64 qw;
     wchar_t *wn;
     char  tb[128];
-    unsigned char *buff  = NULL;
+    unsigned char *bb  = NULL;
     char          *value = NULL;
     wchar_t *wp;
+    wchar_t *wb;
     char    *cp;
 
     if (k && IS_INVALID_HANDLE(k->key)) {
@@ -209,34 +210,35 @@
                         &rt, NULL, &rl)) != ERROR_SUCCESS) {
         goto cleanup;
     }
-    buff = x_malloc((size_t)rl);
+    bb = x_malloc((size_t)rl);
     if ((rc = (int)RegQueryValueExW(k->key, wn, NULL,
-                        &rt, buff, &rl)) != ERROR_SUCCESS) {
+                        &rt, bb, &rl)) != ERROR_SUCCESS) {
         goto cleanup;
     }
+    wb = (wchar_t *)bb;
     switch (rt) {
         case REG_SZ:
-            value = x_strdup_utf8((wchar_t *)buff);
+            value = x_strdup_utf8(wb);
         break;
         case REG_MULTI_SZ:
-            for (wp = (wchar_t *)buff; *wp; wp++) {
+            for (wp = wb; *wp; wp++) {
                 while (*wp)
                     wp++;
                 if (*(wp + 1) != L'\0')
                     *wp = sc;
             }
-            value = x_strdup_utf8((wchar_t *)buff);
+            value = x_strdup_utf8(wb);
         break;
         case REG_EXPAND_SZ:
             {
                 wchar_t *sb;
                 DWORD    sz;
-                sz = ExpandEnvironmentStringsW((wchar_t *)buff, NULL, 0);
+                sz = ExpandEnvironmentStringsW(wb, NULL, 0);
                 if (sz) {
                     sb = x_malloc(sz * sizeof(wchar_t));
                     if (sb == NULL)
                         break;
-                    sz = ExpandEnvironmentStringsW((wchar_t *)buff, sb, sz);
+                    sz = ExpandEnvironmentStringsW(wb, sb, sz);
                     if (!sz) {
                         /* Shouldn't ever happen */
                         int rc = GetLastError();
@@ -249,20 +251,20 @@
             }
         break;
         case REG_DWORD:
-            memcpy(&rt, buff, 4);
+            memcpy(&rt, bb, 4);
             value = x_strdup(itoa(rt, tb, 10));
         break;
         case REG_QWORD:
-            memcpy(&qw, buff, 8);
+            memcpy(&qw, bb, 8);
             value = x_strdup(_i64toa(qw, tb, 10));
         break;
         case REG_BINARY:
             value = x_malloc(rl * 4 + 1);
             for (dw = 0, cp = value; dw < (rl - 1); dw++) {
-                sprintf(cp, "%02x, ", buff[dw]);
+                sprintf(cp, "%02x, ", bb[dw]);
                 cp += 4;
             }
-            sprintf(cp, "%02x", buff[dw]);
+            sprintf(cp, "%02x", bb[dw]);
         break;
         default:
             rc = ACR_EBADF;
@@ -271,7 +273,7 @@
 
 cleanup:
     x_free(wn);
-    x_free(buff);
+    x_free(bb);
     ACR_SET_OS_ERROR(rc);
     return value;
 }
@@ -284,7 +286,6 @@
     DWORD rl, dw;
     INT64 qw;
     wchar_t *wn;
-    unsigned char *buff = NULL;
     wchar_t *wp, *p;
 
     if (k && IS_INVALID_HANDLE(k->key)) {
@@ -336,7 +337,25 @@
                                 (const unsigned char *)&qw, 8);
         break;
         case REG_BINARY:
-            rc = ACR_ENOTIMPL;
+            {
+                DWORD i = 0;
+                const char *pp;
+                unsigned char *bb = x_malloc(strlen(value) / 2);
+                if (!bb) {
+                    rc = ACR_ENOMEM;
+                    break;
+                }
+                for (pp = value; *pp; ) {
+                    char *ep;
+                    unsigned long v = strtoul(pp, &ep, 16);
+
+                    bb[i++] = (unsigned char)v;
+                    pp = ep;
+                    while (*pp && !isxdigit((unsigned char)*pp))
+                        pp++;
+                }
+                rc = RegSetValueExW(k->key, wn, 0, st, bb, i);
+            }
         break;
         default:
             rc = ACR_EBADF;
@@ -345,6 +364,5 @@
 
 cleanup:
     x_free(wn);
-    x_free(buff);
     return rc;
 }