Implement more MLANG interfaces
Dmitry Timoshkov
dmitry at baikal.ru
Thu Aug 5 03:52:53 CDT 2004
Hello,
Changelog:
Dmitry Timoshkov <dmitry at codeweavers.com>
Implement ConvertINetMultiByteToUnicode, ConvertINetUnicodeToMultiByte
and IsConvertINetStringAvailable by moving common code around, add
a stub for ConvertINetString.
diff -u cvs/hq/wine/dlls/mlang/mlang.c wine/dlls/mlang/mlang.c
--- cvs/hq/wine/dlls/mlang/mlang.c 2004-08-05 03:33:06.000000000 +0900
+++ wine/dlls/mlang/mlang.c 2004-08-05 17:35:28.000000000 +0900
@@ -380,6 +380,165 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL,
return TRUE;
}
+HRESULT WINAPI ConvertINetMultiByteToUnicode(
+ LPDWORD pdwMode,
+ DWORD dwEncoding,
+ LPCSTR pSrcStr,
+ LPINT pcSrcSize,
+ LPWSTR pDstStr,
+ LPINT pcDstSize)
+{
+ INT src_len = -1;
+
+ TRACE("%p %ld %s %p %p %p\n", pdwMode, dwEncoding,
+ debugstr_a(pSrcStr), pcSrcSize, pDstStr, pcDstSize);
+
+ if (!pcDstSize)
+ return E_FAIL;
+
+ if (!pcSrcSize)
+ pcSrcSize = &src_len;
+
+ if (!*pcSrcSize)
+ {
+ *pcDstSize = 0;
+ return S_OK;
+ }
+
+ switch (dwEncoding)
+ {
+ case CP_UNICODE:
+ if (*pcSrcSize == -1)
+ *pcSrcSize = lstrlenW((LPCWSTR)pSrcStr);
+ *pcDstSize = min(*pcSrcSize, *pcDstSize);
+ *pcSrcSize *= sizeof(WCHAR);
+ memmove(pDstStr, pSrcStr, *pcDstSize * sizeof(WCHAR));
+ break;
+
+ default:
+ if (*pcSrcSize == -1)
+ *pcSrcSize = lstrlenA(pSrcStr);
+
+ *pcDstSize = MultiByteToWideChar(dwEncoding, 0, pSrcStr, *pcSrcSize, pDstStr, *pcDstSize);
+ break;
+ }
+
+ if (!*pcDstSize)
+ return E_FAIL;
+
+ return S_OK;
+}
+
+HRESULT WINAPI ConvertINetUnicodeToMultiByte(
+ LPDWORD pdwMode,
+ DWORD dwEncoding,
+ LPCWSTR pSrcStr,
+ LPINT pcSrcSize,
+ LPSTR pDstStr,
+ LPINT pcDstSize)
+{
+
+ INT src_len = -1;
+
+ TRACE("%p %ld %s %p %p %p\n", pdwMode, dwEncoding,
+ debugstr_w(pSrcStr), pcSrcSize, pDstStr, pcDstSize);
+
+ if (!pcDstSize)
+ return E_FAIL;
+
+ if (!pcSrcSize)
+ pcSrcSize = &src_len;
+
+ if (!*pcSrcSize)
+ {
+ *pcDstSize = 0;
+ return S_OK;
+ }
+
+ switch (dwEncoding)
+ {
+ case CP_UNICODE:
+ if (*pcSrcSize == -1)
+ *pcSrcSize = lstrlenW(pSrcStr);
+ *pcDstSize = min(*pcSrcSize * sizeof(WCHAR), *pcDstSize);
+ memmove(pDstStr, pSrcStr, *pcDstSize);
+ break;
+
+ default:
+ if (*pcSrcSize == -1)
+ *pcSrcSize = lstrlenW(pSrcStr);
+
+ *pcDstSize = WideCharToMultiByte(dwEncoding, 0, pSrcStr, *pcSrcSize, pDstStr, *pcDstSize, NULL, NULL);
+ break;
+ }
+
+
+ if (!*pcDstSize)
+ return E_FAIL;
+
+ return S_OK;
+}
+
+HRESULT WINAPI ConvertINetString(
+ LPDWORD pdwMode,
+ DWORD dwSrcEncoding,
+ DWORD dwDstEncoding,
+ LPCSTR pSrcStr,
+ LPINT pcSrcSize,
+ LPSTR pDstStr,
+ LPINT pcDstSize
+)
+{
+ FIXME("%p %ld %ld %s %p %p %p: stub!\n", pdwMode, dwSrcEncoding, dwDstEncoding,
+ debugstr_a(pSrcStr), pcSrcSize, pDstStr, pcDstSize);
+ return E_NOTIMPL;
+}
+
+static HRESULT GetFamilyCodePage(
+ UINT uiCodePage,
+ UINT* puiFamilyCodePage)
+{
+ UINT i, n;
+
+ TRACE("%u %p\n", uiCodePage, puiFamilyCodePage);
+
+ if (!puiFamilyCodePage) return S_FALSE;
+
+ for (i = 0; i < sizeof(mlang_data)/sizeof(mlang_data[0]); i++)
+ {
+ for (n = 0; n < mlang_data[i].number_of_cp; n++)
+ {
+ if (mlang_data[i].mime_cp_info[n].cp == uiCodePage)
+ {
+ *puiFamilyCodePage = mlang_data[i].family_codepage;
+ return S_OK;
+ }
+ }
+ }
+
+ return S_FALSE;
+}
+
+HRESULT WINAPI IsConvertINetStringAvailable(
+ DWORD dwSrcEncoding,
+ DWORD dwDstEncoding)
+{
+ UINT src_family, dst_family;
+
+ TRACE("%ld %ld\n", dwSrcEncoding, dwDstEncoding);
+
+ if (GetFamilyCodePage(dwSrcEncoding, &src_family) != S_OK ||
+ GetFamilyCodePage(dwDstEncoding, &dst_family) != S_OK)
+ return S_FALSE;
+
+ if (src_family == dst_family) return S_OK;
+
+ /* we can convert any codepage to/from unicode */
+ if (src_family == CP_UNICODE || dst_family == CP_UNICODE) return S_OK;
+
+ return S_FALSE;
+}
+
/******************************************************************************
* MLANG ClassFactory
*/
@@ -921,8 +1080,7 @@ static HRESULT WINAPI fnIMultiLanguage_G
UINT uiCodePage,
UINT* puiFamilyCodePage)
{
- FIXME("\n");
- return E_NOTIMPL;
+ return GetFamilyCodePage(uiCodePage, puiFamilyCodePage);
}
static HRESULT WINAPI fnIMultiLanguage_EnumCodePages(
@@ -950,8 +1108,7 @@ static HRESULT WINAPI fnIMultiLanguage_I
DWORD dwSrcEncoding,
DWORD dwDstEncoding)
{
- FIXME("\n");
- return E_NOTIMPL;
+ return IsConvertINetStringAvailable(dwSrcEncoding, dwDstEncoding);
}
static HRESULT WINAPI fnIMultiLanguage_ConvertString(
@@ -964,8 +1121,8 @@ static HRESULT WINAPI fnIMultiLanguage_C
BYTE* pDstStr,
UINT* pcDstSize)
{
- FIXME("\n");
- return E_NOTIMPL;
+ return ConvertINetString(pdwMode, dwSrcEncoding, dwDstEncoding,
+ pSrcStr, pcSrcSize, pDstStr, pcDstSize);
}
static HRESULT WINAPI fnIMultiLanguage_ConvertStringToUnicode(
@@ -977,8 +1134,8 @@ static HRESULT WINAPI fnIMultiLanguage_C
WCHAR* pDstStr,
UINT* pcDstSize)
{
- FIXME("\n");
- return E_NOTIMPL;
+ return ConvertINetMultiByteToUnicode(pdwMode, dwEncoding,
+ pSrcStr, pcSrcSize, pDstStr, pcDstSize);
}
static HRESULT WINAPI fnIMultiLanguage_ConvertStringFromUnicode(
@@ -990,8 +1147,8 @@ static HRESULT WINAPI fnIMultiLanguage_C
CHAR* pDstStr,
UINT* pcDstSize)
{
- FIXME("\n");
- return E_NOTIMPL;
+ return ConvertINetUnicodeToMultiByte(pdwMode, dwEncoding,
+ pSrcStr, pcSrcSize, pDstStr, pcDstSize);
}
static HRESULT WINAPI fnIMultiLanguage_ConvertStringReset(
@@ -1175,26 +1332,7 @@ static HRESULT WINAPI fnIMultiLanguage2_
UINT uiCodePage,
UINT* puiFamilyCodePage)
{
- UINT i, n;
-
- ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage2, iface);
- TRACE("%p %d %p\n", This, uiCodePage, puiFamilyCodePage);
-
- if (!puiFamilyCodePage) return S_FALSE;
-
- for (i = 0; i < sizeof(mlang_data)/sizeof(mlang_data[0]); i++)
- {
- for (n = 0; n < mlang_data[i].number_of_cp; n++)
- {
- if (mlang_data[i].mime_cp_info[n].cp == uiCodePage)
- {
- *puiFamilyCodePage = mlang_data[i].family_codepage;
- return S_OK;
- }
- }
- }
-
- return S_FALSE;
+ return GetFamilyCodePage(uiCodePage, puiFamilyCodePage);
}
static HRESULT WINAPI fnIMultiLanguage2_EnumCodePages(
@@ -1224,21 +1362,7 @@ static HRESULT WINAPI fnIMultiLanguage2_
DWORD dwSrcEncoding,
DWORD dwDstEncoding)
{
- UINT src_family, dst_family;
-
- ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage2, iface);
- TRACE("%p %ld %ld\n", This, dwSrcEncoding, dwDstEncoding);
-
- if (fnIMultiLanguage2_GetFamilyCodePage(iface, dwSrcEncoding, &src_family) != S_OK ||
- fnIMultiLanguage2_GetFamilyCodePage(iface, dwDstEncoding, &dst_family) != S_OK)
- return S_FALSE;
-
- if (src_family == dst_family) return S_OK;
-
- /* we can convert any codepage to/from unicode */
- if (src_family == CP_UNICODE || dst_family == CP_UNICODE) return S_OK;
-
- return S_FALSE;
+ return IsConvertINetStringAvailable(dwSrcEncoding, dwDstEncoding);
}
static HRESULT WINAPI fnIMultiLanguage2_ConvertString(
@@ -1251,8 +1375,8 @@ static HRESULT WINAPI fnIMultiLanguage2_
BYTE* pDstStr,
UINT* pcDstSize)
{
- FIXME("\n");
- return E_NOTIMPL;
+ return ConvertINetString(pdwMode, dwSrcEncoding, dwDstEncoding,
+ pSrcStr, pcSrcSize, pDstStr, pcDstSize);
}
static HRESULT WINAPI fnIMultiLanguage2_ConvertStringToUnicode(
@@ -1264,46 +1388,8 @@ static HRESULT WINAPI fnIMultiLanguage2_
WCHAR* pDstStr,
UINT* pcDstSize)
{
- INT src_len = -1;
-
- ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage2, iface);
- TRACE("%p %p %ld %s %p %p %p\n", This, pdwMode, dwEncoding,
- debugstr_a(pSrcStr), pcSrcSize, pDstStr, pcDstSize);
-
- if (!pcDstSize)
- return E_FAIL;
-
- if (!pcSrcSize)
- pcSrcSize = &src_len;
-
- if (!*pcSrcSize)
- {
- *pcDstSize = 0;
- return S_OK;
- }
-
- switch (dwEncoding)
- {
- case CP_UNICODE:
- if (*pcSrcSize == -1)
- *pcSrcSize = lstrlenW((LPCWSTR)pSrcStr);
- *pcDstSize = min(*pcSrcSize, *pcDstSize);
- *pcSrcSize *= sizeof(WCHAR);
- memmove(pDstStr, pSrcStr, *pcDstSize * sizeof(WCHAR));
- break;
-
- default:
- if (*pcSrcSize == -1)
- *pcSrcSize = lstrlenA(pSrcStr);
-
- *pcDstSize = MultiByteToWideChar(dwEncoding, 0, pSrcStr, *pcSrcSize, pDstStr, *pcDstSize);
- break;
- }
-
- if (!*pcDstSize)
- return E_FAIL;
-
- return S_OK;
+ return ConvertINetMultiByteToUnicode(pdwMode, dwEncoding,
+ pSrcStr, pcSrcSize, pDstStr, pcDstSize);
}
static HRESULT WINAPI fnIMultiLanguage2_ConvertStringFromUnicode(
@@ -1315,46 +1401,8 @@ static HRESULT WINAPI fnIMultiLanguage2_
CHAR* pDstStr,
UINT* pcDstSize)
{
- INT src_len = -1;
-
- ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage2, iface);
- TRACE("%p %p %ld %s %p %p %p\n", This, pdwMode, dwEncoding,
- debugstr_w(pSrcStr), pcSrcSize, pDstStr, pcDstSize);
-
- if (!pcDstSize)
- return E_FAIL;
-
- if (!pcSrcSize)
- pcSrcSize = &src_len;
-
- if (!*pcSrcSize)
- {
- *pcDstSize = 0;
- return S_OK;
- }
-
- switch (dwEncoding)
- {
- case CP_UNICODE:
- if (*pcSrcSize == -1)
- *pcSrcSize = lstrlenW(pSrcStr);
- *pcDstSize = min(*pcSrcSize * sizeof(WCHAR), *pcDstSize);
- memmove(pDstStr, pSrcStr, *pcDstSize);
- break;
-
- default:
- if (*pcSrcSize == -1)
- *pcSrcSize = lstrlenW(pSrcStr);
-
- *pcDstSize = WideCharToMultiByte(dwEncoding, 0, pSrcStr, *pcSrcSize, pDstStr, *pcDstSize, NULL, NULL);
- break;
- }
-
-
- if (!*pcDstSize)
- return E_FAIL;
-
- return S_OK;
+ return ConvertINetUnicodeToMultiByte(pdwMode, dwEncoding,
+ pSrcStr, pcSrcSize, pDstStr, pcDstSize);
}
static HRESULT WINAPI fnIMultiLanguage2_ConvertStringReset(
diff -u cvs/hq/wine/dlls/mlang/mlang.spec wine/dlls/mlang/mlang.spec
--- cvs/hq/wine/dlls/mlang/mlang.spec 2004-08-05 03:33:06.000000000 +0900
+++ wine/dlls/mlang/mlang.spec 2004-08-05 17:25:42.000000000 +0900
@@ -1,13 +1,13 @@
-@ stub ConvertINetMultiByteToUnicode
+@ stdcall ConvertINetMultiByteToUnicode(ptr long ptr ptr ptr ptr)
@ stub ConvertINetReset
-@ stub ConvertINetString
-@ stub ConvertINetUnicodeToMultiByte
+@ stdcall ConvertINetString(ptr long long ptr ptr ptr ptr)
+@ stdcall ConvertINetUnicodeToMultiByte(ptr long ptr ptr ptr ptr)
@ stdcall DllCanUnloadNow() MLANG_DllCanUnloadNow
@ stdcall DllGetClassObject(ptr ptr ptr) MLANG_DllGetClassObject
@ stdcall DllRegisterServer() MLANG_DllRegisterServer
@ stdcall DllUnregisterServer() MLANG_DllUnregisterServer
@ stub GetGlobalFontLinkObject
-@ stub IsConvertINetStringAvailable
+@ stdcall IsConvertINetStringAvailable(long long)
@ stub LcidToRfc1766A
@ stub LcidToRfc1766W
@ stub Rfc1766ToLcidA
diff -u cvs/hq/wine/include/mlang.h wine/include/mlang.h
--- cvs/hq/wine/include/mlang.h 2004-08-05 16:55:02.000000000 +0900
+++ wine/include/mlang.h 2004-08-05 17:26:01.000000000 +0900
@@ -2072,6 +2072,16 @@ void __RPC_STUB IMultiLanguage2_Validate
#endif /* __IMultiLanguage2_INTERFACE_DEFINED__ */
+STDAPI LcidToRfc1766A(LCID, LPSTR, INT);
+STDAPI LcidToRfc1766W(LCID, LPWSTR, INT);
+#define LcidToRfc1766 WINELIB_NAME_AW(LcidToRfc1766)
+STDAPI Rfc1766ToLcidA(LCID *, LPCSTR);
+STDAPI Rfc1766ToLcidW(LCID *, LPCWSTR);
+#define Rfc1766ToLcid WINELIB_NAME_AW(Rfc1766ToLcid)
+STDAPI IsConvertINetStringAvailable(DWORD, DWORD);
+STDAPI ConvertINetString(LPDWORD, DWORD, DWORD, LPCSTR, LPINT, LPSTR, LPINT);
+STDAPI ConvertINetMultiByteToUnicode(LPDWORD, DWORD, LPCSTR, LPINT, LPWSTR, LPINT);
+STDAPI ConvertINetUnicodeToMultiByte(LPDWORD, DWORD, LPCWSTR, LPINT, LPSTR, LPINT);
DEFINE_GUID(CLSID_CMultiLanguage, 0x275c23e2, 0x3747, 0x11d0, 0x9f,0xea,0x00,0xaa,0x00,0x3f,0x86,0x46);
DEFINE_GUID(IID_IMLangCodePages, 0x359F3443,0xBD4A,0x11D0,0xB1,0x88,0x00,0xAA,0x00,0x38,0xC9,0x69);
DEFINE_GUID(IID_IMLangFontLink, 0x359F3441,0xBD4A,0x11D0,0xB1,0x88,0x00,0xAA,0x00,0x38,0xC9,0x69);
diff -u cvs/hq/wine/include/mlang.idl wine/include/mlang.idl
--- cvs/hq/wine/include/mlang.idl 2004-08-05 16:55:02.000000000 +0900
+++ wine/include/mlang.idl 2004-08-05 17:25:42.000000000 +0900
@@ -463,6 +463,19 @@ interface IMultiLanguage2 : IUnknown
[in] DWORD dwfIODControl);
};
+cpp_quote("STDAPI LcidToRfc1766A(LCID, LPSTR, INT);")
+cpp_quote("STDAPI LcidToRfc1766W(LCID, LPWSTR, INT);")
+cpp_quote("#define LcidToRfc1766 WINELIB_NAME_AW(LcidToRfc1766)")
+
+cpp_quote("STDAPI Rfc1766ToLcidA(LCID *, LPCSTR);")
+cpp_quote("STDAPI Rfc1766ToLcidW(LCID *, LPCWSTR);")
+cpp_quote("#define Rfc1766ToLcid WINELIB_NAME_AW(Rfc1766ToLcid)")
+
+cpp_quote("STDAPI IsConvertINetStringAvailable(DWORD, DWORD);")
+cpp_quote("STDAPI ConvertINetString(LPDWORD, DWORD, DWORD, LPCSTR, LPINT, LPSTR, LPINT);")
+cpp_quote("STDAPI ConvertINetMultiByteToUnicode(LPDWORD, DWORD, LPCSTR, LPINT, LPWSTR, LPINT);")
+cpp_quote("STDAPI ConvertINetUnicodeToMultiByte(LPDWORD, DWORD, LPCWSTR, LPINT, LPSTR, LPINT);")
+
cpp_quote("DEFINE_GUID(CLSID_CMultiLanguage, 0x275c23e2, 0x3747, 0x11d0, 0x9f,0xea,0x00,0xaa,0x00,0x3f,0x86,0x46);")
cpp_quote("DEFINE_GUID(IID_IMLangCodePages, 0x359F3443,0xBD4A,0x11D0,0xB1,0x88,0x00,0xAA,0x00,0x38,0xC9,0x69);")
cpp_quote("DEFINE_GUID(IID_IMLangFontLink, 0x359F3441,0xBD4A,0x11D0,0xB1,0x88,0x00,0xAA,0x00,0x38,0xC9,0x69);")
More information about the wine-patches
mailing list