Dmitry Timoshkov : mlang: Implement LcidToRfc1766 and GetRfc1766FromLcid.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Nov 28 06:06:00 CST 2006


Module: wine
Branch: master
Commit: ff90dbc08623bc1f2c284f8f927f8003dbf29e5c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ff90dbc08623bc1f2c284f8f927f8003dbf29e5c

Author: Dmitry Timoshkov <dmitry at codeweavers.com>
Date:   Tue Nov 28 18:39:53 2006 +0800

mlang: Implement LcidToRfc1766 and GetRfc1766FromLcid.

---

 dlls/mlang/Makefile.in   |    1 +
 dlls/mlang/mlang.c       |   80 +++++++++++++++++++++++++++++++++++----------
 dlls/mlang/tests/mlang.c |   14 ++++---
 3 files changed, 71 insertions(+), 24 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 8bdcc27..f290426 100644
--- a/dlls/mlang/mlang.c
+++ b/dlls/mlang/mlang.c
@@ -654,21 +654,55 @@ HRESULT WINAPI IsConvertINetStringAvaila
     return S_FALSE;
 }
 
+static inline INT lcid_to_rfc1766A( LCID lcid, LPSTR rfc1766, INT len )
+{
+    INT n = GetLocaleInfoA( lcid, LOCALE_SISO639LANGNAME, rfc1766, len );
+    if (n)
+    {
+        rfc1766[n - 1] = '-';
+        n += GetLocaleInfoA( lcid, LOCALE_SISO3166CTRYNAME, rfc1766 + n, len - n ) + 1;
+        LCMapStringA( LOCALE_USER_DEFAULT, LCMAP_LOWERCASE, rfc1766, n, rfc1766, len );
+        return n;
+    }
+    return 0;
+}
+
+static inline INT lcid_to_rfc1766W( LCID lcid, LPWSTR rfc1766, INT len )
+{
+    INT n = GetLocaleInfoW( lcid, LOCALE_SISO639LANGNAME, rfc1766, len );
+    if (n)
+    {
+        rfc1766[n - 1] = '-';
+        n += GetLocaleInfoW( lcid, LOCALE_SISO3166CTRYNAME, rfc1766 + n, len - n ) + 1;
+        LCMapStringW( LOCALE_USER_DEFAULT, LCMAP_LOWERCASE, rfc1766, n, rfc1766, len );
+        return n;
+    }
+    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 +1586,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 +1751,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,13 +1771,8 @@ static BOOL CALLBACK enum_locales_proc(L
         return FALSE;
 
     info->wszRfc1766[0] = 0;
-    n = GetLocaleInfoW(info->lcid, LOCALE_SISO639LANGNAME, info->wszRfc1766, MAX_RFC1766_NAME);
-    if (n && n < MAX_RFC1766_NAME)
-    {
-        info->wszRfc1766[n - 1] = '-';
-        GetLocaleInfoW(info->lcid, LOCALE_SISO3166CTRYNAME, info->wszRfc1766 + n, MAX_RFC1766_NAME - n);
-        LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_LOWERCASE, info->wszRfc1766 + n, -1, info->wszRfc1766 + n, MAX_RFC1766_NAME - n);
-    }
+    lcid_to_rfc1766W( info->lcid, info->wszRfc1766, MAX_RFC1766_NAME );
+
     info->wszLocaleName[0] = 0;
     GetLocaleInfoW(info->lcid, LOCALE_SLANGUAGE, info->wszLocaleName, MAX_LOCALE_NAME);
     TRACE("ISO639: %s SLANGUAGE: %s\n", wine_dbgstr_w(info->wszRfc1766), wine_dbgstr_w(info->wszLocaleName));
@@ -2066,11 +2102,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(
diff --git a/dlls/mlang/tests/mlang.c b/dlls/mlang/tests/mlang.c
index 2665f3c..3c871f7 100644
--- a/dlls/mlang/tests/mlang.c
+++ b/dlls/mlang/tests/mlang.c
@@ -33,12 +33,14 @@
 #define CP_UNICODE 1200
 #endif
 
-/*#define DUMP_CP_INFO*/
-/*#define DUMP_SCRIPT_INFO*/
+#if 0
+#define DUMP_CP_INFO
+#define DUMP_SCRIPT_INFO
 
 #if defined DUMP_CP_INFO || defined DUMP_SCRIPT_INFO
 #include "wine/debug.h"
 #endif
+#endif /* 0 */
 
 #define TRACE_2 OutputDebugStringA
 
@@ -314,8 +316,8 @@ static void test_EnumCodePages(IMultiLan
 	static const WCHAR autoW[] = {'_','a','u','t','o',0};
 
 #ifdef DUMP_CP_INFO
-	trace("MIMECPINFO #%lu:\n"
-	      "dwFlags %08lx %s\n"
+	trace("MIMECPINFO #%u:\n"
+	      "dwFlags %08x %s\n"
 	      "uiCodePage %u\n"
 	      "uiFamilyCodePage %u\n"
 	      "wszDescription %s\n"
@@ -554,7 +556,7 @@ static void test_EnumScripts(IMultiLangu
     {
 	CPINFOEXA cpinfoex;
 #ifdef DUMP_SCRIPT_INFO
-	trace("SCRIPTINFO #%lu:\n"
+	trace("SCRIPTINFO #%u:\n"
 	      "ScriptId %08x\n"
 	      "uiCodePage %u\n"
 	      "wszDescription %s\n"
@@ -657,7 +659,7 @@ static void test_rfc1766(IMultiLanguage2
         if (ret != S_OK) break;
 
 #ifdef DUMP_CP_INFO
-        trace("lcid %04lx rfc_name %s locale_name %s\n",
+        trace("lcid %04x rfc_name %s locale_name %s\n",
               info.lcid, wine_dbgstr_w(info.wszRfc1766), wine_dbgstr_w(info.wszLocaleName));
 #endif
 




More information about the wine-cvs mailing list