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