Module: wine Branch: master Commit: 596f8d67a0d63375dddaf393210afeaad6685fd6 URL: http://source.winehq.org/git/wine.git/?a=commit;h=596f8d67a0d63375dddaf39321...
Author: Detlef Riekenberg wine.dev@web.de Date: Fri May 29 23:24:30 2009 +0200
mlang: Suppress country data in rfc1766, with tests.
---
dlls/mlang/mlang.c | 51 ++++++++++++++++++++++++++++++++++----------- dlls/mlang/tests/mlang.c | 33 +++++++++++++++++------------ 2 files changed, 57 insertions(+), 27 deletions(-)
diff --git a/dlls/mlang/mlang.c b/dlls/mlang/mlang.c index bac4e48..4144ef5 100644 --- a/dlls/mlang/mlang.c +++ b/dlls/mlang/mlang.c @@ -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; } diff --git a/dlls/mlang/tests/mlang.c b/dlls/mlang/tests/mlang.c index 2ae7c74..bf21146 100644 --- a/dlls/mlang/tests/mlang.c +++ b/dlls/mlang/tests/mlang.c @@ -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); } }