Module: wine Branch: master Commit: 4167e09f48dc7d600ce84aa1e1ed1830c2b6ca97 URL: http://source.winehq.org/git/wine.git/?a=commit;h=4167e09f48dc7d600ce84aa1e1...
Author: Hans Leidekker hans@it.vu.nl Date: Wed Jun 6 22:36:15 2007 +0200
mlang: Implement IMultiLanguage::GetLcidFromRfc1766.
---
dlls/mlang/mlang.c | 58 ++++++++++++++++++++++++++++++++++++++++++--- dlls/mlang/tests/mlang.c | 55 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+), 4 deletions(-)
diff --git a/dlls/mlang/mlang.c b/dlls/mlang/mlang.c index 6d5142b..b5b8e0d 100644 --- a/dlls/mlang/mlang.c +++ b/dlls/mlang/mlang.c @@ -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( diff --git a/dlls/mlang/tests/mlang.c b/dlls/mlang/tests/mlang.c index 53060fd..fb50e2e 100644 --- a/dlls/mlang/tests/mlang.c +++ b/dlls/mlang/tests/mlang.c @@ -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);