diff --git a/dlls/mlang/mlang.c b/dlls/mlang/mlang.c index a60ad70..8a66a19 100644 --- a/dlls/mlang/mlang.c +++ b/dlls/mlang/mlang.c @@ -2236,6 +2236,7 @@ static HRESULT WINAPI fnIMultiLanguage2_GetRfc1766FromLcid( TRACE("%p %04x %p\n", iface, lcid, pbstrRfc1766); + ZeroMemory(buf, MAX_RFC1766_NAME * sizeof(WCHAR)); if (lcid_to_rfc1766W( lcid, buf, MAX_RFC1766_NAME )) { *pbstrRfc1766 = SysAllocString( buf ); diff --git a/dlls/mlang/tests/Makefile.in b/dlls/mlang/tests/Makefile.in index 0df1440..a6da644 100644 --- a/dlls/mlang/tests/Makefile.in +++ b/dlls/mlang/tests/Makefile.in @@ -3,7 +3,7 @@ TOPOBJDIR = ../../.. SRCDIR = @srcdir@ VPATH = @srcdir@ TESTDLL = mlang.dll -IMPORTS = uuid ole32 gdi32 kernel32 +IMPORTS = uuid ole32 oleaut32 gdi32 kernel32 CTESTS = \ mlang.c diff --git a/dlls/mlang/tests/mlang.c b/dlls/mlang/tests/mlang.c index c036f7a..657e8a0 100644 --- a/dlls/mlang/tests/mlang.c +++ b/dlls/mlang/tests/mlang.c @@ -255,6 +255,32 @@ static const char *dump_mime_flags(DWORD flags) } #endif +static BOOL check_convertible(IMultiLanguage2 *iML2, UINT from, UINT to) +{ + CHAR convert[MAX_PATH]; + BYTE dest[MAX_PATH]; + HRESULT hr; + UINT srcsz, destsz; + + static WCHAR strW[] = {'a','b','c',0}; + + srcsz = -1; + destsz = MAX_PATH; + hr = IMultiLanguage2_ConvertStringFromUnicode(iML2, NULL, from, strW, + &srcsz, convert, &destsz); + if (hr != S_OK) + return FALSE; + + srcsz = -1; + destsz = MAX_PATH; + hr = IMultiLanguage2_ConvertString(iML2, NULL, from, to, (BYTE *)convert, + &srcsz, dest, &destsz); + if (hr != S_OK) + return FALSE; + + return TRUE; +} + static void test_EnumCodePages(IMultiLanguage2 *iML2, DWORD flags) { IEnumCodePage *iEnumCP = NULL; @@ -316,6 +342,8 @@ static void test_EnumCodePages(IMultiLanguage2 *iML2, DWORD flags) CPINFOEXA cpinfoex; CHARSETINFO csi; MIMECSETINFO mcsi; + BOOL convertible; + HRESULT check = S_OK; static const WCHAR autoW[] = {'_','a','u','t','o',0}; #ifdef DUMP_CP_INFO @@ -376,12 +404,16 @@ static void test_EnumCodePages(IMultiLanguage2 *iML2, DWORD flags) ret = IMultiLanguage2_IsConvertible(iML2, CP_UNICODE, cpinfo[i].uiCodePage); ok(ret == S_OK, "IMultiLanguage2_IsConvertible(CP_UNICODE -> %u) = %08x\n", cpinfo[i].uiCodePage, ret); + convertible = check_convertible(iML2, cpinfo[i].uiCodePage, CP_UTF8); + if (!convertible) + check = S_FALSE; + TRACE_2("Call IMultiLanguage2_IsConvertible\n"); ret = IMultiLanguage2_IsConvertible(iML2, cpinfo[i].uiCodePage, CP_UTF8); - ok(ret == S_OK, "IMultiLanguage2_IsConvertible(%u -> CP_UTF8) = %08x\n", cpinfo[i].uiCodePage, ret); + ok(ret == check, "IMultiLanguage2_IsConvertible(%u -> CP_UTF8) = %08x\n", cpinfo[i].uiCodePage, ret); TRACE_2("Call IMultiLanguage2_IsConvertible\n"); ret = IMultiLanguage2_IsConvertible(iML2, CP_UTF8, cpinfo[i].uiCodePage); - ok(ret == S_OK, "IMultiLanguage2_IsConvertible(CP_UTF8 -> %u) = %08x\n", cpinfo[i].uiCodePage, ret); + ok(ret == check, "IMultiLanguage2_IsConvertible(CP_UTF8 -> %u) = %08x\n", cpinfo[i].uiCodePage, ret); } else trace("IsValidCodePage failed for cp %u\n", cpinfo[i].uiCodePage); @@ -654,12 +686,37 @@ static void IMLangFontLink_Test(IMLangFontLink* iMLFL) ok(CodePage == 1252, "Incorrect CodePage Returned (%i)\n",CodePage); } +/* copied from libs/wine/string.c */ +WCHAR *strstrW(const WCHAR *str, const WCHAR *sub) +{ + while (*str) + { + const WCHAR *p1 = str, *p2 = sub; + while (*p1 && *p2 && *p1 == *p2) { p1++; p2++; } + if (!*p2) return (WCHAR *)str; + str++; + } + return NULL; +} + +static CHAR string1[MAX_PATH], string2[MAX_PATH]; + +#define ok_w2(format, szString1, szString2) \ +\ + if (lstrcmpW(szString1, szString2) != 0) \ + { \ + WideCharToMultiByte(CP_ACP, 0, szString1, -1, string1, MAX_PATH, NULL, NULL); \ + WideCharToMultiByte(CP_ACP, 0, szString2, -1, string2, MAX_PATH, NULL, NULL); \ + ok(0, format, string1, string2); \ + } + static void test_rfc1766(IMultiLanguage2 *iML2) { IEnumRfc1766 *pEnumRfc1766; RFC1766INFO info; ULONG n; HRESULT ret; + BSTR rfcstr; ret = IMultiLanguage2_EnumRfc1766(iML2, LANG_NEUTRAL, &pEnumRfc1766); ok(ret == S_OK, "IMultiLanguage2_EnumRfc1766 error %08x\n", ret); @@ -675,7 +732,18 @@ static void test_rfc1766(IMultiLanguage2 *iML2) #endif ok(n == 1, "couldn't fetch 1 RFC1766INFO structure\n"); - ok(IsValidLocale(info.lcid, LCID_SUPPORTED), "invalid lcid %04x\n", info.lcid); + + /* verify the Rfc1766 value */ + ret = IMultiLanguage2_GetRfc1766FromLcid(iML2, info.lcid, &rfcstr); + ok(ret == S_OK, "Expected S_OK, got %08x\n", ret); + ok_w2("%s %s\n", info.wszRfc1766, rfcstr); + + /* not an exact 1:1 correspondence between lcid and rfc1766 in the + * mlang database, e.g., nb-no -> 1044 -> no */ + ok(strstrW(info.wszRfc1766, rfcstr) != NULL, + "Expected matching locale names\n"); + + SysFreeString(rfcstr); } IEnumRfc1766_Release(pEnumRfc1766); } -- 1.5.4.3