https://git.reactos.org/?p=reactos.git;a=commitdiff;h=ccc3eeaea8f56430a39c2…
commit ccc3eeaea8f56430a39c268ab15e1589c5c809aa
Author: Amine Khaldi <amine.khaldi(a)reactos.org>
AuthorDate: Sat Jan 26 13:15:35 2019 +0100
Commit: Amine Khaldi <amine.khaldi(a)reactos.org>
CommitDate: Sat Jan 26 13:15:35 2019 +0100
[MLANG] Sync with Wine Staging 4.0. CORE-15682
---
dll/win32/mlang/CMakeLists.txt | 2 +-
dll/win32/mlang/mlang.c | 129 +++++++++++++++++++++++++++++------------
media/doc/README.WINE | 2 +-
3 files changed, 93 insertions(+), 40 deletions(-)
diff --git a/dll/win32/mlang/CMakeLists.txt b/dll/win32/mlang/CMakeLists.txt
index cf6b77e757..5592c23e5a 100644
--- a/dll/win32/mlang/CMakeLists.txt
+++ b/dll/win32/mlang/CMakeLists.txt
@@ -15,5 +15,5 @@ add_library(mlang SHARED ${SOURCE} mlang.rc)
set_module_type(mlang win32dll UNICODE)
target_link_libraries(mlang uuid wine)
add_delay_importlibs(mlang oleaut32)
-add_importlibs(mlang gdi32 msvcrt kernel32 ntdll)
+add_importlibs(mlang gdi32 advapi32 msvcrt kernel32 ntdll)
add_cd_file(TARGET mlang DESTINATION reactos/system32 FOR all)
diff --git a/dll/win32/mlang/mlang.c b/dll/win32/mlang/mlang.c
index bada104a36..f12df298f1 100644
--- a/dll/win32/mlang/mlang.c
+++ b/dll/win32/mlang/mlang.c
@@ -494,35 +494,35 @@ static const struct mlang_data
SCRIPT_ID sid;
} mlang_data[] =
{
- { "Arabic",1256,sizeof(arabic_cp)/sizeof(arabic_cp[0]),arabic_cp,
+ { "Arabic", 1256, ARRAY_SIZE(arabic_cp), arabic_cp,
"Simplified Arabic Fixed","Simplified Arabic", sidArabic },
- { "Baltic",1257,sizeof(baltic_cp)/sizeof(baltic_cp[0]),baltic_cp,
+ { "Baltic", 1257, ARRAY_SIZE(baltic_cp), baltic_cp,
"Courier New","Arial", sidAsciiLatin },
- { "Chinese
Simplified",936,sizeof(chinese_simplified_cp)/sizeof(chinese_simplified_cp[0]),chinese_simplified_cp,
+ { "Chinese Simplified", 936, ARRAY_SIZE(chinese_simplified_cp),
chinese_simplified_cp,
"Simsun","Simsun", sidHan },
- { "Chinese
Traditional",950,sizeof(chinese_traditional_cp)/sizeof(chinese_traditional_cp[0]),chinese_traditional_cp,
+ { "Chinese Traditional", 950, ARRAY_SIZE(chinese_traditional_cp),
chinese_traditional_cp,
"MingLiu","New MingLiu", sidBopomofo },
- { "Central
European",1250,sizeof(central_european_cp)/sizeof(central_european_cp[0]),central_european_cp,
+ { "Central European", 1250, ARRAY_SIZE(central_european_cp),
central_european_cp,
"Courier New","Arial", sidAsciiLatin },
- { "Cyrillic",1251,sizeof(cyrillic_cp)/sizeof(cyrillic_cp[0]),cyrillic_cp,
+ { "Cyrillic", 1251, ARRAY_SIZE(cyrillic_cp), cyrillic_cp,
"Courier New","Arial", sidCyrillic },
- { "Greek",1253,sizeof(greek_cp)/sizeof(greek_cp[0]),greek_cp,
+ { "Greek", 1253, ARRAY_SIZE(greek_cp), greek_cp,
"Courier New","Arial", sidGreek },
- { "Hebrew",1255,sizeof(hebrew_cp)/sizeof(hebrew_cp[0]),hebrew_cp,
+ { "Hebrew", 1255, ARRAY_SIZE(hebrew_cp), hebrew_cp,
"Miriam Fixed","David", sidHebrew },
- { "Japanese",932,sizeof(japanese_cp)/sizeof(japanese_cp[0]),japanese_cp,
+ { "Japanese", 932, ARRAY_SIZE(japanese_cp), japanese_cp,
"MS Gothic","MS PGothic", sidKana },
- { "Korean",949,sizeof(korean_cp)/sizeof(korean_cp[0]),korean_cp,
+ { "Korean", 949, ARRAY_SIZE(korean_cp), korean_cp,
"GulimChe","Gulim", sidHangul },
- { "Thai",874,sizeof(thai_cp)/sizeof(thai_cp[0]),thai_cp,
+ { "Thai", 874, ARRAY_SIZE(thai_cp), thai_cp,
"Tahoma","Tahoma", sidThai },
- { "Turkish",1254,sizeof(turkish_cp)/sizeof(turkish_cp[0]),turkish_cp,
+ { "Turkish", 1254, ARRAY_SIZE(turkish_cp), turkish_cp,
"Courier New","Arial", sidAsciiLatin },
- {
"Vietnamese",1258,sizeof(vietnamese_cp)/sizeof(vietnamese_cp[0]),vietnamese_cp,
+ { "Vietnamese", 1258, ARRAY_SIZE(vietnamese_cp), vietnamese_cp,
"Courier New","Arial", sidAsciiLatin },
- { "Western
European",1252,sizeof(western_cp)/sizeof(western_cp[0]),western_cp,
+ { "Western European", 1252, ARRAY_SIZE(western_cp), western_cp,
"Courier New","Arial", sidAsciiLatin },
- {
"Unicode",CP_UNICODE,sizeof(unicode_cp)/sizeof(unicode_cp[0]),unicode_cp,
+ { "Unicode", CP_UNICODE, ARRAY_SIZE(unicode_cp), unicode_cp,
"Courier New","Arial" }
};
@@ -1163,7 +1163,7 @@ static HRESULT GetFamilyCodePage(
if (!puiFamilyCodePage) return S_FALSE;
- for (i = 0; i < sizeof(mlang_data)/sizeof(mlang_data[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(mlang_data); i++)
{
for (n = 0; n < mlang_data[i].number_of_cp; n++)
{
@@ -1560,13 +1560,13 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid,
LPVOID *ppv)
&& ! IsEqualGUID( &IID_IUnknown, iid) )
return E_NOINTERFACE;
- for (i=0; i < sizeof(object_creation)/sizeof(object_creation[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(object_creation); i++)
{
if (IsEqualGUID(object_creation[i].clsid, rclsid))
break;
}
- if (i == sizeof(object_creation)/sizeof(object_creation[0]))
+ if (i == ARRAY_SIZE(object_creation))
{
FIXME("%s: no class found.\n", debugstr_guid(rclsid));
return CLASS_E_CLASSNOTAVAILABLE;
@@ -1767,7 +1767,7 @@ static HRESULT EnumCodePage_create( MLang_impl* mlang, DWORD
grfFlags,
ecp->ref = 1;
ecp->pos = 0;
ecp->total = 0;
- for (i = 0; i < sizeof(mlang_data)/sizeof(mlang_data[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(mlang_data); i++)
{
for (n = 0; n < mlang_data[i].number_of_cp; n++)
{
@@ -1780,7 +1780,7 @@ static HRESULT EnumCodePage_create( MLang_impl* mlang, DWORD
grfFlags,
sizeof(MIMECPINFO) * ecp->total);
cpinfo = ecp->cpinfo;
- for (i = 0; i < sizeof(mlang_data)/sizeof(mlang_data[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(mlang_data); i++)
{
for (n = 0; n < mlang_data[i].number_of_cp; n++)
{
@@ -1944,7 +1944,7 @@ static HRESULT EnumScript_create( MLang_impl* mlang, DWORD dwFlags,
es->ref = 1;
es->pos = 0;
/* do not enumerate unicode flavours */
- es->total = sizeof(mlang_data)/sizeof(mlang_data[0]) - 1;
+ es->total = ARRAY_SIZE(mlang_data) - 1;
es->script_info = HeapAlloc(GetProcessHeap(), 0, sizeof(SCRIPTINFO) *
es->total);
for (i = 0; i < es->total; i++)
@@ -2140,7 +2140,7 @@ static HRESULT WINAPI fnIMultiLanguage_GetCodePageInfo(
TRACE("%p, %u, %p\n", This, uiCodePage, pCodePageInfo);
- for (i = 0; i < sizeof(mlang_data)/sizeof(mlang_data[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(mlang_data); i++)
{
for (n = 0; n < mlang_data[i].number_of_cp; n++)
{
@@ -2669,18 +2669,18 @@ static void fill_cp_info(const struct mlang_data *ml_data, UINT
index, MIMECPINF
mime_cp_info->uiCodePage = ml_data->mime_cp_info[index].cp;
mime_cp_info->uiFamilyCodePage = ml_data->family_codepage;
MultiByteToWideChar(CP_ACP, 0, ml_data->mime_cp_info[index].description, -1,
- mime_cp_info->wszDescription,
sizeof(mime_cp_info->wszDescription)/sizeof(WCHAR));
+ mime_cp_info->wszDescription,
ARRAY_SIZE(mime_cp_info->wszDescription));
MultiByteToWideChar(CP_ACP, 0, ml_data->mime_cp_info[index].web_charset, -1,
- mime_cp_info->wszWebCharset,
sizeof(mime_cp_info->wszWebCharset)/sizeof(WCHAR));
+ mime_cp_info->wszWebCharset,
ARRAY_SIZE(mime_cp_info->wszWebCharset));
MultiByteToWideChar(CP_ACP, 0, ml_data->mime_cp_info[index].header_charset, -1,
- mime_cp_info->wszHeaderCharset,
sizeof(mime_cp_info->wszHeaderCharset)/sizeof(WCHAR));
+ mime_cp_info->wszHeaderCharset,
ARRAY_SIZE(mime_cp_info->wszHeaderCharset));
MultiByteToWideChar(CP_ACP, 0, ml_data->mime_cp_info[index].body_charset, -1,
- mime_cp_info->wszBodyCharset,
sizeof(mime_cp_info->wszBodyCharset)/sizeof(WCHAR));
+ mime_cp_info->wszBodyCharset,
ARRAY_SIZE(mime_cp_info->wszBodyCharset));
MultiByteToWideChar(CP_ACP, 0, ml_data->fixed_font, -1,
- mime_cp_info->wszFixedWidthFont,
sizeof(mime_cp_info->wszFixedWidthFont)/sizeof(WCHAR));
+ mime_cp_info->wszFixedWidthFont,
ARRAY_SIZE(mime_cp_info->wszFixedWidthFont));
MultiByteToWideChar(CP_ACP, 0, ml_data->proportional_font, -1,
- mime_cp_info->wszProportionalFont,
sizeof(mime_cp_info->wszProportionalFont)/sizeof(WCHAR));
+ mime_cp_info->wszProportionalFont,
ARRAY_SIZE(mime_cp_info->wszProportionalFont));
TRACE("%08x %u %u %s %s %s %s %s %s %d\n",
mime_cp_info->dwFlags, mime_cp_info->uiCodePage,
@@ -2705,7 +2705,7 @@ static HRESULT WINAPI fnIMultiLanguage3_GetCodePageInfo(
TRACE("%p, %u, %04x, %p\n", This, uiCodePage, LangId, pCodePageInfo);
- for (i = 0; i < sizeof(mlang_data)/sizeof(mlang_data[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(mlang_data); i++)
{
for (n = 0; n < mlang_data[i].number_of_cp; n++)
{
@@ -2753,7 +2753,7 @@ static HRESULT WINAPI fnIMultiLanguage3_GetCharsetInfo(
if (!pCharsetInfo) return E_FAIL;
- for (i = 0; i < sizeof(mlang_data)/sizeof(mlang_data[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(mlang_data); i++)
{
for (n = 0; n < mlang_data[i].number_of_cp; n++)
{
@@ -2782,7 +2782,7 @@ static HRESULT WINAPI fnIMultiLanguage3_GetCharsetInfo(
* them in our database as a primary (web_charset) encoding this loop
* does an attempt to 'approximate' charset name by header_charset.
*/
- for (i = 0; i < sizeof(mlang_data)/sizeof(mlang_data[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(mlang_data); i++)
{
for (n = 0; n < mlang_data[i].number_of_cp; n++)
{
@@ -3120,7 +3120,7 @@ static HRESULT WINAPI fnIMultiLanguage3_GetCodePageDescription(
unsigned int i,n;
TRACE ("%u, %04x, %p, %d\n", uiCodePage, lcid, lpWideCharStr,
cchWideChar);
- for (i = 0; i < sizeof(mlang_data)/sizeof(mlang_data[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(mlang_data); i++)
{
for (n = 0; n < mlang_data[i].number_of_cp; n++)
{
@@ -3198,7 +3198,7 @@ static HRESULT WINAPI fnIMultiLanguage3_ValidateCodePageEx(
return S_OK;
/* check for mlang supported code pages */
- for (i = 0; i < sizeof(mlang_data)/sizeof(mlang_data[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(mlang_data); i++)
{
UINT n;
for (n = 0; n < mlang_data[i].number_of_cp; n++)
@@ -3339,7 +3339,7 @@ static HRESULT WINAPI fnIMLangFontLink2_GetCharCodePages(
IMLangFontLink2* iface
*ret_codepages = 0;
- for (i = 0; i < sizeof(mlang_data)/sizeof(mlang_data[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(mlang_data); i++)
{
BOOL used_dc;
CHAR buf;
@@ -3559,7 +3559,7 @@ static HRESULT WINAPI
fnIMLangFontLink2_GetScriptFontInfo(IMLangFontLink2* This,
if (!dwFlags) dwFlags = SCRIPTCONTF_PROPORTIONAL_FONT;
- for (i = 0, j = 0; i < sizeof(mlang_data)/sizeof(mlang_data[0]); i++)
+ for (i = 0, j = 0; i < ARRAY_SIZE(mlang_data); i++)
{
if (sid == mlang_data[i].sid)
{
@@ -3595,7 +3595,7 @@ static HRESULT WINAPI
fnIMLangFontLink2_CodePageToScriptID(IMLangFontLink2* This
if (uiCodePage == CP_UNICODE) return E_FAIL;
- for (i = 0; i < sizeof(mlang_data)/sizeof(mlang_data[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(mlang_data); i++)
{
if (uiCodePage == mlang_data[i].family_codepage)
{
@@ -3884,11 +3884,11 @@ static HRESULT MultiLanguage_create(IUnknown *pUnkOuter, LPVOID
*ppObj)
mlang->IMLangLineBreakConsole_iface.lpVtbl = &IMLangLineBreakConsole_vtbl;
mlang->total_cp = 0;
- for (i = 0; i < sizeof(mlang_data)/sizeof(mlang_data[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(mlang_data); i++)
mlang->total_cp += mlang_data[i].number_of_cp;
/* do not enumerate unicode flavours */
- mlang->total_scripts = sizeof(mlang_data)/sizeof(mlang_data[0]) - 1;
+ mlang->total_scripts = ARRAY_SIZE(mlang_data) - 1;
mlang->ref = 1;
*ppObj = &mlang->IMultiLanguage_iface;
@@ -3928,12 +3928,65 @@ HRESULT WINAPI DllCanUnloadNow(void)
return dll_count == 0 ? S_OK : S_FALSE;
}
+static BOOL register_codepages(void)
+{
+ const struct mlang_data *family;
+ const MIME_CP_INFO *info;
+ HKEY db_key, key;
+ WCHAR buf[32];
+ LSTATUS status;
+
+ static const WCHAR db_key_nameW[] = {
+ 'M','I','M','E',
+
'\\','D','a','t','a','b','a','s','e',
+
'\\','C','o','d','e','p','a','g','e',0};
+ static const WCHAR familyW[] =
{'F','a','m','i','l','y',0};
+ static const WCHAR formatW[] = {'%','u',0};
+
+ status = RegCreateKeyW(HKEY_CLASSES_ROOT, db_key_nameW, &db_key);
+ if (status != ERROR_SUCCESS)
+ return FALSE;
+
+ for (family = mlang_data; family < mlang_data + ARRAY_SIZE(mlang_data); family++)
+ {
+ for (info = family->mime_cp_info; info < family->mime_cp_info +
family->number_of_cp; info++)
+ {
+ sprintfW(buf, formatW, info->cp);
+ status = RegCreateKeyW(db_key, buf, &key);
+ if (status != ERROR_SUCCESS)
+ continue;
+
+ RegSetValueExA(key, "BodyCharset", 0, REG_SZ,
(BYTE*)info->body_charset,
+ strlen(info->body_charset) + 1);
+
+ if (info->cp == family->family_codepage)
+ {
+ RegSetValueExA(key, "FixedWidthFont", 0, REG_SZ,
(BYTE*)family->fixed_font,
+ strlen(family->fixed_font) + 1);
+ RegSetValueExA(key, "ProportionalFont", 0, REG_SZ,
(BYTE*)family->proportional_font,
+ strlen(family->proportional_font) + 1);
+ }
+ else
+ {
+ RegSetValueExW(key, familyW, 0, REG_DWORD,
(BYTE*)&family->family_codepage,
+ sizeof(family->family_codepage));
+ }
+
+ RegCloseKey(key);
+ }
+ }
+
+ RegCloseKey(db_key);
+ return TRUE;
+}
/***********************************************************************
* DllRegisterServer (MLANG.@)
*/
HRESULT WINAPI DllRegisterServer(void)
{
+ if(!register_codepages())
+ return E_FAIL;
return __wine_register_resources( instance );
}
diff --git a/media/doc/README.WINE b/media/doc/README.WINE
index a26f59941d..25458c0b00 100644
--- a/media/doc/README.WINE
+++ b/media/doc/README.WINE
@@ -96,7 +96,7 @@ reactos/dll/win32/mciqtz32 # Synced to WineStaging-3.3
reactos/dll/win32/mciseq # Synced to WineStaging-3.3
reactos/dll/win32/mciwave # Synced to WineStaging-4.0
reactos/dll/win32/mgmtapi # Synced to WineStaging-3.3
-reactos/dll/win32/mlang # Synced to WineStaging-3.3
+reactos/dll/win32/mlang # Synced to WineStaging-4.0
reactos/dll/win32/mmdevapi # Synced to WineStaging-3.3
reactos/dll/win32/mpr # Synced to WineStaging-3.17
reactos/dll/win32/mprapi # Synced to WineStaging-3.3