Hans Leidekker : mlang: Implement IMultiLanguage::GetLcidFromRfc1766.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Jun 7 07:20:18 CDT 2007
Module: wine
Branch: master
Commit: 4167e09f48dc7d600ce84aa1e1ed1830c2b6ca97
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4167e09f48dc7d600ce84aa1e1ed1830c2b6ca97
Author: Hans Leidekker <hans at 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);
More information about the wine-cvs
mailing list