mlang [2/2]: Use recently added support for LOCALE_SNAME to implement LcidToRfc1766 and GetRfc1766FromLcid

Dmitry Timoshkov dmitry at codeweavers.com
Wed Nov 22 01:19:03 CST 2006


Hello,

Changelog:
    mlang [2/2]: Use recently added support for LOCALE_SNAME to implement
    LcidToRfc1766 and GetRfc1766FromLcid.

---
 dlls/mlang/Makefile.in |    1 +
 dlls/mlang/mlang.c     |   69 ++++++++++++++++++++++++++++++++++++++----------
 2 files changed, 56 insertions(+), 14 deletions(-)

diff --git a/dlls/mlang/Makefile.in b/dlls/mlang/Makefile.in
index 60393b0..956fd89 100644
--- a/dlls/mlang/Makefile.in
+++ b/dlls/mlang/Makefile.in
@@ -5,6 +5,7 @@ VPATH     = @srcdir@
 MODULE    = mlang.dll
 IMPORTLIB = libmlang.$(IMPLIBEXT)
 IMPORTS   = ole32 user32 gdi32 advapi32 kernel32 ntdll
+DELAYIMPORTS = oleaut32
 EXTRALIBS = -luuid
 EXTRADEFS = -DCOM_NO_WINDOWS_H
 
diff --git a/dlls/mlang/mlang.c b/dlls/mlang/mlang.c
index 295aa85..90fc3c5 100644
--- a/dlls/mlang/mlang.c
+++ b/dlls/mlang/mlang.c
@@ -654,21 +654,49 @@ HRESULT WINAPI IsConvertINetStringAvaila
     return S_FALSE;
 }
 
+static inline INT lcid_to_rfc1766A( LCID lcid, LPSTR rfc1766, INT len )
+{
+    if ((len = GetLocaleInfoA( lcid, LOCALE_SNAME, rfc1766, len )))
+    {
+        LCMapStringA( LOCALE_USER_DEFAULT, LCMAP_LOWERCASE, rfc1766, len, rfc1766, len );
+        return len;
+    }
+    return 0;
+}
+
+static inline INT lcid_to_rfc1766W( LCID lcid, LPWSTR rfc1766, INT len )
+{
+    if ((len = GetLocaleInfoW( lcid, LOCALE_SNAME, rfc1766, len )))
+    {
+        LCMapStringW( LOCALE_USER_DEFAULT, LCMAP_LOWERCASE, rfc1766, len, rfc1766, len );
+        return len;
+    }
+    return 0;
+}
+
 HRESULT WINAPI LcidToRfc1766A(
-    LCID Locale,
+    LCID lcid,
     LPSTR pszRfc1766,
     INT nChar)
 {
-    FIXME("%d %s %u\n", Locale, pszRfc1766, nChar);
+    TRACE("%04x %p %u\n", lcid, pszRfc1766, nChar);
+
+    if (lcid_to_rfc1766A( lcid, pszRfc1766, nChar ))
+        return S_OK;
+
     return S_FALSE;
 }
 
 HRESULT WINAPI LcidToRfc1766W(
-    LCID Locale,
+    LCID lcid,
     LPWSTR pszRfc1766,
     INT nChar)
 {
-    FIXME("%d %p %u\n", Locale, pszRfc1766, nChar);
+    TRACE("%04x %p %u\n", lcid, pszRfc1766, nChar);
+
+    if (lcid_to_rfc1766W( lcid, pszRfc1766, nChar ))
+        return S_OK;
+
     return S_FALSE;
 }
 
@@ -1552,11 +1580,19 @@ static HRESULT WINAPI fnIMultiLanguage_C
 
 static HRESULT WINAPI fnIMultiLanguage_GetRfc1766FromLcid(
     IMultiLanguage* iface,
-    LCID Locale,
+    LCID lcid,
     BSTR* pbstrRfc1766)
 {
-    FIXME("\n");
-    return E_NOTIMPL;
+    WCHAR buf[MAX_RFC1766_NAME];
+
+    TRACE("%p %04x %p\n", iface, lcid, pbstrRfc1766);
+
+    if (lcid_to_rfc1766W( lcid, buf, MAX_RFC1766_NAME ))
+    {
+        *pbstrRfc1766 = SysAllocString( buf );
+        return S_OK;
+    }
+    return E_FAIL;
 }
 
 static HRESULT WINAPI fnIMultiLanguage_GetLcidFromRfc1766(
@@ -1709,7 +1745,6 @@ struct enum_locales_data
 
 static BOOL CALLBACK enum_locales_proc(LPWSTR locale)
 {
-    DWORD n;
     WCHAR *end;
     struct enum_locales_data *data = TlsGetValue(MLANG_tls_index);
     RFC1766INFO *info;
@@ -1730,9 +1765,7 @@ static BOOL CALLBACK enum_locales_proc(L
         return FALSE;
 
     info->wszRfc1766[0] = 0;
-    n = GetLocaleInfoW(info->lcid, LOCALE_SNAME, info->wszRfc1766, MAX_RFC1766_NAME);
-    if (n)
-        LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_LOWERCASE, info->wszRfc1766, -1, info->wszRfc1766, MAX_RFC1766_NAME);
+    lcid_to_rfc1766W( info->lcid, info->wszRfc1766, MAX_RFC1766_NAME );
 
     info->wszLocaleName[0] = 0;
     GetLocaleInfoW(info->lcid, LOCALE_SLANGUAGE, info->wszLocaleName, MAX_LOCALE_NAME);
@@ -2063,11 +2096,19 @@ static HRESULT WINAPI fnIMultiLanguage2_
 
 static HRESULT WINAPI fnIMultiLanguage2_GetRfc1766FromLcid(
     IMultiLanguage3* iface,
-    LCID Locale,
+    LCID lcid,
     BSTR* pbstrRfc1766)
 {
-    FIXME("\n");
-    return E_NOTIMPL;
+    WCHAR buf[MAX_RFC1766_NAME];
+
+    TRACE("%p %04x %p\n", iface, lcid, pbstrRfc1766);
+
+    if (lcid_to_rfc1766W( lcid, buf, MAX_RFC1766_NAME ))
+    {
+        *pbstrRfc1766 = SysAllocString( buf );
+        return S_OK;
+    }
+    return E_FAIL;
 }
 
 static HRESULT WINAPI fnIMultiLanguage2_GetLcidFromRfc1766(
-- 
1.4.2






More information about the wine-patches mailing list