mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-12-27 07:56:14 +01:00
gtimezone.c: Fix identifier assignment on Windows
On Windows, we may be using the US DST boundaries by using the default "Pacific Standard Time" for rules_from_windows_time_zone() in rules_from_identifier(). This has the unfortunate side-effect of hardcoding the out_identifier to "Pacific Standard Time", which is likely not what we want. Instead, upon retrieving the items successfully using rules_from_windows_time_zone ("Pacific Standard Time", ...), we just set the out_identifier to whatever identifier that was passed into rules_from_identifier().
This commit is contained in:
parent
5ca4ac16ef
commit
f24444c585
@ -717,7 +717,8 @@ register_tzi_to_tzi (RegTZI *reg, TIME_ZONE_INFORMATION *tzi)
|
||||
static guint
|
||||
rules_from_windows_time_zone (const gchar *identifier,
|
||||
gchar **out_identifier,
|
||||
TimeZoneRule **rules)
|
||||
TimeZoneRule **rules,
|
||||
gboolean copy_identifier)
|
||||
{
|
||||
HKEY key;
|
||||
gchar *subkey = NULL;
|
||||
@ -735,10 +736,12 @@ rules_from_windows_time_zone (const gchar *identifier,
|
||||
if (GetSystemDirectoryW (winsyspath, MAX_PATH) == 0)
|
||||
return 0;
|
||||
|
||||
g_assert (out_identifier != NULL);
|
||||
g_assert (copy_identifier == FALSE || out_identifier != NULL);
|
||||
g_assert (rules != NULL);
|
||||
|
||||
if (copy_identifier)
|
||||
*out_identifier = NULL;
|
||||
|
||||
*rules = NULL;
|
||||
key_name = NULL;
|
||||
|
||||
@ -888,7 +891,10 @@ utf16_conv_failed:
|
||||
else
|
||||
(*rules)[rules_num - 1].start_year = (*rules)[rules_num - 2].start_year + 1;
|
||||
|
||||
if (copy_identifier)
|
||||
*out_identifier = g_steal_pointer (&key_name);
|
||||
else
|
||||
g_free (key_name);
|
||||
|
||||
return rules_num;
|
||||
}
|
||||
@ -1425,9 +1431,15 @@ rules_from_identifier (const gchar *identifier,
|
||||
|
||||
/* Use US rules, Windows' default is Pacific Standard Time */
|
||||
if ((rules_num = rules_from_windows_time_zone ("Pacific Standard Time",
|
||||
out_identifier,
|
||||
rules)))
|
||||
NULL,
|
||||
rules,
|
||||
FALSE)))
|
||||
{
|
||||
/* We don't want to hardcode our identifier here as
|
||||
* "Pacific Standard Time", use what was passed in
|
||||
*/
|
||||
*out_identifier = g_strdup (identifier);
|
||||
|
||||
for (i = 0; i < rules_num - 1; i++)
|
||||
{
|
||||
(*rules)[i].std_offset = - tzr.std_offset;
|
||||
@ -1572,7 +1584,8 @@ g_time_zone_new (const gchar *identifier)
|
||||
#elif defined (G_OS_WIN32)
|
||||
if ((rules_num = rules_from_windows_time_zone (identifier,
|
||||
&resolved_identifier,
|
||||
&rules)))
|
||||
&rules,
|
||||
TRUE)))
|
||||
{
|
||||
init_zone_from_rules (tz, rules, rules_num, g_steal_pointer (&resolved_identifier));
|
||||
g_free (rules);
|
||||
|
Loading…
Reference in New Issue
Block a user