mlang: Implement IMultiLanguage::GetLcidFromRfc1766.

This commit is contained in:
Hans Leidekker 2007-06-06 22:36:15 +02:00 committed by Alexandre Julliard
parent b611b56947
commit 4167e09f48
2 changed files with 109 additions and 4 deletions

View File

@ -740,6 +740,28 @@ HRESULT WINAPI LcidToRfc1766W(
return S_FALSE;
}
static HRESULT lcid_from_rfc1766(IEnumRfc1766 *iface, LCID *lcid, LPCWSTR rfc1766)
{
RFC1766INFO info;
ULONG num;
while (IEnumRfc1766_Next(iface, 1, &info, &num) == S_OK)
{
if (!strcmpW(info.wszRfc1766, rfc1766))
{
*lcid = info.lcid;
return S_OK;
}
if (strlenW(rfc1766) == 2 && !memcmp(info.wszRfc1766, rfc1766, 2 * sizeof(WCHAR)))
{
*lcid = PRIMARYLANGID(info.lcid);
return S_OK;
}
}
return E_FAIL;
}
/******************************************************************************
* MLANG ClassFactory
*/
@ -1656,8 +1678,22 @@ static HRESULT WINAPI fnIMultiLanguage_GetLcidFromRfc1766(
LCID* pLocale,
BSTR bstrRfc1766)
{
FIXME("\n");
return E_NOTIMPL;
HRESULT hr;
IEnumRfc1766 *rfc1766;
TRACE("%p %p %s\n", iface, pLocale, debugstr_w(bstrRfc1766));
if (!pLocale || !bstrRfc1766)
return E_INVALIDARG;
hr = IMultiLanguage_EnumRfc1766(iface, &rfc1766);
if (FAILED(hr))
return hr;
hr = lcid_from_rfc1766(rfc1766, pLocale, bstrRfc1766);
IEnumRfc1766_Release(rfc1766);
return hr;
}
/******************************************************************************/
@ -2172,8 +2208,22 @@ static HRESULT WINAPI fnIMultiLanguage2_GetLcidFromRfc1766(
LCID* pLocale,
BSTR bstrRfc1766)
{
FIXME("\n");
return E_NOTIMPL;
HRESULT hr;
IEnumRfc1766 *rfc1766;
TRACE("%p %p %s\n", iface, pLocale, debugstr_w(bstrRfc1766));
if (!pLocale || !bstrRfc1766)
return E_INVALIDARG;
hr = IMultiLanguage2_EnumRfc1766(iface, 0, &rfc1766);
if (FAILED(hr))
return hr;
hr = lcid_from_rfc1766(rfc1766, pLocale, bstrRfc1766);
IEnumRfc1766_Release(rfc1766);
return hr;
}
static HRESULT WINAPI fnIMultiLanguage2_EnumRfc1766(

View File

@ -679,6 +679,60 @@ static void test_rfc1766(IMultiLanguage2 *iML2)
}
}
static void test_GetLcidFromRfc1766(IMultiLanguage2 *iML2)
{
LCID lcid;
HRESULT ret;
static WCHAR e[] = { 'e',0 };
static WCHAR en[] = { 'e','n',0 };
static WCHAR empty[] = { 0 };
static WCHAR dash[] = { '-',0 };
static WCHAR e_dash[] = { 'e','-',0 };
static WCHAR en_gb[] = { 'e','n','-','g','b',0 };
static WCHAR en_us[] = { 'e','n','-','u','s',0 };
static WCHAR en_them[] = { 'e','n','-','t','h','e','m',0 };
static WCHAR english[] = { 'e','n','g','l','i','s','h',0 };
ret = IMultiLanguage2_GetLcidFromRfc1766(iML2, NULL, en);
ok(ret == E_INVALIDARG, "GetLcidFromRfc1766 returned: %08x\n", ret);
ret = IMultiLanguage2_GetLcidFromRfc1766(iML2, &lcid, NULL);
ok(ret == E_INVALIDARG, "GetLcidFromRfc1766 returned: %08x\n", ret);
ret = IMultiLanguage2_GetLcidFromRfc1766(iML2, &lcid, e);
ok(ret == E_FAIL, "GetLcidFromRfc1766 returned: %08x\n", ret);
ret = IMultiLanguage2_GetLcidFromRfc1766(iML2, &lcid, empty);
ok(ret == E_FAIL, "GetLcidFromRfc1766 returned: %08x\n", ret);
ret = IMultiLanguage2_GetLcidFromRfc1766(iML2, &lcid, dash);
ok(ret == E_FAIL, "GetLcidFromRfc1766 returned: %08x\n", ret);
ret = IMultiLanguage2_GetLcidFromRfc1766(iML2, &lcid, e_dash);
ok(ret == E_FAIL, "GetLcidFromRfc1766 returned: %08x\n", ret);
ret = IMultiLanguage2_GetLcidFromRfc1766(iML2, &lcid, en_them);
ok(ret == E_FAIL, "GetLcidFromRfc1766 returned: %08x\n", ret);
ret = IMultiLanguage2_GetLcidFromRfc1766(iML2, &lcid, english);
ok(ret == E_FAIL, "GetLcidFromRfc1766 returned: %08x\n", ret);
lcid = 0;
ret = IMultiLanguage2_GetLcidFromRfc1766(iML2, &lcid, en);
ok(ret == S_OK, "GetLcidFromRfc1766 returned: %08x\n", ret);
ok(lcid == 9, "got wrong lcid: %04x\n", lcid);
ret = IMultiLanguage2_GetLcidFromRfc1766(iML2, &lcid, en_gb);
ok(ret == S_OK, "GetLcidFromRfc1766 returned: %08x\n", ret);
ok(lcid == 0x809, "got wrong lcid: %04x\n", lcid);
ret = IMultiLanguage2_GetLcidFromRfc1766(iML2, &lcid, en_us);
ok(ret == S_OK, "GetLcidFromRfc1766 returned: %08x\n", ret);
ok(lcid == 0x409, "got wrong lcid: %04x\n", lcid);
}
START_TEST(mlang)
{
IMultiLanguage2 *iML2 = NULL;
@ -696,6 +750,7 @@ START_TEST(mlang)
if (ret != S_OK || !iML2) return;
test_rfc1766(iML2);
test_GetLcidFromRfc1766(iML2);
test_EnumCodePages(iML2, 0);
test_EnumCodePages(iML2, MIMECONTF_MIME_LATEST);