From 604ca891769c664273beb519f315c6c327f48478 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1?= =?UTF-8?q?=D1=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= Date: Fri, 5 Feb 2016 09:40:30 +0100 Subject: [PATCH] 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 file changed, 30 insertions(+) diff --git a/gio/gregistrysettingsbackend.c b/gio/gregistrysettingsbackend.c index 330f57f47..382e642f7 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; }