/*
********************************************************************************
-* Copyright (C) 2005-2011, International Business Machines
+* Copyright (C) 2005-2012, International Business Machines
* Corporation and others. All Rights Reserved.
********************************************************************************
*
#if U_PLATFORM_HAS_WIN32_API
#include "wintz.h"
-
#include "cmemory.h"
#include "cstring.h"
# define NOMCX
#include <windows.h>
-#define MAX_LENGTH_ID 32
+#define MAX_LENGTH_ID 40
/* The layout of the Tzi value in the registry */
typedef struct
{
/* subKeyName needs to be long enough for the longest TZ_REGKEY, plus the longest Windows
* tzid (current or obsolete), plus an appended STANDARD_TIME_REGKEY, plus a 0 terminator.
- * Currently this is 111, but the code had 110. Make it 128 for some wiggle room. */
+ * At its max point this was 111, but the code had 110. Make it 128 for some wiggle room. */
char subKeyName[128];
char *name;
LONG result;
char* icuid = NULL;
UChar apiStd[MAX_LENGTH_ID];
char apiStdName[MAX_LENGTH_ID];
- char regStdName[MAX_LENGTH_ID];
+ char regStdName[MAX_LENGTH_ID];
char tmpid[MAX_LENGTH_ID];
int32_t apiStdLength = 0;
int32_t len;
+ int id;
+ int errorCode;
+ char ISOcode[3]; /* 2 letter iso code */
LONG result;
TZI tziKey;
tmpid[0] = 0;
+ id = GetUserGeoID(GEOCLASS_NATION);
+ errorCode = GetGeoInfo(id,GEO_ISO2,ISOcode,3,0);
+
bundle = ures_openDirect(NULL, "windowsZones", &status);
ures_getByKey(bundle, "mapTimezones", bundle, &status);
tziKey.daylightBias = tziReg.daylightBias;
if (uprv_memcmp((char *)&tziKey, (char*)&tziReg, sizeof(tziKey)) == 0) {
- const UChar* icuTZ = ures_getStringByKey(winTZ, "001", &len, &status);
+ const UChar* icuTZ = NULL;
+ if (errorCode != 0) {
+ icuTZ = ures_getStringByKey(winTZ, ISOcode, &len, &status);
+ }
+ if (errorCode==0 || icuTZ==NULL) {
+ /* fallback to default "001" and reset status */
+ status = U_ZERO_ERROR;
+ icuTZ = ures_getStringByKey(winTZ, "001", &len, &status);
+ }
+
if (U_SUCCESS(status)) {
/* Get the standard name from the registry key to compare with
the one from Windows API call. */
* the current time zone information)
*/
if (idFound || tmpid[0] == 0) {
- uprv_memset(tmpid, 0, sizeof(tmpid));
- u_austrncpy(tmpid, icuTZ, len);
+ /* if icuTZ has more than one city, take only the first (i.e. terminate icuTZ at first space) */
+ int index=0;
+ while (! (*icuTZ == '\0' || *icuTZ ==' ')) {
+ tmpid[index++]=(char)(*icuTZ++); /* safe to assume 'char' is ASCII compatible on windows */
+ }
+ tmpid[index]='\0';
}
}
}
}
ures_close(bundle);
-
+
return icuid;
}