ReactOS 0.4.17-dev-116-ga4b6fe9
mlang.c
Go to the documentation of this file.
1/*
2 * MLANG Class Factory
3 *
4 * Copyright 2002 Lionel Ulmer
5 * Copyright 2003,2004 Mike McCormack
6 * Copyright 2004,2005 Dmitry Timoshkov
7 * Copyright 2009 Detlef Riekenberg
8 *
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
13 *
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 */
23
24
25#include <stdarg.h>
26#include <stdio.h>
27
28#define COBJMACROS
29
30#include "windef.h"
31#include "winbase.h"
32#include "wingdi.h"
33#include "winuser.h"
34#include "ole2.h"
35#include "objbase.h"
36#include "rpcproxy.h"
37#include "mlang.h"
38#include "mimeole.h"
39
40#include "wine/debug.h"
41#include "wine/list.h"
42
44
45#include "initguid.h"
46
49
50static HRESULT MultiLanguage_create(IUnknown *pUnkOuter, LPVOID *ppObj);
52static HRESULT EnumRfc1766_create(LANGID LangId, IEnumRfc1766 **ppEnum);
53
54/* FIXME:
55 * Under what circumstances HKEY_CLASSES_ROOT\MIME\Database\Codepage and
56 * HKEY_CLASSES_ROOT\MIME\Database\Charset are used?
57 */
58
59typedef struct
60{
67 const WCHAR *alias;
69
70/* These data are based on the codepage info in libs/unicode/cpmap.pl */
71/* FIXME: Add 28604 (Celtic), 28606 (Balkan) */
72
73static const MIME_CP_INFO arabic_cp[] =
74{
75 { L"Arabic (864)",
76 864, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID_NLS |
77 MIMECONTF_MIME_LATEST,
78 L"ibm864", L"ibm864", L"ibm864" },
79 { L"Arabic (1006)",
80 1006, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID_NLS |
81 MIMECONTF_MIME_LATEST,
82 L"ibm1006", L"ibm1006", L"ibm1006" },
83 { L"Arabic (Windows)",
84 1256, MIMECONTF_MAILNEWS | MIMECONTF_BROWSER | MIMECONTF_IMPORT |
85 MIMECONTF_SAVABLE_MAILNEWS | MIMECONTF_SAVABLE_BROWSER |
86 MIMECONTF_EXPORT | MIMECONTF_VALID_NLS | MIMECONTF_MIME_LATEST,
87 L"windows-1256", L"windows-1256", L"windows-1256" },
88 { L"Arabic (ISO)",
89 28596, MIMECONTF_MAILNEWS | MIMECONTF_BROWSER | MIMECONTF_MINIMAL |
90 MIMECONTF_IMPORT | MIMECONTF_SAVABLE_MAILNEWS |
91 MIMECONTF_SAVABLE_BROWSER | MIMECONTF_EXPORT |
92 MIMECONTF_VALID_NLS | MIMECONTF_MIME_IE4 | MIMECONTF_MIME_LATEST,
93 L"iso-8859-6", L"iso-8859-6", L"iso-8859-6" }
94};
95static const MIME_CP_INFO baltic_cp[] =
96{
97 { L"Baltic (DOS)",
98 775, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID |
99 MIMECONTF_VALID_NLS | MIMECONTF_MIME_LATEST,
100 L"ibm775", L"ibm775", L"ibm775" },
101 { L"Baltic (Windows)",
102 1257, MIMECONTF_MAILNEWS | MIMECONTF_BROWSER | MIMECONTF_MINIMAL |
103 MIMECONTF_IMPORT | MIMECONTF_SAVABLE_MAILNEWS |
104 MIMECONTF_SAVABLE_BROWSER | MIMECONTF_EXPORT | MIMECONTF_VALID |
105 MIMECONTF_VALID_NLS | MIMECONTF_MIME_LATEST,
106 L"windows-1257", L"windows-1257", L"windows-1257" },
107 { L"Baltic (ISO)",
108 28594, MIMECONTF_MAILNEWS | MIMECONTF_BROWSER | MIMECONTF_IMPORT |
109 MIMECONTF_SAVABLE_MAILNEWS | MIMECONTF_SAVABLE_BROWSER |
110 MIMECONTF_EXPORT | MIMECONTF_VALID | MIMECONTF_VALID_NLS |
111 MIMECONTF_MIME_LATEST,
112 L"iso-8859-4", L"iso-8859-4", L"iso-8859-4" },
113 { L"Estonian (ISO)",
114 28603, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID |
115 MIMECONTF_VALID_NLS | MIMECONTF_MIME_LATEST,
116 L"iso-8859-13", L"iso-8859-13", L"iso-8859-13" }
117};
119{
120 { L"Chinese Simplified (Auto-Select)",
121 50936, MIMECONTF_IMPORT | MIMECONTF_VALID | MIMECONTF_VALID_NLS |
122 MIMECONTF_MIME_LATEST,
123 L"_autodetect_chs", L"_autodetect_chs", L"_autodetect_chs" },
124 { L"Chinese Simplified (GB2312)",
125 936, MIMECONTF_MAILNEWS | MIMECONTF_BROWSER | MIMECONTF_MINIMAL |
126 MIMECONTF_IMPORT | MIMECONTF_SAVABLE_MAILNEWS | MIMECONTF_VALID |
127 MIMECONTF_SAVABLE_BROWSER | MIMECONTF_EXPORT | MIMECONTF_VALID_NLS |
128 MIMECONTF_MIME_IE4 | MIMECONTF_MIME_LATEST,
129 L"gb2312", L"gb2312", L"gb2312" },
130 { L"Chinese Simplified (GB2312-80)",
131 20936, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID |
132 MIMECONTF_VALID_NLS | MIMECONTF_MIME_LATEST,
133 L"x-cp20936", L"x-cp20936", L"x-cp20936" },
134 { L"Chinese Simplified (HZ)",
135 52936, MIMECONTF_MAILNEWS | MIMECONTF_BROWSER | MIMECONTF_IMPORT |
136 MIMECONTF_SAVABLE_MAILNEWS | MIMECONTF_SAVABLE_BROWSER | MIMECONTF_EXPORT |
137 MIMECONTF_VALID | MIMECONTF_VALID_NLS | MIMECONTF_MIME_IE4 |
138 MIMECONTF_MIME_LATEST,
139 L"hz-gb-2312", L"hz-gb-2312", L"hz-gb-2312" },
140 { L"Chinese Simplified (GB18030)",
141 54936, MIMECONTF_MAILNEWS | MIMECONTF_BROWSER | MIMECONTF_MINIMAL |
142 MIMECONTF_IMPORT | MIMECONTF_SAVABLE_MAILNEWS | MIMECONTF_SAVABLE_BROWSER |
143 MIMECONTF_EXPORT | MIMECONTF_VALID | MIMECONTF_VALID_NLS |
144 MIMECONTF_MIME_LATEST,
145 L"GB18030", L"GB18030", L"GB18030" },
146 { L"Chinese Simplified (GBK)",
147 936, MIMECONTF_MAILNEWS | MIMECONTF_BROWSER | MIMECONTF_MINIMAL |
148 MIMECONTF_IMPORT | MIMECONTF_SAVABLE_MAILNEWS |
149 MIMECONTF_SAVABLE_BROWSER | MIMECONTF_EXPORT | MIMECONTF_VALID_NLS |
150 MIMECONTF_MIME_IE4 | MIMECONTF_MIME_LATEST,
151 L"gbk", L"gbk", L"gbk" }
152};
154{
155 { L"Chinese Traditional (Auto-Select)",
156 50950, MIMECONTF_IMPORT | MIMECONTF_VALID | MIMECONTF_VALID_NLS |
157 MIMECONTF_MIME_LATEST,
158 L"_autodetect_cht", L"_autodetect_cht", L"_autodetect_cht" },
159 { L"Chinese Traditional (Big5)",
160 950, MIMECONTF_MAILNEWS | MIMECONTF_BROWSER | MIMECONTF_MINIMAL |
161 MIMECONTF_IMPORT | MIMECONTF_SAVABLE_MAILNEWS |
162 MIMECONTF_SAVABLE_BROWSER | MIMECONTF_EXPORT | MIMECONTF_VALID |
163 MIMECONTF_VALID_NLS | MIMECONTF_MIME_IE4 | MIMECONTF_MIME_LATEST,
164 L"big5", L"big5", L"big5" },
165 { L"Chinese Traditional (CNS)",
166 20000, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID |
167 MIMECONTF_VALID_NLS | MIMECONTF_MIME_LATEST,
168 L"x-Chinese-CNS", L"x-Chinese-CNS", L"x-Chinese-CNS" }
169};
171{
172 { L"Central European (DOS)",
173 852, MIMECONTF_BROWSER | MIMECONTF_IMPORT | MIMECONTF_SAVABLE_BROWSER |
174 MIMECONTF_EXPORT | MIMECONTF_VALID | MIMECONTF_VALID_NLS |
175 MIMECONTF_MIME_IE4 | MIMECONTF_MIME_LATEST,
176 L"ibm852", L"ibm852", L"ibm852" },
177 { L"Central European (Windows)",
178 1250, MIMECONTF_MAILNEWS | MIMECONTF_BROWSER | MIMECONTF_IMPORT |
179 MIMECONTF_SAVABLE_MAILNEWS | MIMECONTF_SAVABLE_BROWSER |
180 MIMECONTF_EXPORT | MIMECONTF_VALID | MIMECONTF_VALID_NLS |
181 MIMECONTF_MIME_LATEST,
182 L"windows-1250", L"windows-1250", L"windows-1250" },
183 { L"Central European (Mac)",
184 10029, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID |
185 MIMECONTF_VALID_NLS | MIMECONTF_MIME_LATEST,
186 L"x-mac-ce", L"x-mac-ce", L"x-mac-ce" },
187 { L"Central European (ISO)",
188 28592, MIMECONTF_MAILNEWS | MIMECONTF_BROWSER | MIMECONTF_MINIMAL |
189 MIMECONTF_IMPORT | MIMECONTF_SAVABLE_MAILNEWS |
190 MIMECONTF_SAVABLE_BROWSER | MIMECONTF_EXPORT | MIMECONTF_VALID |
191 MIMECONTF_VALID_NLS | MIMECONTF_MIME_IE4 | MIMECONTF_MIME_LATEST,
192 L"iso-8859-2", L"iso-8859-2", L"iso-8859-2" }
193};
194static const MIME_CP_INFO cyrillic_cp[] =
195{
196 { L"OEM Cyrillic",
197 855, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID |
198 MIMECONTF_VALID_NLS | MIMECONTF_MIME_LATEST,
199 L"ibm855", L"ibm855", L"ibm855" },
200 { L"Cyrillic (DOS)",
201 866, MIMECONTF_BROWSER | MIMECONTF_IMPORT | MIMECONTF_SAVABLE_BROWSER |
202 MIMECONTF_EXPORT | MIMECONTF_VALID_NLS | MIMECONTF_MIME_IE4 |
203 MIMECONTF_MIME_LATEST,
204 L"cp866", L"cp866", L"cp866" },
205#if 0 /* Windows has 20866 as an official code page for KOI8-R */
206 { L"Cyrillic (KOI8-R)",
207 878, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID |
208 MIMECONTF_VALID_NLS | MIMECONTF_MIME_LATEST,
209 L"koi8-r", L"koi8-r", L"koi8-r" },
210#endif
211 { L"Cyrillic (Windows)",
212 1251, MIMECONTF_MAILNEWS | MIMECONTF_BROWSER | MIMECONTF_IMPORT |
213 MIMECONTF_SAVABLE_MAILNEWS | MIMECONTF_SAVABLE_BROWSER |
214 MIMECONTF_EXPORT | MIMECONTF_VALID_NLS | MIMECONTF_MIME_LATEST,
215 L"windows-1251", L"windows-1251", L"windows-1251" },
216 { L"Cyrillic (Mac)",
217 10007, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID_NLS |
218 MIMECONTF_MIME_LATEST,
219 L"x-mac-cyrillic", L"x-mac-cyrillic", L"x-mac-cyrillic" },
220 { L"Cyrillic (KOI8-R)",
221 20866, MIMECONTF_MAILNEWS | MIMECONTF_BROWSER | MIMECONTF_MINIMAL |
222 MIMECONTF_IMPORT | MIMECONTF_SAVABLE_MAILNEWS |
223 MIMECONTF_SAVABLE_BROWSER | MIMECONTF_EXPORT |
224 MIMECONTF_VALID_NLS | MIMECONTF_MIME_IE4 | MIMECONTF_MIME_LATEST,
225 L"koi8-r", L"koi8-r", L"koi8-r" },
226 { L"Cyrillic (KOI8-U)",
227 21866, MIMECONTF_MAILNEWS | MIMECONTF_BROWSER | MIMECONTF_MINIMAL |
228 MIMECONTF_IMPORT | MIMECONTF_SAVABLE_MAILNEWS |
229 MIMECONTF_SAVABLE_BROWSER | MIMECONTF_EXPORT |
230 MIMECONTF_VALID_NLS | MIMECONTF_MIME_IE4 | MIMECONTF_MIME_LATEST,
231 L"koi8-u", L"koi8-u", L"koi8-u" },
232 { L"Cyrillic (ISO)",
233 28595, MIMECONTF_MAILNEWS | MIMECONTF_BROWSER | MIMECONTF_MINIMAL |
234 MIMECONTF_IMPORT | MIMECONTF_SAVABLE_MAILNEWS |
235 MIMECONTF_SAVABLE_BROWSER | MIMECONTF_EXPORT |
236 MIMECONTF_VALID_NLS | MIMECONTF_MIME_IE4 | MIMECONTF_MIME_LATEST,
237 L"iso-8859-5", L"iso-8859-5", L"iso-8859-5" }
238};
239static const MIME_CP_INFO greek_cp[] =
240{
241 { L"Greek (DOS)",
242 737, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID_NLS |
243 MIMECONTF_MIME_LATEST,
244 L"ibm737", L"ibm737", L"ibm737" },
245 { L"Greek, Modern (DOS)",
246 869, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID_NLS |
247 MIMECONTF_MIME_LATEST,
248 L"ibm869", L"ibm869", L"ibm869" },
249 { L"IBM EBCDIC (Greek Modern)",
250 875, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID_NLS |
251 MIMECONTF_MIME_LATEST,
252 L"cp875", L"cp875", L"cp875" },
253 { L"Greek (Windows)",
254 1253, MIMECONTF_MAILNEWS | MIMECONTF_BROWSER | MIMECONTF_IMPORT |
255 MIMECONTF_SAVABLE_MAILNEWS | MIMECONTF_SAVABLE_BROWSER |
256 MIMECONTF_EXPORT | MIMECONTF_VALID_NLS | MIMECONTF_MIME_LATEST,
257 L"windows-1253", L"windows-1253", L"windows-1253" },
258 { L"Greek (Mac)",
259 10006, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID_NLS |
260 MIMECONTF_MIME_LATEST,
261 L"x-mac-greek", L"x-mac-greek", L"x-mac-greek" },
262 { L"Greek (ISO)",
263 28597, MIMECONTF_MAILNEWS | MIMECONTF_BROWSER | MIMECONTF_MINIMAL |
264 MIMECONTF_IMPORT | MIMECONTF_SAVABLE_MAILNEWS |
265 MIMECONTF_SAVABLE_BROWSER | MIMECONTF_EXPORT |
266 MIMECONTF_VALID_NLS | MIMECONTF_MIME_IE4 | MIMECONTF_MIME_LATEST,
267 L"iso-8859-7", L"iso-8859-7", L"iso-8859-7" }
268};
269static const MIME_CP_INFO hebrew_cp[] =
270{
271 { L"Hebrew (424)",
272 424, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID_NLS |
273 MIMECONTF_MIME_LATEST,
274 L"ibm424", L"ibm424", L"ibm424" },
275 { L"Hebrew (856)",
276 856, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID_NLS |
277 MIMECONTF_MIME_LATEST,
278 L"cp856", L"cp856", L"cp856" },
279 { L"Hebrew (DOS)",
280 862, MIMECONTF_BROWSER | MIMECONTF_MINIMAL | MIMECONTF_IMPORT |
281 MIMECONTF_SAVABLE_BROWSER | MIMECONTF_EXPORT | MIMECONTF_VALID_NLS |
282 MIMECONTF_MIME_LATEST,
283 L"dos-862", L"dos-862", L"dos-862" },
284 { L"Hebrew (Windows)",
285 1255, MIMECONTF_MAILNEWS | MIMECONTF_BROWSER | MIMECONTF_IMPORT |
286 MIMECONTF_SAVABLE_MAILNEWS | MIMECONTF_SAVABLE_BROWSER |
287 MIMECONTF_EXPORT | MIMECONTF_VALID_NLS | MIMECONTF_MIME_LATEST,
288 L"windows-1255", L"windows-1255", L"windows-1255" },
289 { L"Hebrew (ISO-Visual)",
290 28598, MIMECONTF_BROWSER | MIMECONTF_MINIMAL | MIMECONTF_IMPORT |
291 MIMECONTF_SAVABLE_BROWSER | MIMECONTF_EXPORT |
292 MIMECONTF_VALID_NLS | MIMECONTF_MIME_IE4 | MIMECONTF_MIME_LATEST,
293 L"iso-8859-8", L"iso-8859-8", L"iso-8859-8" }
294};
295static const MIME_CP_INFO japanese_cp[] =
296{
297 { L"Japanese (Auto-Select)",
298 50932, MIMECONTF_MAILNEWS | MIMECONTF_BROWSER | MIMECONTF_MINIMAL |
299 MIMECONTF_IMPORT | MIMECONTF_VALID | MIMECONTF_VALID_NLS |
300 MIMECONTF_MIME_IE4 | MIMECONTF_MIME_LATEST,
301 L"_autodetect", L"_autodetect", L"_autodetect" },
302 { L"Japanese (EUC)",
303 51932, MIMECONTF_MAILNEWS | MIMECONTF_BROWSER | MIMECONTF_MINIMAL |
304 MIMECONTF_IMPORT | MIMECONTF_SAVABLE_MAILNEWS |
305 MIMECONTF_SAVABLE_BROWSER | MIMECONTF_EXPORT | MIMECONTF_VALID |
306 MIMECONTF_VALID_NLS | MIMECONTF_MIME_IE4 | MIMECONTF_MIME_LATEST,
307 L"euc-jp", L"euc-jp", L"euc-jp" },
308 { L"Japanese (JIS)",
309 50220, MIMECONTF_IMPORT | MIMECONTF_MAILNEWS | MIMECONTF_EXPORT |
310 MIMECONTF_SAVABLE_MAILNEWS | MIMECONTF_VALID_NLS |
311 MIMECONTF_PRIVCONVERTER | MIMECONTF_MIME_LATEST |
312 MIMECONTF_MIME_IE4,
313 L"iso-2022-jp", L"iso-2022-jp", L"iso-2022-jp"},
314 { L"Japanese (JIS 0208-1990 and 0212-1990)",
315 20932, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID_NLS |
316 MIMECONTF_VALID | MIMECONTF_PRIVCONVERTER | MIMECONTF_MIME_LATEST,
317 L"EUC-JP", L"EUC-JP", L"EUC-JP"},
318 { L"Japanese (JIS-Allow 1 byte Kana)",
319 50221, MIMECONTF_MAILNEWS | MIMECONTF_EXPORT | MIMECONTF_SAVABLE_BROWSER |
320 MIMECONTF_SAVABLE_MAILNEWS | MIMECONTF_VALID_NLS |
321 MIMECONTF_VALID | MIMECONTF_PRIVCONVERTER | MIMECONTF_MIME_LATEST,
322 L"csISO2022JP", L"iso-2022-jp", L"iso-2022-jp"},
323 { L"Japanese (JIS-Allow 1 byte Kana - SO/SI)",
324 50222, MIMECONTF_EXPORT | MIMECONTF_VALID_NLS | MIMECONTF_VALID |
325 MIMECONTF_PRIVCONVERTER | MIMECONTF_MIME_LATEST,
326 L"iso-2022-jp", L"iso-2022-jp", L"iso-2022-jp"},
327 { L"Japanese (Mac)",
328 10001, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID_NLS |
329 MIMECONTF_VALID | MIMECONTF_PRIVCONVERTER | MIMECONTF_MIME_LATEST,
330 L"x-mac-japanese", L"x-mac-japanese", L"x-mac-japanese"},
331 { L"Japanese (Shift-JIS)",
332 932, MIMECONTF_MAILNEWS | MIMECONTF_BROWSER | MIMECONTF_MINIMAL |
333 MIMECONTF_IMPORT | MIMECONTF_SAVABLE_MAILNEWS |
334 MIMECONTF_SAVABLE_BROWSER | MIMECONTF_EXPORT | MIMECONTF_VALID |
335 MIMECONTF_VALID_NLS | MIMECONTF_MIME_IE4 | MIMECONTF_MIME_LATEST,
336 L"shift_jis", L"iso-2022-jp", L"iso-2022-jp" }
337};
338static const MIME_CP_INFO korean_cp[] =
339{
340 { L"Korean",
341 949, MIMECONTF_MAILNEWS | MIMECONTF_BROWSER | MIMECONTF_MINIMAL |
342 MIMECONTF_IMPORT | MIMECONTF_SAVABLE_MAILNEWS |
343 MIMECONTF_SAVABLE_BROWSER | MIMECONTF_EXPORT | MIMECONTF_VALID_NLS |
344 MIMECONTF_MIME_LATEST,
345 L"ks_c_5601-1987", L"ks_c_5601-1987", L"ks_c_5601-1987" }
346};
347static const MIME_CP_INFO thai_cp[] =
348{
349 { L"Thai (Windows)",
350 874, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_MIME_LATEST,
351 L"ibm-thai", L"ibm-thai", L"ibm-thai" }
352};
353static const MIME_CP_INFO turkish_cp[] =
354{
355 { L"Turkish (DOS)",
356 857, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID |
357 MIMECONTF_VALID_NLS | MIMECONTF_MIME_LATEST,
358 L"ibm857", L"ibm857", L"ibm857" },
359 { L"IBM EBCDIC (Turkish Latin-5)",
360 1026, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID |
361 MIMECONTF_VALID_NLS | MIMECONTF_MIME_LATEST,
362 L"ibm1026", L"ibm1026", L"ibm1026" },
363 { L"Turkish (Windows)",
364 1254, MIMECONTF_MAILNEWS | MIMECONTF_BROWSER | MIMECONTF_MINIMAL |
365 MIMECONTF_IMPORT | MIMECONTF_SAVABLE_MAILNEWS |
366 MIMECONTF_SAVABLE_BROWSER | MIMECONTF_EXPORT | MIMECONTF_VALID |
367 MIMECONTF_VALID_NLS | MIMECONTF_MIME_LATEST,
368 L"windows-1254", L"windows-1254", L"windows-1254" },
369 { L"Turkish (Mac)",
370 10081, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID |
371 MIMECONTF_VALID_NLS | MIMECONTF_MIME_LATEST,
372 L"x-mac-turkish", L"x-mac-turkish", L"x-mac-turkish" },
373 { L"Latin 3 (ISO)",
374 28593, MIMECONTF_MAILNEWS | MIMECONTF_IMPORT |
375 MIMECONTF_SAVABLE_MAILNEWS | MIMECONTF_EXPORT | MIMECONTF_VALID |
376 MIMECONTF_VALID_NLS | MIMECONTF_MIME_IE4 | MIMECONTF_MIME_LATEST,
377 L"iso-8859-3", L"iso-8859-3", L"iso-8859-3" },
378 { L"Turkish (ISO)",
379 28599, MIMECONTF_MAILNEWS | MIMECONTF_BROWSER | MIMECONTF_MINIMAL |
380 MIMECONTF_IMPORT | MIMECONTF_SAVABLE_MAILNEWS |
381 MIMECONTF_SAVABLE_BROWSER | MIMECONTF_EXPORT | MIMECONTF_VALID |
382 MIMECONTF_VALID_NLS | MIMECONTF_MIME_LATEST,
383 L"iso-8859-9", L"iso-8859-9", L"iso-8859-9" }
384};
386{
387 { L"Vietnamese (Windows)",
388 1258, MIMECONTF_MAILNEWS | MIMECONTF_BROWSER | MIMECONTF_IMPORT |
389 MIMECONTF_SAVABLE_MAILNEWS | MIMECONTF_SAVABLE_BROWSER |
390 MIMECONTF_EXPORT | MIMECONTF_VALID_NLS | MIMECONTF_MIME_IE4 |
391 MIMECONTF_MIME_LATEST,
392 L"windows-1258", L"windows-1258", L"windows-1258" }
393};
394
395static const MIME_CP_INFO western_cp[] =
396{
397 { L"IBM EBCDIC (US-Canada)",
398 37, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID |
399 MIMECONTF_VALID_NLS | MIMECONTF_MIME_LATEST,
400 L"ibm037", L"ibm037", L"ibm037" },
401 { L"OEM United States",
402 437, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID |
403 MIMECONTF_VALID_NLS | MIMECONTF_MIME_LATEST,
404 L"ibm437", L"ibm437", L"ibm437" },
405 { L"IBM EBCDIC (International)",
406 500, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID |
407 MIMECONTF_VALID_NLS | MIMECONTF_MIME_LATEST,
408 L"ibm500", L"ibm500", L"ibm500" },
409 { L"Western European (DOS)",
410 850, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID |
411 MIMECONTF_VALID_NLS | MIMECONTF_MIME_LATEST,
412 L"ibm850", L"ibm850", L"ibm850" },
413 { L"Portuguese (DOS)",
414 860, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID |
415 MIMECONTF_VALID_NLS | MIMECONTF_MIME_LATEST,
416 L"ibm860", L"ibm860", L"ibm860" },
417 { L"Icelandic (DOS)",
418 861, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID |
419 MIMECONTF_VALID_NLS | MIMECONTF_MIME_LATEST,
420 L"ibm861", L"ibm861", L"ibm861" },
421 { L"French Canadian (DOS)",
422 863, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID |
423 MIMECONTF_VALID_NLS | MIMECONTF_MIME_LATEST,
424 L"ibm863", L"ibm863", L"ibm863" },
425 { L"Nordic (DOS)",
426 865, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID |
427 MIMECONTF_VALID_NLS | MIMECONTF_MIME_LATEST,
428 L"ibm865", L"ibm865", L"ibm865" },
429 { L"Western European (Windows)",
430 1252, MIMECONTF_MAILNEWS | MIMECONTF_BROWSER | MIMECONTF_MINIMAL |
431 MIMECONTF_IMPORT | MIMECONTF_SAVABLE_MAILNEWS |
432 MIMECONTF_SAVABLE_BROWSER | MIMECONTF_EXPORT | MIMECONTF_VALID |
433 MIMECONTF_VALID_NLS | MIMECONTF_MIME_LATEST,
434 L"windows-1252", L"windows-1252", L"iso-8859-1" },
435 { L"Western European (Mac)",
436 10000, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID |
437 MIMECONTF_VALID_NLS | MIMECONTF_MIME_LATEST,
438 L"macintosh", L"macintosh", L"macintosh" },
439 { L"Icelandic (Mac)",
440 10079, MIMECONTF_IMPORT | MIMECONTF_EXPORT | MIMECONTF_VALID |
441 MIMECONTF_VALID_NLS | MIMECONTF_MIME_LATEST,
442 L"x-mac-icelandic", L"x-mac-icelandic", L"x-mac-icelandic" },
443 { L"US-ASCII",
444 20127, MIMECONTF_MAILNEWS | MIMECONTF_IMPORT | MIMECONTF_EXPORT |
445 MIMECONTF_SAVABLE_MAILNEWS | MIMECONTF_VALID |
446 MIMECONTF_VALID_NLS | MIMECONTF_MIME_LATEST,
447 L"us-ascii", L"us-ascii", L"us-ascii", L"ascii" },
448 { L"Western European (ISO)",
449 28591, MIMECONTF_MAILNEWS | MIMECONTF_BROWSER | MIMECONTF_IMPORT |
450 MIMECONTF_SAVABLE_MAILNEWS | MIMECONTF_SAVABLE_BROWSER |
451 MIMECONTF_EXPORT | MIMECONTF_VALID | MIMECONTF_VALID_NLS |
452 MIMECONTF_MIME_LATEST,
453 L"iso-8859-1", L"iso-8859-1", L"iso-8859-1", L"iso8859-1" },
454 { L"Latin 9 (ISO)",
455 28605, MIMECONTF_MAILNEWS | MIMECONTF_IMPORT |
456 MIMECONTF_SAVABLE_MAILNEWS | MIMECONTF_SAVABLE_BROWSER |
457 MIMECONTF_EXPORT | MIMECONTF_VALID | MIMECONTF_VALID_NLS |
458 MIMECONTF_MIME_LATEST,
459 L"iso-8859-15", L"iso-8859-15", L"iso-8859-15" }
460};
461static const MIME_CP_INFO unicode_cp[] =
462{
463 { L"Unicode",
464 CP_UNICODE, MIMECONTF_MINIMAL | MIMECONTF_IMPORT |
465 MIMECONTF_SAVABLE_BROWSER | MIMECONTF_EXPORT |
466 MIMECONTF_VALID | MIMECONTF_VALID_NLS | MIMECONTF_MIME_IE4 |
467 MIMECONTF_MIME_LATEST,
468 L"unicode", L"unicode", L"unicode" },
469 { L"Unicode (UTF-7)",
470 CP_UTF7, MIMECONTF_MAILNEWS | MIMECONTF_IMPORT |
471 MIMECONTF_SAVABLE_MAILNEWS | MIMECONTF_EXPORT | MIMECONTF_VALID |
472 MIMECONTF_VALID_NLS | MIMECONTF_MIME_IE4 | MIMECONTF_MIME_LATEST,
473 L"utf-7", L"utf-7", L"utf-7" },
474 { L"Unicode (UTF-8)",
475 CP_UTF8, MIMECONTF_MAILNEWS | MIMECONTF_BROWSER | MIMECONTF_IMPORT |
476 MIMECONTF_SAVABLE_MAILNEWS | MIMECONTF_SAVABLE_BROWSER |
477 MIMECONTF_EXPORT | MIMECONTF_VALID | MIMECONTF_VALID_NLS |
478 MIMECONTF_MIME_IE4 | MIMECONTF_MIME_LATEST,
479 L"utf-8", L"utf-8", L"utf-8" }
480};
481
482static const struct mlang_data
483{
490 SCRIPT_ID sid;
491} mlang_data[] =
492{
493 { L"Arabic", 1256, ARRAY_SIZE(arabic_cp), arabic_cp,
494 L"Simplified Arabic Fixed", L"Simplified Arabic", sidArabic },
495 { L"Baltic", 1257, ARRAY_SIZE(baltic_cp), baltic_cp,
496 L"Courier New", L"Arial", sidAsciiLatin },
497 { L"Chinese Simplified", 936, ARRAY_SIZE(chinese_simplified_cp), chinese_simplified_cp,
498 L"Simsun", L"Simsun", sidHan },
499 { L"Chinese Traditional", 950, ARRAY_SIZE(chinese_traditional_cp), chinese_traditional_cp,
500 L"MingLiu", L"New MingLiu", sidBopomofo },
501 { L"Central European", 1250, ARRAY_SIZE(central_european_cp), central_european_cp,
502 L"Courier New", L"Arial", sidAsciiLatin },
503 { L"Cyrillic", 1251, ARRAY_SIZE(cyrillic_cp), cyrillic_cp,
504 L"Courier New", L"Arial", sidCyrillic },
505 { L"Greek", 1253, ARRAY_SIZE(greek_cp), greek_cp,
506 L"Courier New", L"Arial", sidGreek },
507 { L"Hebrew", 1255, ARRAY_SIZE(hebrew_cp), hebrew_cp,
508 L"Miriam Fixed", L"David", sidHebrew },
509 { L"Japanese", 932, ARRAY_SIZE(japanese_cp), japanese_cp,
510 L"MS Gothic", L"MS PGothic", sidKana },
511 { L"Korean", 949, ARRAY_SIZE(korean_cp), korean_cp,
512 L"GulimChe", L"Gulim", sidHangul },
513 { L"Thai", 874, ARRAY_SIZE(thai_cp), thai_cp,
514 L"Tahoma", L"Tahoma", sidThai },
515 { L"Turkish", 1254, ARRAY_SIZE(turkish_cp), turkish_cp,
516 L"Courier New", L"Arial", sidAsciiLatin },
517 { L"Vietnamese", 1258, ARRAY_SIZE(vietnamese_cp), vietnamese_cp,
518 L"Courier New", L"Arial", sidAsciiLatin },
519 { L"Western European", 1252, ARRAY_SIZE(western_cp), western_cp,
520 L"Courier New", L"Arial", sidAsciiLatin },
522 L"Courier New", L"Arial" }
524
526{
529 HFONT font;
531};
532
536{
537 0, 0, &font_cache_critical,
539 0, 0, { (DWORD_PTR)(__FILE__ ": font_cache_critical") }
540};
542
543static void fill_cp_info(const struct mlang_data *ml_data, UINT index, MIMECPINFO *mime_cp_info);
544
546
547/*
548 * Japanese Detection and Conversion Functions
549 */
550
551#define HANKATA(A) ((A >= 161) && (A <= 223))
552#define ISEUC(A) ((A >= 161) && (A <= 254))
553#define NOTEUC(A,B) (((A >= 129) && (A <= 159)) && ((B >= 64) && (B <= 160)))
554#define SJIS1(A) (((A >= 129) && (A <= 159)) || ((A >= 224) && (A <= 239)))
555#define SJIS2(A) ((A >= 64) && (A <= 252))
556#define ISMARU(A) ((A >= 202) && (A <= 206))
557#define ISNIGORI(A) (((A >= 182) && (A <= 196)) || ((A >= 202) && (A <= 206)))
558
560{
561 UINT code = 0;
562 DWORD i = 0;
563 unsigned char c1,c2;
564
565 while ((code == 0 || code == 51932) && i < count)
566 {
567 c1 = input[i];
568 if (c1 == 0x1b /* ESC */)
569 {
570 i++;
571 if (i >= count)
572 return code;
573 c1 = input[i];
574 if (c1 == '$')
575 {
576 i++;
577 if (i >= count)
578 return code;
579 c1 = input[i];
580 if (c1 =='B' || c1 == '@')
581 code = 50220;
582 }
583 if (c1 == 'K')
584 code = 50220;
585 }
586 else if (c1 >= 129)
587 {
588 i++;
589 if (i >= count)
590 return code;
591 c2 = input[i];
592 if NOTEUC(c1,c2)
593 code = 932;
594 else if (ISEUC(c1) && ISEUC(c2))
595 code = 51932;
596 else if (((c1 == 142)) && HANKATA(c2))
597 code = 51932;
598 }
599 i++;
600 }
601 return code;
602}
603
604static inline void jis2sjis(unsigned char *p1, unsigned char *p2)
605{
606 unsigned char c1 = *p1;
607 unsigned char c2 = *p2;
608 int row = c1 < 95 ? 112 : 176;
609 int cell = c1 % 2 ? 31 + (c2 > 95) : 126;
610
611 *p1 = ((c1 + 1) >> 1) + row;
612 *p2 = c2 + cell;
613}
614
615static inline void sjis2jis(unsigned char *p1, unsigned char *p2)
616{
617 unsigned char c1 = *p1;
618 unsigned char c2 = *p2;
619 int shift = c2 < 159;
620 int row = c1 < 160 ? 112 : 176;
621 int cell = shift ? (31 + (c2 > 127)): 126;
622
623 *p1 = ((c1 - row) << 1) - shift;
624 *p2 -= cell;
625}
626
627static int han2zen(unsigned char *p1, unsigned char *p2)
628{
629 BOOL maru = FALSE;
630 BOOL nigori = FALSE;
631 static const unsigned char char1[] = {129,129,129,129,129,131,131,131,131,
632 131,131,131,131,131,131,129,131,131,131,131,131,131,131,131,131,131,
633 131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,
634 131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,
635 131,129,129 };
636 static const unsigned char char2[] = {66,117,118,65,69,146,64,66,68,70,
637 72,131,133,135,98,91,65,67,69,71,73,74,76,78,80,82,84,86,88,90,92,94,
638 96,99,101,103,105,106,107,108,109,110,113,116,119,122,125,126,128,
639 129,130,132,134,136,137,138,139,140,141,143,147,74,75};
640
641 if (( *p2 == 222) && ((ISNIGORI(*p1) || (*p1 == 179))))
642 nigori = TRUE;
643 else if ((*p2 == 223) && (ISMARU(*p1)))
644 maru = TRUE;
645
646 if (*p1 >= 161 && *p1 <= 223)
647 {
648 unsigned char index = *p1 - 161;
649 *p1 = char1[index];
650 *p2 = char2[index];
651 }
652
653 if (maru || nigori)
654 {
655 if (nigori)
656 {
657 if (((*p2 >= 74) && (*p2 <= 103)) || ((*p2 >= 110) && (*p2 <= 122)))
658 (*p2)++;
659 else if ((*p1 == 131) && (*p2 == 69))
660 *p2 = 148;
661 }
662 else if ((maru) && ((*p2 >= 110) && (*p2 <= 122)))
663 *p2+= 2;
664
665 return 1;
666 }
667
668 return 0;
669}
670
671
673{
674 DWORD i = 0;
675 int j = 0;
676 unsigned char p2,p;
677 BOOL shifted = FALSE;
678
679 while (i < count)
680 {
681 p = input[i];
682 if (p == 0x1b /* ESC */)
683 {
684 i++;
685 if (i >= count)
686 return 0;
687 p2 = input[i];
688 if (p2 == '$' || p2 =='(')
689 i++;
690 if (p2 == 'K' || p2 =='$')
691 shifted = TRUE;
692 else
693 shifted = FALSE;
694 }
695 else
696 {
697 if (shifted)
698 {
699 i++;
700 if (i >= count)
701 return 0;
702 p2 = input[i];
703 jis2sjis(&p,&p2);
704 output[j++]=p;
705 output[j++]=p2;
706 }
707 else
708 {
709 output[j++] = p;
710 }
711 }
712 i++;
713 }
714 return j;
715}
716
717static inline int exit_shift(LPSTR out, int c)
718{
719 if (out)
720 {
721 out[c] = 0x1b;
722 out[c+1] = '(';
723 out[c+2] = 'B';
724 }
725 return 3;
726}
727
728static inline int enter_shift(LPSTR out, int c)
729{
730 if (out)
731 {
732 out[c] = 0x1b;
733 out[c+1] = '$';
734 out[c+2] = 'B';
735 }
736 return 3;
737}
738
739
741{
742 DWORD i = 0;
743 int j = 0;
744 unsigned char p2,p;
745 BOOL shifted = FALSE;
746
747 while (i < count)
748 {
749 p = input[i] & 0xff;
750 if (p == 10 || p == 13) /* NL and CR */
751 {
752 if (shifted)
753 {
754 shifted = FALSE;
755 j += exit_shift(output,j);
756 }
757 if (output)
758 output[j++] = p;
759 else
760 j++;
761 }
762 else
763 {
764 if (SJIS1(p))
765 {
766 i++;
767 if (i >= count)
768 return 0;
769 p2 = input[i] & 0xff;
770 if (SJIS2(p2))
771 {
772 sjis2jis(&p,&p2);
773 if (!shifted)
774 {
775 shifted = TRUE;
776 j+=enter_shift(output,j);
777 }
778 }
779
780 if (output)
781 {
782 output[j++]=p;
783 output[j++]=p2;
784 }
785 else
786 j+=2;
787 }
788 else
789 {
790 if (HANKATA(p))
791 {
792 if ((i+1) >= count)
793 return 0;
794 p2 = input[i+1] & 0xff;
795 i+=han2zen(&p,&p2);
796 sjis2jis(&p,&p2);
797 if (!shifted)
798 {
799 shifted = TRUE;
800 j+=enter_shift(output,j);
801 }
802 if (output)
803 {
804 output[j++]=p;
805 output[j++]=p2;
806 }
807 else
808 j+=2;
809 }
810 else
811 {
812 if (shifted)
813 {
814 shifted = FALSE;
815 j += exit_shift(output,j);
816 }
817 if (output)
818 output[j++]=p;
819 else
820 j++;
821 }
822 }
823 }
824 i++;
825 }
826 if (shifted)
827 j += exit_shift(output,j);
828 return j;
829}
830
832 LPWSTR output, DWORD out_count)
833{
834 CHAR *sjis_string;
835 UINT rc = 0;
836 sjis_string = malloc(count);
837 rc = ConvertJIS2SJIS(input,count,sjis_string);
838 if (rc)
839 {
840 TRACE("%s\n",debugstr_an(sjis_string,rc));
841 if (output)
842 rc = MultiByteToWideChar(932,0,sjis_string,rc,output,out_count);
843 else
844 rc = MultiByteToWideChar(932,0,sjis_string,rc,0,0);
845 }
846 free(sjis_string);
847 return rc;
848
849}
850
852 LPWSTR output, DWORD out_count)
853{
854 CHAR *sjis_string;
855 UINT rc = 0;
857 TRACE("Japanese code %i\n",code);
858
859 switch (code)
860 {
861 case 0:
862 if (output)
864 else
866 break;
867
868 case 932:
869 if (output)
870 rc = MultiByteToWideChar(932,0,input,count,output,out_count);
871 else
872 rc = MultiByteToWideChar(932,0,input,count,0,0);
873 break;
874
875 case 51932:
876 if (output)
877 rc = MultiByteToWideChar(20932,0,input,count,output,out_count);
878 else
879 rc = MultiByteToWideChar(20932,0,input,count,0,0);
880 break;
881
882 case 50220:
883 sjis_string = malloc(count);
884 rc = ConvertJIS2SJIS(input,count,sjis_string);
885 if (rc)
886 {
887 TRACE("%s\n",debugstr_an(sjis_string,rc));
888 if (output)
889 rc = MultiByteToWideChar(932,0,sjis_string,rc,output,out_count);
890 else
891 rc = MultiByteToWideChar(932,0,sjis_string,rc,0,0);
892 }
893 free(sjis_string);
894 break;
895 }
896 return rc;
897}
898
900 LPSTR output, DWORD out_count)
901{
902 CHAR *sjis_string;
903 INT len;
904 UINT rc = 0;
905
907 sjis_string = malloc(len);
908 WideCharToMultiByte(932,0,input,count,sjis_string,len,NULL,NULL);
909 TRACE("%s\n",debugstr_an(sjis_string,len));
910
911 rc = ConvertSJIS2JIS(sjis_string, len, NULL);
912 if (out_count >= rc)
913 {
914 ConvertSJIS2JIS(sjis_string, len, output);
915 }
916 free(sjis_string);
917 return rc;
918
919}
920
921/*
922 * Dll lifetime tracking declaration
923 */
924static void LockModule(void)
925{
927}
928
929static void UnlockModule(void)
930{
932}
933
935 LPDWORD pdwMode,
936 DWORD dwEncoding,
937 LPCSTR pSrcStr,
938 LPINT pcSrcSize,
939 LPWSTR pDstStr,
940 LPINT pcDstSize)
941{
942 INT src_len = -1;
943
944 TRACE("%p %ld %s %p %p %p\n", pdwMode, dwEncoding,
945 debugstr_a(pSrcStr), pcSrcSize, pDstStr, pcDstSize);
946
947 if (!pcDstSize)
948 return E_FAIL;
949
950 if (!pcSrcSize)
951 pcSrcSize = &src_len;
952
953 if (!*pcSrcSize)
954 {
955 *pcDstSize = 0;
956 return S_OK;
957 }
958
959 /* forwarding euc-jp to EUC-JP */
960 if (dwEncoding == 51932)
961 dwEncoding = 20932;
962
963 switch (dwEncoding)
964 {
965 case CP_UNICODE:
966 if (*pcSrcSize == -1)
967 *pcSrcSize = lstrlenW((LPCWSTR)pSrcStr);
968 *pcDstSize = min(*pcSrcSize, *pcDstSize);
969 *pcSrcSize *= sizeof(WCHAR);
970 if (pDstStr)
971 memmove(pDstStr, pSrcStr, *pcDstSize * sizeof(WCHAR));
972 break;
973
974 case 50220:
975 case 50221:
976 case 50222:
977 *pcDstSize = ConvertJISJapaneseToUnicode(pSrcStr,*pcSrcSize,pDstStr,*pcDstSize);
978 break;
979 case 50932:
980 *pcDstSize = ConvertUnknownJapaneseToUnicode(pSrcStr,*pcSrcSize,pDstStr,*pcDstSize);
981 break;
982
983 default:
984 if (*pcSrcSize == -1)
985 *pcSrcSize = lstrlenA(pSrcStr);
986
987 if (pDstStr)
988 *pcDstSize = MultiByteToWideChar(dwEncoding, 0, pSrcStr, *pcSrcSize, pDstStr, *pcDstSize);
989 else
990 *pcDstSize = MultiByteToWideChar(dwEncoding, 0, pSrcStr, *pcSrcSize, NULL, 0);
991 break;
992 }
993
994 if (!*pcDstSize)
995 return E_FAIL;
996
997 return S_OK;
998}
999
1001 LPDWORD pdwMode,
1002 DWORD dwEncoding,
1003 LPCWSTR pSrcStr,
1004 LPINT pcSrcSize,
1005 LPSTR pDstStr,
1006 LPINT pcDstSize)
1007{
1008 INT destsz, size;
1009 INT src_len = -1;
1010
1011 TRACE("%p %ld %s %p %p %p\n", pdwMode, dwEncoding,
1012 debugstr_w(pSrcStr), pcSrcSize, pDstStr, pcDstSize);
1013
1014 if (!pcDstSize)
1015 return S_OK;
1016
1017 if (!pcSrcSize)
1018 pcSrcSize = &src_len;
1019
1020 destsz = (pDstStr) ? *pcDstSize : 0;
1021 *pcDstSize = 0;
1022
1023 if (!pSrcStr || !*pcSrcSize)
1024 return S_OK;
1025
1026 if (*pcSrcSize == -1)
1027 *pcSrcSize = lstrlenW(pSrcStr);
1028
1029 /* forwarding euc-jp to EUC-JP */
1030 if (dwEncoding == 51932)
1031 dwEncoding = 20932;
1032
1033 if (dwEncoding == CP_UNICODE)
1034 {
1035 if (*pcSrcSize == -1)
1036 *pcSrcSize = lstrlenW(pSrcStr);
1037
1038 size = min(*pcSrcSize, destsz) * sizeof(WCHAR);
1039 if (pDstStr)
1040 memmove(pDstStr, pSrcStr, size);
1041
1042 if (size >= destsz)
1043 goto fail;
1044 }
1045 else if (dwEncoding == 50220 || dwEncoding == 50221 || dwEncoding == 50222)
1046 {
1047 size = ConvertJapaneseUnicodeToJIS(pSrcStr, *pcSrcSize, NULL, 0);
1048 if (!size)
1049 goto fail;
1050
1051 if (pDstStr)
1052 {
1053 size = ConvertJapaneseUnicodeToJIS(pSrcStr, *pcSrcSize, pDstStr,
1054 destsz);
1055 if (!size)
1056 goto fail;
1057 }
1058
1059 }
1060 else
1061 {
1062 size = WideCharToMultiByte(dwEncoding, 0, pSrcStr, *pcSrcSize,
1063 NULL, 0, NULL, NULL);
1064 if (!size)
1065 goto fail;
1066
1067 if (pDstStr)
1068 {
1069 size = WideCharToMultiByte(dwEncoding, 0, pSrcStr, *pcSrcSize,
1070 pDstStr, destsz, NULL, NULL);
1071 if (!size)
1072 goto fail;
1073 }
1074 }
1075
1076 *pcDstSize = size;
1077 return S_OK;
1078
1079fail:
1080 *pcSrcSize = 0;
1081 *pcDstSize = 0;
1082 return E_FAIL;
1083}
1084
1086 LPDWORD pdwMode,
1087 DWORD dwSrcEncoding,
1088 DWORD dwDstEncoding,
1089 LPCSTR pSrcStr,
1090 LPINT pcSrcSize,
1091 LPSTR pDstStr,
1092 LPINT pcDstSize
1093)
1094{
1095 TRACE("%p %ld %ld %s %p %p %p\n", pdwMode, dwSrcEncoding, dwDstEncoding,
1096 debugstr_a(pSrcStr), pcSrcSize, pDstStr, pcDstSize);
1097
1098 if (dwSrcEncoding == CP_UNICODE)
1099 {
1100 INT cSrcSizeW;
1101 if (pcSrcSize && *pcSrcSize != -1)
1102 {
1103 cSrcSizeW = *pcSrcSize / sizeof(WCHAR);
1104 pcSrcSize = &cSrcSizeW;
1105 }
1106 return ConvertINetUnicodeToMultiByte(pdwMode, dwDstEncoding, (LPCWSTR)pSrcStr, pcSrcSize, pDstStr, pcDstSize);
1107 }
1108 else if (dwDstEncoding == CP_UNICODE)
1109 {
1110 HRESULT hr = ConvertINetMultiByteToUnicode(pdwMode, dwSrcEncoding, pSrcStr, pcSrcSize, (LPWSTR)pDstStr, pcDstSize);
1111 *pcDstSize *= sizeof(WCHAR);
1112 return hr;
1113 }
1114 else
1115 {
1116 INT cDstSizeW;
1117 LPWSTR pDstStrW;
1118 HRESULT hr;
1119
1120 TRACE("convert %s from %ld to %ld\n", debugstr_a(pSrcStr), dwSrcEncoding, dwDstEncoding);
1121
1122 hr = ConvertINetMultiByteToUnicode(pdwMode, dwSrcEncoding, pSrcStr, pcSrcSize, NULL, &cDstSizeW);
1123 if (hr != S_OK)
1124 return hr;
1125
1126 pDstStrW = malloc(cDstSizeW * sizeof(WCHAR));
1127 hr = ConvertINetMultiByteToUnicode(pdwMode, dwSrcEncoding, pSrcStr, pcSrcSize, pDstStrW, &cDstSizeW);
1128 if (hr == S_OK)
1129 hr = ConvertINetUnicodeToMultiByte(pdwMode, dwDstEncoding, pDstStrW, &cDstSizeW, pDstStr, pcDstSize);
1130
1131 free(pDstStrW);
1132 return hr;
1133 }
1134}
1135
1137 UINT uiCodePage,
1138 UINT* puiFamilyCodePage)
1139{
1140 UINT i, n;
1141
1142 TRACE("%u %p\n", uiCodePage, puiFamilyCodePage);
1143
1144 if (!puiFamilyCodePage) return S_FALSE;
1145
1146 for (i = 0; i < ARRAY_SIZE(mlang_data); i++)
1147 {
1148 for (n = 0; n < mlang_data[i].number_of_cp; n++)
1149 {
1150 if (mlang_data[i].mime_cp_info[n].cp == uiCodePage)
1151 {
1152 *puiFamilyCodePage = mlang_data[i].family_codepage;
1153 return S_OK;
1154 }
1155 }
1156 }
1157
1158 return S_FALSE;
1159}
1160
1162 DWORD dwSrcEncoding,
1163 DWORD dwDstEncoding)
1164{
1165 UINT src_family, dst_family;
1166
1167 TRACE("%ld %ld\n", dwSrcEncoding, dwDstEncoding);
1168
1169 if (GetFamilyCodePage(dwSrcEncoding, &src_family) != S_OK ||
1170 GetFamilyCodePage(dwDstEncoding, &dst_family) != S_OK)
1171 return S_FALSE;
1172
1173 if (src_family == dst_family) return S_OK;
1174
1175 /* we can convert any codepage to/from unicode */
1176 if (src_family == CP_UNICODE || dst_family == CP_UNICODE) return S_OK;
1177
1178 return S_FALSE;
1179}
1180
1181static inline HRESULT lcid_to_rfc1766A( LCID lcid, LPSTR rfc1766, INT len )
1182{
1183 CHAR buffer[MAX_RFC1766_NAME];
1184 INT n = GetLocaleInfoA(lcid, LOCALE_SISO639LANGNAME, buffer, MAX_RFC1766_NAME);
1185 INT i;
1186
1187 if (n)
1188 {
1189 i = PRIMARYLANGID(lcid);
1190 if ((((i == LANG_ENGLISH) || (i == LANG_CHINESE) || (i == LANG_ARABIC)) &&
1193
1194 buffer[n - 1] = '-';
1195 i = GetLocaleInfoA(lcid, LOCALE_SISO3166CTRYNAME, buffer + n, MAX_RFC1766_NAME - n);
1196 if (!i)
1197 buffer[n - 1] = '\0';
1198 }
1199 else
1200 i = 0;
1201
1203 return ((n + i) > len) ? E_INVALIDARG : S_OK;
1204 }
1205 return E_FAIL;
1206}
1207
1208static inline HRESULT lcid_to_rfc1766W( LCID lcid, LPWSTR rfc1766, INT len )
1209{
1210 WCHAR buffer[MAX_RFC1766_NAME];
1211 INT n = GetLocaleInfoW(lcid, LOCALE_SISO639LANGNAME, buffer, MAX_RFC1766_NAME);
1212 INT i;
1213
1214 if (n)
1215 {
1216 i = PRIMARYLANGID(lcid);
1217 if ((((i == LANG_ENGLISH) || (i == LANG_CHINESE) || (i == LANG_ARABIC)) &&
1220
1221 buffer[n - 1] = '-';
1222 i = GetLocaleInfoW(lcid, LOCALE_SISO3166CTRYNAME, buffer + n, MAX_RFC1766_NAME - n);
1223 if (!i)
1224 buffer[n - 1] = '\0';
1225 }
1226 else
1227 i = 0;
1228
1230 return ((n + i) > len) ? E_INVALIDARG : S_OK;
1231 }
1232 return E_FAIL;
1233}
1234
1236 LCID lcid,
1237 LPSTR pszRfc1766,
1238 INT nChar)
1239{
1240 TRACE("%04lx %p %u\n", lcid, pszRfc1766, nChar);
1241 if (!pszRfc1766)
1242 return E_INVALIDARG;
1243
1244 return lcid_to_rfc1766A(lcid, pszRfc1766, nChar);
1245}
1246
1248 LCID lcid,
1249 LPWSTR pszRfc1766,
1250 INT nChar)
1251{
1252 TRACE("%04lx %p %u\n", lcid, pszRfc1766, nChar);
1253 if (!pszRfc1766)
1254 return E_INVALIDARG;
1255
1256 return lcid_to_rfc1766W(lcid, pszRfc1766, nChar);
1257}
1258
1259static HRESULT lcid_from_rfc1766(IEnumRfc1766 *iface, LCID *lcid, LPCWSTR rfc1766)
1260{
1261 RFC1766INFO info;
1262 ULONG num;
1263
1264 while (IEnumRfc1766_Next(iface, 1, &info, &num) == S_OK)
1265 {
1266 if (!wcsicmp(info.wszRfc1766, rfc1766))
1267 {
1268 *lcid = info.lcid;
1269 return S_OK;
1270 }
1271 if (lstrlenW(rfc1766) == 2 && !memcmp(info.wszRfc1766, rfc1766, 2 * sizeof(WCHAR)))
1272 {
1273 *lcid = PRIMARYLANGID(info.lcid);
1274 return S_OK;
1275 }
1276 }
1277
1278 return E_FAIL;
1279}
1280
1282{
1283 IEnumRfc1766 *enumrfc1766;
1284 HRESULT hr;
1285
1286 TRACE("(%p, %s)\n", pLocale, debugstr_w(pszRfc1766));
1287
1288 if (!pLocale || !pszRfc1766)
1289 return E_INVALIDARG;
1290
1291 hr = EnumRfc1766_create(0, &enumrfc1766);
1292 if (FAILED(hr))
1293 return hr;
1294
1295 hr = lcid_from_rfc1766(enumrfc1766, pLocale, pszRfc1766);
1296 IEnumRfc1766_Release(enumrfc1766);
1297
1298 return hr;
1299}
1300
1302{
1303 WCHAR rfc1766W[MAX_RFC1766_NAME + 1];
1304
1305 if (!rfc1766A)
1306 return E_INVALIDARG;
1307
1308 MultiByteToWideChar(CP_ACP, 0, rfc1766A, -1, rfc1766W, MAX_RFC1766_NAME);
1309 rfc1766W[MAX_RFC1766_NAME] = 0;
1310
1311 return Rfc1766ToLcidW(lcid, rfc1766W);
1312}
1313
1315{
1318 HFONT font;
1321};
1322
1324{
1325 HFONT new_font, old_font;
1327 UINT charset;
1329
1330 data->src_lf.lfCharSet = lf->lfCharSet;
1331 wcscpy(data->src_lf.lfFaceName, lf->lfFaceName);
1332
1333 new_font = CreateFontIndirectW(&data->src_lf);
1334 if (new_font == NULL) return 1;
1335
1336 old_font = SelectObject(data->hdc, new_font);
1337 charset = GetTextCharsetInfo(data->hdc, &fs, 0);
1338 SelectObject(data->hdc, old_font);
1339
1340 /* check that the font directly supports the codepage as well (not just through a child font) */
1341 if (charset == data->charset && fs.fsCsb[0] & data->mask)
1342 {
1343 data->font = new_font;
1344 return 0;
1345 }
1346 DeleteObject(new_font);
1347 return 1;
1348}
1349
1350static HRESULT map_font(HDC hdc, DWORD codepages, HFONT src_font, HFONT *dst_font)
1351{
1352 struct font_list *font_list_entry;
1353 CHARSETINFO charset_info;
1354 LOGFONTW font_attr;
1355 DWORD mask, Csb[2];
1356 BOOL found_cached;
1357 BOOL ret;
1358 UINT i;
1360
1361 if (hdc == NULL || src_font == NULL) return E_FAIL;
1362
1363 enum_data.hdc = hdc;
1364 enum_data.font = NULL;
1365
1366 GetObjectW(src_font, sizeof(enum_data.src_lf), &enum_data.src_lf);
1367 enum_data.src_lf.lfWidth = 0;
1368
1369 for (i = 0; i < 32; i++)
1370 {
1371 mask = (DWORD)(1 << i);
1372 if (codepages & mask)
1373 {
1374 Csb[0] = mask;
1375 Csb[1] = 0x0;
1376 ret = TranslateCharsetInfo(Csb, &charset_info, TCI_SRCFONTSIG);
1377 if (!ret) continue;
1378
1379 /* use cached font if possible */
1380 found_cached = FALSE;
1382 LIST_FOR_EACH_ENTRY(font_list_entry, &font_cache, struct font_list, list_entry)
1383 {
1384 if (font_list_entry->charset == charset_info.ciCharset &&
1385 font_list_entry->base_font == src_font)
1386 {
1387 if (dst_font != NULL)
1388 *dst_font = font_list_entry->font;
1389 found_cached = TRUE;
1390 }
1391 }
1393 if (found_cached) return S_OK;
1394
1395 font_attr.lfCharSet = (BYTE)charset_info.ciCharset;
1396 font_attr.lfFaceName[0] = 0;
1397 font_attr.lfPitchAndFamily = 0;
1398
1399 enum_data.charset = charset_info.ciCharset;
1400 enum_data.mask = mask;
1401
1403 {
1404 font_list_entry = malloc(sizeof(*font_list_entry));
1405 if (font_list_entry == NULL) return E_OUTOFMEMORY;
1406
1407 font_list_entry->base_font = src_font;
1408 font_list_entry->font = enum_data.font;
1409 font_list_entry->charset = enum_data.charset;
1410
1412 list_add_tail(&font_cache, &font_list_entry->list_entry);
1414
1415 if (dst_font != NULL)
1416 *dst_font = enum_data.font;
1417 return S_OK;
1418 }
1419 }
1420 }
1421 WARN("couldn't create an appropriate mapped font...\n");
1422 return E_FAIL;
1423}
1424
1426{
1427 struct font_list *font_list_entry;
1428 HRESULT hr;
1429
1430 hr = E_FAIL;
1432 LIST_FOR_EACH_ENTRY(font_list_entry, &font_cache, struct font_list, list_entry)
1433 {
1434 if (font_list_entry->font == font)
1435 {
1436 list_remove(&font_list_entry->list_entry);
1438 free(font_list_entry);
1439 hr = S_OK;
1440 break;
1441 }
1442 }
1444
1445 return hr;
1446}
1447
1449{
1450 struct font_list *font_list_entry;
1451 struct font_list *font_list_entry2;
1452
1454 LIST_FOR_EACH_ENTRY_SAFE(font_list_entry, font_list_entry2, &font_cache, struct font_list, list_entry)
1455 {
1456 list_remove(&font_list_entry->list_entry);
1457 DeleteObject(font_list_entry->font);
1458 free(font_list_entry);
1459 }
1461
1462 return S_OK;
1463}
1464
1465/******************************************************************************
1466 * MLANG ClassFactory
1467 */
1468typedef struct {
1469 IClassFactory IClassFactory_iface;
1470 LONG ref;
1471 HRESULT (*pfnCreateInstance)(IUnknown *pUnkOuter, LPVOID *ppObj);
1473
1475{
1476 return CONTAINING_RECORD(iface, IClassFactoryImpl, IClassFactory_iface);
1477}
1478
1480{
1481 const CLSID *clsid;
1483 HRESULT (*pfnCreateInstance)(IUnknown *pUnkOuter, LPVOID *ppObj);
1484};
1485
1487{
1488 { &CLSID_CMultiLanguage, "CLSID_CMultiLanguage", MultiLanguage_create },
1489 { &CLSID_CMLangConvertCharset, "CLSID_CMLangConvertCharset", MLangConvertCharset_create }
1490};
1491
1493{
1494 TRACE("%s\n", debugstr_guid(riid) );
1495
1498 {
1499 IClassFactory_AddRef(iface);
1500 *ppobj = iface;
1501 return S_OK;
1502 }
1503
1504 *ppobj = NULL;
1505 WARN("(%p)->(%s,%p), not found\n", iface, debugstr_guid(riid), ppobj);
1506 return E_NOINTERFACE;
1507}
1508
1510{
1512 return InterlockedIncrement(&This->ref);
1513}
1514
1516{
1519
1520 if (ref == 0)
1521 {
1522 TRACE("Destroying %p\n", This);
1523 free(This);
1524 }
1525
1526 return ref;
1527}
1528
1530 REFIID riid, void **ppobj)
1531{
1533 HRESULT hres;
1535
1536 TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj);
1537
1538 *ppobj = NULL;
1539 hres = This->pfnCreateInstance(pOuter, (LPVOID *) &punk);
1540 if (SUCCEEDED(hres)) {
1541 hres = IUnknown_QueryInterface(punk, riid, ppobj);
1542 IUnknown_Release(punk);
1543 }
1544 TRACE("returning (%p) -> %lx\n", *ppobj, hres);
1545 return hres;
1546}
1547
1549{
1550 if (dolock)
1551 LockModule();
1552 else
1553 UnlockModule();
1554
1555 return S_OK;
1556}
1557
1558static const IClassFactoryVtbl MLANGCF_Vtbl =
1559{
1565};
1566
1567/******************************************************************
1568 * DllGetClassObject (MLANG.@)
1569 */
1571{
1572 unsigned int i;
1574
1575 TRACE("%s %s %p\n",debugstr_guid(rclsid), debugstr_guid(iid), ppv);
1576
1577 if ( !IsEqualGUID( &IID_IClassFactory, iid )
1578 && ! IsEqualGUID( &IID_IUnknown, iid) )
1579 return E_NOINTERFACE;
1580
1581 for (i = 0; i < ARRAY_SIZE(object_creation); i++)
1582 {
1583 if (IsEqualGUID(object_creation[i].clsid, rclsid))
1584 break;
1585 }
1586
1588 {
1589 FIXME("%s: no class found.\n", debugstr_guid(rclsid));
1591 }
1592
1593 TRACE("Creating a class factory for %s\n",object_creation[i].szClassName);
1594
1595 factory = malloc(sizeof(*factory));
1596 if (factory == NULL) return E_OUTOFMEMORY;
1597
1599 factory->ref = 1;
1600
1601 factory->pfnCreateInstance = object_creation[i].pfnCreateInstance;
1602
1604
1605 TRACE("(%p) <- %p\n", ppv, &factory->IClassFactory_iface);
1606
1607 return S_OK;
1608}
1609
1610
1611/******************************************************************************/
1612
1613typedef struct tagMLang_impl
1614{
1615 IMLangFontLink IMLangFontLink_iface;
1616 IMultiLanguage IMultiLanguage_iface;
1617 IMultiLanguage3 IMultiLanguage3_iface;
1618 IMLangFontLink2 IMLangFontLink2_iface;
1619 IMLangLineBreakConsole IMLangLineBreakConsole_iface;
1623
1624/******************************************************************************/
1625
1627{
1628 IEnumCodePage IEnumCodePage_iface;
1630 MIMECPINFO *cpinfo;
1633
1634static inline EnumCodePage_impl *impl_from_IEnumCodePage( IEnumCodePage *iface )
1635{
1636 return CONTAINING_RECORD( iface, EnumCodePage_impl, IEnumCodePage_iface );
1637}
1638
1640 IEnumCodePage* iface,
1641 REFIID riid,
1642 void** ppvObject)
1643{
1645
1646 TRACE("%p -> %s\n", This, debugstr_guid(riid) );
1647
1649 || IsEqualGUID(riid, &IID_IEnumCodePage))
1650 {
1651 IEnumCodePage_AddRef(iface);
1652 TRACE("Returning IID_IEnumCodePage %p ref = %ld\n", This, This->ref);
1653 *ppvObject = &This->IEnumCodePage_iface;
1654 return S_OK;
1655 }
1656
1657 WARN("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
1658 return E_NOINTERFACE;
1659}
1660
1662 IEnumCodePage* iface)
1663{
1665 return InterlockedIncrement(&This->ref);
1666}
1667
1669 IEnumCodePage* iface)
1670{
1673
1674 TRACE("%p ref = %ld\n", This, ref);
1675 if (ref == 0)
1676 {
1677 TRACE("Destroying %p\n", This);
1678 free(This->cpinfo);
1679 free(This);
1680 }
1681
1682 return ref;
1683}
1684
1686 IEnumCodePage* iface,
1687 IEnumCodePage** ppEnum)
1688{
1690 FIXME("%p %p\n", This, ppEnum);
1691 return E_NOTIMPL;
1692}
1693
1695 IEnumCodePage* iface,
1696 ULONG celt,
1697 PMIMECPINFO rgelt,
1698 ULONG* pceltFetched)
1699{
1700 ULONG i;
1702
1703 TRACE("%p %lu %p %p\n", This, celt, rgelt, pceltFetched);
1704
1705 if (!pceltFetched) return S_FALSE;
1706 *pceltFetched = 0;
1707
1708 if (!rgelt) return S_FALSE;
1709
1710 if (This->pos + celt > This->total)
1711 celt = This->total - This->pos;
1712
1713 if (!celt) return S_FALSE;
1714
1715 memcpy(rgelt, This->cpinfo + This->pos, celt * sizeof(MIMECPINFO));
1716 *pceltFetched = celt;
1717 This->pos += celt;
1718
1719 for (i = 0; i < celt; i++)
1720 {
1721 TRACE("#%lu: %08lx %u %u %s %s %s %s %s %s %d\n",
1722 i, rgelt[i].dwFlags, rgelt[i].uiCodePage,
1723 rgelt[i].uiFamilyCodePage,
1724 wine_dbgstr_w(rgelt[i].wszDescription),
1725 wine_dbgstr_w(rgelt[i].wszWebCharset),
1726 wine_dbgstr_w(rgelt[i].wszHeaderCharset),
1727 wine_dbgstr_w(rgelt[i].wszBodyCharset),
1728 wine_dbgstr_w(rgelt[i].wszFixedWidthFont),
1729 wine_dbgstr_w(rgelt[i].wszProportionalFont),
1730 rgelt[i].bGDICharset);
1731 }
1732 return S_OK;
1733}
1734
1736 IEnumCodePage* iface)
1737{
1739
1740 TRACE("%p\n", This);
1741
1742 This->pos = 0;
1743 return S_OK;
1744}
1745
1747 IEnumCodePage* iface,
1748 ULONG celt)
1749{
1751
1752 TRACE("%p %lu\n", This, celt);
1753
1754 if (celt >= This->total) return S_FALSE;
1755
1756 This->pos += celt;
1757 return S_OK;
1758}
1759
1760static const IEnumCodePageVtbl IEnumCodePage_vtbl =
1761{
1769};
1770
1772 LANGID LangId, IEnumCodePage** ppEnumCodePage )
1773{
1774 EnumCodePage_impl *ecp;
1775 MIMECPINFO *cpinfo;
1776 UINT i, n;
1777
1778 TRACE("%p, %08lx, %04x, %p\n", mlang, grfFlags, LangId, ppEnumCodePage);
1779
1780 if (!grfFlags) /* enumerate internal data base of encodings */
1781 grfFlags = MIMECONTF_MIME_LATEST;
1782
1783 ecp = malloc(sizeof(EnumCodePage_impl));
1785 ecp->ref = 1;
1786 ecp->pos = 0;
1787 ecp->total = 0;
1788 for (i = 0; i < ARRAY_SIZE(mlang_data); i++)
1789 {
1790 for (n = 0; n < mlang_data[i].number_of_cp; n++)
1791 {
1792 if (mlang_data[i].mime_cp_info[n].flags & grfFlags)
1793 ecp->total++;
1794 }
1795 }
1796
1797 ecp->cpinfo = malloc(sizeof(MIMECPINFO) * ecp->total);
1798 cpinfo = ecp->cpinfo;
1799
1800 for (i = 0; i < ARRAY_SIZE(mlang_data); i++)
1801 {
1802 for (n = 0; n < mlang_data[i].number_of_cp; n++)
1803 {
1804 if (mlang_data[i].mime_cp_info[n].flags & grfFlags)
1805 fill_cp_info(&mlang_data[i], n, cpinfo++);
1806 }
1807 }
1808
1809 TRACE("enumerated %ld codepages with flags %08lx\n", ecp->total, grfFlags);
1810
1811 *ppEnumCodePage = &ecp->IEnumCodePage_iface;
1812
1813 return S_OK;
1814}
1815
1816/******************************************************************************/
1817
1819{
1822 SCRIPTINFO *script_info;
1825
1826static inline EnumScript_impl *impl_from_IEnumScript( IEnumScript *iface )
1827{
1828 return CONTAINING_RECORD( iface, EnumScript_impl, IEnumScript_iface );
1829}
1830
1832 IEnumScript* iface,
1833 REFIID riid,
1834 void** ppvObject)
1835{
1837
1838 TRACE("%p -> %s\n", This, debugstr_guid(riid) );
1839
1841 || IsEqualGUID(riid, &IID_IEnumScript))
1842 {
1843 IEnumScript_AddRef(iface);
1844 TRACE("Returning IID_IEnumScript %p ref = %ld\n", This, This->ref);
1845 *ppvObject = &This->IEnumScript_iface;
1846 return S_OK;
1847 }
1848
1849 WARN("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
1850 return E_NOINTERFACE;
1851}
1852
1854 IEnumScript* iface)
1855{
1857 return InterlockedIncrement(&This->ref);
1858}
1859
1861 IEnumScript* iface)
1862{
1865
1866 TRACE("%p ref = %ld\n", This, ref);
1867 if (ref == 0)
1868 {
1869 TRACE("Destroying %p\n", This);
1870 free(This->script_info);
1871 free(This);
1872 }
1873
1874 return ref;
1875}
1876
1878 IEnumScript* iface,
1879 IEnumScript** ppEnum)
1880{
1882 FIXME("%p %p: stub!\n", This, ppEnum);
1883 return E_NOTIMPL;
1884}
1885
1887 IEnumScript* iface,
1888 ULONG celt,
1889 PSCRIPTINFO rgelt,
1890 ULONG* pceltFetched)
1891{
1893
1894 TRACE("%p %lu %p %p\n", This, celt, rgelt, pceltFetched);
1895
1896 if (!pceltFetched || !rgelt) return E_FAIL;
1897
1898 *pceltFetched = 0;
1899
1900 if (This->pos + celt > This->total)
1901 celt = This->total - This->pos;
1902
1903 if (!celt) return S_FALSE;
1904
1905 memcpy(rgelt, This->script_info + This->pos, celt * sizeof(SCRIPTINFO));
1906 *pceltFetched = celt;
1907 This->pos += celt;
1908
1909 return S_OK;
1910}
1911
1913 IEnumScript* iface)
1914{
1916
1917 TRACE("%p\n", This);
1918
1919 This->pos = 0;
1920 return S_OK;
1921}
1922
1924 IEnumScript* iface,
1925 ULONG celt)
1926{
1928
1929 TRACE("%p %lu\n", This, celt);
1930
1931 if (celt >= This->total) return S_FALSE;
1932
1933 This->pos += celt;
1934 return S_OK;
1935}
1936
1937static const IEnumScriptVtbl IEnumScript_vtbl =
1938{
1946};
1947
1949 LANGID LangId, IEnumScript** ppEnumScript )
1950{
1952 UINT i;
1953
1954 TRACE("%p, %08lx, %04x, %p\n", mlang, dwFlags, LangId, ppEnumScript);
1955
1956 if (!dwFlags) /* enumerate all available scripts */
1957 dwFlags = SCRIPTCONTF_SCRIPT_USER | SCRIPTCONTF_SCRIPT_HIDE | SCRIPTCONTF_SCRIPT_SYSTEM;
1958
1959 es = malloc(sizeof(EnumScript_impl));
1960 es->IEnumScript_iface.lpVtbl = &IEnumScript_vtbl;
1961 es->ref = 1;
1962 es->pos = 0;
1963 /* do not enumerate unicode flavours */
1964 es->total = ARRAY_SIZE(mlang_data) - 1;
1965 es->script_info = malloc(sizeof(SCRIPTINFO) * es->total);
1966
1967 for (i = 0; i < es->total; i++)
1968 {
1969 es->script_info[i].ScriptId = i;
1970 es->script_info[i].uiCodePage = mlang_data[i].family_codepage;
1971 wcscpy( es->script_info[i].wszDescription, mlang_data[i].description );
1972 wcscpy( es->script_info[i].wszFixedWidthFont, mlang_data[i].fixed_font );
1973 wcscpy( es->script_info[i].wszProportionalFont, mlang_data[i].proportional_font );
1974 }
1975
1976 TRACE("enumerated %ld scripts with flags %08lx\n", es->total, dwFlags);
1977
1978 *ppEnumScript = &es->IEnumScript_iface;
1979
1980 return S_OK;
1981}
1982
1983/******************************************************************************/
1984
1985static inline MLang_impl *impl_from_IMLangFontLink( IMLangFontLink *iface )
1986{
1987 return CONTAINING_RECORD( iface, MLang_impl, IMLangFontLink_iface );
1988}
1989
1991 IMLangFontLink* iface,
1992 REFIID riid,
1993 void** ppvObject)
1994{
1996 return IMultiLanguage3_QueryInterface( &This->IMultiLanguage3_iface, riid, ppvObject );
1997}
1998
2000 IMLangFontLink* iface)
2001{
2003 return IMultiLanguage3_AddRef( &This->IMultiLanguage3_iface );
2004}
2005
2007 IMLangFontLink* iface)
2008{
2010 return IMultiLanguage3_Release( &This->IMultiLanguage3_iface );
2011}
2012
2014 IMLangFontLink* iface,
2015 WCHAR ch_src,
2017{
2019 return IMLangFontLink2_GetCharCodePages(&This->IMLangFontLink2_iface, ch_src, codepages);
2020}
2021
2023 IMLangFontLink* iface,
2024 const WCHAR* src,
2025 LONG src_len,
2026 DWORD priority_cp,
2028 LONG* ret_len)
2029{
2031 return IMLangFontLink2_GetStrCodePages(&This->IMLangFontLink2_iface, src, src_len, priority_cp,
2033}
2034
2036 IMLangFontLink* iface,
2037 UINT codepage,
2039{
2041 return IMLangFontLink2_CodePageToCodePages(&This->IMLangFontLink2_iface, codepage, codepages);
2042}
2043
2045 IMLangFontLink* iface,
2047 UINT def_codepage,
2048 UINT* codepage)
2049{
2051 return IMLangFontLink2_CodePagesToCodePage(&This->IMLangFontLink2_iface, codepages,
2052 def_codepage, codepage);
2053}
2054
2056 IMLangFontLink* iface,
2057 HDC hdc,
2058 HFONT hfont,
2060{
2062 return IMLangFontLink2_GetFontCodePages(&This->IMLangFontLink2_iface, hdc, hfont, codepages);
2063}
2064
2066 IMLangFontLink* iface,
2067 HDC hDC,
2068 DWORD dwCodePages,
2069 HFONT hSrcFont,
2070 HFONT* phDestFont)
2071{
2072 TRACE("(%p)->%p %08lx %p %p\n",iface, hDC, dwCodePages, hSrcFont, phDestFont);
2073
2074 return map_font(hDC, dwCodePages, hSrcFont, phDestFont);
2075}
2076
2078 IMLangFontLink* iface,
2079 HFONT hFont)
2080{
2081 TRACE("(%p)->%p\n",iface, hFont);
2082
2083 return release_font(hFont);
2084}
2085
2087 IMLangFontLink* iface)
2088{
2089 TRACE("(%p)\n",iface);
2090
2091 return clear_font_cache();
2092}
2093
2094
2095static const IMLangFontLinkVtbl IMLangFontLink_vtbl =
2096{
2108};
2109
2110/******************************************************************************/
2111
2112static inline MLang_impl *impl_from_IMultiLanguage( IMultiLanguage *iface )
2113{
2114 return CONTAINING_RECORD( iface, MLang_impl, IMultiLanguage_iface );
2115}
2116
2118 IMultiLanguage* iface,
2119 REFIID riid,
2120 void** obj)
2121{
2123 return IMultiLanguage3_QueryInterface(&This->IMultiLanguage3_iface, riid, obj);
2124}
2125
2126static ULONG WINAPI fnIMultiLanguage_AddRef( IMultiLanguage* iface )
2127{
2129 return IMultiLanguage3_AddRef(&This->IMultiLanguage3_iface);
2130}
2131
2132static ULONG WINAPI fnIMultiLanguage_Release( IMultiLanguage* iface )
2133{
2135 return IMultiLanguage3_Release(&This->IMultiLanguage3_iface);
2136}
2137
2139 IMultiLanguage* iface,
2140 UINT* cp)
2141{
2143 TRACE("(%p, %p)\n", This, cp);
2144 return IMultiLanguage3_GetNumberOfCodePageInfo(&This->IMultiLanguage3_iface, cp);
2145}
2146
2148 IMultiLanguage* iface,
2149 UINT uiCodePage,
2150 PMIMECPINFO pCodePageInfo)
2151{
2152 UINT i, n;
2154
2155 TRACE("%p, %u, %p\n", This, uiCodePage, pCodePageInfo);
2156
2157 for (i = 0; i < ARRAY_SIZE(mlang_data); i++)
2158 {
2159 for (n = 0; n < mlang_data[i].number_of_cp; n++)
2160 {
2161 if (mlang_data[i].mime_cp_info[n].cp == uiCodePage)
2162 {
2163 fill_cp_info(&mlang_data[i], n, pCodePageInfo);
2164 return S_OK;
2165 }
2166 }
2167 }
2168
2169 return S_FALSE;
2170}
2171
2173 IMultiLanguage* iface,
2174 UINT cp,
2175 UINT* family_cp)
2176{
2178 return IMultiLanguage3_GetFamilyCodePage(&This->IMultiLanguage3_iface, cp, family_cp);
2179}
2180
2182 IMultiLanguage* iface,
2183 DWORD grfFlags,
2184 IEnumCodePage** ppEnumCodePage)
2185{
2187
2188 TRACE("%p %08lx %p\n", This, grfFlags, ppEnumCodePage);
2189
2190 return EnumCodePage_create( This, grfFlags, 0, ppEnumCodePage );
2191}
2192
2194 IMultiLanguage* iface,
2195 BSTR Charset,
2196 PMIMECSETINFO pCharsetInfo)
2197{
2199 return IMultiLanguage3_GetCharsetInfo( &This->IMultiLanguage3_iface, Charset, pCharsetInfo );
2200}
2201
2203 IMultiLanguage* iface,
2204 DWORD src_enc,
2205 DWORD dst_enc)
2206{
2208 return IMultiLanguage3_IsConvertible(&This->IMultiLanguage3_iface, src_enc, dst_enc);
2209}
2210
2212 IMultiLanguage* iface,
2213 DWORD* mode,
2214 DWORD src_enc,
2215 DWORD dst_enc,
2216 BYTE* src,
2217 UINT* src_size,
2218 BYTE* dest,
2219 UINT* dest_size)
2220{
2222 return IMultiLanguage3_ConvertString(&This->IMultiLanguage3_iface, mode, src_enc,
2223 dst_enc, src, src_size, dest, dest_size);
2224}
2225
2227 IMultiLanguage* iface,
2228 DWORD* mode,
2229 DWORD src_enc,
2230 CHAR* src,
2231 UINT* src_size,
2232 WCHAR* dest,
2233 UINT* dest_size)
2234{
2236 return IMultiLanguage3_ConvertStringToUnicode(&This->IMultiLanguage3_iface,
2237 mode, src_enc, src, src_size, dest, dest_size);
2238}
2239
2241 IMultiLanguage* iface,
2242 DWORD* mode,
2243 DWORD encoding,
2244 WCHAR* src,
2245 UINT* src_size,
2246 CHAR* dest,
2247 UINT* dest_size)
2248{
2250 return IMultiLanguage3_ConvertStringFromUnicode(&This->IMultiLanguage3_iface,
2251 mode, encoding, src, src_size, dest, dest_size);
2252}
2253
2255 IMultiLanguage* iface)
2256{
2258 return IMultiLanguage3_ConvertStringReset(&This->IMultiLanguage3_iface);
2259}
2260
2262 IMultiLanguage* iface,
2263 LCID lcid,
2264 BSTR* pbstrRfc1766)
2265{
2267 return IMultiLanguage3_GetRfc1766FromLcid(&This->IMultiLanguage3_iface, lcid, pbstrRfc1766);
2268}
2269
2271 IMultiLanguage* iface,
2272 LCID* locale,
2273 BSTR rfc1766)
2274{
2276 return IMultiLanguage3_GetLcidFromRfc1766(&This->IMultiLanguage3_iface, locale, rfc1766);
2277}
2278
2279/******************************************************************************/
2280
2282{
2285 RFC1766INFO *info;
2288
2289static inline EnumRfc1766_impl *impl_from_IEnumRfc1766( IEnumRfc1766 *iface )
2290{
2291 return CONTAINING_RECORD( iface, EnumRfc1766_impl, IEnumRfc1766_iface );
2292}
2293
2295 IEnumRfc1766 *iface,
2296 REFIID riid,
2297 void** ppvObject)
2298{
2300
2301 TRACE("%p -> %s\n", This, debugstr_guid(riid) );
2302
2304 || IsEqualGUID(riid, &IID_IEnumRfc1766))
2305 {
2306 IEnumRfc1766_AddRef(iface);
2307 TRACE("Returning IID_IEnumRfc1766 %p ref = %ld\n", This, This->ref);
2308 *ppvObject = &This->IEnumRfc1766_iface;
2309 return S_OK;
2310 }
2311
2312 WARN("(%p) -> (%s,%p), not found\n",This,debugstr_guid(riid),ppvObject);
2313 return E_NOINTERFACE;
2314}
2315
2317 IEnumRfc1766 *iface)
2318{
2320 return InterlockedIncrement(&This->ref);
2321}
2322
2324 IEnumRfc1766 *iface)
2325{
2328
2329 TRACE("%p ref = %ld\n", This, ref);
2330 if (ref == 0)
2331 {
2332 TRACE("Destroying %p\n", This);
2333 free(This->info);
2334 free(This);
2335 }
2336 return ref;
2337}
2338
2340 IEnumRfc1766 *iface,
2341 IEnumRfc1766 **ppEnum)
2342{
2344
2345 FIXME("%p %p\n", This, ppEnum);
2346 return E_NOTIMPL;
2347}
2348
2350 IEnumRfc1766 *iface,
2351 ULONG celt,
2352 PRFC1766INFO rgelt,
2353 ULONG *pceltFetched)
2354{
2355 ULONG i;
2357
2358 TRACE("%p %lu %p %p\n", This, celt, rgelt, pceltFetched);
2359
2360 if (!pceltFetched) return S_FALSE;
2361 *pceltFetched = 0;
2362
2363 if (!rgelt) return S_FALSE;
2364
2365 if (This->pos + celt > This->total)
2366 celt = This->total - This->pos;
2367
2368 if (!celt) return S_FALSE;
2369
2370 memcpy(rgelt, This->info + This->pos, celt * sizeof(RFC1766INFO));
2371 *pceltFetched = celt;
2372 This->pos += celt;
2373
2374 for (i = 0; i < celt; i++)
2375 {
2376 TRACE("#%lu: %08lx %s %s\n",
2377 i, rgelt[i].lcid,
2378 wine_dbgstr_w(rgelt[i].wszRfc1766),
2379 wine_dbgstr_w(rgelt[i].wszLocaleName));
2380 }
2381 return S_OK;
2382}
2383
2385 IEnumRfc1766 *iface)
2386{
2388
2389 TRACE("%p\n", This);
2390
2391 This->pos = 0;
2392 return S_OK;
2393}
2394
2396 IEnumRfc1766 *iface,
2397 ULONG celt)
2398{
2400
2401 TRACE("%p %lu\n", This, celt);
2402
2403 if (celt >= This->total) return S_FALSE;
2404
2405 This->pos += celt;
2406 return S_OK;
2407}
2408
2409static const IEnumRfc1766Vtbl IEnumRfc1766_vtbl =
2410{
2418};
2419
2421{
2422 RFC1766INFO *info;
2424};
2425
2427{
2428 struct enum_locales_data *data = (struct enum_locales_data *)lparam;
2429 RFC1766INFO *info;
2430
2431 TRACE("%s\n", debugstr_w(locale));
2432
2433 if (data->total >= data->allocated)
2434 {
2435 data->allocated *= 2;
2436 data->info = realloc(data->info, data->allocated * sizeof(RFC1766INFO));
2437 if (!data->info) return FALSE;
2438 }
2439
2440 info = &data->info[data->total];
2441
2442 info->lcid = LocaleNameToLCID( locale, 0 );
2443 if (info->lcid == LOCALE_CUSTOM_UNSPECIFIED) return TRUE;
2444
2445 info->wszRfc1766[0] = 0;
2446 if (FAILED( lcid_to_rfc1766W( info->lcid, info->wszRfc1766, MAX_RFC1766_NAME ))) return TRUE;
2447
2448 info->wszLocaleName[0] = 0;
2449 GetLocaleInfoW(info->lcid, LOCALE_SLANGUAGE, info->wszLocaleName, MAX_LOCALE_NAME);
2450 TRACE("ISO639: %s SLANGUAGE: %s\n", wine_dbgstr_w(info->wszRfc1766), wine_dbgstr_w(info->wszLocaleName));
2451
2452 data->total++;
2453
2454 return TRUE;
2455}
2456
2457static HRESULT EnumRfc1766_create(LANGID LangId, IEnumRfc1766 **ppEnum)
2458{
2459 EnumRfc1766_impl *rfc;
2460 struct enum_locales_data data;
2461
2462 TRACE("%04x, %p\n", LangId, ppEnum);
2463
2464 rfc = malloc(sizeof(EnumRfc1766_impl));
2466 rfc->ref = 1;
2467 rfc->pos = 0;
2468 rfc->total = 0;
2469
2470 data.total = 0;
2471 data.allocated = 160;
2472 data.info = malloc(data.allocated * sizeof(RFC1766INFO));
2473 if (!data.info)
2474 {
2475 free(rfc);
2476 return E_OUTOFMEMORY;
2477 }
2478
2480
2481 TRACE("enumerated %ld rfc1766 structures\n", data.total);
2482
2483 if (!data.total)
2484 {
2485 free(data.info);
2486 free(rfc);
2487 return E_FAIL;
2488 }
2489
2490 rfc->info = data.info;
2491 rfc->total = data.total;
2492
2493 *ppEnum = &rfc->IEnumRfc1766_iface;
2494 return S_OK;
2495}
2496
2498 IMultiLanguage *iface,
2499 IEnumRfc1766 **ppEnumRfc1766)
2500{
2502
2503 TRACE("%p %p\n", This, ppEnumRfc1766);
2504
2505 return EnumRfc1766_create(0, ppEnumRfc1766);
2506}
2507
2508/******************************************************************************/
2509
2511 IMultiLanguage* iface,
2512 LCID Locale,
2513 PRFC1766INFO pRfc1766Info)
2514{
2516
2517 TRACE("(%p, 0x%04lx, %p)\n", iface, Locale, pRfc1766Info);
2518
2519 if (!pRfc1766Info)
2520 return E_INVALIDARG;
2521
2522 if ((PRIMARYLANGID(Locale) == LANG_ENGLISH) ||
2523 (PRIMARYLANGID(Locale) == LANG_CHINESE) ||
2524 (PRIMARYLANGID(Locale) == LANG_ARABIC)) {
2525
2526 if (!SUBLANGID(Locale))
2527 type = LOCALE_SENGLANGUAGE; /* suppress country */
2528 }
2529 else
2530 {
2531 if (!SUBLANGID(Locale)) {
2532 TRACE("SUBLANGID missing in 0x%04lx\n", Locale);
2533 return E_FAIL;
2534 }
2535 }
2536
2537 pRfc1766Info->lcid = Locale;
2538 pRfc1766Info->wszRfc1766[0] = 0;
2539 pRfc1766Info->wszLocaleName[0] = 0;
2540
2541 if ((!lcid_to_rfc1766W(Locale, pRfc1766Info->wszRfc1766, MAX_RFC1766_NAME)) &&
2542 (GetLocaleInfoW(Locale, type, pRfc1766Info->wszLocaleName, MAX_LOCALE_NAME) > 0))
2543 return S_OK;
2544
2545 /* Locale not supported */
2546 return E_INVALIDARG;
2547}
2548
2550 IMultiLanguage* iface,
2551 UINT src_cp,
2552 UINT dst_cp,
2553 DWORD prop,
2554 IMLangConvertCharset** convert_charset)
2555{
2557 return IMultiLanguage3_CreateConvertCharset(&This->IMultiLanguage3_iface, src_cp, dst_cp, prop, convert_charset);
2558}
2559
2560static const IMultiLanguageVtbl IMultiLanguage_vtbl =
2561{
2580};
2581
2582
2583/******************************************************************************/
2584
2585static inline MLang_impl *impl_from_IMultiLanguage3( IMultiLanguage3 *iface )
2586{
2587 return CONTAINING_RECORD( iface, MLang_impl, IMultiLanguage3_iface );
2588}
2589
2591 IMultiLanguage3* iface,
2592 REFIID riid,
2593 void** obj)
2594{
2596
2597 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), obj);
2598
2599 if (IsEqualGUID(riid, &IID_IUnknown) ||
2600 IsEqualGUID(riid, &IID_IMultiLanguage))
2601 {
2602 *obj = &This->IMultiLanguage_iface;
2603 }
2604 else if (IsEqualGUID(riid, &IID_IMLangCodePages) ||
2605 IsEqualGUID(riid, &IID_IMLangFontLink))
2606 {
2607 *obj = &This->IMLangFontLink_iface;
2608 }
2609 else if (IsEqualGUID(riid, &IID_IMLangFontLink2))
2610 {
2611 *obj = &This->IMLangFontLink2_iface;
2612 }
2613 else if (IsEqualGUID(riid, &IID_IMultiLanguage2) ||
2614 IsEqualGUID(riid, &IID_IMultiLanguage3))
2615 {
2616 *obj = &This->IMultiLanguage3_iface;
2617 }
2618 else if (IsEqualGUID(riid, &IID_IMLangLineBreakConsole))
2619 {
2620 *obj = &This->IMLangLineBreakConsole_iface;
2621 }
2622 else
2623 {
2624 WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), obj);
2625 *obj = NULL;
2626 return E_NOINTERFACE;
2627 }
2628
2629 IMultiLanguage3_AddRef(iface);
2630 return S_OK;
2631}
2632
2633static ULONG WINAPI fnIMultiLanguage3_AddRef( IMultiLanguage3* iface )
2634{
2636 return InterlockedIncrement(&This->ref);
2637}
2638
2639static ULONG WINAPI fnIMultiLanguage3_Release( IMultiLanguage3* iface )
2640{
2643
2644 TRACE("(%p)->(%ld)\n", This, ref);
2645 if (ref == 0)
2646 {
2647 free(This);
2648 UnlockModule();
2649 }
2650
2651 return ref;
2652}
2653
2655 IMultiLanguage3* iface,
2656 UINT* pcCodePage)
2657{
2659
2660 TRACE("%p, %p\n", This, pcCodePage);
2661
2662 if (!pcCodePage) return E_INVALIDARG;
2663
2664 *pcCodePage = This->total_cp;
2665 return S_OK;
2666}
2667
2668static void fill_cp_info(const struct mlang_data *ml_data, UINT index, MIMECPINFO *mime_cp_info)
2669{
2670 CHARSETINFO csi;
2671
2674 mime_cp_info->bGDICharset = csi.ciCharset;
2675 else
2676 mime_cp_info->bGDICharset = DEFAULT_CHARSET;
2677
2678 mime_cp_info->dwFlags = ml_data->mime_cp_info[index].flags;
2679 mime_cp_info->uiCodePage = ml_data->mime_cp_info[index].cp;
2680 mime_cp_info->uiFamilyCodePage = ml_data->family_codepage;
2681 wcscpy( mime_cp_info->wszDescription, ml_data->mime_cp_info[index].description );
2682 wcscpy( mime_cp_info->wszWebCharset, ml_data->mime_cp_info[index].web_charset );
2683 wcscpy( mime_cp_info->wszHeaderCharset, ml_data->mime_cp_info[index].header_charset );
2684 wcscpy( mime_cp_info->wszBodyCharset, ml_data->mime_cp_info[index].body_charset );
2685 wcscpy( mime_cp_info->wszFixedWidthFont, ml_data->fixed_font );
2686 wcscpy( mime_cp_info->wszProportionalFont, ml_data->proportional_font );
2687
2688 TRACE("%08lx %u %u %s %s %s %s %s %s %d\n",
2689 mime_cp_info->dwFlags, mime_cp_info->uiCodePage,
2690 mime_cp_info->uiFamilyCodePage,
2691 wine_dbgstr_w(mime_cp_info->wszDescription),
2692 wine_dbgstr_w(mime_cp_info->wszWebCharset),
2693 wine_dbgstr_w(mime_cp_info->wszHeaderCharset),
2694 wine_dbgstr_w(mime_cp_info->wszBodyCharset),
2695 wine_dbgstr_w(mime_cp_info->wszFixedWidthFont),
2696 wine_dbgstr_w(mime_cp_info->wszProportionalFont),
2697 mime_cp_info->bGDICharset);
2698}
2699
2701 IMultiLanguage3* iface,
2702 UINT uiCodePage,
2703 LANGID LangId,
2704 PMIMECPINFO pCodePageInfo)
2705{
2706 UINT i, n;
2708
2709 TRACE("%p, %u, %04x, %p\n", This, uiCodePage, LangId, pCodePageInfo);
2710
2711 for (i = 0; i < ARRAY_SIZE(mlang_data); i++)
2712 {
2713 for (n = 0; n < mlang_data[i].number_of_cp; n++)
2714 {
2715 if (mlang_data[i].mime_cp_info[n].cp == uiCodePage)
2716 {
2717 fill_cp_info(&mlang_data[i], n, pCodePageInfo);
2718 return S_OK;
2719 }
2720 }
2721 }
2722
2723 return S_FALSE;
2724}
2725
2727 IMultiLanguage3* iface,
2728 UINT uiCodePage,
2729 UINT* puiFamilyCodePage)
2730{
2731 return GetFamilyCodePage(uiCodePage, puiFamilyCodePage);
2732}
2733
2735 IMultiLanguage3* iface,
2736 DWORD grfFlags,
2737 LANGID LangId,
2738 IEnumCodePage** ppEnumCodePage)
2739{
2741
2742 TRACE("%p %08lx %04x %p\n", This, grfFlags, LangId, ppEnumCodePage);
2743
2744 return EnumCodePage_create( This, grfFlags, LangId, ppEnumCodePage );
2745}
2746
2748 IMultiLanguage3* iface,
2749 BSTR Charset,
2750 PMIMECSETINFO pCharsetInfo)
2751{
2752 UINT i, n;
2754
2755 TRACE("%p %s %p\n", This, debugstr_w(Charset), pCharsetInfo);
2756
2757 if (!pCharsetInfo) return E_FAIL;
2758
2759 for (i = 0; i < ARRAY_SIZE(mlang_data); i++)
2760 {
2761 for (n = 0; n < mlang_data[i].number_of_cp; n++)
2762 {
2763 if (!lstrcmpiW(Charset, mlang_data[i].mime_cp_info[n].web_charset))
2764 {
2765 pCharsetInfo->uiCodePage = mlang_data[i].family_codepage;
2766 pCharsetInfo->uiInternetEncoding = mlang_data[i].mime_cp_info[n].cp;
2767 lstrcpyW(pCharsetInfo->wszCharset, mlang_data[i].mime_cp_info[n].web_charset);
2768 return S_OK;
2769 }
2770 if (mlang_data[i].mime_cp_info[n].alias && !lstrcmpiW(Charset, mlang_data[i].mime_cp_info[n].alias))
2771 {
2772 pCharsetInfo->uiCodePage = mlang_data[i].family_codepage;
2773 pCharsetInfo->uiInternetEncoding = mlang_data[i].mime_cp_info[n].cp;
2774 lstrcpyW(pCharsetInfo->wszCharset, mlang_data[i].mime_cp_info[n].alias);
2775 return S_OK;
2776 }
2777 }
2778 }
2779
2780 /* FIXME:
2781 * Since we do not support charsets like iso-2022-jp and do not have
2782 * them in our database as a primary (web_charset) encoding this loop
2783 * does an attempt to 'approximate' charset name by header_charset.
2784 */
2785 for (i = 0; i < ARRAY_SIZE(mlang_data); i++)
2786 {
2787 for (n = 0; n < mlang_data[i].number_of_cp; n++)
2788 {
2789 if (!lstrcmpiW(Charset, mlang_data[i].mime_cp_info[n].header_charset))
2790 {
2791 pCharsetInfo->uiCodePage = mlang_data[i].family_codepage;
2792 pCharsetInfo->uiInternetEncoding = mlang_data[i].mime_cp_info[n].cp;
2793 lstrcpyW(pCharsetInfo->wszCharset, mlang_data[i].mime_cp_info[n].header_charset);
2794 return S_OK;
2795 }
2796 }
2797 }
2798
2799 return E_FAIL;
2800}
2801
2803 IMultiLanguage3* iface,
2804 DWORD dwSrcEncoding,
2805 DWORD dwDstEncoding)
2806{
2807 return IsConvertINetStringAvailable(dwSrcEncoding, dwDstEncoding);
2808}
2809
2811 IMultiLanguage3* iface,
2812 DWORD* pdwMode,
2813 DWORD dwSrcEncoding,
2814 DWORD dwDstEncoding,
2815 BYTE* pSrcStr,
2816 UINT* pcSrcSize,
2817 BYTE* pDstStr,
2818 UINT* pcDstSize)
2819{
2820 return ConvertINetString(pdwMode, dwSrcEncoding, dwDstEncoding,
2821 (LPCSTR)pSrcStr, (LPINT)pcSrcSize, (LPSTR)pDstStr, (LPINT)pcDstSize);
2822}
2823
2825 IMultiLanguage3* iface,
2826 DWORD* pdwMode,
2827 DWORD dwEncoding,
2828 CHAR* pSrcStr,
2829 UINT* pcSrcSize,
2830 WCHAR* pDstStr,
2831 UINT* pcDstSize)
2832{
2833 return ConvertINetMultiByteToUnicode(pdwMode, dwEncoding,
2834 pSrcStr, (LPINT)pcSrcSize, pDstStr, (LPINT)pcDstSize);
2835}
2836
2838 IMultiLanguage3* iface,
2839 DWORD* pdwMode,
2840 DWORD dwEncoding,
2841 WCHAR* pSrcStr,
2842 UINT* pcSrcSize,
2843 CHAR* pDstStr,
2844 UINT* pcDstSize)
2845{
2846 return ConvertINetUnicodeToMultiByte(pdwMode, dwEncoding,
2847 pSrcStr, (LPINT)pcSrcSize, pDstStr, (LPINT)pcDstSize);
2848}
2849
2851 IMultiLanguage3* iface)
2852{
2853 FIXME("\n");
2854 return E_NOTIMPL;
2855}
2856
2858 IMultiLanguage3* iface,
2859 LCID lcid,
2860 BSTR* pbstrRfc1766)
2861{
2862 WCHAR buf[MAX_RFC1766_NAME];
2863
2864 TRACE("%p %04lx %p\n", iface, lcid, pbstrRfc1766);
2865 if (!pbstrRfc1766)
2866 return E_INVALIDARG;
2867
2868 if (!lcid_to_rfc1766W( lcid, buf, MAX_RFC1766_NAME ))
2869 {
2870 *pbstrRfc1766 = SysAllocString( buf );
2871 return S_OK;
2872 }
2873 return E_FAIL;
2874}
2875
2877 IMultiLanguage3* iface,
2878 LCID* pLocale,
2879 BSTR bstrRfc1766)
2880{
2881 HRESULT hr;
2882 IEnumRfc1766 *rfc1766;
2883
2884 TRACE("%p %p %s\n", iface, pLocale, debugstr_w(bstrRfc1766));
2885
2886 if (!pLocale || !bstrRfc1766)
2887 return E_INVALIDARG;
2888
2889 hr = IMultiLanguage3_EnumRfc1766(iface, 0, &rfc1766);
2890 if (FAILED(hr))
2891 return hr;
2892
2893 hr = lcid_from_rfc1766(rfc1766, pLocale, bstrRfc1766);
2894
2895 IEnumRfc1766_Release(rfc1766);
2896 return hr;
2897}
2898
2900 IMultiLanguage3* iface,
2901 LANGID LangId,
2902 IEnumRfc1766** ppEnumRfc1766)
2903{
2905
2906 TRACE("%p %p\n", This, ppEnumRfc1766);
2907
2908 return EnumRfc1766_create(LangId, ppEnumRfc1766);
2909}
2910
2912 IMultiLanguage3* iface,
2913 LCID Locale,
2914 LANGID LangId,
2915 PRFC1766INFO pRfc1766Info)
2916{
2917 static LANGID last_lang = -1;
2919
2920 TRACE("(%p, 0x%04lx, 0x%04x, %p)\n", iface, Locale, LangId, pRfc1766Info);
2921
2922 if (!pRfc1766Info)
2923 return E_INVALIDARG;
2924
2925 if ((PRIMARYLANGID(Locale) == LANG_ENGLISH) ||
2926 (PRIMARYLANGID(Locale) == LANG_CHINESE) ||
2927 (PRIMARYLANGID(Locale) == LANG_ARABIC)) {
2928
2929 if (!SUBLANGID(Locale))
2930 type = LOCALE_SENGLANGUAGE; /* suppress country */
2931 }
2932 else
2933 {
2934 if (!SUBLANGID(Locale)) {
2935 TRACE("SUBLANGID missing in 0x%04lx\n", Locale);
2936 return E_FAIL;
2937 }
2938 }
2939
2940 pRfc1766Info->lcid = Locale;
2941 pRfc1766Info->wszRfc1766[0] = 0;
2942 pRfc1766Info->wszLocaleName[0] = 0;
2943
2944 if ((PRIMARYLANGID(LangId) != LANG_ENGLISH) &&
2945 (last_lang != LangId)) {
2946 FIXME("Only English names supported (requested: 0x%04x)\n", LangId);
2947 last_lang = LangId;
2948 }
2949
2950 if ((!lcid_to_rfc1766W(Locale, pRfc1766Info->wszRfc1766, MAX_RFC1766_NAME)) &&
2951 (GetLocaleInfoW(Locale, type, pRfc1766Info->wszLocaleName, MAX_LOCALE_NAME) > 0))
2952 return S_OK;
2953
2954 /* Locale not supported */
2955 return E_INVALIDARG;
2956}
2957
2959 IMultiLanguage3* iface,
2960 UINT src_cp,
2961 UINT dst_cp,
2962 DWORD prop,
2963 IMLangConvertCharset** convert_charset)
2964{
2965 HRESULT hr;
2966
2967 TRACE("(%u %u 0x%08lx %p)\n", src_cp, dst_cp, prop, convert_charset);
2968
2970 if (FAILED(hr)) return hr;
2971
2972 return IMLangConvertCharset_Initialize(*convert_charset, src_cp, dst_cp, prop);
2973}
2974
2976 IMultiLanguage3* iface,
2977 DWORD* pdwMode,
2978 DWORD dwFlag,
2979 WCHAR* lpFallBack,
2980 DWORD dwSrcEncoding,
2981 DWORD dwDstEncoding,
2982 IStream* pstmIn,
2983 IStream* pstmOut)
2984{
2985 char *src, *dst = NULL;
2986 INT srclen, dstlen;
2987 STATSTG stat;
2988 HRESULT hr;
2989
2990 TRACE("%p %0lx8 %s %lu %lu %p %p\n",
2991 pdwMode, dwFlag, debugstr_w(lpFallBack), dwSrcEncoding, dwDstEncoding, pstmIn, pstmOut);
2992
2993 FIXME("dwFlag and lpFallBack not handled\n");
2994
2995 hr = IStream_Stat(pstmIn, &stat, STATFLAG_NONAME);
2996 if (FAILED(hr)) return hr;
2997
2998 if (stat.cbSize.QuadPart > MAXLONG) return E_INVALIDARG;
2999 if (!(src = malloc(stat.cbSize.QuadPart))) return E_OUTOFMEMORY;
3000
3001 hr = IStream_Read(pstmIn, src, stat.cbSize.QuadPart, (ULONG *)&srclen);
3002 if (FAILED(hr)) goto exit;
3003
3004 hr = ConvertINetString(pdwMode, dwSrcEncoding, dwDstEncoding, src, &srclen, NULL, &dstlen);
3005 if (FAILED(hr)) goto exit;
3006
3007 if (!(dst = malloc(dstlen)))
3008 {
3009 hr = E_OUTOFMEMORY;
3010 goto exit;
3011 }
3012 hr = ConvertINetString(pdwMode, dwSrcEncoding, dwDstEncoding, src, &srclen, dst, &dstlen);
3013 if (FAILED(hr)) goto exit;
3014
3015 hr = IStream_Write(pstmOut, dst, dstlen, NULL);
3016
3017exit:
3018 free(src);
3019 free(dst);
3020 return hr;
3021}
3022
3024 IMultiLanguage3* iface,
3025 DWORD* pdwMode,
3026 DWORD dwEncoding,
3027 CHAR* pSrcStr,
3028 UINT* pcSrcSize,
3029 WCHAR* pDstStr,
3030 UINT* pcDstSize,
3031 DWORD dwFlag,
3032 WCHAR* lpFallBack)
3033{
3034 if (dwFlag || lpFallBack)
3035 FIXME("Ignoring dwFlag (0x%lx/%ld) and lpFallBack (%p)\n",
3036 dwFlag, dwFlag, lpFallBack);
3037
3038 return ConvertINetMultiByteToUnicode(pdwMode, dwEncoding,
3039 pSrcStr, (LPINT)pcSrcSize, pDstStr, (LPINT)pcDstSize);
3040}
3041
3042/*****************************************************************************
3043 * MultiLanguage2::ConvertStringToUnicodeEx
3044 *
3045 * Translates the multibyte string from the specified code page to Unicode.
3046 *
3047 * PARAMS
3048 * see ConvertStringToUnicode
3049 * dwFlag
3050 * lpFallBack if dwFlag contains MLCONVCHARF_USEDEFCHAR, lpFallBack string used
3051 * instead unconvertible characters.
3052 *
3053 * RETURNS
3054 * S_OK Success.
3055 * S_FALSE The conversion is not supported.
3056 * E_FAIL Some error has occurred.
3057 *
3058 * TODO: handle dwFlag and lpFallBack
3059*/
3061 IMultiLanguage3* This,
3062 DWORD* pdwMode,
3063 DWORD dwEncoding,
3064 WCHAR* pSrcStr,
3065 UINT* pcSrcSize,
3066 CHAR* pDstStr,
3067 UINT* pcDstSize,
3068 DWORD dwFlag,
3069 WCHAR* lpFallBack)
3070{
3071 FIXME("\n");
3072 return ConvertINetUnicodeToMultiByte(pdwMode, dwEncoding,
3073 pSrcStr, (LPINT)pcSrcSize, pDstStr, (LPINT)pcDstSize);
3074}
3075
3077 IMultiLanguage3* iface,
3078 DWORD dwFlag,
3079 DWORD dwPrefWinCodePage,
3080 IStream* pstmIn,
3081 DetectEncodingInfo* lpEncoding,
3082 INT* pnScores)
3083{
3084 FIXME("\n");
3085 return E_NOTIMPL;
3086}
3087
3089 IMultiLanguage3* iface,
3090 DWORD dwFlag,
3091 DWORD dwPrefWinCodePage,
3092 CHAR* pSrcStr,
3093 INT* pcSrcSize,
3094 DetectEncodingInfo* lpEncoding,
3095 INT* pnScores)
3096{
3097 FIXME("\n");
3098 return E_NOTIMPL;
3099}
3100
3102 IMultiLanguage3* iface,
3103 UINT uiCodePage,
3104 HWND hwnd)
3105{
3106 return IMultiLanguage3_ValidateCodePageEx(iface,uiCodePage,hwnd,0);
3107}
3108
3110 IMultiLanguage3* iface,
3111 UINT uiCodePage,
3112 LCID lcid,
3113 LPWSTR lpWideCharStr,
3114 int cchWideChar)
3115{
3116 /* Find first instance */
3117 unsigned int i,n;
3118
3119 TRACE ("%u, %04lx, %p, %d\n", uiCodePage, lcid, lpWideCharStr, cchWideChar);
3120 for (i = 0; i < ARRAY_SIZE(mlang_data); i++)
3121 {
3122 for (n = 0; n < mlang_data[i].number_of_cp; n++)
3123 {
3124 if (mlang_data[i].mime_cp_info[n].cp == uiCodePage)
3125 {
3126 lstrcpynW( lpWideCharStr, mlang_data[i].mime_cp_info[n].description, cchWideChar);
3127 return S_OK;
3128 }
3129 }
3130 }
3131
3132 return S_FALSE;
3133}
3134
3136 IMultiLanguage3* iface,
3137 UINT uiCodePage)
3138{
3139 TRACE("%u\n", uiCodePage);
3140
3141 /* FIXME: the installable set is usually larger than the set of valid codepages */
3142 return IMultiLanguage3_ValidateCodePageEx(iface, uiCodePage, NULL, CPIOD_PEEK);
3143}
3144
3146 IMultiLanguage3* iface,
3147 MIMECONTF dwSource)
3148{
3149 FIXME("0x%08x\n", dwSource);
3150 return S_OK;
3151}
3152
3154 IMultiLanguage3* iface,
3155 UINT* pnScripts)
3156{
3158
3159 TRACE("%p %p\n", This, pnScripts);
3160
3161 if (!pnScripts) return S_FALSE;
3162
3163 *pnScripts = This->total_scripts;
3164 return S_OK;
3165}
3166
3168 IMultiLanguage3* iface,
3169 DWORD dwFlags,
3170 LANGID LangId,
3171 IEnumScript** ppEnumScript)
3172{
3174
3175 TRACE("%p %08lx %04x %p\n", This, dwFlags, LangId, ppEnumScript);
3176
3177 return EnumScript_create( This, dwFlags, LangId, ppEnumScript );
3178}
3179
3181 IMultiLanguage3* iface,
3182 UINT uiCodePage,
3183 HWND hwnd,
3184 DWORD dwfIODControl)
3185{
3186 unsigned int i;
3188
3189 TRACE("%p %u %p %08lx\n", This, uiCodePage, hwnd, dwfIODControl);
3190
3191 /* quick check for kernel32 supported code pages */
3192 if (IsValidCodePage(uiCodePage))
3193 return S_OK;
3194
3195 /* check for mlang supported code pages */
3196 for (i = 0; i < ARRAY_SIZE(mlang_data); i++)
3197 {
3198 UINT n;
3199 for (n = 0; n < mlang_data[i].number_of_cp; n++)
3200 {
3201 if (mlang_data[i].mime_cp_info[n].cp == uiCodePage)
3202 return S_OK;
3203 }
3204 }
3205
3206 if (dwfIODControl != CPIOD_PEEK)
3207 FIXME("Request to install codepage language pack not handled\n");
3208
3209 return S_FALSE;
3210}
3211
3213 IMultiLanguage3 *iface,
3214 DWORD dwFlags,
3215 LPCWSTR lpWideCharStr,
3216 UINT cchWideChar,
3217 UINT *puiPreferredCodePages,
3218 UINT nPreferredCodePages,
3219 UINT *puiDetectedCodePages,
3220 UINT *pnDetectedCodePages,
3221 WCHAR *lpSpecialChar)
3222{
3224
3225 FIXME("(%p)->(%08lx %s %p %u %p %p(%u) %s)\n", This, dwFlags, debugstr_w(lpWideCharStr),
3226 puiPreferredCodePages, nPreferredCodePages, puiDetectedCodePages,
3227 pnDetectedCodePages, pnDetectedCodePages ? *pnDetectedCodePages : 0,
3228 debugstr_w(lpSpecialChar));
3229
3230 if (!puiDetectedCodePages || !pnDetectedCodePages || !*pnDetectedCodePages)
3231 return E_INVALIDARG;
3232
3233 puiDetectedCodePages[0] = CP_UTF8;
3234 *pnDetectedCodePages = 1;
3235 return S_OK;
3236}
3237
3239 IMultiLanguage3 *iface,
3240 DWORD dwFlags,
3241 IStream *pStrIn,
3242 UINT *puiPreferredCodePages,
3243 UINT nPreferredCodePages,
3244 UINT *puiDetectedCodePages,
3245 UINT *pnDetectedCodePages,
3246 WCHAR *lpSpecialChar)
3247{
3249
3250 FIXME("(%p)->(%08lx %p %p %u %p %p(%u) %s)\n", This, dwFlags, pStrIn,
3251 puiPreferredCodePages, nPreferredCodePages, puiDetectedCodePages,
3252 pnDetectedCodePages, pnDetectedCodePages ? *pnDetectedCodePages : 0,
3253 debugstr_w(lpSpecialChar));
3254
3255 if (!puiDetectedCodePages || !pnDetectedCodePages || !*pnDetectedCodePages)
3256 return E_INVALIDARG;
3257
3258 puiDetectedCodePages[0] = CP_UTF8;
3259 *pnDetectedCodePages = 1;
3260 return S_OK;
3261}
3262
3263static const IMultiLanguage3Vtbl IMultiLanguage3_vtbl =
3264{
3297};
3298
3299/******************************************************************************/
3300
3301static inline MLang_impl *impl_from_IMLangFontLink2( IMLangFontLink2 *iface )
3302{
3303 return CONTAINING_RECORD( iface, MLang_impl, IMLangFontLink2_iface );
3304}
3305
3307 IMLangFontLink2 * iface,
3308 REFIID riid,
3309 void** ppvObject)
3310{
3312 return IMultiLanguage3_QueryInterface( &This->IMultiLanguage3_iface, riid, ppvObject );
3313}
3314
3315static ULONG WINAPI fnIMLangFontLink2_AddRef( IMLangFontLink2* iface )
3316{
3318 return IMultiLanguage3_AddRef( &This->IMultiLanguage3_iface );
3319}
3320
3321static ULONG WINAPI fnIMLangFontLink2_Release( IMLangFontLink2* iface )
3322{
3324 return IMultiLanguage3_Release( &This->IMultiLanguage3_iface );
3325}
3326
3328 WCHAR ch_src, DWORD *ret_codepages)
3329{
3331 unsigned int i;
3332
3333 TRACE("(%p)->(%s %p)\n", This, debugstr_wn(&ch_src, 1), ret_codepages);
3334
3335 *ret_codepages = 0;
3336
3337 for (i = 0; i < ARRAY_SIZE(mlang_data) - 1 /* skip unicode codepages */; i++)
3338 {
3339 BOOL used_dc;
3340 CHAR buf[2];
3341
3343 &ch_src, 1, buf, 2, NULL, &used_dc);
3344
3345 /* If default char is not used, current codepage include the given symbol */
3346 if (!used_dc)
3347 {
3349
3350 IMLangFontLink2_CodePageToCodePages(iface,
3351 mlang_data[i].family_codepage, &codepages);
3352 *ret_codepages |= codepages;
3353 }
3354 }
3355 return S_OK;
3356}
3357
3358static HRESULT WINAPI fnIMLangFontLink2_GetStrCodePages( IMLangFontLink2* iface,
3359 const WCHAR *src, LONG src_len, DWORD priority_cp,
3361{
3363 LONG i;
3364 DWORD cps = 0;
3365
3366 TRACE("(%p)->(%s:%ld %lx %p %p)\n", This, debugstr_wn(src, src_len), src_len, priority_cp,
3368
3369 if (codepages) *codepages = 0;
3370 if (ret_len) *ret_len = 0;
3371
3372 if (!src || !src_len || src_len < 0)
3373 return E_INVALIDARG;
3374
3375 for (i = 0; i < src_len; i++)
3376 {
3377 DWORD cp = 0;
3378 HRESULT ret;
3379
3380 ret = IMLangFontLink2_GetCharCodePages(iface, src[i], &cp);
3381 if (ret != S_OK) return E_FAIL;
3382
3383 if (!cps) cps = cp;
3384 else if ((cps & cp) != 0 &&
3385 !((priority_cp & cps) ^ (priority_cp & cp))) cps &= cp;
3386 else
3387 {
3388 i--;
3389 break;
3390 }
3391 }
3392
3393 if (codepages) *codepages = cps;
3394 if (ret_len) *ret_len = min( i + 1, src_len );
3395 return S_OK;
3396}
3397
3399 UINT codepage,
3401{
3404 BOOL rc;
3405
3406 TRACE("(%p)->(%u %p)\n", This, codepage, codepages);
3407
3409 if (rc)
3410 {
3411 *codepages = cs.fs.fsCsb[0];
3412 TRACE("resulting codepages 0x%lx\n", *codepages);
3413 return S_OK;
3414 }
3415
3416 TRACE("codepage not found\n");
3417 *codepages = 0;
3418 return E_FAIL;
3419}
3420
3422 DWORD codepages, UINT def_codepage, UINT *codepage)
3423{
3425 DWORD mask = 0;
3427 BOOL rc;
3428 UINT i;
3429
3430 TRACE("(%p)->(0x%lx %u %p)\n", This, codepages, def_codepage, codepage);
3431
3432 *codepage = 0;
3433
3434 rc = TranslateCharsetInfo((DWORD*)(DWORD_PTR)def_codepage, &cs, TCI_SRCCODEPAGE);
3435 if (rc && (codepages & cs.fs.fsCsb[0]))
3436 {
3437 TRACE("Found Default Codepage\n");
3438 *codepage = def_codepage;
3439 return S_OK;
3440 }
3441
3442 for (i = 0; i < 32; i++)
3443 {
3444 mask = 1 << i;
3445 if (codepages & mask)
3446 {
3447 DWORD Csb[2];
3448 Csb[0] = mask;
3449 Csb[1] = 0x0;
3451 if (!rc)
3452 continue;
3453
3454 TRACE("Falling back to least significant found CodePage %u\n",
3455 cs.ciACP);
3456 *codepage = cs.ciACP;
3457 return S_OK;
3458 }
3459 }
3460
3461 TRACE("no codepage found\n");
3462 return E_FAIL;
3463}
3464
3466 HDC hdc, HFONT hfont, DWORD *codepages)
3467{
3469 FONTSIGNATURE fontsig;
3470 HFONT old_font;
3471
3472 TRACE("(%p)->(%p %p %p)\n", This, hdc, hfont, codepages);
3473
3474 if (codepages) *codepages = 0;
3475
3476 old_font = SelectObject(hdc, hfont);
3477 if (!old_font) return E_FAIL;
3478 GetTextCharsetInfo(hdc, &fontsig, 0);
3479 SelectObject(hdc, old_font);
3480
3481 *codepages = fontsig.fsCsb[0];
3482 TRACE("ret 0x%lx\n", fontsig.fsCsb[0]);
3483
3484 return S_OK;
3485}
3486
3488 HFONT hFont)
3489{
3490 TRACE("(%p)->%p\n",This, hFont);
3491
3492 return release_font(hFont);
3493}
3494
3496{
3497 TRACE("(%p)\n",This);
3498
3499 return clear_font_cache();
3500}
3501
3503 HDC hDC, DWORD dwCodePages, WCHAR chSrc, HFONT *pFont)
3504{
3505 HFONT old_font;
3506
3507 TRACE("(%p)->%p %08lx %04x %p\n",This, hDC, dwCodePages, chSrc, pFont);
3508
3509 if (!hDC) return E_FAIL;
3510
3511 if (dwCodePages != 0)
3512 {
3513 old_font = GetCurrentObject(hDC, OBJ_FONT);
3514 return map_font(hDC, dwCodePages, old_font, pFont);
3515 }
3516 else
3517 {
3518 if (pFont == NULL) return E_INVALIDARG;
3519 FIXME("the situation where dwCodepages is set to zero is not implemented\n");
3520 return E_FAIL;
3521 }
3522}
3523
3525 HDC hDC, UINT *puiRanges, UNICODERANGE *pUranges)
3526{
3527 DWORD size;
3528 GLYPHSET *gs;
3529
3530 TRACE("(%p)->%p %p %p\n", This, hDC, puiRanges, pUranges);
3531
3532 if (!puiRanges) return E_INVALIDARG;
3533 if (!(size = GetFontUnicodeRanges(hDC, NULL))) return E_FAIL;
3534 if (!(gs = malloc(size))) return E_OUTOFMEMORY;
3535
3536 GetFontUnicodeRanges(hDC, gs);
3537 *puiRanges = gs->cRanges;
3538 if (pUranges)
3539 {
3540 UINT i;
3541 for (i = 0; i < gs->cRanges; i++)
3542 {
3543 if (i >= *puiRanges) break;
3544 pUranges[i].wcFrom = gs->ranges[i].wcLow;
3545 pUranges[i].wcTo = gs->ranges[i].wcLow + gs->ranges[i].cGlyphs;
3546 }
3547 *puiRanges = i;
3548 }
3549 free(gs);
3550 return S_OK;
3551}
3552
3554 SCRIPT_ID sid, DWORD dwFlags, UINT *puiFonts,
3555 SCRIPTFONTINFO *pScriptFont)
3556{
3557 UINT i, j;
3558
3559 TRACE("(%p)->%u %lx %p %p\n", This, sid, dwFlags, puiFonts, pScriptFont);
3560
3561 if (!dwFlags) dwFlags = SCRIPTCONTF_PROPORTIONAL_FONT;
3562
3563 for (i = 0, j = 0; i < ARRAY_SIZE(mlang_data); i++)
3564 {
3565 if (sid == mlang_data[i].sid)
3566 {
3567 if (pScriptFont)
3568 {
3569 if (j >= *puiFonts) break;
3570
3571 pScriptFont[j].scripts = (SCRIPT_IDS)1 << mlang_data[i].sid;
3572 if (dwFlags == SCRIPTCONTF_FIXED_FONT)
3573 wcscpy( pScriptFont[j].wszFont, mlang_data[i].fixed_font );
3574 else if (dwFlags == SCRIPTCONTF_PROPORTIONAL_FONT)
3575 wcscpy( pScriptFont[j].wszFont, mlang_data[i].proportional_font );
3576 }
3577 j++;
3578 }
3579 }
3580 *puiFonts = j;
3581 return S_OK;
3582}
3583
3585 UINT uiCodePage, SCRIPT_ID *pSid)
3586{
3587 UINT i;
3588
3589 TRACE("(%p)->%i %p\n", This, uiCodePage, pSid);
3590
3591 if (uiCodePage == CP_UNICODE) return E_FAIL;
3592
3593 for (i = 0; i < ARRAY_SIZE(mlang_data); i++)
3594 {
3595 if (uiCodePage == mlang_data[i].family_codepage)
3596 {
3597 if (pSid) *pSid = mlang_data[i].sid;
3598 return S_OK;
3599 }
3600 }
3601 return E_FAIL;
3602}
3603
3604static const IMLangFontLink2Vtbl IMLangFontLink2_vtbl =
3605{
3620};
3621
3622/******************************************************************************/
3623
3624static inline MLang_impl *impl_from_IMLangLineBreakConsole( IMLangLineBreakConsole *iface )
3625{
3626 return CONTAINING_RECORD( iface, MLang_impl, IMLangLineBreakConsole_iface );
3627}
3628
3630 IMLangLineBreakConsole* iface,
3631 REFIID riid,
3632 void** ppvObject)
3633{
3635 return IMultiLanguage3_QueryInterface( &This->IMultiLanguage3_iface, riid, ppvObject );
3636}
3637
3639 IMLangLineBreakConsole* iface )
3640{
3642 return IMultiLanguage3_AddRef( &This->IMultiLanguage3_iface );
3643}
3644
3646 IMLangLineBreakConsole* iface )
3647{
3649 return IMultiLanguage3_Release( &This->IMultiLanguage3_iface );
3650}
3651
3653 IMLangLineBreakConsole* iface,
3654 IMLangString* pSrcMLStr,
3655 LONG lSrcPos,
3656 LONG lSrcLen,
3657 LONG cMinColumns,
3658 LONG cMaxColumns,
3659 LONG* plLineLen,
3660 LONG* plSkipLen)
3661{
3662 FIXME("(%p)->%p %li %li %li %li %p %p\n", iface, pSrcMLStr, lSrcPos, lSrcLen, cMinColumns, cMaxColumns, plLineLen, plSkipLen);
3663 return E_NOTIMPL;
3664}
3665
3667 IMLangLineBreakConsole* iface,
3668 LCID locale,
3669 const WCHAR* pszSrc,
3670 LONG cchSrc,
3671 LONG cMaxColumns,
3672 LONG* pcchLine,
3673 LONG* pcchSkip )
3674{
3675 FIXME("(%p)->%li %s %li %li %p %p\n", iface, locale, debugstr_wn(pszSrc,cchSrc), cchSrc, cMaxColumns, pcchLine, pcchSkip);
3676
3677 *pcchLine = cchSrc;
3678 *pcchSkip = 0;
3679 return S_OK;
3680}
3681
3683 IMLangLineBreakConsole* iface,
3684 LCID locale,
3685 UINT uCodePage,
3686 const CHAR* pszSrc,
3687 LONG cchSrc,
3688 LONG cMaxColumns,
3689 LONG* pcchLine,
3690 LONG* pcchSkip)
3691{
3692 LONG i, line = cchSrc, skip = 0;
3693
3694 FIXME("(%p)->%li %i %s %li %li %p %p\n", iface, locale, uCodePage, debugstr_an(pszSrc,cchSrc), cchSrc, cMaxColumns, pcchLine, pcchSkip);
3695
3696 if (uCodePage == CP_USASCII && cchSrc > cMaxColumns)
3697 {
3698 for (line = cMaxColumns, i = cMaxColumns - 1; i >= 0; i--)
3699 {
3700 if (pszSrc[i] == ' ')
3701 {
3702 while (i >= 0 && pszSrc[i] == ' ')
3703 {
3704 i--;
3705 line--;
3706 skip++;
3707 }
3708 break;
3709 }
3710 }
3711 }
3712 *pcchLine = line;
3713 *pcchSkip = skip;
3714 return S_OK;
3715}
3716
3717static const IMLangLineBreakConsoleVtbl IMLangLineBreakConsole_vtbl =
3718{
3725};
3726
3728 IMLangConvertCharset IMLangConvertCharset_iface;
3730
3733};
3734
3735static inline struct convert_charset *impl_from_IMLangConvertCharset(IMLangConvertCharset *iface)
3736{
3738}
3739
3740static HRESULT WINAPI MLangConvertCharset_QueryInterface(IMLangConvertCharset *iface, REFIID riid, void **obj)
3741{
3743
3744 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), obj);
3745
3746 if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IMLangConvertCharset))
3747 {
3748 *obj = &This->IMLangConvertCharset_iface;
3749 IMLangConvertCharset_AddRef(iface);
3750 return S_OK;
3751 }
3752
3753 *obj = NULL;
3754 return E_NOINTERFACE;
3755}
3756
3757static ULONG WINAPI MLangConvertCharset_AddRef(IMLangConvertCharset *iface)
3758{
3761 TRACE("(%p)->(%lu)\n", This, ref);
3762 return ref;
3763}
3764
3765static ULONG WINAPI MLangConvertCharset_Release(IMLangConvertCharset *iface)
3766{
3769
3770 TRACE("(%p)->(%lu)\n", This, ref);
3771 if (!ref)
3772 {
3773 free(This);
3774 UnlockModule();
3775 }
3776
3777 return ref;
3778}
3779
3780static HRESULT WINAPI MLangConvertCharset_Initialize(IMLangConvertCharset *iface,
3781 UINT src_cp, UINT dst_cp, DWORD prop)
3782{
3784
3785 TRACE("(%p)->(%u %u 0x%08lx)\n", This, src_cp, dst_cp, prop);
3786
3787 prop &= ~MLCONVCHARF_USEDEFCHAR;
3788 if (prop)
3789 FIXME("property 0x%08lx not supported\n", prop);
3790
3791 This->src_cp = src_cp;
3792 This->dst_cp = dst_cp;
3793
3794 return S_OK;
3795}
3796
3798{
3800
3801 TRACE("(%p)->(%p)\n", This, src_cp);
3802
3803 if (!src_cp) return E_INVALIDARG;
3804 *src_cp = This->src_cp;
3805 return S_OK;
3806}
3807
3809{
3811
3812 TRACE("(%p)->(%p)\n", This, dst_cp);
3813
3814 if (!dst_cp) return E_INVALIDARG;
3815 *dst_cp = This->dst_cp;
3816 return S_OK;
3817}
3818
3819static HRESULT WINAPI MLangConvertCharset_GetProperty(IMLangConvertCharset *iface, DWORD *prop)
3820{
3822 FIXME("(%p)->(%p): stub\n", This, prop);
3823 return E_NOTIMPL;
3824}
3825
3826static HRESULT WINAPI MLangConvertCharset_DoConversion(IMLangConvertCharset *iface, BYTE *src,
3827 UINT *src_size, BYTE *dest, UINT *dest_size)
3828{
3830 FIXME("(%p)->(%p %p %p %p): stub\n", This, src, src_size, dest, dest_size);
3831 return E_NOTIMPL;
3832}
3833
3835 UINT *src_size, WCHAR *dest, UINT *dest_size)
3836{
3838 TRACE("(%p)->(%p %p %p %p)\n", This, src, src_size, dest, dest_size);
3839 return ConvertINetMultiByteToUnicode(NULL, This->src_cp, src, (INT*)src_size, dest, (INT*)dest_size);
3840}
3841
3843 WCHAR *src, UINT *src_size, CHAR *dest, UINT *dest_size)
3844{
3846 TRACE("(%p)->(%p %p %p %p)\n", This, src, src_size, dest, dest_size);
3847 return ConvertINetUnicodeToMultiByte(NULL, This->dst_cp, src, (INT*)src_size, dest, (INT*)dest_size);
3848}
3849
3850static const IMLangConvertCharsetVtbl MLangConvertCharsetVtbl =
3851{
3862};
3863
3865{
3867 UINT i;
3868
3869 TRACE("Creating MultiLanguage object\n");
3870
3871 if( pUnkOuter )
3872 return CLASS_E_NOAGGREGATION;
3873
3874 mlang = malloc(sizeof(MLang_impl));
3875 mlang->IMLangFontLink_iface.lpVtbl = &IMLangFontLink_vtbl;
3876 mlang->IMultiLanguage_iface.lpVtbl = &IMultiLanguage_vtbl;
3877 mlang->IMultiLanguage3_iface.lpVtbl = &IMultiLanguage3_vtbl;
3878 mlang->IMLangFontLink2_iface.lpVtbl = &IMLangFontLink2_vtbl;
3879 mlang->IMLangLineBreakConsole_iface.lpVtbl = &IMLangLineBreakConsole_vtbl;
3880
3881 mlang->total_cp = 0;
3882 for (i = 0; i < ARRAY_SIZE(mlang_data); i++)
3883 mlang->total_cp += mlang_data[i].number_of_cp;
3884
3885 /* do not enumerate unicode flavours */
3886 mlang->total_scripts = ARRAY_SIZE(mlang_data) - 1;
3887
3888 mlang->ref = 1;
3889 *ppObj = &mlang->IMultiLanguage_iface;
3890 TRACE("returning %p\n", mlang);
3891
3892 LockModule();
3893
3894 return S_OK;
3895}
3896
3898{
3899 struct convert_charset *convert;
3900
3901 if (outer)
3902 return CLASS_E_NOAGGREGATION;
3903
3904 *obj = NULL;
3905
3906 convert = malloc(sizeof(struct convert_charset));
3907 if (!convert) return E_OUTOFMEMORY;
3908
3909 convert->IMLangConvertCharset_iface.lpVtbl = &MLangConvertCharsetVtbl;
3910 convert->ref = 1;
3911
3912 *obj = &convert->IMLangConvertCharset_iface;
3913
3914 LockModule();
3915
3916 return S_OK;
3917}
3918
3919/******************************************************************************/
3920
3922{
3923 return dll_count == 0 ? S_OK : S_FALSE;
3924}
3925
3927{
3929}
3930
3932{
3933 TRACE("%p\n", obj);
3934
3935 if (!obj) return E_INVALIDARG;
3936
3938 {
3939 ERR("Failed to create global font link object.\n");
3940 return E_FAIL;
3941 }
3942
3943 return IUnknown_QueryInterface(font_link_global, &IID_IMLangFontLink, (void**)obj);
3944}
static HDC hDC
Definition: 3dtext.c:33
BOOL WINAPI EnumSystemLocalesEx(LOCALE_ENUMPROCEX proc, DWORD flags, LPARAM lparam, LPVOID reserved)
static HFONT hfont
@ lparam
Definition: SystemMenu.c:31
#define stat
Definition: acwin.h:99
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define skip(...)
Definition: atltest.h:64
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
const WCHAR * alias
Definition: main.c:67
#define index(s, c)
Definition: various.h:29
HFONT hFont
Definition: main.c:53
#define ARRAY_SIZE(A)
Definition: main.h:20
static void list_remove(struct list_entry *entry)
Definition: list.h:90
static void list_add_tail(struct list_entry *head, struct list_entry *entry)
Definition: list.h:83
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
const GUID IID_IUnknown
const GUID IID_IClassFactory
FT_UInt sid
Definition: cffcmap.c:138
CFF_Charset charset
Definition: cffcmap.c:137
Definition: list.h:37
Definition: _locale.h:75
static const WCHAR szClassName[]
Definition: clipbrd.c:11
LPARAM lParam
Definition: combotst.c:139
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define realloc
Definition: debug_ros.c:6
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
HRESULT hr
Definition: delayimp.cpp:573
static LPVOID LPUNKNOWN
Definition: dinput.c:53
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define CP_ACP
Definition: compat.h:109
static __inline const char * debugstr_an(const char *s, int n)
Definition: compat.h:55
OLECHAR * BSTR
Definition: compat.h:2293
#define CALLBACK
Definition: compat.h:35
#define lstrcpyW
Definition: compat.h:749
#define WideCharToMultiByte
Definition: compat.h:111
#define MultiByteToWideChar
Definition: compat.h:110
#define wcsicmp
Definition: compat.h:15
#define lstrcpynW
Definition: compat.h:738
#define lstrlenW
Definition: compat.h:750
BOOL WINAPI InitOnceExecuteOnce(_Inout_ PINIT_ONCE InitOnce, _In_ __callback PINIT_ONCE_FN InitFn, _Inout_opt_ PVOID Parameter, _Outptr_opt_result_maybenull_ LPVOID *Context)
Definition: InitOnce.c:12
LCID WINAPI LocaleNameToLCID(_In_ LPCWSTR lpName, _In_ DWORD dwFlags)
INT WINAPI LCMapStringA(LCID lcid, DWORD flags, LPCSTR src, INT srclen, LPSTR dst, INT dstlen)
Definition: locale.c:3834
BOOL WINAPI IsValidCodePage(UINT codepage)
Definition: locale.c:2081
INT WINAPI GetLocaleInfoA(LCID lcid, LCTYPE lctype, LPSTR buffer, INT len)
Definition: locale.c:1609
int WINAPI lstrcmpiW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4171
INT WINAPI LCMapStringW(LCID lcid, DWORD flags, LPCWSTR src, INT srclen, LPWSTR dst, INT dstlen)
Definition: locale.c:3808
INT WINAPI GetLocaleInfoW(LCID lcid, LCTYPE lctype, LPWSTR buffer, INT len)
Definition: locale.c:1675
LCID lcid
Definition: locale.c:5656
static CPTABLEINFO codepages[128]
Definition: locale.c:318
static int exit_shift(LPSTR out, int c)
Definition: mlang.c:717
static const IMLangFontLink2Vtbl IMLangFontLink2_vtbl
Definition: mlang.c:3604
static HRESULT WINAPI fnIMultiLanguage_IsConvertible(IMultiLanguage *iface, DWORD src_enc, DWORD dst_enc)
Definition: mlang.c:2202
static HRESULT WINAPI fnIMultiLanguage_GetRfc1766FromLcid(IMultiLanguage *iface, LCID lcid, BSTR *pbstrRfc1766)
Definition: mlang.c:2261
static HRESULT WINAPI fnIEnumRfc1766_Skip(IEnumRfc1766 *iface, ULONG celt)
Definition: mlang.c:2395
static HRESULT map_font(HDC hdc, DWORD codepages, HFONT src_font, HFONT *dst_font)
Definition: mlang.c:1350
static HRESULT MLangConvertCharset_create(IUnknown *outer, void **obj)
Definition: mlang.c:3897
static IUnknown * font_link_global
Definition: mlang.c:48
static HRESULT WINAPI fnIMultiLanguage3_SetMimeDBSource(IMultiLanguage3 *iface, MIMECONTF dwSource)
Definition: mlang.c:3145
static HRESULT WINAPI fnIMultiLanguage3_ConvertStringReset(IMultiLanguage3 *iface)
Definition: mlang.c:2850
static const IClassFactoryVtbl MLANGCF_Vtbl
Definition: mlang.c:1558
static HRESULT WINAPI fnIEnumCodePage_Next(IEnumCodePage *iface, ULONG celt, PMIMECPINFO rgelt, ULONG *pceltFetched)
Definition: mlang.c:1694
#define ISMARU(A)
Definition: mlang.c:556
static const MIME_CP_INFO thai_cp[]
Definition: mlang.c:347
static HRESULT GetFamilyCodePage(UINT uiCodePage, UINT *puiFamilyCodePage)
Definition: mlang.c:1136
static HRESULT WINAPI fnIMultiLanguage_GetCharsetInfo(IMultiLanguage *iface, BSTR Charset, PMIMECSETINFO pCharsetInfo)
Definition: mlang.c:2193
static HRESULT WINAPI fnIMLangFontLink_MapFont(IMLangFontLink *iface, HDC hDC, DWORD dwCodePages, HFONT hSrcFont, HFONT *phDestFont)
Definition: mlang.c:2065
static HRESULT WINAPI MLangConvertCharset_QueryInterface(IMLangConvertCharset *iface, REFIID riid, void **obj)
Definition: mlang.c:3740
#define SJIS2(A)
Definition: mlang.c:555
static HRESULT WINAPI fnIMLangFontLink2_CodePageToScriptID(IMLangFontLink2 *This, UINT uiCodePage, SCRIPT_ID *pSid)
Definition: mlang.c:3584
static const IEnumCodePageVtbl IEnumCodePage_vtbl
Definition: mlang.c:1760
static const struct object_creation_info object_creation[]
Definition: mlang.c:1486
#define NOTEUC(A, B)
Definition: mlang.c:553
static ULONG WINAPI fnIEnumCodePage_Release(IEnumCodePage *iface)
Definition: mlang.c:1668
static MLang_impl * impl_from_IMLangFontLink(IMLangFontLink *iface)
Definition: mlang.c:1985
static ULONG WINAPI fnIEnumScript_AddRef(IEnumScript *iface)
Definition: mlang.c:1853
static HRESULT WINAPI fnIMultiLanguage3_ConvertStringInIStream(IMultiLanguage3 *iface, DWORD *pdwMode, DWORD dwFlag, WCHAR *lpFallBack, DWORD dwSrcEncoding, DWORD dwDstEncoding, IStream *pstmIn, IStream *pstmOut)
Definition: mlang.c:2975
static HRESULT WINAPI fnIMultiLanguage3_QueryInterface(IMultiLanguage3 *iface, REFIID riid, void **obj)
Definition: mlang.c:2590
struct tagEnumCodePage_impl EnumCodePage_impl
static HRESULT WINAPI fnIMultiLanguage3_ConvertStringFromUnicodeEx(IMultiLanguage3 *This, DWORD *pdwMode, DWORD dwEncoding, WCHAR *pSrcStr, UINT *pcSrcSize, CHAR *pDstStr, UINT *pcDstSize, DWORD dwFlag, WCHAR *lpFallBack)
Definition: mlang.c:3060
static CRITICAL_SECTION_DEBUG font_cache_critical_debug
Definition: mlang.c:535
static HRESULT WINAPI fnIEnumRfc1766_QueryInterface(IEnumRfc1766 *iface, REFIID riid, void **ppvObject)
Definition: mlang.c:2294
static ULONG WINAPI fnIMLangFontLink2_AddRef(IMLangFontLink2 *iface)
Definition: mlang.c:3315
static HRESULT WINAPI fnIMultiLanguage_GetRfc1766Info(IMultiLanguage *iface, LCID Locale, PRFC1766INFO pRfc1766Info)
Definition: mlang.c:2510
static HRESULT WINAPI fnIMLangFontLink2_QueryInterface(IMLangFontLink2 *iface, REFIID riid, void **ppvObject)
Definition: mlang.c:3306
static HRESULT WINAPI fnIMultiLanguage3_GetNumberOfScripts(IMultiLanguage3 *iface, UINT *pnScripts)
Definition: mlang.c:3153
static ULONG WINAPI fnIEnumCodePage_AddRef(IEnumCodePage *iface)
Definition: mlang.c:1661
static HRESULT WINAPI MLangConvertCharset_GetProperty(IMLangConvertCharset *iface, DWORD *prop)
Definition: mlang.c:3819
static HRESULT release_font(HFONT font)
Definition: mlang.c:1425
static HRESULT WINAPI fnIMultiLanguage3_EnumRfc1766(IMultiLanguage3 *iface, LANGID LangId, IEnumRfc1766 **ppEnumRfc1766)
Definition: mlang.c:2899
#define ISNIGORI(A)
Definition: mlang.c:557
static int enter_shift(LPSTR out, int c)
Definition: mlang.c:728
static HRESULT WINAPI fnIMLangFontLink2_ResetFontMapping(IMLangFontLink2 *This)
Definition: mlang.c:3495
static HRESULT lcid_from_rfc1766(IEnumRfc1766 *iface, LCID *lcid, LPCWSTR rfc1766)
Definition: mlang.c:1259
static HRESULT EnumScript_create(MLang_impl *mlang, DWORD dwFlags, LANGID LangId, IEnumScript **ppEnumScript)
Definition: mlang.c:1948
static HRESULT WINAPI fnIMultiLanguage3_ValidateCodePage(IMultiLanguage3 *iface, UINT uiCodePage, HWND hwnd)
Definition: mlang.c:3101
static HRESULT WINAPI fnIMultiLanguage3_DetectInputCodepage(IMultiLanguage3 *iface, DWORD dwFlag, DWORD dwPrefWinCodePage, CHAR *pSrcStr, INT *pcSrcSize, DetectEncodingInfo *lpEncoding, INT *pnScores)
Definition: mlang.c:3088
static void fill_cp_info(const struct mlang_data *ml_data, UINT index, MIMECPINFO *mime_cp_info)
Definition: mlang.c:2668
static HRESULT WINAPI MLangConvertCharset_DoConversion(IMLangConvertCharset *iface, BYTE *src, UINT *src_size, BYTE *dest, UINT *dest_size)
Definition: mlang.c:3826
static const MIME_CP_INFO arabic_cp[]
Definition: mlang.c:73
static HRESULT WINAPI fnIMLangFontLink2_GetCharCodePages(IMLangFontLink2 *iface, WCHAR ch_src, DWORD *ret_codepages)
Definition: mlang.c:3327
#define SJIS1(A)
Definition: mlang.c:554
static HRESULT WINAPI fnIMultiLanguage_GetFamilyCodePage(IMultiLanguage *iface, UINT cp, UINT *family_cp)
Definition: mlang.c:2172
static EnumRfc1766_impl * impl_from_IEnumRfc1766(IEnumRfc1766 *iface)
Definition: mlang.c:2289
static UINT ConvertUnknownJapaneseToUnicode(LPCSTR input, DWORD count, LPWSTR output, DWORD out_count)
Definition: mlang.c:851
static HRESULT WINAPI fnIMultiLanguage3_GetCodePageDescription(IMultiLanguage3 *iface, UINT uiCodePage, LCID lcid, LPWSTR lpWideCharStr, int cchWideChar)
Definition: mlang.c:3109
static MLang_impl * impl_from_IMultiLanguage3(IMultiLanguage3 *iface)
Definition: mlang.c:2585
static HRESULT WINAPI fnIMultiLanguage_CreateConvertCharset(IMultiLanguage *iface, UINT src_cp, UINT dst_cp, DWORD prop, IMLangConvertCharset **convert_charset)
Definition: mlang.c:2549
static HRESULT WINAPI fnIMultiLanguage_ConvertStringFromUnicode(IMultiLanguage *iface, DWORD *mode, DWORD encoding, WCHAR *src, UINT *src_size, CHAR *dest, UINT *dest_size)
Definition: mlang.c:2240
static int han2zen(unsigned char *p1, unsigned char *p2)
Definition: mlang.c:627
static const IEnumRfc1766Vtbl IEnumRfc1766_vtbl
Definition: mlang.c:2409
static HRESULT EnumCodePage_create(MLang_impl *mlang, DWORD grfFlags, LANGID LangId, IEnumCodePage **ppEnumCodePage)
Definition: mlang.c:1771
static HRESULT WINAPI fnIMLangFontLink2_CodePagesToCodePage(IMLangFontLink2 *iface, DWORD codepages, UINT def_codepage, UINT *codepage)
Definition: mlang.c:3421
static HRESULT WINAPI fnIMLangFontLink_GetCharCodePages(IMLangFontLink *iface, WCHAR ch_src, DWORD *codepages)
Definition: mlang.c:2013
static HRESULT WINAPI fnIEnumCodePage_Clone(IEnumCodePage *iface, IEnumCodePage **ppEnum)
Definition: mlang.c:1685
static HRESULT WINAPI fnIMLangFontLink_CodePageToCodePages(IMLangFontLink *iface, UINT codepage, DWORD *codepages)
Definition: mlang.c:2035
static EnumCodePage_impl * impl_from_IEnumCodePage(IEnumCodePage *iface)
Definition: mlang.c:1634
static struct convert_charset * impl_from_IMLangConvertCharset(IMLangConvertCharset *iface)
Definition: mlang.c:3735
static HRESULT WINAPI fnIMultiLanguage3_IsConvertible(IMultiLanguage3 *iface, DWORD dwSrcEncoding, DWORD dwDstEncoding)
Definition: mlang.c:2802
static HRESULT WINAPI fnIMultiLanguage3_ConvertString(IMultiLanguage3 *iface, DWORD *pdwMode, DWORD dwSrcEncoding, DWORD dwDstEncoding, BYTE *pSrcStr, UINT *pcSrcSize, BYTE *pDstStr, UINT *pcDstSize)
Definition: mlang.c:2810
static ULONG WINAPI fnIMLangFontLink_Release(IMLangFontLink *iface)
Definition: mlang.c:2006
static HRESULT WINAPI fnIMLangLineBreakConsole_QueryInterface(IMLangLineBreakConsole *iface, REFIID riid, void **ppvObject)
Definition: mlang.c:3629
#define HANKATA(A)
Definition: mlang.c:551
static HRESULT WINAPI fnIMultiLanguage_ConvertStringToUnicode(IMultiLanguage *iface, DWORD *mode, DWORD src_enc, CHAR *src, UINT *src_size, WCHAR *dest, UINT *dest_size)
Definition: mlang.c:2226
static HRESULT WINAPI fnIMLangFontLink_ResetFontMapping(IMLangFontLink *iface)
Definition: mlang.c:2086
static struct list font_cache
Definition: mlang.c:533
static MLang_impl * impl_from_IMLangFontLink2(IMLangFontLink2 *iface)
Definition: mlang.c:3301
static HRESULT WINAPI fnIMultiLanguage_GetCodePageInfo(IMultiLanguage *iface, UINT uiCodePage, PMIMECPINFO pCodePageInfo)
Definition: mlang.c:2147
static HRESULT WINAPI MLANGCF_LockServer(IClassFactory *iface, BOOL dolock)
Definition: mlang.c:1548
static HRESULT WINAPI fnIMultiLanguage_GetNumberOfCodePageInfo(IMultiLanguage *iface, UINT *cp)
Definition: mlang.c:2138
static const IMLangConvertCharsetVtbl MLangConvertCharsetVtbl
Definition: mlang.c:3850
static MLang_impl * impl_from_IMLangLineBreakConsole(IMLangLineBreakConsole *iface)
Definition: mlang.c:3624
static UINT DetectJapaneseCode(LPCSTR input, DWORD count)
Definition: mlang.c:559
static HRESULT WINAPI fnIMLangLineBreakConsole_BreakLineW(IMLangLineBreakConsole *iface, LCID locale, const WCHAR *pszSrc, LONG cchSrc, LONG cMaxColumns, LONG *pcchLine, LONG *pcchSkip)
Definition: mlang.c:3666
static HRESULT lcid_to_rfc1766W(LCID lcid, LPWSTR rfc1766, INT len)
Definition: mlang.c:1208
static const MIME_CP_INFO baltic_cp[]
Definition: mlang.c:95
static HRESULT WINAPI fnIMultiLanguage_QueryInterface(IMultiLanguage *iface, REFIID riid, void **obj)
Definition: mlang.c:2117
static UINT ConvertJapaneseUnicodeToJIS(LPCWSTR input, DWORD count, LPSTR output, DWORD out_count)
Definition: mlang.c:899
static CRITICAL_SECTION font_cache_critical
Definition: mlang.c:534
static HRESULT WINAPI fnIEnumScript_Next(IEnumScript *iface, ULONG celt, PSCRIPTINFO rgelt, ULONG *pceltFetched)
Definition: mlang.c:1886
static const MIME_CP_INFO chinese_traditional_cp[]
Definition: mlang.c:153
static HRESULT WINAPI fnIMultiLanguage_GetLcidFromRfc1766(IMultiLanguage *iface, LCID *locale, BSTR rfc1766)
Definition: mlang.c:2270
static BOOL WINAPI allocate_font_link_cb(PINIT_ONCE init_once, PVOID args, PVOID *context)
Definition: mlang.c:3926
static UINT ConvertSJIS2JIS(LPCSTR input, DWORD count, LPSTR output)
Definition: mlang.c:740
static const MIME_CP_INFO japanese_cp[]
Definition: mlang.c:295
static HRESULT WINAPI fnIEnumScript_Reset(IEnumScript *iface)
Definition: mlang.c:1912
static HRESULT WINAPI fnIEnumCodePage_QueryInterface(IEnumCodePage *iface, REFIID riid, void **ppvObject)
Definition: mlang.c:1639
static ULONG WINAPI fnIMLangFontLink2_Release(IMLangFontLink2 *iface)
Definition: mlang.c:3321
static ULONG WINAPI fnIEnumScript_Release(IEnumScript *iface)
Definition: mlang.c:1860
static const MIME_CP_INFO cyrillic_cp[]
Definition: mlang.c:194
static const MIME_CP_INFO western_cp[]
Definition: mlang.c:395
static void UnlockModule(void)
Definition: mlang.c:929
HRESULT WINAPI LcidToRfc1766W(LCID lcid, LPWSTR pszRfc1766, INT nChar)
Definition: mlang.c:1247
static HRESULT WINAPI fnIMLangFontLink2_MapFont(IMLangFontLink2 *This, HDC hDC, DWORD dwCodePages, WCHAR chSrc, HFONT *pFont)
Definition: mlang.c:3502
static ULONG WINAPI fnIMLangLineBreakConsole_AddRef(IMLangLineBreakConsole *iface)
Definition: mlang.c:3638
static ULONG WINAPI fnIEnumRfc1766_AddRef(IEnumRfc1766 *iface)
Definition: mlang.c:2316
static HRESULT WINAPI fnIMultiLanguage3_CreateConvertCharset(IMultiLanguage3 *iface, UINT src_cp, UINT dst_cp, DWORD prop, IMLangConvertCharset **convert_charset)
Definition: mlang.c:2958
static HRESULT WINAPI fnIMultiLanguage3_EnumCodePages(IMultiLanguage3 *iface, DWORD grfFlags, LANGID LangId, IEnumCodePage **ppEnumCodePage)
Definition: mlang.c:2734
static HRESULT WINAPI fnIEnumScript_QueryInterface(IEnumScript *iface, REFIID riid, void **ppvObject)
Definition: mlang.c:1831
HRESULT WINAPI GetGlobalFontLinkObject(IMLangFontLink **obj)
Definition: mlang.c:3931
static UINT ConvertJIS2SJIS(LPCSTR input, DWORD count, LPSTR output)
Definition: mlang.c:672
struct tagMLang_impl MLang_impl
static HRESULT WINAPI fnIMultiLanguage3_EnumScripts(IMultiLanguage3 *iface, DWORD dwFlags, LANGID LangId, IEnumScript **ppEnumScript)
Definition: mlang.c:3167
static ULONG WINAPI fnIEnumRfc1766_Release(IEnumRfc1766 *iface)
Definition: mlang.c:2323
#define ISEUC(A)
Definition: mlang.c:552
static const MIME_CP_INFO chinese_simplified_cp[]
Definition: mlang.c:118
static const MIME_CP_INFO turkish_cp[]
Definition: mlang.c:353
static HRESULT WINAPI fnIMultiLanguage3_GetLcidFromRfc1766(IMultiLanguage3 *iface, LCID *pLocale, BSTR bstrRfc1766)
Definition: mlang.c:2876
static const MIME_CP_INFO greek_cp[]
Definition: mlang.c:239
static HRESULT WINAPI fnIMLangFontLink_GetFontCodePages(IMLangFontLink *iface, HDC hdc, HFONT hfont, DWORD *codepages)
Definition: mlang.c:2055
static HRESULT WINAPI fnIMLangFontLink2_GetFontUnicodeRanges(IMLangFontLink2 *This, HDC hDC, UINT *puiRanges, UNICODERANGE *pUranges)
Definition: mlang.c:3524
static HRESULT WINAPI fnIMultiLanguage3_GetRfc1766FromLcid(IMultiLanguage3 *iface, LCID lcid, BSTR *pbstrRfc1766)
Definition: mlang.c:2857
static HRESULT WINAPI fnIMultiLanguage_EnumRfc1766(IMultiLanguage *iface, IEnumRfc1766 **ppEnumRfc1766)
Definition: mlang.c:2497
static const IMultiLanguage3Vtbl IMultiLanguage3_vtbl
Definition: mlang.c:3263
static HRESULT WINAPI fnIMLangFontLink2_GetStrCodePages(IMLangFontLink2 *iface, const WCHAR *src, LONG src_len, DWORD priority_cp, DWORD *codepages, LONG *ret_len)
Definition: mlang.c:3358
static const IEnumScriptVtbl IEnumScript_vtbl
Definition: mlang.c:1937
static HRESULT WINAPI fnIMLangFontLink2_CodePageToCodePages(IMLangFontLink2 *iface, UINT codepage, DWORD *codepages)
Definition: mlang.c:3398
HRESULT WINAPI Rfc1766ToLcidW(LCID *pLocale, LPCWSTR pszRfc1766)
Definition: mlang.c:1281
static UINT ConvertJISJapaneseToUnicode(LPCSTR input, DWORD count, LPWSTR output, DWORD out_count)
Definition: mlang.c:831
static HRESULT WINAPI fnIEnumRfc1766_Next(IEnumRfc1766 *iface, ULONG celt, PRFC1766INFO rgelt, ULONG *pceltFetched)
Definition: mlang.c:2349
static HRESULT WINAPI fnIMultiLanguage3_ConvertStringFromUnicode(IMultiLanguage3 *iface, DWORD *pdwMode, DWORD dwEncoding, WCHAR *pSrcStr, UINT *pcSrcSize, CHAR *pDstStr, UINT *pcDstSize)
Definition: mlang.c:2837
struct tagEnumRfc1766_impl EnumRfc1766_impl
static HRESULT WINAPI fnIMultiLanguage3_ConvertStringToUnicodeEx(IMultiLanguage3 *iface, DWORD *pdwMode, DWORD dwEncoding, CHAR *pSrcStr, UINT *pcSrcSize, WCHAR *pDstStr, UINT *pcDstSize, DWORD dwFlag, WCHAR *lpFallBack)
Definition: mlang.c:3023
static const IMLangFontLinkVtbl IMLangFontLink_vtbl
Definition: mlang.c:2095
static MLang_impl * impl_from_IMultiLanguage(IMultiLanguage *iface)
Definition: mlang.c:2112
static HRESULT WINAPI fnIMLangFontLink_CodePagesToCodePage(IMLangFontLink *iface, DWORD codepages, UINT def_codepage, UINT *codepage)
Definition: mlang.c:2044
static HRESULT WINAPI fnIEnumRfc1766_Clone(IEnumRfc1766 *iface, IEnumRfc1766 **ppEnum)
Definition: mlang.c:2339
static ULONG WINAPI MLANGCF_Release(IClassFactory *iface)
Definition: mlang.c:1515
static HRESULT WINAPI fnIMLangLineBreakConsole_BreakLineML(IMLangLineBreakConsole *iface, IMLangString *pSrcMLStr, LONG lSrcPos, LONG lSrcLen, LONG cMinColumns, LONG cMaxColumns, LONG *plLineLen, LONG *plSkipLen)
Definition: mlang.c:3652
static HRESULT WINAPI MLangConvertCharset_DoConversionFromUnicode(IMLangConvertCharset *iface, WCHAR *src, UINT *src_size, CHAR *dest, UINT *dest_size)
Definition: mlang.c:3842
static HRESULT WINAPI MLANGCF_QueryInterface(IClassFactory *iface, REFIID riid, void **ppobj)
Definition: mlang.c:1492
static HRESULT WINAPI MLANGCF_CreateInstance(IClassFactory *iface, IUnknown *pOuter, REFIID riid, void **ppobj)
Definition: mlang.c:1529
static HRESULT WINAPI fnIMultiLanguage_ConvertStringReset(IMultiLanguage *iface)
Definition: mlang.c:2254
static ULONG WINAPI MLANGCF_AddRef(IClassFactory *iface)
Definition: mlang.c:1509
static INT CALLBACK map_font_enum_proc(const LOGFONTW *lf, const TEXTMETRICW *ntm, DWORD type, LPARAM lParam)
Definition: mlang.c:1323
static ULONG WINAPI MLangConvertCharset_AddRef(IMLangConvertCharset *iface)
Definition: mlang.c:3757
static HRESULT WINAPI MLangConvertCharset_Initialize(IMLangConvertCharset *iface, UINT src_cp, UINT dst_cp, DWORD prop)
Definition: mlang.c:3780
static HRESULT clear_font_cache(void)
Definition: mlang.c:1448
static HRESULT WINAPI fnIMultiLanguage_ConvertString(IMultiLanguage *iface, DWORD *mode, DWORD src_enc, DWORD dst_enc, BYTE *src, UINT *src_size, BYTE *dest, UINT *dest_size)
Definition: mlang.c:2211
static ULONG WINAPI MLangConvertCharset_Release(IMLangConvertCharset *iface)
Definition: mlang.c:3765
static ULONG WINAPI fnIMLangLineBreakConsole_Release(IMLangLineBreakConsole *iface)
Definition: mlang.c:3645
static HRESULT MultiLanguage_create(IUnknown *pUnkOuter, LPVOID *ppObj)
Definition: mlang.c:3864
static HRESULT WINAPI fnIMLangFontLink2_ReleaseFont(IMLangFontLink2 *This, HFONT hFont)
Definition: mlang.c:3487
static HRESULT WINAPI fnIMLangFontLink_GetStrCodePages(IMLangFontLink *iface, const WCHAR *src, LONG src_len, DWORD priority_cp, DWORD *codepages, LONG *ret_len)
Definition: mlang.c:2022
static const MIME_CP_INFO unicode_cp[]
Definition: mlang.c:461
static const MIME_CP_INFO korean_cp[]
Definition: mlang.c:338
static HRESULT WINAPI fnIEnumCodePage_Skip(IEnumCodePage *iface, ULONG celt)
Definition: mlang.c:1746
static HRESULT WINAPI fnIMLangLineBreakConsole_BreakLineA(IMLangLineBreakConsole *iface, LCID locale, UINT uCodePage, const CHAR *pszSrc, LONG cchSrc, LONG cMaxColumns, LONG *pcchLine, LONG *pcchSkip)
Definition: mlang.c:3682
static HRESULT WINAPI fnIMultiLanguage3_DetectCodepageInIStream(IMultiLanguage3 *iface, DWORD dwFlag, DWORD dwPrefWinCodePage, IStream *pstmIn, DetectEncodingInfo *lpEncoding, INT *pnScores)
Definition: mlang.c:3076
static void jis2sjis(unsigned char *p1, unsigned char *p2)
Definition: mlang.c:604
static HRESULT EnumRfc1766_create(LANGID LangId, IEnumRfc1766 **ppEnum)
Definition: mlang.c:2457
static HRESULT WINAPI MLangConvertCharset_GetDestinationCodePage(IMLangConvertCharset *iface, UINT *dst_cp)
Definition: mlang.c:3808
static HRESULT WINAPI fnIMultiLanguage3_GetCodePageInfo(IMultiLanguage3 *iface, UINT uiCodePage, LANGID LangId, PMIMECPINFO pCodePageInfo)
Definition: mlang.c:2700
static HRESULT WINAPI fnIMLangFontLink2_GetScriptFontInfo(IMLangFontLink2 *This, SCRIPT_ID sid, DWORD dwFlags, UINT *puiFonts, SCRIPTFONTINFO *pScriptFont)
Definition: mlang.c:3553
static HRESULT lcid_to_rfc1766A(LCID lcid, LPSTR rfc1766, INT len)
Definition: mlang.c:1181
static ULONG WINAPI fnIMultiLanguage3_AddRef(IMultiLanguage3 *iface)
Definition: mlang.c:2633
HRESULT WINAPI DllCanUnloadNow(void)
Definition: mlang.c:3921
static HRESULT WINAPI fnIMultiLanguage3_GetRfc1766Info(IMultiLanguage3 *iface, LCID Locale, LANGID LangId, PRFC1766INFO pRfc1766Info)
Definition: mlang.c:2911
static IClassFactoryImpl * impl_from_IClassFactory(IClassFactory *iface)
Definition: mlang.c:1474
static void LockModule(void)
Definition: mlang.c:924
static const MIME_CP_INFO vietnamese_cp[]
Definition: mlang.c:385
static INIT_ONCE font_link_global_init_once
Definition: mlang.c:47
static HRESULT WINAPI fnIMultiLanguage3_GetCharsetInfo(IMultiLanguage3 *iface, BSTR Charset, PMIMECSETINFO pCharsetInfo)
Definition: mlang.c:2747
static HRESULT WINAPI fnIEnumScript_Clone(IEnumScript *iface, IEnumScript **ppEnum)
Definition: mlang.c:1877
static HRESULT WINAPI fnIMultiLanguage3_ConvertStringToUnicode(IMultiLanguage3 *iface, DWORD *pdwMode, DWORD dwEncoding, CHAR *pSrcStr, UINT *pcSrcSize, WCHAR *pDstStr, UINT *pcDstSize)
Definition: mlang.c:2824
static HRESULT WINAPI fnIMultiLanguage3_GetNumberOfCodePageInfo(IMultiLanguage3 *iface, UINT *pcCodePage)
Definition: mlang.c:2654
static HRESULT WINAPI fnIMultiLanguage3_ValidateCodePageEx(IMultiLanguage3 *iface, UINT uiCodePage, HWND hwnd, DWORD dwfIODControl)
Definition: mlang.c:3180
static ULONG WINAPI fnIMultiLanguage_Release(IMultiLanguage *iface)
Definition: mlang.c:2132
static const IMultiLanguageVtbl IMultiLanguage_vtbl
Definition: mlang.c:2560
static HRESULT WINAPI fnIEnumScript_Skip(IEnumScript *iface, ULONG celt)
Definition: mlang.c:1923
static const MIME_CP_INFO hebrew_cp[]
Definition: mlang.c:269
HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv)
Definition: mlang.c:1570
static HRESULT WINAPI fnIMLangFontLink_QueryInterface(IMLangFontLink *iface, REFIID riid, void **ppvObject)
Definition: mlang.c:1990
static void sjis2jis(unsigned char *p1, unsigned char *p2)
Definition: mlang.c:615
static HRESULT WINAPI fnIMLangFontLink_ReleaseFont(IMLangFontLink *iface, HFONT hFont)
Definition: mlang.c:2077
static HRESULT WINAPI fnIMLangFontLink2_GetFontCodePages(IMLangFontLink2 *iface, HDC hdc, HFONT hfont, DWORD *codepages)
Definition: mlang.c:3465
struct tagEnumScript_impl EnumScript_impl
static HRESULT WINAPI fnIMultiLanguage3_GetFamilyCodePage(IMultiLanguage3 *iface, UINT uiCodePage, UINT *puiFamilyCodePage)
Definition: mlang.c:2726
static HRESULT WINAPI fnIMultiLanguage_EnumCodePages(IMultiLanguage *iface, DWORD grfFlags, IEnumCodePage **ppEnumCodePage)
Definition: mlang.c:2181
static HRESULT WINAPI fnIEnumRfc1766_Reset(IEnumRfc1766 *iface)
Definition: mlang.c:2384
static const IMLangLineBreakConsoleVtbl IMLangLineBreakConsole_vtbl
Definition: mlang.c:3717
static ULONG WINAPI fnIMLangFontLink_AddRef(IMLangFontLink *iface)
Definition: mlang.c:1999
static HRESULT WINAPI fnIMultiLanguage3_IsCodePageInstallable(IMultiLanguage3 *iface, UINT uiCodePage)
Definition: mlang.c:3135
static LONG dll_count
Definition: mlang.c:545
static HRESULT WINAPI fnIMultiLanguage3_DetectOutboundCodePageInIStream(IMultiLanguage3 *iface, DWORD dwFlags, IStream *pStrIn, UINT *puiPreferredCodePages, UINT nPreferredCodePages, UINT *puiDetectedCodePages, UINT *pnDetectedCodePages, WCHAR *lpSpecialChar)
Definition: mlang.c:3238
static HRESULT WINAPI fnIMultiLanguage3_DetectOutboundCodePage(IMultiLanguage3 *iface, DWORD dwFlags, LPCWSTR lpWideCharStr, UINT cchWideChar, UINT *puiPreferredCodePages, UINT nPreferredCodePages, UINT *puiDetectedCodePages, UINT *pnDetectedCodePages, WCHAR *lpSpecialChar)
Definition: mlang.c:3212
static ULONG WINAPI fnIMultiLanguage3_Release(IMultiLanguage3 *iface)
Definition: mlang.c:2639
static const MIME_CP_INFO central_european_cp[]
Definition: mlang.c:170
static HRESULT WINAPI MLangConvertCharset_GetSourceCodePage(IMLangConvertCharset *iface, UINT *src_cp)
Definition: mlang.c:3797
static HRESULT WINAPI fnIEnumCodePage_Reset(IEnumCodePage *iface)
Definition: mlang.c:1735
static BOOL CALLBACK enum_locales_proc(LPWSTR locale, DWORD flags, LPARAM lparam)
Definition: mlang.c:2426
static HRESULT WINAPI MLangConvertCharset_DoConversionToUnicode(IMLangConvertCharset *iface, CHAR *src, UINT *src_size, WCHAR *dest, UINT *dest_size)
Definition: mlang.c:3834
static EnumScript_impl * impl_from_IEnumScript(IEnumScript *iface)
Definition: mlang.c:1826
static ULONG WINAPI fnIMultiLanguage_AddRef(IMultiLanguage *iface)
Definition: mlang.c:2126
static IMultiLanguage2 * mlang
Definition: main.c:43
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2802
#define CP_UNICODE
Definition: stg_prop.c:73
struct png_info_def *typedef unsigned char **typedef struct png_info_def *typedef struct png_info_def *typedef struct png_info_def *typedef unsigned char ** row
Definition: typeof.h:78
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
pKey DeleteObject()
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLdouble n
Definition: glext.h:7729
GLenum src
Definition: glext.h:6340
GLuint buffer
Definition: glext.h:5915
GLsizeiptr size
Definition: glext.h:5919
const GLubyte * c
Definition: glext.h:8905
GLuint index
Definition: glext.h:6031
GLenum GLint GLuint mask
Definition: glext.h:6028
GLenum mode
Definition: glext.h:6217
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLenum GLenum dst
Definition: glext.h:6340
GLbitfield flags
Definition: glext.h:7161
GLfloat GLfloat p
Definition: glext.h:8902
GLuint GLuint num
Definition: glext.h:9618
GLenum GLsizei len
Definition: glext.h:6722
GLenum GLenum GLenum input
Definition: glext.h:9031
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
#define WC_NO_BEST_FIT_CHARS
Definition: unicode.h:46
#define fs
Definition: i386-dis.c:444
#define es
Definition: i386-dis.c:440
#define cs
Definition: i386-dis.c:442
#define gs
Definition: i386-dis.c:445
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define c
Definition: ke_i.h:80
#define debugstr_guid
Definition: kernel32.h:35
#define debugstr_a
Definition: kernel32.h:31
#define debugstr_wn
Definition: kernel32.h:33
#define debugstr_w
Definition: kernel32.h:32
#define wine_dbgstr_w
Definition: kernel32.h:34
USHORT LANGID
Definition: mui.h:9
if(dx< 0)
Definition: linetemp.h:194
int WINAPI lstrlenA(LPCSTR lpString)
Definition: lstring.c:145
POINT cp
Definition: magnifier.c:59
LONG_PTR LPARAM
Definition: minwindef.h:175
int * LPINT
Definition: minwindef.h:151
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define memmove(s1, s2, n)
Definition: mkisofs.h:881
HDC hdc
Definition: main.c:9
static PSID pSid
Definition: security.c:115
static HDC
Definition: imagelist.c:88
HRESULT hres
Definition: protocol.c:465
static JOBOBJECTINFOCLASS LPVOID DWORD LPDWORD ret_len
Definition: process.c:81
static DWORD LPDWORD LPCSTR DWORD srclen
Definition: directory.c:52
static DWORD dstlen
Definition: directory.c:51
static char * dest
Definition: rtl.c:149
static IUnknown * outer
Definition: compobj.c:82
static UINT UINT * out_count
Definition: clipboard.c:31
#define shift
Definition: input.c:3280
#define min(a, b)
Definition: monoChain.cc:55
int convert
Definition: msacm.c:1374
const CLSID * clsid
Definition: msctf.cpp:50
Definition: mk_font.cpp:20
unsigned int UINT
Definition: ndis.h:50
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
#define DWORD
Definition: nt_native.h:44
#define LOCALE_CUSTOM_UNSPECIFIED
#define LOCALE_USER_DEFAULT
#define OBJ_FONT
Definition: objidl.idl:1019
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:238
short WCHAR
Definition: pedump.c:58
long LONG
Definition: pedump.c:60
char CHAR
Definition: pedump.c:57
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
#define REFCLSID
Definition: guiddef.h:117
_In_opt_ IUnknown * punk
Definition: shlwapi.h:158
int nChar
Definition: shlwapi.h:1074
#define SUBLANGID(l)
Definition: nls.h:17
#define LANG_ENGLISH
Definition: nls.h:52
#define SUBLANG_DEFAULT
Definition: nls.h:168
#define LANG_ARABIC
Definition: nls.h:29
#define LANG_CHINESE
Definition: nls.h:42
DWORD LCID
Definition: nls.h:13
#define CP_UTF8
Definition: nls.h:20
#define PRIMARYLANGID(l)
Definition: nls.h:16
wcscpy
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:198
#define LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, list, type, field)
Definition: list.h:204
#define exit(n)
Definition: config.h:202
#define TRACE(s)
Definition: solgame.cpp:4
WCHAR lfFaceName[LF_FACESIZE]
Definition: dimm.idl:72
BYTE lfCharSet
Definition: dimm.idl:67
BYTE lfPitchAndFamily
Definition: dimm.idl:71
const WCHAR * body_charset
Definition: mlang.c:66
const WCHAR * header_charset
Definition: mlang.c:65
UINT cp
Definition: mlang.c:62
const WCHAR * description
Definition: mlang.c:61
const WCHAR * alias
Definition: mlang.c:67
DWORD flags
Definition: mlang.c:63
const WCHAR * web_charset
Definition: mlang.c:64
Definition: match.c:390
Definition: inflate.c:139
Definition: http.c:7252
IMLangConvertCharset IMLangConvertCharset_iface
Definition: mlang.c:3728
RFC1766INFO * info
Definition: mlang.c:2422
DWORD allocated
Definition: mlang.c:2423
Definition: main.c:439
IClassFactory IClassFactory_iface
Definition: main.c:440
HFONT base_font
Definition: mlang.c:528
HFONT font
Definition: mlang.c:529
UINT charset
Definition: mlang.c:530
struct list list_entry
Definition: mlang.c:527
Definition: ffs.h:70
Definition: parser.c:49
Definition: list.h:27
LOGFONTW src_lf
Definition: mlang.c:1317
const WCHAR * fixed_font
Definition: mlang.c:488
const MIME_CP_INFO * mime_cp_info
Definition: mlang.c:487
UINT family_codepage
Definition: mlang.c:485
UINT number_of_cp
Definition: mlang.c:486
const WCHAR * proportional_font
Definition: mlang.c:489
SCRIPT_ID sid
Definition: mlang.c:490
const WCHAR * description
Definition: mlang.c:484
LPCSTR szClassName
Definition: mlang.c:1482
const CLSID * clsid
Definition: main.c:70
HRESULT(* pfnCreateInstance)(IUnknown *pUnkOuter, LPVOID *ppObj)
Definition: main.c:71
Definition: send.c:48
Definition: stat.h:66
UINT ciCharset
Definition: wingdi.h:1992
MIMECPINFO * cpinfo
Definition: mlang.c:1630
IEnumCodePage IEnumCodePage_iface
Definition: mlang.c:1628
RFC1766INFO * info
Definition: mlang.c:2285
IEnumRfc1766 IEnumRfc1766_iface
Definition: mlang.c:2283
IEnumScript IEnumScript_iface
Definition: mlang.c:1820
SCRIPTINFO * script_info
Definition: mlang.c:1822
DWORD fsCsb[2]
Definition: wingdi.h:1989
DWORD total_cp
Definition: mlang.c:1621
IMLangFontLink2 IMLangFontLink2_iface
Definition: mlang.c:1618
IMLangLineBreakConsole IMLangLineBreakConsole_iface
Definition: mlang.c:1619
IMLangFontLink IMLangFontLink_iface
Definition: mlang.c:1615
IMultiLanguage3 IMultiLanguage3_iface
Definition: mlang.c:1617
DWORD total_scripts
Definition: mlang.c:1621
IMultiLanguage IMultiLanguage_iface
Definition: mlang.c:1616
LONG ref
Definition: mlang.c:1620
#define LIST_INIT(head)
Definition: queue.h:197
#define DWORD_PTR
Definition: treelist.c:76
const char * LPCSTR
Definition: typedefs.h:52
const uint16_t * LPCWSTR
Definition: typedefs.h:57
uint32_t DWORD_PTR
Definition: typedefs.h:65
uint16_t * LPWSTR
Definition: typedefs.h:56
uint32_t * LPDWORD
Definition: typedefs.h:59
char * LPSTR
Definition: typedefs.h:51
int32_t INT
Definition: typedefs.h:58
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
#define MAXLONG
Definition: umtypes.h:116
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383
int codepage
Definition: win_iconv.c:156
static RFC1766TOLCIDA Rfc1766ToLcidA
Definition: win_iconv.c:709
static LCIDTORFC1766A LcidToRfc1766A
Definition: win_iconv.c:708
static CONVERTINETMULTIBYTETOUNICODE ConvertINetMultiByteToUnicode
Definition: win_iconv.c:705
static ISCONVERTINETSTRINGAVAILABLE IsConvertINetStringAvailable
Definition: win_iconv.c:707
static CONVERTINETUNICODETOMULTIBYTE ConvertINetUnicodeToMultiByte
Definition: win_iconv.c:706
static CONVERTINETSTRING ConvertINetString
Definition: win_iconv.c:704
PRTL_RUN_ONCE PINIT_ONCE
Definition: winbase.h:3681
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
RTL_RUN_ONCE INIT_ONCE
Definition: winbase.h:3680
#define INIT_ONCE_STATIC_INIT
Definition: winbase.h:591
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define HRESULT
Definition: msvc.h:7
#define WINAPI
Definition: msvc.h:6
const char * description
Definition: directx.c:2497
#define S_FALSE
Definition: winerror.h:3451
#define E_NOINTERFACE
Definition: winerror.h:3479
#define CLASS_E_NOAGGREGATION
Definition: winerror.h:3771
#define CLASS_E_CLASSNOTAVAILABLE
Definition: winerror.h:3772
int WINAPI GetObjectW(_In_ HANDLE h, _In_ int c, _Out_writes_bytes_opt_(c) LPVOID pv)
int WINAPI GetTextCharsetInfo(_In_ HDC, _Out_opt_ LPFONTSIGNATURE, _In_ DWORD)
int WINAPI EnumFontFamiliesExW(_In_ HDC, _In_ PLOGFONTW, _In_ FONTENUMPROCW, _In_ LPARAM, _In_ DWORD)
HGDIOBJ WINAPI GetCurrentObject(_In_ HDC, _In_ UINT)
Definition: dc.c:428
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1546
#define DEFAULT_CHARSET
Definition: wingdi.h:384
HFONT WINAPI CreateFontIndirectW(_In_ const LOGFONTW *)
BOOL WINAPI TranslateCharsetInfo(_Inout_ PDWORD, _Out_ LPCHARSETINFO, _In_ DWORD)
#define TCI_SRCFONTSIG
Definition: wingdi.h:963
#define TCI_SRCCODEPAGE
Definition: wingdi.h:962
#define LOCALE_SENGLANGUAGE
Definition: winnls.h:32
#define CP_UTF7
Definition: winnls.h:253
#define LOCALE_SISO639LANGNAME
Definition: winnls.h:133
#define LCMAP_LOWERCASE
Definition: winnls.h:197
#define LOCALE_SLANGUAGE
Definition: winnls.h:31
#define LOCALE_SISO3166CTRYNAME
Definition: winnls.h:134
#define LOCALE_WINDOWS
Definition: winnls.h:224
_In_ DWORD _In_ int cchSrc
Definition: winnls.h:1264
DWORD LCTYPE
Definition: winnls.h:581
unsigned char BYTE
Definition: xxhash.c:193