[glib] registrybackend: do convert values to UTF-16



commit 604ca891769c664273beb519f315c6c327f48478
Author: Руслан Ижбулатов <lrn1986 gmail com>
Date:   Fri Feb 5 09:40:30 2016 +0100

    registrybackend: do convert values to UTF-16
    
    Perform conversion before writing a value out of the cache into the registry,
    and convert back when reading a value into the cache out of the registry.
    The registry holds UTF-8 strings.

 gio/gregistrysettingsbackend.c |   30 ++++++++++++++++++++++++++++++
 1 files changed, 30 insertions(+), 0 deletions(-)
---
diff --git a/gio/gregistrysettingsbackend.c b/gio/gregistrysettingsbackend.c
index 330f57f..382e642 100644
--- a/gio/gregistrysettingsbackend.c
+++ b/gio/gregistrysettingsbackend.c
@@ -816,6 +816,13 @@ registry_read (HKEY           hpath,
       return FALSE;
     }
 
+  if (p_value->type == REG_SZ)
+    {
+      gchar *valueu8 = g_utf16_to_utf8 (p_value->ptr, -1, NULL, NULL, NULL);
+      g_free (p_value->ptr);
+      p_value->ptr = valueu8;
+    }
+
   return TRUE;
 }
 
@@ -926,6 +933,7 @@ g_registry_backend_write_one (const char *key_name,
   gunichar2 *value_namew;
   DWORD value_data_size;
   LPVOID value_data;
+  gunichar2 *value_dataw;
   LONG result;
   GNode *node;
   gboolean changed;
@@ -1023,7 +1031,28 @@ g_registry_backend_write_one (const char *key_name,
 
   value_namew = g_utf8_to_utf16 (value_name, -1, NULL, NULL, NULL);
 
+  value_dataw = NULL;
+
+  switch (type_string[0])
+    {
+    case 'b':
+    case 'y':
+    case 'n':
+    case 'q':
+    case 'i':
+    case 'u':
+    case 'x':
+    case 't':
+      break;
+    default:
+      value_dataw = g_utf8_to_utf16 (value_data, -1, NULL, NULL, NULL);
+      value_data = value_dataw;
+      value_data_size = (DWORD)((wcslen (value_data) + 1) * sizeof (gunichar2));
+      break;
+    }
+
   result = RegSetValueExW (hpath, value_namew, 0, value.type, value_data, value_data_size);
+
   if (result != ERROR_SUCCESS)
     g_message_win32_error (result, "gregistrybackend: setting value %s\\%s\\%s failed.\n",
                            self->base_path, path_name, value_name);
@@ -1036,6 +1065,7 @@ g_registry_backend_write_one (const char *key_name,
   RegCloseKey (hpath);
   g_free (path_name);
   g_free (value_namew);
+  g_free (value_dataw);
 
   return FALSE;
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]