mlang: Suppress country data in rfc1766, with tests.

This commit is contained in:
Detlef Riekenberg 2009-05-29 23:24:30 +02:00 committed by Alexandre Julliard
parent e84ae0e720
commit 596f8d67a0
2 changed files with 57 additions and 27 deletions

View File

@ -1137,29 +1137,54 @@ HRESULT WINAPI IsConvertINetStringAvailable(
static inline HRESULT lcid_to_rfc1766A( LCID lcid, LPSTR rfc1766, INT len )
{
INT n = GetLocaleInfoA( lcid, LOCALE_SISO639LANGNAME, rfc1766, len );
CHAR buffer[MAX_RFC1766_NAME];
INT n = GetLocaleInfoA(lcid, LOCALE_SISO639LANGNAME, buffer, MAX_RFC1766_NAME);
INT i;
if (n)
{
rfc1766[n - 1] = '-';
n += GetLocaleInfoA( lcid, LOCALE_SISO3166CTRYNAME, rfc1766 + n, len - n );
LCMapStringA( LOCALE_USER_DEFAULT, LCMAP_LOWERCASE, rfc1766, n, rfc1766, len );
return S_OK;
i = PRIMARYLANGID(lcid);
if ((((i == LANG_ENGLISH) || (i == LANG_CHINESE) || (i == LANG_ARABIC)) &&
(SUBLANGID(lcid) == SUBLANG_DEFAULT)) ||
(SUBLANGID(lcid) > SUBLANG_DEFAULT)) {
buffer[n - 1] = '-';
i = GetLocaleInfoA(lcid, LOCALE_SISO3166CTRYNAME, buffer + n, MAX_RFC1766_NAME - n);
if (!i)
buffer[n - 1] = '\0';
}
else
i = 0;
LCMapStringA( LOCALE_USER_DEFAULT, LCMAP_LOWERCASE, buffer, n + i, rfc1766, len );
return ((n + i) > len) ? E_INVALIDARG : S_OK;
}
return E_FAIL;
}
static inline HRESULT lcid_to_rfc1766W( LCID lcid, LPWSTR rfc1766, INT len )
{
INT n = GetLocaleInfoW( lcid, LOCALE_SISO639LANGNAME, rfc1766, len );
INT save = n;
WCHAR buffer[MAX_RFC1766_NAME];
INT n = GetLocaleInfoW(lcid, LOCALE_SISO639LANGNAME, buffer, MAX_RFC1766_NAME);
INT i;
if (n)
{
rfc1766[n - 1] = '-';
n += GetLocaleInfoW( lcid, LOCALE_SISO3166CTRYNAME, rfc1766 + n, len - n );
if (n == save)
rfc1766[n - 1] = '\0';
LCMapStringW( LOCALE_USER_DEFAULT, LCMAP_LOWERCASE, rfc1766, n, rfc1766, len );
return S_OK;
i = PRIMARYLANGID(lcid);
if ((((i == LANG_ENGLISH) || (i == LANG_CHINESE) || (i == LANG_ARABIC)) &&
(SUBLANGID(lcid) == SUBLANG_DEFAULT)) ||
(SUBLANGID(lcid) > SUBLANG_DEFAULT)) {
buffer[n - 1] = '-';
i = GetLocaleInfoW(lcid, LOCALE_SISO3166CTRYNAME, buffer + n, MAX_RFC1766_NAME - n);
if (!i)
buffer[n - 1] = '\0';
}
else
i = 0;
LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_LOWERCASE, buffer, n + i, rfc1766, len);
return ((n + i) > len) ? E_INVALIDARG : S_OK;
}
return E_FAIL;
}

View File

@ -940,25 +940,30 @@ static void test_Rfc1766ToLcid(void)
static void test_GetRfc1766FromLcid(IMultiLanguage2 *iML2)
{
CHAR expected[MAX_RFC1766_NAME];
CHAR buffer[MAX_RFC1766_NAME + 1];
DWORD i;
HRESULT hr;
BSTR rfcstr;
LCID lcid;
static WCHAR kok[] = {'k','o','k',0};
for(i = 0; i < sizeof(lcid_table) / sizeof(lcid_table[0]); i++) {
buffer[0] = '\0';
hr = IMultiLanguage2_GetLcidFromRfc1766(iML2, &lcid, kok);
/*
* S_FALSE happens when 'kok' instead matches to a different Rfc1766 name
* for example 'ko' so it is not a failure but does not give us what
* we are looking for
*/
if (hr != S_FALSE)
{
ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
rfcstr = NULL;
hr = IMultiLanguage2_GetRfc1766FromLcid(iML2, lcid_table[i].lcid, &rfcstr);
ok(hr == lcid_table[i].hr,
"#%02d: HRESULT 0x%x (expected 0x%x)\n", i, hr, lcid_table[i].hr);
if (hr != S_OK)
continue; /* no result-string created */
WideCharToMultiByte(CP_ACP, 0, rfcstr, -1, buffer, sizeof(buffer), NULL, NULL);
LCMapStringA(LOCALE_USER_DEFAULT, LCMAP_LOWERCASE, lcid_table[i].rfc1766,
lstrlenA(lcid_table[i].rfc1766) + 1, expected, MAX_RFC1766_NAME);
ok(!lstrcmpA(buffer, expected),
"#%02d: got '%s' (expected '%s')\n", i, buffer, expected);
hr = IMultiLanguage2_GetRfc1766FromLcid(iML2, lcid, &rfcstr);
ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
ok_w2("Expected \"%s\", got \"%s\"n", kok, rfcstr);
SysFreeString(rfcstr);
}
}