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