📄 mlang.c
字号:
memcpy(rgelt, This->script_info + This->pos, celt * sizeof(SCRIPTINFO));
*pceltFetched = celt;
This->pos += celt;
return S_OK;
}
static HRESULT WINAPI fnIEnumScript_Reset(
IEnumScript* iface)
{
ICOM_THIS_MULTI(EnumScript_impl, vtbl_IEnumScript, iface);
TRACE("%p\n", This);
This->pos = 0;
return S_OK;
}
static HRESULT WINAPI fnIEnumScript_Skip(
IEnumScript* iface,
ULONG celt)
{
ICOM_THIS_MULTI(EnumScript_impl, vtbl_IEnumScript, iface);
TRACE("%p %u\n", This, celt);
if (celt >= This->total) return S_FALSE;
This->pos += celt;
return S_OK;
}
static const IEnumScriptVtbl IEnumScript_vtbl =
{
fnIEnumScript_QueryInterface,
fnIEnumScript_AddRef,
fnIEnumScript_Release,
fnIEnumScript_Clone,
fnIEnumScript_Next,
fnIEnumScript_Reset,
fnIEnumScript_Skip
};
static HRESULT EnumScript_create( MLang_impl* mlang, DWORD dwFlags,
LANGID LangId, IEnumScript** ppEnumScript )
{
EnumScript_impl *es;
UINT i;
TRACE("%p, %08x, %04x, %p: stub!\n", mlang, dwFlags, LangId, ppEnumScript);
if (!dwFlags) /* enumerate all available scripts */
dwFlags = SCRIPTCONTF_SCRIPT_USER | SCRIPTCONTF_SCRIPT_HIDE | SCRIPTCONTF_SCRIPT_SYSTEM;
es = HeapAlloc( GetProcessHeap(), 0, sizeof (EnumScript_impl) );
es->vtbl_IEnumScript = &IEnumScript_vtbl;
es->ref = 1;
es->pos = 0;
/* do not enumerate unicode flavours */
es->total = sizeof(mlang_data)/sizeof(mlang_data[0]) - 1;
es->script_info = HeapAlloc(GetProcessHeap(), 0, sizeof(SCRIPTINFO) * es->total);
for (i = 0; i < es->total; i++)
{
es->script_info[i].ScriptId = i;
es->script_info[i].uiCodePage = mlang_data[i].family_codepage;
MultiByteToWideChar(CP_ACP, 0, mlang_data[i].description, -1,
es->script_info[i].wszDescription, MAX_SCRIPT_NAME);
MultiByteToWideChar(CP_ACP, 0, mlang_data[i].fixed_font, -1,
es->script_info[i].wszFixedWidthFont, MAX_MIMEFACE_NAME);
MultiByteToWideChar(CP_ACP, 0, mlang_data[i].proportional_font, -1,
es->script_info[i].wszProportionalFont, MAX_MIMEFACE_NAME);
}
TRACE("enumerated %d scripts with flags %08x\n", es->total, dwFlags);
*ppEnumScript = (IEnumScript *)es;
return S_OK;
}
/******************************************************************************/
static HRESULT WINAPI fnIMLangFontLink_QueryInterface(
IMLangFontLink* iface,
REFIID riid,
void** ppvObject)
{
ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink, iface);
return MLang_QueryInterface( This, riid, ppvObject );
}
static ULONG WINAPI fnIMLangFontLink_AddRef(
IMLangFontLink* iface)
{
ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink, iface);
return MLang_AddRef( This );
}
static ULONG WINAPI fnIMLangFontLink_Release(
IMLangFontLink* iface)
{
ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink, iface);
return MLang_Release( This );
}
static HRESULT WINAPI fnIMLangFontLink_GetCharCodePages(
IMLangFontLink* iface,
WCHAR chSrc,
DWORD* pdwCodePages)
{
FIXME("\n");
return E_NOTIMPL;
}
static HRESULT WINAPI fnIMLangFontLink_GetStrCodePages(
IMLangFontLink* iface,
const WCHAR* pszSrc,
long cchSrc,
DWORD dwPriorityCodePages,
DWORD* pdwCodePages,
long* pcchCodePages)
{
FIXME("(pszSrc=%s, cchSrc=%ld, dwPriorityCodePages=%d) stub\n", debugstr_w(pszSrc), cchSrc, dwPriorityCodePages);
*pdwCodePages = 0;
*pcchCodePages = 1;
return S_OK;
}
static HRESULT WINAPI fnIMLangFontLink_CodePageToCodePages(
IMLangFontLink* iface,
UINT uCodePage,
DWORD* pdwCodePages)
{
ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink, iface);
CHARSETINFO cs;
BOOL rc;
TRACE("(%p) Seeking %u\n",This, uCodePage);
memset(&cs, 0, sizeof(cs));
rc = TranslateCharsetInfo((DWORD*)uCodePage, &cs, TCI_SRCCODEPAGE);
if (rc)
{
*pdwCodePages = cs.fs.fsCsb[0];
TRACE("resulting CodePages 0x%x\n",*pdwCodePages);
}
else
TRACE("CodePage Not Found\n");
return S_OK;
}
static HRESULT WINAPI fnIMLangFontLink_CodePagesToCodePage(
IMLangFontLink* iface,
DWORD dwCodePages,
UINT uDefaultCodePage,
UINT* puCodePage)
{
ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink, iface);
DWORD mask = 0x00000000;
UINT i;
CHARSETINFO cs;
BOOL rc;
TRACE("(%p) scanning 0x%x default page %u\n",This, dwCodePages,
uDefaultCodePage);
*puCodePage = 0x00000000;
rc = TranslateCharsetInfo((DWORD*)uDefaultCodePage, &cs, TCI_SRCCODEPAGE);
if (rc && (dwCodePages & cs.fs.fsCsb[0]))
{
TRACE("Found Default Codepage\n");
*puCodePage = uDefaultCodePage;
return S_OK;
}
for (i = 0; i < 32; i++)
{
mask = 1 << i;
if (dwCodePages & mask)
{
DWORD Csb[2];
Csb[0] = mask;
Csb[1] = 0x0;
rc = TranslateCharsetInfo((DWORD*)Csb, &cs, TCI_SRCFONTSIG);
if (!rc)
continue;
TRACE("Falling back to least significant found CodePage %u\n",
cs.ciACP);
*puCodePage = cs.ciACP;
return S_OK;
}
}
TRACE("no codepage found\n");
return E_FAIL;
}
static HRESULT WINAPI fnIMLangFontLink_GetFontCodePages(
IMLangFontLink* iface,
HDC hDC,
HFONT hFont,
DWORD* pdwCodePages)
{
HFONT old_font;
FONTSIGNATURE fontsig;
ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink, iface);
TRACE("(%p)\n",This);
old_font = SelectObject(hDC,hFont);
GetTextCharsetInfo(hDC,&fontsig, 0);
SelectObject(hDC,old_font);
*pdwCodePages = fontsig.fsCsb[0];
TRACE("CodePages is 0x%x\n",fontsig.fsCsb[0]);
return S_OK;
}
static HRESULT WINAPI fnIMLangFontLink_MapFont(
IMLangFontLink* iface,
HDC hDC,
DWORD dwCodePages,
HFONT hSrcFont,
HFONT* phDestFont)
{
FIXME("\n");
return E_NOTIMPL;
}
static HRESULT WINAPI fnIMLangFontLink_ReleaseFont(
IMLangFontLink* iface,
HFONT hFont)
{
FIXME("\n");
return E_NOTIMPL;
}
static HRESULT WINAPI fnIMLangFontLink_ResetFontMapping(
IMLangFontLink* iface)
{
FIXME("\n");
return E_NOTIMPL;
}
static const IMLangFontLinkVtbl IMLangFontLink_vtbl =
{
fnIMLangFontLink_QueryInterface,
fnIMLangFontLink_AddRef,
fnIMLangFontLink_Release,
fnIMLangFontLink_GetCharCodePages,
fnIMLangFontLink_GetStrCodePages,
fnIMLangFontLink_CodePageToCodePages,
fnIMLangFontLink_CodePagesToCodePage,
fnIMLangFontLink_GetFontCodePages,
fnIMLangFontLink_MapFont,
fnIMLangFontLink_ReleaseFont,
fnIMLangFontLink_ResetFontMapping,
};
/******************************************************************************/
static HRESULT WINAPI fnIMultiLanguage_QueryInterface(
IMultiLanguage* iface,
REFIID riid,
void** ppvObject)
{
ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage, iface);
return MLang_QueryInterface( This, riid, ppvObject );
}
static ULONG WINAPI fnIMultiLanguage_AddRef( IMultiLanguage* iface )
{
ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage, iface);
return IMLangFontLink_AddRef( ((IMLangFontLink*)This) );
}
static ULONG WINAPI fnIMultiLanguage_Release( IMultiLanguage* iface )
{
ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage, iface);
return IMLangFontLink_Release( ((IMLangFontLink*)This) );
}
static HRESULT WINAPI fnIMultiLanguage_GetNumberOfCodePageInfo(
IMultiLanguage* iface,
UINT* pcCodePage)
{
FIXME("\n");
return E_NOTIMPL;
}
static HRESULT WINAPI fnIMultiLanguage_GetCodePageInfo(
IMultiLanguage* iface,
UINT uiCodePage,
PMIMECPINFO pCodePageInfo)
{
UINT i, n;
ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage, iface);
TRACE("%p, %u, %p\n", This, uiCodePage, pCodePageInfo);
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)
{
fill_cp_info(&mlang_data[i], n, pCodePageInfo);
return S_OK;
}
}
}
return S_FALSE;
}
static HRESULT WINAPI fnIMultiLanguage_GetFamilyCodePage(
IMultiLanguage* iface,
UINT uiCodePage,
UINT* puiFamilyCodePage)
{
return GetFamilyCodePage(uiCodePage, puiFamilyCodePage);
}
static HRESULT WINAPI fnIMultiLanguage_EnumCodePages(
IMultiLanguage* iface,
DWORD grfFlags,
IEnumCodePage** ppEnumCodePage)
{
ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage, iface);
TRACE("%p %08x %p\n", This, grfFlags, ppEnumCodePage);
return EnumCodePage_create( This, grfFlags, 0, ppEnumCodePage );
}
static HRESULT WINAPI fnIMultiLanguage_GetCharsetInfo(
IMultiLanguage* iface,
BSTR Charset,
PMIMECSETINFO pCharsetInfo)
{
FIXME("\n");
return E_NOTIMPL;
}
static HRESULT WINAPI fnIMultiLanguage_IsConvertible(
IMultiLanguage* iface,
DWORD dwSrcEncoding,
DWORD dwDstEncoding)
{
return IsConvertINetStringAvailable(dwSrcEncoding, dwDstEncoding);
}
static HRESULT WINAPI fnIMultiLanguage_ConvertString(
IMultiLanguage* iface,
DWORD* pdwMode,
DWORD dwSrcEncoding,
DWORD dwDstEncoding,
BYTE* pSrcStr,
UINT* pcSrcSize,
BYTE* pDstStr,
UINT* pcDstSize)
{
return ConvertINetString(pdwMode, dwSrcEncoding, dwDstEncoding,
(LPCSTR)pSrcStr, (LPINT)pcSrcSize, (LPSTR)pDstStr, (LPINT)pcDstSize);
}
static HRESULT WINAPI fnIMultiLanguage_ConvertStringToUnicode(
IMultiLanguage* iface,
DWORD* pdwMode,
DWORD dwEncoding,
CHAR* pSrcStr,
UINT* pcSrcSize,
WCHAR* pDstStr,
UINT* pcDstSize)
{
return ConvertINetMultiByteToUnicode(pdwMode, dwEncoding,
(LPCSTR)pSrcStr, (LPINT)pcSrcSize, pDstStr, (LPINT)pcDstSize);
}
static HRESULT WINAPI fnIMultiLanguage_ConvertStringFromUnicode(
IMultiLanguage* iface,
DWORD* pdwMode,
DWORD dwEncoding,
WCHAR* pSrcStr,
UINT* pcSrcSize,
CHAR* pDstStr,
UINT* pcDstSize)
{
return ConvertINetUnicodeToMultiByte(pdwMode, dwEncoding,
pSrcStr, (LPINT)pcSrcSize, pDstStr, (LPINT)pcDstSize);
}
static HRESULT WINAPI fnIMultiLanguage_ConvertStringReset(
IMultiLanguage* iface)
{
FIXME("\n");
return E_NOTIMPL;
}
static HRESULT WINAPI fnIMultiLanguage_GetRfc1766FromLcid(
IMultiLanguage* iface,
LCID lcid,
BSTR* pbstrRfc1766)
{
WCHAR buf[MAX_RFC1766_NAME];
TRACE("%p %04x %p\n", iface, lcid, pbstrRfc1766);
if (lcid_to_rfc1766W( lcid, buf, MAX_RFC1766_NAME ))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -