Author: cwittich Date: Sun Sep 14 01:17:43 2008 New Revision: 36219
URL: http://svn.reactos.org/svn/reactos?rev=36219&view=rev Log: sync mlang with wine 1.1.4
Modified: trunk/reactos/dll/win32/mlang/mlang.c
Modified: trunk/reactos/dll/win32/mlang/mlang.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mlang/mlang.c?rev... ============================================================================== --- trunk/reactos/dll/win32/mlang/mlang.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/mlang/mlang.c [iso-8859-1] Sun Sep 14 01:17:43 2008 @@ -258,16 +258,46 @@ }; static const MIME_CP_INFO japanese_cp[] = { + { "Japanese (Auto-Select)", + 50932, MIMECONTF_MAILNEWS | MIMECONTF_BROWSER | MIMECONTF_MINIMAL | + MIMECONTF_IMPORT | MIMECONTF_VALID | MIMECONTF_VALID_NLS | + MIMECONTF_MIME_IE4 | MIMECONTF_MIME_LATEST, + "_autodetect", "_autodetect", "_autodetect" }, + { "Japanese (EUC)", + 51932, MIMECONTF_MAILNEWS | MIMECONTF_BROWSER | MIMECONTF_MINIMAL | + MIMECONTF_IMPORT | MIMECONTF_SAVABLE_MAILNEWS | + MIMECONTF_SAVABLE_BROWSER | MIMECONTF_EXPORT | MIMECONTF_VALID | + MIMECONTF_VALID_NLS | MIMECONTF_MIME_IE4 | MIMECONTF_MIME_LATEST, + "euc-jp", "euc-jp", "euc-jp" }, + { "Japanese (JIS)", + 50220, MIMECONTF_IMPORT | MIMECONTF_MAILNEWS | MIMECONTF_EXPORT | + MIMECONTF_SAVABLE_MAILNEWS | MIMECONTF_VALID_NLS | + MIMECONTF_PRIVCONVERTER | MIMECONTF_MIME_LATEST | + MIMECONTF_MIME_IE4, + "iso-2022-jp","iso-2022-jp","iso-2022-jp"}, + { "Japanese (JIS 0208-1990 and 0212-1990)", + 20932, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID_NLS | + MIMECONTF_VALID | MIMECONTF_PRIVCONVERTER | MIMECONTF_MIME_LATEST, + "EUC-JP","EUC-JP","EUC-JP"}, + { "Japanese (JIS-Allow 1 byte Kana)", + 50221, MIMECONTF_MAILNEWS | MIMECONTF_EXPORT | MIMECONTF_SAVABLE_BROWSER | + MIMECONTF_SAVABLE_MAILNEWS | MIMECONTF_VALID_NLS | + MIMECONTF_VALID | MIMECONTF_PRIVCONVERTER | MIMECONTF_MIME_LATEST, + "csISO2022JP","iso-2022-jp","iso-2022-jp"}, + { "Japanese (JIS-Allow 1 byte Kana - SO/SI)", + 50222, MIMECONTF_EXPORT | MIMECONTF_VALID_NLS | MIMECONTF_VALID | + MIMECONTF_PRIVCONVERTER | MIMECONTF_MIME_LATEST, + "iso-2022-jp","iso-2022-jp","iso-2022-jp"}, + { "Japanese (Mac)", + 10001, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID_NLS | + MIMECONTF_VALID | MIMECONTF_PRIVCONVERTER | MIMECONTF_MIME_LATEST, + "x-mac-japanese","x-mac-japanese","x-mac-japanese"}, { "Japanese (Shift-JIS)", 932, MIMECONTF_MAILNEWS | MIMECONTF_BROWSER | MIMECONTF_MINIMAL | MIMECONTF_IMPORT | MIMECONTF_SAVABLE_MAILNEWS | - MIMECONTF_SAVABLE_BROWSER | MIMECONTF_EXPORT | MIMECONTF_VALID_NLS | - MIMECONTF_MIME_IE4 | MIMECONTF_MIME_LATEST, - "shift_jis", "iso-2022-jp", "iso-2022-jp" }, - { "Japanese (JIS 0208-1990 and 0212-1990)", - 20932, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID_NLS | - MIMECONTF_MIME_LATEST, - "euc-jp", "euc-jp", "euc-jp" } + MIMECONTF_SAVABLE_BROWSER | MIMECONTF_EXPORT | MIMECONTF_VALID | + MIMECONTF_VALID_NLS | MIMECONTF_MIME_IE4 | MIMECONTF_MIME_LATEST, + "shift_jis", "iso-2022-jp", "iso-2022-jp" } }; static const MIME_CP_INFO korean_cp[] = { @@ -439,7 +469,7 @@ { "Hebrew",1255,sizeof(hebrew_cp)/sizeof(hebrew_cp[0]),hebrew_cp, "Courier","Arial" }, /* FIXME */ { "Japanese",932,sizeof(japanese_cp)/sizeof(japanese_cp[0]),japanese_cp, - "Courier","Arial" }, /* FIXME */ + "MS Gothic","MS PGothic" }, { "Korean",949,sizeof(korean_cp)/sizeof(korean_cp[0]),korean_cp, "Courier","Arial" }, /* FIXME */ { "Thai",874,sizeof(thai_cp)/sizeof(thai_cp[0]),thai_cp, @@ -459,6 +489,371 @@ static LONG dll_count;
/* + * Japanese Detection and Converstion Functions + */ + +#define HANKATA(A) ((A >= 161) && (A <= 223)) +#define ISEUC(A) ((A >= 161) && (A <= 254)) +#define NOTEUC(A,B) (((A >= 129) && (A <= 159)) && ((B >= 64) && (B <= 160))) +#define SJIS1(A) (((A >= 129) && (A <= 159)) || ((A >= 224) && (A <= 239))) +#define SJIS2(A) ((A >= 64) && (A <= 252)) +#define ISMARU(A) ((A >= 202) && (A <= 206)) +#define ISNIGORI(A) (((A >= 182) && (A <= 196)) || ((A >= 202) && (A <= 206))) + +static UINT DetectJapaneseCode(LPCSTR input, DWORD count) +{ + UINT code = 0; + int i = 0; + unsigned char c1,c2; + + while ((code == 0 || code == 51932) && i < count) + { + c1 = input[i]; + if (c1 == 0x1b /* ESC */) + { + i++; + if (i >= count) + return code; + c1 = input[i]; + if (c1 == '$') + { + i++; + if (i >= count) + return code; + c1 = input[i]; + if (c1 =='B' || c1 == '@') + code = 50220; + } + if (c1 == 'K') + code = 50220; + } + else if (c1 >= 129) + { + i++; + if (i >= count) + return code; + c2 = input[i]; + if NOTEUC(c1,c2) + code = 932; + else if (ISEUC(c1) && ISEUC(c2)) + code = 51932; + else if (((c1 == 142)) && HANKATA(c2)) + code = 51932; + } + i++; + } + return code; +} + +static inline void jis2sjis(unsigned char *p1, unsigned char *p2) +{ + unsigned char c1 = *p1; + unsigned char c2 = *p2; + int row = c1 < 95 ? 112 : 176; + int cell = c1 % 2 ? 31 + (c2 > 95) : 126; + + *p1 = ((c1 + 1) >> 1) + row; + *p2 = c2 + cell; +} + +static inline void sjis2jis(unsigned char *p1, unsigned char *p2) +{ + unsigned char c1 = *p1; + unsigned char c2 = *p2; + int shift = c2 < 159; + int row = c1 < 160 ? 112 : 176; + int cell = shift ? (31 + (c2 > 127)): 126; + + *p1 = ((c1 - row) << 1) - shift; + *p2 -= cell; +} + +static int han2zen(unsigned char *p1, unsigned char *p2) +{ + int maru = FALSE; + int nigori = FALSE; + static const unsigned char char1[] = {129,129,129,129,129,131,131,131,131, + 131,131,131,131,131,131,129,131,131,131,131,131,131,131,131,131,131, + 131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131, + 131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131, + 131,129,129 }; + static const unsigned char char2[] = {66,117,118,65,69,146,64,66,68,70, + 72,131,133,135,98,91,65,67,69,71,73,74,76,78,80,82,84,86,88,90,92,94, + 96,99,101,103,105,106,107,108,109,110,113,116,119,122,125,126,128, + 129,130,132,134,136,137,138,139,140,141,143,147,74,75}; + + if (( *p2 == 222) && ((ISNIGORI(*p1) || (*p1 == 179)))) + nigori = TRUE; + else if ((*p2 == 223) && (ISMARU(*p1))) + maru = TRUE; + + if (*p1 >= 161 && *p1 <= 223) + { + unsigned char index = *p1 - 161; + *p1 = char1[index]; + *p2 = char2[index]; + } + + if (maru || nigori) + { + if (nigori) + { + if (((*p2 >= 74) && (*p2 <= 103)) || ((*p2 >= 110) && (*p2 <= 122))) + (*p2)++; + else if ((*p1 == 131) && (*p2 == 69)) + *p2 = 148; + } + else if ((maru) && ((*p2 >= 110) && (*p2 <= 122))) + *p2+= 2; + + return 1; + } + + return 0; +} + + +static UINT ConvertJIS2SJIS(LPCSTR input, DWORD count, LPSTR output) +{ + int i = 0; + int j = 0; + unsigned char p2,p; + int shifted = FALSE; + + while (i < count) + { + p = input[i]; + if (p == 0x1b /* ESC */) + { + i++; + if (i >= count) + return 0; + p2 = input[i]; + if (p2 == '$' || p2 =='(') + i++; + if (p2 == 'K' || p2 =='$') + shifted = TRUE; + else + shifted = FALSE; + } + else + { + if (shifted) + { + i++; + if (i >= count) + return 0; + p2 = input[i]; + jis2sjis(&p,&p2); + output[j++]=p; + output[j++]=p2; + } + else + { + output[j++] = p; + } + } + i++; + } + return j; +} + +static inline int exit_shift(LPSTR out, int c) +{ + if (out) + { + out[c] = 0x1b; + out[c+1] = '('; + out[c+2] = 'B'; + } + return 3; +} + +static inline int enter_shift(LPSTR out, int c) +{ + if (out) + { + out[c] = 0x1b; + out[c+1] = '$'; + out[c+2] = 'B'; + } + return 3; +} + + +static UINT ConvertSJIS2JIS(LPCSTR input, DWORD count, LPSTR output) +{ + int i = 0; + int j = 0; + unsigned char p2,p; + int shifted = FALSE; + + while (i < count) + { + p = input[i] & 0xff; + if (p == 10 || p == 13) /* NL and CR */ + { + if (shifted) + { + shifted = FALSE; + j += exit_shift(output,j); + } + if (output) + output[j++] = p; + else + j++; + } + else + { + if (SJIS1(p)) + { + i++; + if (i >= count) + return 0; + p2 = input[i] & 0xff; + if (SJIS2(p2)) + { + sjis2jis(&p,&p2); + if (!shifted) + { + shifted = TRUE; + j+=enter_shift(output,j); + } + } + + if (output) + { + output[j++]=p; + output[j++]=p2; + } + else + j+=2; + } + else + { + if (HANKATA(p)) + { + if ((i+1) >= count) + return 0; + p2 = input[i+1] & 0xff; + i+=han2zen(&p,&p2); + sjis2jis(&p,&p2); + if (!shifted) + { + shifted = TRUE; + j+=enter_shift(output,j); + } + if (output) + { + output[j++]=p; + output[j++]=p2; + } + else + j+=2; + } + else + { + if (shifted) + { + shifted = FALSE; + j += exit_shift(output,j); + } + if (output) + output[j++]=p; + else + j++; + } + } + } + i++; + } + if (shifted) + j += exit_shift(output,j); + return j; +} + +static UINT ConvertJISJapaneseToUnicode(LPCSTR input, DWORD count, + LPWSTR output, DWORD out_count) +{ + CHAR *sjis_string; + UINT rc = 0; + sjis_string = HeapAlloc(GetProcessHeap(),0,count); + rc = ConvertJIS2SJIS(input,count,sjis_string); + if (rc) + { + TRACE("%s\n",debugstr_an(sjis_string,rc)); + if (output) + rc = MultiByteToWideChar(932,0,sjis_string,rc,output,out_count); + else + rc = MultiByteToWideChar(932,0,sjis_string,rc,0,0); + } + HeapFree(GetProcessHeap(),0,sjis_string); + return rc; + +} + +static UINT ConvertUnknownJapaneseToUnicode(LPCSTR input, DWORD count, + LPWSTR output, DWORD out_count) +{ + CHAR *sjis_string; + UINT rc = 0; + int code = DetectJapaneseCode(input,count); + TRACE("Japanese code %i\n",code); + + if (code == 932) + { + if (output) + rc = MultiByteToWideChar(932,0,input,count,output,out_count); + else + rc = MultiByteToWideChar(932,0,input,count,0,0); + } + else if (code == 51932) + { + if (output) + rc = MultiByteToWideChar(20932,0,input,count,output,out_count); + else + rc = MultiByteToWideChar(20932,0,input,count,0,0); + } + else if (code == 50220) + { + sjis_string = HeapAlloc(GetProcessHeap(),0,count); + rc = ConvertJIS2SJIS(input,count,sjis_string); + if (rc) + { + TRACE("%s\n",debugstr_an(sjis_string,rc)); + if (output) + rc = MultiByteToWideChar(932,0,sjis_string,rc,output,out_count); + else + rc = MultiByteToWideChar(932,0,sjis_string,rc,0,0); + } + HeapFree(GetProcessHeap(),0,sjis_string); + } + return rc; +} + +static UINT ConvertJapaneseUnicodeToJIS(LPCWSTR input, DWORD count, + LPSTR output, DWORD out_count) +{ + CHAR *sjis_string; + INT len; + UINT rc = 0; + + len = WideCharToMultiByte(932,0,input,count,0,0,NULL,NULL); + sjis_string = HeapAlloc(GetProcessHeap(),0,len); + WideCharToMultiByte(932,0,input,count,sjis_string,len,NULL,NULL); + TRACE("%s\n",debugstr_an(sjis_string,len)); + + rc = ConvertSJIS2JIS(sjis_string, len, NULL); + if (out_count >= rc) + { + ConvertSJIS2JIS(sjis_string, len, output); + } + HeapFree(GetProcessHeap(),0,sjis_string); + return rc; + +} + +/* * Dll lifetime tracking declaration */ static void LockModule(void) @@ -510,6 +905,10 @@ return S_OK; }
+ /* forwarding euc-jp to EUC-JP */ + if (dwEncoding == 51932) + dwEncoding = 20932; + switch (dwEncoding) { case CP_UNICODE: @@ -521,6 +920,15 @@ memmove(pDstStr, pSrcStr, *pcDstSize * sizeof(WCHAR)); break;
+ case 50220: + case 50221: + case 50222: + *pcDstSize = ConvertJISJapaneseToUnicode(pSrcStr,*pcSrcSize,pDstStr,*pcDstSize); + break; + case 50932: + *pcDstSize = ConvertUnknownJapaneseToUnicode(pSrcStr,*pcSrcSize,pDstStr,*pcDstSize); + break; + default: if (*pcSrcSize == -1) *pcSrcSize = lstrlenA(pSrcStr); @@ -546,50 +954,83 @@ LPSTR pDstStr, LPINT pcDstSize) { - + INT destsz, size; INT src_len = -1;
TRACE("%p %d %s %p %p %p\n", pdwMode, dwEncoding, debugstr_w(pSrcStr), pcSrcSize, pDstStr, pcDstSize);
if (!pcDstSize) - return E_FAIL; + return S_OK;
if (!pcSrcSize) pcSrcSize = &src_len;
- if (!*pcSrcSize) - { - *pcDstSize = 0; + destsz = (pDstStr) ? *pcDstSize : 0; + *pcDstSize = 0; + + if (!pSrcStr || !*pcSrcSize) return S_OK; - } - - switch (dwEncoding) - { - case CP_UNICODE: + + if (*pcSrcSize == -1) + *pcSrcSize = lstrlenW(pSrcStr); + + /* forwarding euc-jp to EUC-JP */ + if (dwEncoding == 51932) + dwEncoding = 20932; + + if (dwEncoding == CP_UNICODE) + { if (*pcSrcSize == -1) *pcSrcSize = lstrlenW(pSrcStr); - *pcDstSize = min(*pcSrcSize * sizeof(WCHAR), *pcDstSize); + + size = min(*pcSrcSize, destsz) * sizeof(WCHAR); if (pDstStr) - memmove(pDstStr, pSrcStr, *pcDstSize); - break; - - default: - if (*pcSrcSize == -1) - *pcSrcSize = lstrlenW(pSrcStr); + memmove(pDstStr, pSrcStr, size); + + if (size >= destsz) + goto fail; + } + else if (dwEncoding == 50220 || dwEncoding == 50221 || dwEncoding == 50222) + { + size = ConvertJapaneseUnicodeToJIS(pSrcStr, *pcSrcSize, NULL, 0); + if (!size) + goto fail;
if (pDstStr) - *pcDstSize = WideCharToMultiByte(dwEncoding, 0, pSrcStr, *pcSrcSize, pDstStr, *pcDstSize, NULL, NULL); - else - *pcDstSize = WideCharToMultiByte(dwEncoding, 0, pSrcStr, *pcSrcSize, NULL, 0, NULL, NULL); - break; - } - - - if (!*pcDstSize) - return E_FAIL; - + { + size = min(size, destsz); + size = ConvertJapaneseUnicodeToJIS(pSrcStr, *pcSrcSize, pDstStr, + destsz); + if (!size) + goto fail; + } + + } + else + { + size = WideCharToMultiByte(dwEncoding, 0, pSrcStr, *pcSrcSize, + NULL, 0, NULL, NULL); + if (!size) + goto fail; + + if (pDstStr) + { + size = min(size, destsz); + size = WideCharToMultiByte(dwEncoding, 0, pSrcStr, *pcSrcSize, + pDstStr, destsz, NULL, NULL); + if (!size) + goto fail; + } + } + + *pcDstSize = size; return S_OK; + +fail: + *pcSrcSize = 0; + *pcDstSize = 0; + return E_FAIL; }
HRESULT WINAPI ConvertINetString( @@ -948,6 +1389,8 @@ const IMLangFontLinkVtbl *vtbl_IMLangFontLink; const IMultiLanguageVtbl *vtbl_IMultiLanguage; const IMultiLanguage3Vtbl *vtbl_IMultiLanguage3; + const IMLangFontLink2Vtbl *vtbl_IMLangFontLink2; + const IMLangLineBreakConsoleVtbl *vtbl_IMLangLineBreakConsole; LONG ref; DWORD total_cp, total_scripts; } MLang_impl; @@ -989,6 +1432,14 @@ return S_OK; }
+ if (IsEqualGUID(riid, &IID_IMLangFontLink2)) + { + MLang_AddRef(This); + TRACE("Returning IID_IMLangFontLink2 %p ref = %d\n", This, This->ref); + *ppvObject = &(This->vtbl_IMLangFontLink2); + return S_OK; + } + if (IsEqualGUID(riid, &IID_IMultiLanguage) ) { MLang_AddRef(This); @@ -1012,6 +1463,15 @@ TRACE("Returning IID_IMultiLanguage3 %p ref = %d\n", This, This->ref); return S_OK; } + + if (IsEqualGUID(riid, &IID_IMLangLineBreakConsole)) + { + MLang_AddRef(This); + TRACE("Returning IID_IMLangLineBreakConsole %p ref = %d\n", This, This->ref); + *ppvObject = &(This->vtbl_IMLangLineBreakConsole); + return S_OK; + } +
WARN("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject); return E_NOINTERFACE; @@ -1423,7 +1883,6 @@ BOOL rc;
TRACE("(%p) Seeking %u\n",This, uCodePage); - memset(&cs, 0, sizeof(cs));
rc = TranslateCharsetInfo((DWORD*)uCodePage, &cs, TCI_SRCCODEPAGE);
@@ -1431,11 +1890,12 @@ { *pdwCodePages = cs.fs.fsCsb[0]; TRACE("resulting CodePages 0x%x\n",*pdwCodePages); - } - else - TRACE("CodePage Not Found\n"); - - return S_OK; + return S_OK; + } + + TRACE("CodePage Not Found\n"); + *pdwCodePages = 0; + return E_FAIL; }
static HRESULT WINAPI fnIMLangFontLink_CodePagesToCodePage( @@ -2410,8 +2870,25 @@ LPWSTR lpWideCharStr, int cchWideChar) { - FIXME("%u, %04x, %p, %d\n", uiCodePage, lcid, lpWideCharStr, cchWideChar); - return E_NOTIMPL; + /* Find first instance */ + 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 (n = 0; n < mlang_data[i].number_of_cp; n++) + { + if (mlang_data[i].mime_cp_info[n].cp == uiCodePage) + { + MultiByteToWideChar(CP_ACP, 0, + mlang_data[i].mime_cp_info[n].description, + -1, lpWideCharStr, cchWideChar); + return S_OK; + } + } + } + + return S_FALSE; }
static HRESULT WINAPI fnIMultiLanguage2_IsCodePageInstallable( @@ -2538,6 +3015,207 @@ fnIMultiLanguage3_DetectOutboundCodePageInIStream };
+/******************************************************************************/ +static HRESULT WINAPI fnIMLangFontLink2_QueryInterface( + IMLangFontLink2 * iface, + REFIID riid, + void** ppvObject) +{ + ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink2, iface); + return MLang_QueryInterface( This, riid, ppvObject ); +} + +static ULONG WINAPI fnIMLangFontLink2_AddRef( IMLangFontLink2* iface ) +{ + ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink2, iface); + return MLang_AddRef( This ); +} + +static ULONG WINAPI fnIMLangFontLink2_Release( IMLangFontLink2* iface ) +{ + ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink2, iface); + return MLang_Release( This ); +} + +static HRESULT WINAPI fnIMLangFontLink2_GetCharCodePages( IMLangFontLink2* This, + WCHAR chSrc, DWORD *pdwCodePages) +{ + FIXME("(%p)->%s %p\n",This, debugstr_wn(&chSrc,1),pdwCodePages); + return E_NOTIMPL; +} + +static HRESULT WINAPI fnIMLangFontLink2_GetStrCodePages( IMLangFontLink2* This, + const WCHAR *pszSrc, long cchSrc, DWORD dwPriorityCodePages, + DWORD *pdwCodePages, long *pcchCodePages) +{ + FIXME("(%p)->%s %li %x %p %p\n",This, debugstr_wn(pszSrc,cchSrc),cchSrc,dwPriorityCodePages,pdwCodePages,pcchCodePages); + return E_NOTIMPL; +} + +static HRESULT WINAPI fnIMLangFontLink2_CodePageToCodePages(IMLangFontLink2* This, + UINT uCodePage, + DWORD *pdwCodePages) +{ + FIXME("(%p)->%i %p\n",This, uCodePage, pdwCodePages); + return E_NOTIMPL; +} + +static HRESULT WINAPI fnIMLangFontLink2_CodePagesToCodePage(IMLangFontLink2* This, + DWORD dwCodePages, UINT uDefaultCodePage, UINT *puCodePage) +{ + FIXME("(%p)->%i %i %p\n",This, dwCodePages, uDefaultCodePage, puCodePage); + return E_NOTIMPL; +} + +static HRESULT WINAPI fnIMLangFontLink2_GetFontCodePages(IMLangFontLink2* This, + HDC hDC, HFONT hFont, DWORD *pdwCodePages) +{ + FIXME("(%p)->%p %p %p\n",This, hDC, hFont, pdwCodePages); + return E_NOTIMPL; +} + +static HRESULT WINAPI fnIMLangFontLink2_ReleaseFont(IMLangFontLink2* This, + HFONT hFont) +{ + FIXME("(%p)->%p\n",This, hFont); + return E_NOTIMPL; +} + +static HRESULT WINAPI fnIMLangFontLink2_ResetFontMapping(IMLangFontLink2* This) +{ + FIXME("(%p)->\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI fnIMLangFontLink2_MapFont(IMLangFontLink2* This, + HDC hDC, DWORD dwCodePages, WCHAR chSrc, HFONT *pFont) +{ + FIXME("(%p)->%p %i %s %p\n",This, hDC, dwCodePages, debugstr_wn(&chSrc,1), pFont); + return E_NOTIMPL; +} + +static HRESULT WINAPI fnIMLangFontLink2_GetFontUnicodeRanges(IMLangFontLink2* This, + HDC hDC, UINT *puiRanges, UNICODERANGE *pUranges) +{ + FIXME("(%p)->%p %p %p\n",This, hDC, puiRanges, pUranges); + return E_NOTIMPL; +} + +static HRESULT WINAPI fnIMLangFontLink2_GetScriptFontInfo(IMLangFontLink2* This, + SCRIPT_ID sid, DWORD dwFlags, UINT *puiFonts, + SCRIPTFONTINFO *pScriptFont) +{ + FIXME("(%p)->%i %i %p %p\n",This, sid, dwFlags, puiFonts, pScriptFont); + return E_NOTIMPL; +} + +static HRESULT WINAPI fnIMLangFontLink2_CodePageToScriptID(IMLangFontLink2* This, + UINT uiCodePage, SCRIPT_ID *pSid) +{ + FIXME("(%p)->%i %p\n",This, uiCodePage, pSid); + return E_NOTIMPL; +} + +static const IMLangFontLink2Vtbl IMLangFontLink2_vtbl = +{ + fnIMLangFontLink2_QueryInterface, + fnIMLangFontLink2_AddRef, + fnIMLangFontLink2_Release, + fnIMLangFontLink2_GetCharCodePages, + fnIMLangFontLink2_GetStrCodePages, + fnIMLangFontLink2_CodePageToCodePages, + fnIMLangFontLink2_CodePagesToCodePage, + fnIMLangFontLink2_GetFontCodePages, + fnIMLangFontLink2_ReleaseFont, + fnIMLangFontLink2_ResetFontMapping, + fnIMLangFontLink2_MapFont, + fnIMLangFontLink2_GetFontUnicodeRanges, + fnIMLangFontLink2_GetScriptFontInfo, + fnIMLangFontLink2_CodePageToScriptID +}; + +/******************************************************************************/ + +static HRESULT WINAPI fnIMLangLineBreakConsole_QueryInterface( + IMLangLineBreakConsole* iface, + REFIID riid, + void** ppvObject) +{ + ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangLineBreakConsole, iface); + return MLang_QueryInterface( This, riid, ppvObject ); +} + +static ULONG WINAPI fnIMLangLineBreakConsole_AddRef( + IMLangLineBreakConsole* iface ) +{ + ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangLineBreakConsole, iface); + return MLang_AddRef( This ); +} + +static ULONG WINAPI fnIMLangLineBreakConsole_Release( + IMLangLineBreakConsole* iface ) +{ + ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangLineBreakConsole, iface); + return MLang_Release( This ); +} + +static HRESULT WINAPI fnIMLangLineBreakConsole_BreakLineML( + IMLangLineBreakConsole* iface, + IMLangString* pSrcMLStr, + long lSrcPos, + long lSrcLen, + long cMinColumns, + long cMaxColumns, + long* plLineLen, + long* plSkipLen) +{ + FIXME("(%p)->%p %li %li %li %li %p %p\n", iface, pSrcMLStr, lSrcPos, lSrcLen, cMinColumns, cMaxColumns, plLineLen, plSkipLen); + return E_NOTIMPL; +} + +static HRESULT WINAPI fnIMLangLineBreakConsole_BreakLineW( + IMLangLineBreakConsole* iface, + LCID locale, + const WCHAR* pszSrc, + long cchSrc, + long cMaxColumns, + long* pcchLine, + long* pcchSkip ) +{ + FIXME("(%p)->%i %s %li %li %p %p\n", iface, locale, debugstr_wn(pszSrc,cchSrc), cchSrc, cMaxColumns, pcchLine, pcchSkip); + + *pcchLine = cchSrc; + *pcchSkip = 0; + return S_OK; +} + +static HRESULT WINAPI fnIMLangLineBreakConsole_BreakLineA( + IMLangLineBreakConsole* iface, + LCID locale, + UINT uCodePage, + const CHAR* pszSrc, + long cchSrc, + long cMaxColumns, + long* pcchLine, + long* pcchSkip) +{ + FIXME("(%p)->%i %i %s %li %li %p %p\n", iface, locale, uCodePage, debugstr_an(pszSrc,cchSrc), cchSrc, cMaxColumns, pcchLine, pcchSkip); + + *pcchLine = cchSrc; + *pcchSkip = 0; + return S_OK; +} + +static const IMLangLineBreakConsoleVtbl IMLangLineBreakConsole_vtbl = +{ + fnIMLangLineBreakConsole_QueryInterface, + fnIMLangLineBreakConsole_AddRef, + fnIMLangLineBreakConsole_Release, + fnIMLangLineBreakConsole_BreakLineML, + fnIMLangLineBreakConsole_BreakLineW, + fnIMLangLineBreakConsole_BreakLineA +}; + static HRESULT MultiLanguage_create(IUnknown *pUnkOuter, LPVOID *ppObj) { MLang_impl *mlang; @@ -2552,6 +3230,8 @@ mlang->vtbl_IMLangFontLink = &IMLangFontLink_vtbl; mlang->vtbl_IMultiLanguage = &IMultiLanguage_vtbl; mlang->vtbl_IMultiLanguage3 = &IMultiLanguage3_vtbl; + mlang->vtbl_IMLangFontLink2 = &IMLangFontLink2_vtbl; + mlang->vtbl_IMLangLineBreakConsole = &IMLangLineBreakConsole_vtbl;
mlang->total_cp = 0; for (i = 0; i < sizeof(mlang_data)/sizeof(mlang_data[0]); i++)