4 * Copyright 2002 Lionel Ulmer
5 * Copyright 2003,2004 Mike McCormack
6 * Copyright 2004 Dmitry Timoshkov
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
39 #include "wine/unicode.h"
40 #include "wine/debug.h"
42 WINE_DEFAULT_DEBUG_CHANNEL(mlang
);
46 #define CP_UNICODE 1200
48 #define ICOM_THIS_MULTI(impl,field,iface) impl* const This=(impl*)((char*)(iface) - offsetof(impl,field))
50 static HRESULT
MultiLanguage_create(IUnknown
*pUnkOuter
, LPVOID
*ppObj
);
53 * Under what circumstances HKEY_CLASSES_ROOT\MIME\Database\Codepage and
54 * HKEY_CLASSES_ROOT\MIME\Database\Charset are used?
61 const char *web_charset
;
62 const char *header_charset
;
63 const char *body_charset
;
66 /* These data are based on the codepage info in libs/unicode/cpmap.pl */
67 /* FIXME: Add 28604 (Celtic), 28606 (Balkan) */
69 static const MIME_CP_INFO arabic_cp
[] =
71 { 864, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
|
72 MIMECONTF_MIME_LATEST
,
73 "ibm864", "ibm864", "ibm864" },
74 { 1006, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
|
75 MIMECONTF_MIME_LATEST
,
76 "ibm1006", "ibm1006", "ibm1006" },
77 { 1256, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_IMPORT
|
78 MIMECONTF_SAVABLE_MAILNEWS
| MIMECONTF_SAVABLE_BROWSER
|
79 MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
80 "windows-1256", "windows-1256", "windows-1256" },
81 { 28596, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_MINIMAL
|
82 MIMECONTF_IMPORT
| MIMECONTF_SAVABLE_MAILNEWS
|
83 MIMECONTF_SAVABLE_BROWSER
| MIMECONTF_EXPORT
|
84 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_IE4
| MIMECONTF_MIME_LATEST
,
85 "iso-8859-6", "iso-8859-6", "iso-8859-6" }
87 static const MIME_CP_INFO baltic_cp
[] =
89 { 775, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
90 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
91 "ibm775", "ibm775", "ibm775" },
92 { 1257, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_MINIMAL
|
93 MIMECONTF_IMPORT
| MIMECONTF_SAVABLE_MAILNEWS
|
94 MIMECONTF_SAVABLE_BROWSER
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
95 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
96 "windows-1257", "windows-1257", "windows-1257" },
97 { 28594, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_IMPORT
|
98 MIMECONTF_SAVABLE_MAILNEWS
| MIMECONTF_SAVABLE_BROWSER
|
99 MIMECONTF_EXPORT
| MIMECONTF_VALID
| MIMECONTF_VALID_NLS
|
100 MIMECONTF_MIME_LATEST
,
101 "iso-8859-4", "iso-8859-4", "iso-8859-4" },
102 { 28603, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
103 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
104 "iso-8859-13", "iso-8859-13", "iso-8859-13" }
106 static const MIME_CP_INFO chinese_simplified_cp
[] =
108 { 936, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_MINIMAL
|
109 MIMECONTF_IMPORT
| MIMECONTF_SAVABLE_MAILNEWS
|
110 MIMECONTF_SAVABLE_BROWSER
| MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
|
111 MIMECONTF_MIME_IE4
| MIMECONTF_MIME_LATEST
,
112 "gb2312", "gb2312", "gb2312" }
114 static const MIME_CP_INFO chinese_traditional_cp
[] =
116 { 950, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_MINIMAL
|
117 MIMECONTF_IMPORT
| MIMECONTF_SAVABLE_MAILNEWS
|
118 MIMECONTF_SAVABLE_BROWSER
| MIMECONTF_EXPORT
|
119 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_IE4
| MIMECONTF_MIME_LATEST
,
120 "big5", "big5", "big5" }
122 static const MIME_CP_INFO central_european_cp
[] =
124 { 852, MIMECONTF_BROWSER
| MIMECONTF_IMPORT
| MIMECONTF_SAVABLE_BROWSER
|
125 MIMECONTF_EXPORT
| MIMECONTF_VALID
| MIMECONTF_VALID_NLS
|
126 MIMECONTF_MIME_IE4
| MIMECONTF_MIME_LATEST
,
127 "ibm852", "ibm852", "ibm852" },
128 { 1250, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_IMPORT
|
129 MIMECONTF_SAVABLE_MAILNEWS
| MIMECONTF_SAVABLE_BROWSER
|
130 MIMECONTF_EXPORT
| MIMECONTF_VALID
| MIMECONTF_VALID_NLS
|
131 MIMECONTF_MIME_LATEST
,
132 "windows-1250", "windows-1250", "windows-1250" },
133 { 10029, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
134 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
135 "x-mac-ce", "x-mac-ce", "x-mac-ce" },
136 { 28592, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_MINIMAL
|
137 MIMECONTF_IMPORT
| MIMECONTF_SAVABLE_MAILNEWS
|
138 MIMECONTF_SAVABLE_BROWSER
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
139 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_IE4
| MIMECONTF_MIME_LATEST
,
140 "iso-8859-2", "iso-8859-2", "iso-8859-2" }
142 static const MIME_CP_INFO cyrillic_cp
[] =
144 { 855, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
145 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
146 "ibm855", "ibm855", "ibm855" },
147 { 866, MIMECONTF_BROWSER
| MIMECONTF_IMPORT
| MIMECONTF_SAVABLE_BROWSER
|
148 MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
| MIMECONTF_MIME_IE4
|
149 MIMECONTF_MIME_LATEST
,
150 "cp866", "cp866", "cp866" },
151 { 878, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
152 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
153 "koi8-r", "koi8-r", "koi8-r" },
154 { 1251, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_IMPORT
|
155 MIMECONTF_SAVABLE_MAILNEWS
| MIMECONTF_SAVABLE_BROWSER
|
156 MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
157 "windows-1251", "windows-1251", "windows-1251" },
158 { 10007, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
|
159 MIMECONTF_MIME_LATEST
,
160 "x-mac-cyrillic", "x-mac-cyrillic", "x-mac-cyrillic" },
161 { 20866, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_MINIMAL
|
162 MIMECONTF_IMPORT
| MIMECONTF_SAVABLE_MAILNEWS
|
163 MIMECONTF_SAVABLE_BROWSER
| MIMECONTF_EXPORT
|
164 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_IE4
| MIMECONTF_MIME_LATEST
,
165 "koi8-r", "koi8-r", "koi8-r" },
166 { 28595, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_MINIMAL
|
167 MIMECONTF_IMPORT
| MIMECONTF_SAVABLE_MAILNEWS
|
168 MIMECONTF_SAVABLE_BROWSER
| MIMECONTF_EXPORT
|
169 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_IE4
| MIMECONTF_MIME_LATEST
,
170 "iso-8859-5", "iso-8859-5", "iso-8859-5" }
172 static const MIME_CP_INFO greek_cp
[] =
174 { 737, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
|
175 MIMECONTF_MIME_LATEST
,
176 "ibm737", "ibm737", "ibm737" },
177 { 869, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
|
178 MIMECONTF_MIME_LATEST
,
179 "ibm869", "ibm869", "ibm869" },
180 { 875, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
|
181 MIMECONTF_MIME_LATEST
,
182 "cp875", "cp875", "cp875" },
183 { 1253, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_IMPORT
|
184 MIMECONTF_SAVABLE_MAILNEWS
| MIMECONTF_SAVABLE_BROWSER
|
185 MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
186 "windows-1253", "windows-1253", "windows-1253" },
187 { 10006, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
|
188 MIMECONTF_MIME_LATEST
,
189 "x-mac-greek", "x-mac-greek", "x-mac-greek" },
190 { 28597, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_MINIMAL
|
191 MIMECONTF_IMPORT
| MIMECONTF_SAVABLE_MAILNEWS
|
192 MIMECONTF_SAVABLE_BROWSER
| MIMECONTF_EXPORT
|
193 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_IE4
| MIMECONTF_MIME_LATEST
,
194 "iso-8859-7", "iso-8859-7", "iso-8859-7" }
196 static const MIME_CP_INFO hebrew_cp
[] =
198 { 424, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
|
199 MIMECONTF_MIME_LATEST
,
200 "ibm424", "ibm424", "ibm424" },
201 { 856, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
|
202 MIMECONTF_MIME_LATEST
,
203 "cp856", "cp856", "cp856" },
204 { 862, MIMECONTF_BROWSER
| MIMECONTF_MINIMAL
| MIMECONTF_IMPORT
|
205 MIMECONTF_SAVABLE_BROWSER
| MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
|
206 MIMECONTF_MIME_LATEST
,
207 "dos-862", "dos-862", "dos-862" },
208 { 1255, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_IMPORT
|
209 MIMECONTF_SAVABLE_MAILNEWS
| MIMECONTF_SAVABLE_BROWSER
|
210 MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
211 "windows-1255", "windows-1255", "windows-1255" },
212 { 28598, MIMECONTF_BROWSER
| MIMECONTF_MINIMAL
| MIMECONTF_IMPORT
|
213 MIMECONTF_SAVABLE_BROWSER
| MIMECONTF_EXPORT
|
214 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_IE4
| MIMECONTF_MIME_LATEST
,
215 "iso-8859-8", "iso-8859-8", "iso-8859-8" }
217 static const MIME_CP_INFO japanese_cp
[] =
219 { 932, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_MINIMAL
|
220 MIMECONTF_IMPORT
| MIMECONTF_SAVABLE_MAILNEWS
|
221 MIMECONTF_SAVABLE_BROWSER
| MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
|
222 MIMECONTF_MIME_IE4
| MIMECONTF_MIME_LATEST
,
223 "shift_jis", "iso-2022-jp", "iso-2022-jp" },
224 { 20932, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
|
225 MIMECONTF_MIME_LATEST
,
226 "euc-jp", "euc-jp", "euc-jp" }
228 static const MIME_CP_INFO korean_cp
[] =
230 { 949, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_MINIMAL
|
231 MIMECONTF_IMPORT
| MIMECONTF_SAVABLE_MAILNEWS
|
232 MIMECONTF_SAVABLE_BROWSER
| MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
|
233 MIMECONTF_MIME_LATEST
,
234 "ks_c_5601-1987", "ks_c_5601-1987", "ks_c_5601-1987" }
236 static const MIME_CP_INFO thai_cp
[] =
238 { 874, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_MIME_LATEST
,
239 "ibm-thai", "ibm-thai", "ibm-thai" }
241 static const MIME_CP_INFO turkish_cp
[] =
243 { 857, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
244 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
245 "ibm857", "ibm857", "ibm857" },
246 { 1026, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
247 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
248 "ibm1026", "ibm1026", "ibm1026" },
249 { 1254, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_MINIMAL
|
250 MIMECONTF_IMPORT
| MIMECONTF_SAVABLE_MAILNEWS
|
251 MIMECONTF_SAVABLE_BROWSER
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
252 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
253 "windows-1254", "windows-1254", "windows-1254" },
254 { 10081, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
255 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
256 "x-mac-turkish", "x-mac-turkish", "x-mac-turkish" },
257 { 28593, MIMECONTF_MAILNEWS
| MIMECONTF_IMPORT
|
258 MIMECONTF_SAVABLE_MAILNEWS
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
259 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_IE4
| MIMECONTF_MIME_LATEST
,
260 "iso-8859-3", "iso-8859-3", "iso-8859-3" },
261 { 28599, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_MINIMAL
|
262 MIMECONTF_IMPORT
| MIMECONTF_SAVABLE_MAILNEWS
|
263 MIMECONTF_SAVABLE_BROWSER
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
264 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
265 "iso-8859-9", "iso-8859-9", "iso-8859-9" }
267 static const MIME_CP_INFO vietnamese_cp
[] =
269 { 1258, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_IMPORT
|
270 MIMECONTF_SAVABLE_MAILNEWS
| MIMECONTF_SAVABLE_BROWSER
|
271 MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
| MIMECONTF_MIME_IE4
|
272 MIMECONTF_MIME_LATEST
,
273 "windows-1258", "windows-1258", "windows-1258" }
275 static const MIME_CP_INFO western_cp
[] =
277 { 37, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
278 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
279 "ibm037", "ibm037", "ibm037" },
280 { 437, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
281 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
282 "ibm437", "ibm437", "ibm437" },
283 { 500, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
284 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
285 "ibm500", "ibm500", "ibm500" },
286 { 850, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
287 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
288 "ibm850", "ibm850", "ibm850" },
289 { 860, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
290 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
291 "ibm860", "ibm860", "ibm860" },
292 { 861, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
293 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
294 "ibm861", "ibm861", "ibm861" },
295 { 863, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
296 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
297 "ibm863", "ibm863", "ibm863" },
298 { 865, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
299 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
300 "ibm865", "ibm865", "ibm865" },
301 { 1252, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_MINIMAL
|
302 MIMECONTF_IMPORT
| MIMECONTF_SAVABLE_MAILNEWS
|
303 MIMECONTF_SAVABLE_BROWSER
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
304 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
305 "windows-1252", "windows-1252", "iso-8859-1" },
306 { 10000, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
307 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
308 "macintosh", "macintosh", "macintosh" },
309 { 10079, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
310 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
311 "x-mac-icelandic", "x-mac-icelandic", "x-mac-icelandic" },
312 { 28591, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_IMPORT
|
313 MIMECONTF_SAVABLE_MAILNEWS
| MIMECONTF_SAVABLE_BROWSER
|
314 MIMECONTF_EXPORT
| MIMECONTF_VALID
| MIMECONTF_VALID_NLS
|
315 MIMECONTF_MIME_LATEST
,
316 "iso-8859-1", "iso-8859-1", "iso-8859-1" },
317 { 28605, MIMECONTF_MAILNEWS
| MIMECONTF_IMPORT
|
318 MIMECONTF_SAVABLE_MAILNEWS
| MIMECONTF_SAVABLE_BROWSER
|
319 MIMECONTF_EXPORT
| MIMECONTF_VALID
| MIMECONTF_VALID_NLS
|
320 MIMECONTF_MIME_LATEST
,
321 "iso-8859-15", "iso-8859-15", "iso-8859-15" }
323 static const MIME_CP_INFO unicode_cp
[] =
325 { CP_UNICODE
, MIMECONTF_MINIMAL
| MIMECONTF_IMPORT
|
326 MIMECONTF_SAVABLE_BROWSER
| MIMECONTF_EXPORT
|
327 MIMECONTF_VALID
| MIMECONTF_VALID_NLS
| MIMECONTF_MIME_IE4
|
328 MIMECONTF_MIME_LATEST
,
329 "unicode", "unicode", "unicode" },
330 { CP_UTF7
, MIMECONTF_MAILNEWS
| MIMECONTF_IMPORT
|
331 MIMECONTF_SAVABLE_MAILNEWS
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
332 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_IE4
| MIMECONTF_MIME_LATEST
,
333 "utf-7", "utf-7", "utf-7" },
334 { CP_UTF8
, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_IMPORT
|
335 MIMECONTF_SAVABLE_MAILNEWS
| MIMECONTF_SAVABLE_BROWSER
|
336 MIMECONTF_EXPORT
| MIMECONTF_VALID
| MIMECONTF_VALID_NLS
|
337 MIMECONTF_MIME_IE4
| MIMECONTF_MIME_LATEST
,
338 "utf-8", "utf-8", "utf-8" }
341 static const struct mlang_data
344 UINT family_codepage
;
346 const MIME_CP_INFO
*mime_cp_info
;
347 const char *fixed_font
; /* FIXME: Add */
348 const char *proportional_font
; /* FIXME: Add */
351 { MAKELANGID(LANG_ARABIC
,SUBLANG_DEFAULT
),1256,sizeof(arabic_cp
)/sizeof(arabic_cp
[0]),arabic_cp
},
353 { MAKELANGID(LANG_ENGLISH
,SUBLANG_DEFAULT
),1257,sizeof(baltic_cp
)/sizeof(baltic_cp
[0]),baltic_cp
},
354 { MAKELANGID(LANG_CHINESE
,SUBLANG_CHINESE_SIMPLIFIED
),936,sizeof(chinese_simplified_cp
)/sizeof(chinese_simplified_cp
[0]),chinese_simplified_cp
},
355 { MAKELANGID(LANG_CHINESE
,SUBLANG_CHINESE_TRADITIONAL
),950,sizeof(chinese_traditional_cp
)/sizeof(chinese_traditional_cp
[0]),chinese_traditional_cp
},
357 { MAKELANGID(LANG_ENGLISH
,SUBLANG_DEFAULT
),1250,sizeof(central_european_cp
)/sizeof(central_european_cp
[0]),central_european_cp
},
358 { MAKELANGID(LANG_RUSSIAN
,SUBLANG_DEFAULT
),1251,sizeof(cyrillic_cp
)/sizeof(cyrillic_cp
[0]),cyrillic_cp
},
359 { MAKELANGID(LANG_GREEK
,SUBLANG_DEFAULT
),1253,sizeof(greek_cp
)/sizeof(greek_cp
[0]),greek_cp
},
360 { MAKELANGID(LANG_HEBREW
,SUBLANG_DEFAULT
),1255,sizeof(hebrew_cp
)/sizeof(hebrew_cp
[0]),hebrew_cp
},
361 { MAKELANGID(LANG_JAPANESE
,SUBLANG_DEFAULT
),932,sizeof(japanese_cp
)/sizeof(japanese_cp
[0]),japanese_cp
},
362 { MAKELANGID(LANG_KOREAN
,SUBLANG_DEFAULT
),949,sizeof(korean_cp
)/sizeof(korean_cp
[0]),korean_cp
},
363 { MAKELANGID(LANG_THAI
,SUBLANG_DEFAULT
),874,sizeof(thai_cp
)/sizeof(thai_cp
[0]),thai_cp
},
364 { MAKELANGID(LANG_TURKISH
,SUBLANG_DEFAULT
),1254,sizeof(turkish_cp
)/sizeof(turkish_cp
[0]),turkish_cp
},
365 { MAKELANGID(LANG_VIETNAMESE
,SUBLANG_DEFAULT
),1258,sizeof(vietnamese_cp
)/sizeof(vietnamese_cp
[0]),vietnamese_cp
},
366 { MAKELANGID(LANG_ENGLISH
,SUBLANG_DEFAULT
),1252,sizeof(western_cp
)/sizeof(western_cp
[0]),western_cp
},
368 { MAKELANGID(LANG_ENGLISH
,SUBLANG_DEFAULT
),CP_UNICODE
,sizeof(unicode_cp
)/sizeof(unicode_cp
[0]),unicode_cp
}
371 static void fill_cp_info(const struct mlang_data
*ml_data
, UINT index
, MIMECPINFO
*mime_cp_info
);
373 BOOL WINAPI
DllMain(HINSTANCE hInstDLL
, DWORD fdwReason
, LPVOID lpv
)
376 case DLL_PROCESS_ATTACH
:
377 DisableThreadLibraryCalls(hInstDLL
);
379 case DLL_PROCESS_DETACH
:
385 HRESULT WINAPI
ConvertINetMultiByteToUnicode(
395 TRACE("%p %ld %s %p %p %p\n", pdwMode
, dwEncoding
,
396 debugstr_a(pSrcStr
), pcSrcSize
, pDstStr
, pcDstSize
);
402 pcSrcSize
= &src_len
;
413 if (*pcSrcSize
== -1)
414 *pcSrcSize
= lstrlenW((LPCWSTR
)pSrcStr
);
415 *pcDstSize
= min(*pcSrcSize
, *pcDstSize
);
416 *pcSrcSize
*= sizeof(WCHAR
);
418 memmove(pDstStr
, pSrcStr
, *pcDstSize
* sizeof(WCHAR
));
422 if (*pcSrcSize
== -1)
423 *pcSrcSize
= lstrlenA(pSrcStr
);
426 *pcDstSize
= MultiByteToWideChar(dwEncoding
, 0, pSrcStr
, *pcSrcSize
, pDstStr
, *pcDstSize
);
428 *pcDstSize
= MultiByteToWideChar(dwEncoding
, 0, pSrcStr
, *pcSrcSize
, NULL
, 0);
438 HRESULT WINAPI
ConvertINetUnicodeToMultiByte(
449 TRACE("%p %ld %s %p %p %p\n", pdwMode
, dwEncoding
,
450 debugstr_w(pSrcStr
), pcSrcSize
, pDstStr
, pcDstSize
);
456 pcSrcSize
= &src_len
;
467 if (*pcSrcSize
== -1)
468 *pcSrcSize
= lstrlenW(pSrcStr
);
469 *pcDstSize
= min(*pcSrcSize
* sizeof(WCHAR
), *pcDstSize
);
471 memmove(pDstStr
, pSrcStr
, *pcDstSize
);
475 if (*pcSrcSize
== -1)
476 *pcSrcSize
= lstrlenW(pSrcStr
);
479 *pcDstSize
= WideCharToMultiByte(dwEncoding
, 0, pSrcStr
, *pcSrcSize
, pDstStr
, *pcDstSize
, NULL
, NULL
);
481 *pcDstSize
= WideCharToMultiByte(dwEncoding
, 0, pSrcStr
, *pcSrcSize
, NULL
, 0, NULL
, NULL
);
492 HRESULT WINAPI
ConvertINetString(
502 FIXME("%p %ld %ld %s %p %p %p: stub!\n", pdwMode
, dwSrcEncoding
, dwDstEncoding
,
503 debugstr_a(pSrcStr
), pcSrcSize
, pDstStr
, pcDstSize
);
507 static HRESULT
GetFamilyCodePage(
509 UINT
* puiFamilyCodePage
)
513 TRACE("%u %p\n", uiCodePage
, puiFamilyCodePage
);
515 if (!puiFamilyCodePage
) return S_FALSE
;
517 for (i
= 0; i
< sizeof(mlang_data
)/sizeof(mlang_data
[0]); i
++)
519 for (n
= 0; n
< mlang_data
[i
].number_of_cp
; n
++)
521 if (mlang_data
[i
].mime_cp_info
[n
].cp
== uiCodePage
)
523 *puiFamilyCodePage
= mlang_data
[i
].family_codepage
;
532 HRESULT WINAPI
IsConvertINetStringAvailable(
536 UINT src_family
, dst_family
;
538 TRACE("%ld %ld\n", dwSrcEncoding
, dwDstEncoding
);
540 if (GetFamilyCodePage(dwSrcEncoding
, &src_family
) != S_OK
||
541 GetFamilyCodePage(dwDstEncoding
, &dst_family
) != S_OK
)
544 if (src_family
== dst_family
) return S_OK
;
546 /* we can convert any codepage to/from unicode */
547 if (src_family
== CP_UNICODE
|| dst_family
== CP_UNICODE
) return S_OK
;
552 /******************************************************************************
556 IClassFactory ITF_IClassFactory
;
559 HRESULT (*pfnCreateInstance
)(IUnknown
*pUnkOuter
, LPVOID
*ppObj
);
562 struct object_creation_info
566 HRESULT (*pfnCreateInstance
)(IUnknown
*pUnkOuter
, LPVOID
*ppObj
);
569 static const struct object_creation_info object_creation
[] =
571 { &CLSID_CMultiLanguage
, "CLSID_CMultiLanguage", MultiLanguage_create
},
574 static HRESULT WINAPI
575 MLANGCF_QueryInterface(LPCLASSFACTORY iface
,REFIID riid
,LPVOID
*ppobj
)
577 ICOM_THIS(IClassFactoryImpl
,iface
);
579 TRACE("%s\n", debugstr_guid(riid
) );
581 if (IsEqualGUID(riid
, &IID_IUnknown
)
582 || IsEqualGUID(riid
, &IID_IClassFactory
))
584 IClassFactory_AddRef(iface
);
589 WARN("(%p)->(%s,%p),not found\n",This
,debugstr_guid(riid
),ppobj
);
590 return E_NOINTERFACE
;
593 static ULONG WINAPI
MLANGCF_AddRef(LPCLASSFACTORY iface
) {
594 ICOM_THIS(IClassFactoryImpl
,iface
);
595 return ++(This
->ref
);
598 static ULONG WINAPI
MLANGCF_Release(LPCLASSFACTORY iface
) {
599 ICOM_THIS(IClassFactoryImpl
,iface
);
601 ULONG ref
= --This
->ref
;
605 TRACE("Destroying %p\n", This
);
606 HeapFree(GetProcessHeap(), 0, This
);
612 static HRESULT WINAPI
MLANGCF_CreateInstance(LPCLASSFACTORY iface
, LPUNKNOWN pOuter
,
613 REFIID riid
, LPVOID
*ppobj
) {
614 ICOM_THIS(IClassFactoryImpl
,iface
);
618 TRACE("(%p)->(%p,%s,%p)\n",This
,pOuter
,debugstr_guid(riid
),ppobj
);
620 hres
= This
->pfnCreateInstance(pOuter
, (LPVOID
*) &punk
);
625 hres
= IUnknown_QueryInterface(punk
, riid
, ppobj
);
630 IUnknown_Release(punk
);
631 TRACE("returning (%p) -> %lx\n", *ppobj
, hres
);
635 static HRESULT WINAPI
MLANGCF_LockServer(LPCLASSFACTORY iface
,BOOL dolock
) {
636 ICOM_THIS(IClassFactoryImpl
,iface
);
637 FIXME("(%p)->(%d),stub!\n",This
,dolock
);
641 static IClassFactoryVtbl MLANGCF_Vtbl
=
643 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
644 MLANGCF_QueryInterface
,
647 MLANGCF_CreateInstance
,
651 HRESULT WINAPI
MLANG_DllGetClassObject(REFCLSID rclsid
, REFIID iid
, LPVOID
*ppv
)
654 IClassFactoryImpl
*factory
;
656 TRACE("%s %s %p\n",debugstr_guid(rclsid
), debugstr_guid(iid
), ppv
);
658 if ( !IsEqualGUID( &IID_IClassFactory
, iid
)
659 && ! IsEqualGUID( &IID_IUnknown
, iid
) )
660 return E_NOINTERFACE
;
662 for (i
=0; i
< sizeof(object_creation
)/sizeof(object_creation
[0]); i
++)
664 if (IsEqualGUID(object_creation
[i
].clsid
, rclsid
))
668 if (i
== sizeof(object_creation
)/sizeof(object_creation
[0]))
670 FIXME("%s: no class found.\n", debugstr_guid(rclsid
));
671 return CLASS_E_CLASSNOTAVAILABLE
;
674 TRACE("Creating a class factory for %s\n",object_creation
[i
].szClassName
);
676 factory
= HeapAlloc(GetProcessHeap(), 0, sizeof(*factory
));
677 if (factory
== NULL
) return E_OUTOFMEMORY
;
679 factory
->ITF_IClassFactory
.lpVtbl
= &MLANGCF_Vtbl
;
682 factory
->pfnCreateInstance
= object_creation
[i
].pfnCreateInstance
;
684 *ppv
= &(factory
->ITF_IClassFactory
);
686 TRACE("(%p) <- %p\n", ppv
, &(factory
->ITF_IClassFactory
) );
692 /******************************************************************************/
694 typedef struct tagMLang_impl
696 IMLangFontLinkVtbl
*vtbl_IMLangFontLink
;
697 IMultiLanguageVtbl
*vtbl_IMultiLanguage
;
698 IMultiLanguage2Vtbl
*vtbl_IMultiLanguage2
;
700 DWORD total_cp
, total_scripts
;
703 static ULONG WINAPI
MLang_AddRef( MLang_impl
* This
)
705 return ++(This
->ref
);
708 static ULONG WINAPI
MLang_Release( MLang_impl
* This
)
710 ULONG ref
= --This
->ref
;
712 TRACE("%p ref = %ld\n", This
, ref
);
715 TRACE("Destroying %p\n", This
);
716 HeapFree(GetProcessHeap(), 0, This
);
722 static HRESULT WINAPI
MLang_QueryInterface(
727 TRACE("%p -> %s\n", This
, debugstr_guid(riid
) );
729 if (IsEqualGUID(riid
, &IID_IUnknown
)
730 || IsEqualGUID(riid
, &IID_IMLangCodePages
)
731 || IsEqualGUID(riid
, &IID_IMLangFontLink
))
734 TRACE("Returning IID_IMLangFontLink %p ref = %ld\n", This
, This
->ref
);
735 *ppvObject
= &(This
->vtbl_IMLangFontLink
);
739 if (IsEqualGUID(riid
, &IID_IMultiLanguage
) )
742 TRACE("Returning IID_IMultiLanguage %p ref = %ld\n", This
, This
->ref
);
743 *ppvObject
= &(This
->vtbl_IMultiLanguage
);
747 if (IsEqualGUID(riid
, &IID_IMultiLanguage2
) )
750 *ppvObject
= &(This
->vtbl_IMultiLanguage2
);
751 TRACE("Returning IID_IMultiLanguage2 %p ref = %ld\n", This
, This
->ref
);
755 WARN("(%p)->(%s,%p),not found\n",This
,debugstr_guid(riid
),ppvObject
);
756 return E_NOINTERFACE
;
759 /******************************************************************************/
761 typedef struct tagEnumCodePage_impl
763 IEnumCodePageVtbl
*vtbl_IEnumCodePage
;
769 static HRESULT WINAPI
fnIEnumCodePage_QueryInterface(
770 IEnumCodePage
* iface
,
774 ICOM_THIS_MULTI(EnumCodePage_impl
, vtbl_IEnumCodePage
, iface
);
776 TRACE("%p -> %s\n", This
, debugstr_guid(riid
) );
778 if (IsEqualGUID(riid
, &IID_IUnknown
)
779 || IsEqualGUID(riid
, &IID_IEnumCodePage
))
781 IEnumCodePage_AddRef(iface
);
782 TRACE("Returning IID_IEnumCodePage %p ref = %ld\n", This
, This
->ref
);
783 *ppvObject
= &(This
->vtbl_IEnumCodePage
);
787 WARN("(%p)->(%s,%p),not found\n",This
,debugstr_guid(riid
),ppvObject
);
788 return E_NOINTERFACE
;
791 static ULONG WINAPI
fnIEnumCodePage_AddRef(
792 IEnumCodePage
* iface
)
794 ICOM_THIS_MULTI(EnumCodePage_impl
, vtbl_IEnumCodePage
, iface
);
795 return ++(This
->ref
);
798 static ULONG WINAPI
fnIEnumCodePage_Release(
799 IEnumCodePage
* iface
)
801 ICOM_THIS_MULTI(EnumCodePage_impl
, vtbl_IEnumCodePage
, iface
);
802 ULONG ref
= --This
->ref
;
804 TRACE("%p ref = %ld\n", This
, ref
);
807 TRACE("Destroying %p\n", This
);
808 HeapFree(GetProcessHeap(), 0, This
->cpinfo
);
809 HeapFree(GetProcessHeap(), 0, This
);
815 static HRESULT WINAPI
fnIEnumCodePage_Clone(
816 IEnumCodePage
* iface
,
817 IEnumCodePage
** ppEnum
)
819 ICOM_THIS_MULTI(EnumCodePage_impl
, vtbl_IEnumCodePage
, iface
);
820 FIXME("%p %p\n", This
, ppEnum
);
824 static HRESULT WINAPI
fnIEnumCodePage_Next(
825 IEnumCodePage
* iface
,
830 ICOM_THIS_MULTI(EnumCodePage_impl
, vtbl_IEnumCodePage
, iface
);
831 TRACE("%p %lu %p %p\n", This
, celt
, rgelt
, pceltFetched
);
833 if (!pceltFetched
) return S_FALSE
;
836 if (!rgelt
) return S_FALSE
;
838 if (This
->pos
+ celt
> This
->total
)
839 celt
= This
->total
- This
->pos
;
841 if (!celt
) return S_FALSE
;
843 memcpy(rgelt
, This
->cpinfo
+ This
->pos
, celt
* sizeof(MIMECPINFO
));
844 *pceltFetched
= celt
;
850 static HRESULT WINAPI
fnIEnumCodePage_Reset(
851 IEnumCodePage
* iface
)
853 ICOM_THIS_MULTI(EnumCodePage_impl
, vtbl_IEnumCodePage
, iface
);
860 static HRESULT WINAPI
fnIEnumCodePage_Skip(
861 IEnumCodePage
* iface
,
864 ICOM_THIS_MULTI(EnumCodePage_impl
, vtbl_IEnumCodePage
, iface
);
865 TRACE("%p %lu\n", This
, celt
);
867 if (celt
>= This
->total
) return S_FALSE
;
869 This
->pos
= celt
; /* FIXME: should be += ?? */
873 static IEnumCodePageVtbl IEnumCodePage_vtbl
=
875 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
876 fnIEnumCodePage_QueryInterface
,
877 fnIEnumCodePage_AddRef
,
878 fnIEnumCodePage_Release
,
879 fnIEnumCodePage_Clone
,
880 fnIEnumCodePage_Next
,
881 fnIEnumCodePage_Reset
,
885 static HRESULT
EnumCodePage_create( MLang_impl
* mlang
, DWORD grfFlags
,
886 LANGID LangId
, IEnumCodePage
** ppEnumCodePage
)
888 EnumCodePage_impl
*ecp
;
892 TRACE("%p, %08lx, %04x, %p\n", mlang
, grfFlags
, LangId
, ppEnumCodePage
);
894 if (!grfFlags
) /* enumerate internal data base of encodings */
895 grfFlags
= MIMECONTF_MIME_LATEST
;
897 ecp
= HeapAlloc( GetProcessHeap(), 0, sizeof (EnumCodePage_impl
) );
898 ecp
->vtbl_IEnumCodePage
= &IEnumCodePage_vtbl
;
902 for (i
= 0; i
< sizeof(mlang_data
)/sizeof(mlang_data
[0]); i
++)
904 for (n
= 0; n
< mlang_data
[i
].number_of_cp
; n
++)
906 if (mlang_data
[i
].mime_cp_info
[n
].flags
& grfFlags
)
911 ecp
->cpinfo
= HeapAlloc(GetProcessHeap(), 0,
912 sizeof(MIMECPINFO
) * ecp
->total
);
913 cpinfo
= ecp
->cpinfo
;
915 for (i
= 0; i
< sizeof(mlang_data
)/sizeof(mlang_data
[0]); i
++)
917 for (n
= 0; n
< mlang_data
[i
].number_of_cp
; n
++)
919 if (mlang_data
[i
].mime_cp_info
[n
].flags
& grfFlags
)
920 fill_cp_info(&mlang_data
[i
], n
, cpinfo
++);
924 TRACE("enumerated %ld codepages with flags %08lx\n", ecp
->total
, grfFlags
);
926 *ppEnumCodePage
= (IEnumCodePage
*) ecp
;
931 /******************************************************************************/
933 typedef struct tagEnumScript_impl
935 IEnumScriptVtbl
*vtbl_IEnumScript
;
937 SCRIPTINFO
*script_info
;
941 static HRESULT WINAPI
fnIEnumScript_QueryInterface(
946 ICOM_THIS_MULTI(EnumScript_impl
, vtbl_IEnumScript
, iface
);
948 TRACE("%p -> %s\n", This
, debugstr_guid(riid
) );
950 if (IsEqualGUID(riid
, &IID_IUnknown
)
951 || IsEqualGUID(riid
, &IID_IEnumScript
))
953 IEnumScript_AddRef(iface
);
954 TRACE("Returning IID_IEnumScript %p ref = %ld\n", This
, This
->ref
);
955 *ppvObject
= &(This
->vtbl_IEnumScript
);
959 WARN("(%p)->(%s,%p),not found\n",This
,debugstr_guid(riid
),ppvObject
);
960 return E_NOINTERFACE
;
963 static ULONG WINAPI
fnIEnumScript_AddRef(
966 ICOM_THIS_MULTI(EnumScript_impl
, vtbl_IEnumScript
, iface
);
967 return ++(This
->ref
);
970 static ULONG WINAPI
fnIEnumScript_Release(
973 ICOM_THIS_MULTI(EnumScript_impl
, vtbl_IEnumScript
, iface
);
974 ULONG ref
= --This
->ref
;
976 TRACE("%p ref = %ld\n", This
, ref
);
979 TRACE("Destroying %p\n", This
);
980 HeapFree(GetProcessHeap(), 0, This
);
986 static HRESULT WINAPI
fnIEnumScript_Clone(
988 IEnumScript
** ppEnum
)
990 ICOM_THIS_MULTI(EnumScript_impl
, vtbl_IEnumScript
, iface
);
991 FIXME("%p %p: stub!\n", This
, ppEnum
);
995 static HRESULT WINAPI
fnIEnumScript_Next(
1001 ICOM_THIS_MULTI(EnumScript_impl
, vtbl_IEnumScript
, iface
);
1002 TRACE("%p %lu %p %p\n", This
, celt
, rgelt
, pceltFetched
);
1004 if (!pceltFetched
|| !rgelt
) return E_FAIL
;
1008 if (This
->pos
+ celt
> This
->total
)
1009 celt
= This
->total
- This
->pos
;
1011 if (!celt
) return S_FALSE
;
1013 memcpy(rgelt
, This
->script_info
+ This
->pos
, celt
* sizeof(SCRIPTINFO
));
1014 *pceltFetched
= celt
;
1020 static HRESULT WINAPI
fnIEnumScript_Reset(
1023 ICOM_THIS_MULTI(EnumScript_impl
, vtbl_IEnumScript
, iface
);
1024 TRACE("%p\n", This
);
1030 static HRESULT WINAPI
fnIEnumScript_Skip(
1034 ICOM_THIS_MULTI(EnumScript_impl
, vtbl_IEnumScript
, iface
);
1035 TRACE("%p %lu\n", This
, celt
);
1037 if (celt
>= This
->total
) return S_FALSE
;
1039 This
->pos
= celt
; /* FIXME: should be += ?? */
1043 static IEnumScriptVtbl IEnumScript_vtbl
=
1045 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1046 fnIEnumScript_QueryInterface
,
1047 fnIEnumScript_AddRef
,
1048 fnIEnumScript_Release
,
1049 fnIEnumScript_Clone
,
1051 fnIEnumScript_Reset
,
1055 static HRESULT
EnumScript_create( MLang_impl
* mlang
, DWORD dwFlags
,
1056 LANGID LangId
, IEnumScript
** ppEnumScript
)
1058 static const WCHAR defaultW
[] = { 'D','e','f','a','u','l','t',0 };
1059 EnumScript_impl
*es
;
1061 FIXME("%p, %08lx, %04x, %p: stub!\n", mlang
, dwFlags
, LangId
, ppEnumScript
);
1063 if (!dwFlags
) /* enumerate all available scripts */
1064 dwFlags
= SCRIPTCONTF_SCRIPT_USER
| SCRIPTCONTF_SCRIPT_HIDE
| SCRIPTCONTF_SCRIPT_SYSTEM
;
1066 es
= HeapAlloc( GetProcessHeap(), 0, sizeof (EnumScript_impl
) );
1067 es
->vtbl_IEnumScript
= &IEnumScript_vtbl
;
1072 es
->script_info
= HeapAlloc(GetProcessHeap(), 0, sizeof(SCRIPTINFO
) * es
->total
);
1074 /* just a fake for now */
1075 es
->script_info
[0].ScriptId
= 0;
1076 es
->script_info
[0].uiCodePage
= 0;
1077 strcpyW(es
->script_info
[0].wszDescription
, defaultW
);
1078 es
->script_info
[0].wszFixedWidthFont
[0] = 0;
1079 es
->script_info
[0].wszProportionalFont
[0] = 0;
1081 *ppEnumScript
= (IEnumScript
*)es
;
1086 /******************************************************************************/
1088 static HRESULT WINAPI
fnIMLangFontLink_QueryInterface(
1089 IMLangFontLink
* iface
,
1093 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMLangFontLink
, iface
);
1094 return MLang_QueryInterface( This
, riid
, ppvObject
);
1097 static ULONG WINAPI
fnIMLangFontLink_AddRef(
1098 IMLangFontLink
* iface
)
1100 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMLangFontLink
, iface
);
1101 return MLang_AddRef( This
);
1104 static ULONG WINAPI
fnIMLangFontLink_Release(
1105 IMLangFontLink
* iface
)
1107 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMLangFontLink
, iface
);
1108 return MLang_Release( This
);
1111 static HRESULT WINAPI
fnIMLangFontLink_GetCharCodePages(
1112 IMLangFontLink
* iface
,
1114 DWORD
* pdwCodePages
)
1120 static HRESULT WINAPI
fnIMLangFontLink_GetStrCodePages(
1121 IMLangFontLink
* iface
,
1122 const WCHAR
* pszSrc
,
1124 DWORD dwPriorityCodePages
,
1125 DWORD
* pdwCodePages
,
1126 long* pcchCodePages
)
1132 static HRESULT WINAPI
fnIMLangFontLink_CodePageToCodePages(
1133 IMLangFontLink
* iface
,
1135 DWORD
* pdwCodePages
)
1141 static HRESULT WINAPI
fnIMLangFontLink_CodePagesToCodePage(
1142 IMLangFontLink
* iface
,
1144 UINT uDefaultCodePage
,
1151 static HRESULT WINAPI
fnIMLangFontLink_GetFontCodePages(
1152 IMLangFontLink
* iface
,
1155 DWORD
* pdwCodePages
)
1161 static HRESULT WINAPI
fnIMLangFontLink_MapFont(
1162 IMLangFontLink
* iface
,
1172 static HRESULT WINAPI
fnIMLangFontLink_ReleaseFont(
1173 IMLangFontLink
* iface
,
1180 static HRESULT WINAPI
fnIMLangFontLink_ResetFontMapping(
1181 IMLangFontLink
* iface
)
1188 static IMLangFontLinkVtbl IMLangFontLink_vtbl
=
1190 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1191 fnIMLangFontLink_QueryInterface
,
1192 fnIMLangFontLink_AddRef
,
1193 fnIMLangFontLink_Release
,
1194 fnIMLangFontLink_GetCharCodePages
,
1195 fnIMLangFontLink_GetStrCodePages
,
1196 fnIMLangFontLink_CodePageToCodePages
,
1197 fnIMLangFontLink_CodePagesToCodePage
,
1198 fnIMLangFontLink_GetFontCodePages
,
1199 fnIMLangFontLink_MapFont
,
1200 fnIMLangFontLink_ReleaseFont
,
1201 fnIMLangFontLink_ResetFontMapping
,
1204 /******************************************************************************/
1206 static HRESULT WINAPI
fnIMultiLanguage_QueryInterface(
1207 IMultiLanguage
* iface
,
1211 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMultiLanguage
, iface
);
1212 return MLang_QueryInterface( This
, riid
, ppvObject
);
1215 static ULONG WINAPI
fnIMultiLanguage_AddRef( IMultiLanguage
* iface
)
1217 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMultiLanguage
, iface
);
1218 return IMLangFontLink_AddRef( ((IMLangFontLink
*)This
) );
1221 static ULONG WINAPI
fnIMultiLanguage_Release( IMultiLanguage
* iface
)
1223 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMultiLanguage
, iface
);
1224 return IMLangFontLink_Release( ((IMLangFontLink
*)This
) );
1227 static HRESULT WINAPI
fnIMultiLanguage_GetNumberOfCodePageInfo(
1228 IMultiLanguage
* iface
,
1235 static HRESULT WINAPI
fnIMultiLanguage_GetCodePageInfo(
1236 IMultiLanguage
* iface
,
1238 PMIMECPINFO pCodePageInfo
)
1244 static HRESULT WINAPI
fnIMultiLanguage_GetFamilyCodePage(
1245 IMultiLanguage
* iface
,
1247 UINT
* puiFamilyCodePage
)
1249 return GetFamilyCodePage(uiCodePage
, puiFamilyCodePage
);
1252 static HRESULT WINAPI
fnIMultiLanguage_EnumCodePages(
1253 IMultiLanguage
* iface
,
1255 IEnumCodePage
** ppEnumCodePage
)
1257 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMultiLanguage
, iface
);
1258 TRACE("%p %08lx %p\n", This
, grfFlags
, ppEnumCodePage
);
1260 return EnumCodePage_create( This
, grfFlags
, 0, ppEnumCodePage
);
1263 static HRESULT WINAPI
fnIMultiLanguage_GetCharsetInfo(
1264 IMultiLanguage
* iface
,
1266 PMIMECSETINFO pCharsetInfo
)
1272 static HRESULT WINAPI
fnIMultiLanguage_IsConvertible(
1273 IMultiLanguage
* iface
,
1274 DWORD dwSrcEncoding
,
1275 DWORD dwDstEncoding
)
1277 return IsConvertINetStringAvailable(dwSrcEncoding
, dwDstEncoding
);
1280 static HRESULT WINAPI
fnIMultiLanguage_ConvertString(
1281 IMultiLanguage
* iface
,
1283 DWORD dwSrcEncoding
,
1284 DWORD dwDstEncoding
,
1290 return ConvertINetString(pdwMode
, dwSrcEncoding
, dwDstEncoding
,
1291 pSrcStr
, pcSrcSize
, pDstStr
, pcDstSize
);
1294 static HRESULT WINAPI
fnIMultiLanguage_ConvertStringToUnicode(
1295 IMultiLanguage
* iface
,
1303 return ConvertINetMultiByteToUnicode(pdwMode
, dwEncoding
,
1304 pSrcStr
, pcSrcSize
, pDstStr
, pcDstSize
);
1307 static HRESULT WINAPI
fnIMultiLanguage_ConvertStringFromUnicode(
1308 IMultiLanguage
* iface
,
1316 return ConvertINetUnicodeToMultiByte(pdwMode
, dwEncoding
,
1317 pSrcStr
, pcSrcSize
, pDstStr
, pcDstSize
);
1320 static HRESULT WINAPI
fnIMultiLanguage_ConvertStringReset(
1321 IMultiLanguage
* iface
)
1327 static HRESULT WINAPI
fnIMultiLanguage_GetRfc1766FromLcid(
1328 IMultiLanguage
* iface
,
1336 static HRESULT WINAPI
fnIMultiLanguage_GetLcidFromRfc1766(
1337 IMultiLanguage
* iface
,
1345 static HRESULT WINAPI
fnIMultiLanguage_EnumRfc1766(
1346 IMultiLanguage
* iface
,
1347 IEnumRfc1766
** ppEnumRfc1766
)
1353 static HRESULT WINAPI
fnIMultiLanguage_GetRfc1766Info(
1354 IMultiLanguage
* iface
,
1356 PRFC1766INFO pRfc1766Info
)
1362 static HRESULT WINAPI
fnIMultiLanguage_CreateConvertCharset(
1363 IMultiLanguage
* iface
,
1367 IMLangConvertCharset
** ppMLangConvertCharset
)
1373 static IMultiLanguageVtbl IMultiLanguage_vtbl
=
1375 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1376 fnIMultiLanguage_QueryInterface
,
1377 fnIMultiLanguage_AddRef
,
1378 fnIMultiLanguage_Release
,
1379 fnIMultiLanguage_GetNumberOfCodePageInfo
,
1380 fnIMultiLanguage_GetCodePageInfo
,
1381 fnIMultiLanguage_GetFamilyCodePage
,
1382 fnIMultiLanguage_EnumCodePages
,
1383 fnIMultiLanguage_GetCharsetInfo
,
1384 fnIMultiLanguage_IsConvertible
,
1385 fnIMultiLanguage_ConvertString
,
1386 fnIMultiLanguage_ConvertStringToUnicode
,
1387 fnIMultiLanguage_ConvertStringFromUnicode
,
1388 fnIMultiLanguage_ConvertStringReset
,
1389 fnIMultiLanguage_GetRfc1766FromLcid
,
1390 fnIMultiLanguage_GetLcidFromRfc1766
,
1391 fnIMultiLanguage_EnumRfc1766
,
1392 fnIMultiLanguage_GetRfc1766Info
,
1393 fnIMultiLanguage_CreateConvertCharset
,
1397 /******************************************************************************/
1399 static HRESULT WINAPI
fnIMultiLanguage2_QueryInterface(
1400 IMultiLanguage2
* iface
,
1404 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMultiLanguage2
, iface
);
1405 return MLang_QueryInterface( This
, riid
, ppvObject
);
1408 static ULONG WINAPI
fnIMultiLanguage2_AddRef( IMultiLanguage2
* iface
)
1410 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMultiLanguage2
, iface
);
1411 return MLang_AddRef( This
);
1414 static ULONG WINAPI
fnIMultiLanguage2_Release( IMultiLanguage2
* iface
)
1416 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMultiLanguage2
, iface
);
1417 return MLang_Release( This
);
1420 static HRESULT WINAPI
fnIMultiLanguage2_GetNumberOfCodePageInfo(
1421 IMultiLanguage2
* iface
,
1424 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMultiLanguage2
, iface
);
1425 TRACE("%p, %p\n", This
, pcCodePage
);
1427 if (!pcCodePage
) return S_FALSE
;
1429 *pcCodePage
= This
->total_cp
;
1433 static void fill_cp_info(const struct mlang_data
*ml_data
, UINT index
, MIMECPINFO
*mime_cp_info
)
1439 if (TranslateCharsetInfo((DWORD
*)ml_data
->family_codepage
, &csi
, TCI_SRCCODEPAGE
))
1440 mime_cp_info
->bGDICharset
= csi
.ciCharset
;
1442 mime_cp_info
->bGDICharset
= DEFAULT_CHARSET
;
1444 if (!GetCPInfoExW(ml_data
->mime_cp_info
[index
].cp
, 0, &cpinfo
))
1446 /* fall back to family codepage in the case of alias */
1447 if (!GetCPInfoExW(ml_data
->family_codepage
, 0, &cpinfo
))
1448 cpinfo
.CodePageName
[0] = 0;
1451 mime_cp_info
->dwFlags
= ml_data
->mime_cp_info
[index
].flags
;
1452 mime_cp_info
->uiCodePage
= ml_data
->mime_cp_info
[index
].cp
;
1453 mime_cp_info
->uiFamilyCodePage
= ml_data
->family_codepage
;
1454 strcpyW(mime_cp_info
->wszDescription
, cpinfo
.CodePageName
);
1455 MultiByteToWideChar(CP_ACP
, 0, ml_data
->mime_cp_info
[index
].web_charset
, -1,
1456 mime_cp_info
->wszWebCharset
, sizeof(mime_cp_info
->wszWebCharset
)/sizeof(WCHAR
));
1457 MultiByteToWideChar(CP_ACP
, 0, ml_data
->mime_cp_info
[index
].header_charset
, -1,
1458 mime_cp_info
->wszHeaderCharset
, sizeof(mime_cp_info
->wszHeaderCharset
)/sizeof(WCHAR
));
1459 MultiByteToWideChar(CP_ACP
, 0, ml_data
->mime_cp_info
[index
].body_charset
, -1,
1460 mime_cp_info
->wszBodyCharset
, sizeof(mime_cp_info
->wszBodyCharset
)/sizeof(WCHAR
));
1463 GetObjectW(GetStockObject(SYSTEM_FIXED_FONT
), sizeof(lf
), &lf
);
1464 strcpyW(mime_cp_info
->wszFixedWidthFont
, lf
.lfFaceName
);
1466 GetObjectW(GetStockObject(DEFAULT_GUI_FONT
), sizeof(lf
), &lf
);
1467 strcpyW(mime_cp_info
->wszProportionalFont
, lf
.lfFaceName
);
1470 static HRESULT WINAPI
fnIMultiLanguage2_GetCodePageInfo(
1471 IMultiLanguage2
* iface
,
1474 PMIMECPINFO pCodePageInfo
)
1478 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMultiLanguage2
, iface
);
1479 TRACE("%p, %u, %04x, %p\n", This
, uiCodePage
, LangId
, pCodePageInfo
);
1481 for (i
= 0; i
< sizeof(mlang_data
)/sizeof(mlang_data
[0]); i
++)
1483 for (n
= 0; n
< mlang_data
[i
].number_of_cp
; n
++)
1485 if (mlang_data
[i
].mime_cp_info
[n
].cp
== uiCodePage
)
1487 fill_cp_info(&mlang_data
[i
], n
, pCodePageInfo
);
1496 static HRESULT WINAPI
fnIMultiLanguage2_GetFamilyCodePage(
1497 IMultiLanguage2
* iface
,
1499 UINT
* puiFamilyCodePage
)
1501 return GetFamilyCodePage(uiCodePage
, puiFamilyCodePage
);
1504 static HRESULT WINAPI
fnIMultiLanguage2_EnumCodePages(
1505 IMultiLanguage2
* iface
,
1508 IEnumCodePage
** ppEnumCodePage
)
1510 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMultiLanguage2
, iface
);
1511 TRACE("%p %08lx %04x %p\n", This
, grfFlags
, LangId
, ppEnumCodePage
);
1513 return EnumCodePage_create( This
, grfFlags
, LangId
, ppEnumCodePage
);
1516 static HRESULT WINAPI
fnIMultiLanguage2_GetCharsetInfo(
1517 IMultiLanguage2
* iface
,
1519 PMIMECSETINFO pCharsetInfo
)
1521 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMultiLanguage2
, iface
);
1522 FIXME("%p %s %p\n", This
, debugstr_w(Charset
), pCharsetInfo
);
1526 static HRESULT WINAPI
fnIMultiLanguage2_IsConvertible(
1527 IMultiLanguage2
* iface
,
1528 DWORD dwSrcEncoding
,
1529 DWORD dwDstEncoding
)
1531 return IsConvertINetStringAvailable(dwSrcEncoding
, dwDstEncoding
);
1534 static HRESULT WINAPI
fnIMultiLanguage2_ConvertString(
1535 IMultiLanguage2
* iface
,
1537 DWORD dwSrcEncoding
,
1538 DWORD dwDstEncoding
,
1544 return ConvertINetString(pdwMode
, dwSrcEncoding
, dwDstEncoding
,
1545 pSrcStr
, pcSrcSize
, pDstStr
, pcDstSize
);
1548 static HRESULT WINAPI
fnIMultiLanguage2_ConvertStringToUnicode(
1549 IMultiLanguage2
* iface
,
1557 return ConvertINetMultiByteToUnicode(pdwMode
, dwEncoding
,
1558 pSrcStr
, pcSrcSize
, pDstStr
, pcDstSize
);
1561 static HRESULT WINAPI
fnIMultiLanguage2_ConvertStringFromUnicode(
1562 IMultiLanguage2
* iface
,
1570 return ConvertINetUnicodeToMultiByte(pdwMode
, dwEncoding
,
1571 pSrcStr
, pcSrcSize
, pDstStr
, pcDstSize
);
1574 static HRESULT WINAPI
fnIMultiLanguage2_ConvertStringReset(
1575 IMultiLanguage2
* iface
)
1581 static HRESULT WINAPI
fnIMultiLanguage2_GetRfc1766FromLcid(
1582 IMultiLanguage2
* iface
,
1590 static HRESULT WINAPI
fnIMultiLanguage2_GetLcidFromRfc1766(
1591 IMultiLanguage2
* iface
,
1599 static HRESULT WINAPI
fnIMultiLanguage2_EnumRfc1766(
1600 IMultiLanguage2
* iface
,
1602 IEnumRfc1766
** ppEnumRfc1766
)
1608 static HRESULT WINAPI
fnIMultiLanguage2_GetRfc1766Info(
1609 IMultiLanguage2
* iface
,
1612 PRFC1766INFO pRfc1766Info
)
1618 static HRESULT WINAPI
fnIMultiLanguage2_CreateConvertCharset(
1619 IMultiLanguage2
* iface
,
1623 IMLangConvertCharset
** ppMLangConvertCharset
)
1629 static HRESULT WINAPI
fnIMultiLanguage2_ConvertStringInIStream(
1630 IMultiLanguage2
* iface
,
1634 DWORD dwSrcEncoding
,
1635 DWORD dwDstEncoding
,
1643 static HRESULT WINAPI
fnIMultiLanguage2_ConvertStringToUnicodeEx(
1644 IMultiLanguage2
* iface
,
1658 static HRESULT WINAPI
fnIMultiLanguage2_ConvertStringFromUnicodeEx(
1659 IMultiLanguage2
* This
,
1673 static HRESULT WINAPI
fnIMultiLanguage2_DetectCodepageInIStream(
1674 IMultiLanguage2
* iface
,
1676 DWORD dwPrefWinCodePage
,
1678 DetectEncodingInfo
* lpEncoding
,
1685 static HRESULT WINAPI
fnIMultiLanguage2_DetectInputCodepage(
1686 IMultiLanguage2
* iface
,
1688 DWORD dwPrefWinCodePage
,
1691 DetectEncodingInfo
* lpEncoding
,
1698 static HRESULT WINAPI
fnIMultiLanguage2_ValidateCodePage(
1699 IMultiLanguage2
* iface
,
1707 static HRESULT WINAPI
fnIMultiLanguage2_GetCodePageDescription(
1708 IMultiLanguage2
* iface
,
1711 LPWSTR lpWideCharStr
,
1718 static HRESULT WINAPI
fnIMultiLanguage2_IsCodePageInstallable(
1719 IMultiLanguage2
* iface
,
1726 static HRESULT WINAPI
fnIMultiLanguage2_SetMimeDBSource(
1727 IMultiLanguage2
* iface
,
1734 static HRESULT WINAPI
fnIMultiLanguage2_GetNumberOfScripts(
1735 IMultiLanguage2
* iface
,
1738 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMultiLanguage2
, iface
);
1739 TRACE("%p %p\n", This
, pnScripts
);
1741 if (!pnScripts
) return S_FALSE
;
1743 *pnScripts
= This
->total_scripts
;
1747 static HRESULT WINAPI
fnIMultiLanguage2_EnumScripts(
1748 IMultiLanguage2
* iface
,
1751 IEnumScript
** ppEnumScript
)
1753 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMultiLanguage2
, iface
);
1754 TRACE("%p %08lx %04x %p\n", This
, dwFlags
, LangId
, ppEnumScript
);
1756 return EnumScript_create( This
, dwFlags
, LangId
, ppEnumScript
);
1759 static HRESULT WINAPI
fnIMultiLanguage2_ValidateCodePageEx(
1760 IMultiLanguage2
* iface
,
1763 DWORD dwfIODControl
)
1765 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMultiLanguage2
, iface
);
1766 FIXME("%p %u %p %08lx: stub!\n", This
, uiCodePage
, hwnd
, dwfIODControl
);
1771 static IMultiLanguage2Vtbl IMultiLanguage2_vtbl
=
1773 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1774 fnIMultiLanguage2_QueryInterface
,
1775 fnIMultiLanguage2_AddRef
,
1776 fnIMultiLanguage2_Release
,
1777 fnIMultiLanguage2_GetNumberOfCodePageInfo
,
1778 fnIMultiLanguage2_GetCodePageInfo
,
1779 fnIMultiLanguage2_GetFamilyCodePage
,
1780 fnIMultiLanguage2_EnumCodePages
,
1781 fnIMultiLanguage2_GetCharsetInfo
,
1782 fnIMultiLanguage2_IsConvertible
,
1783 fnIMultiLanguage2_ConvertString
,
1784 fnIMultiLanguage2_ConvertStringToUnicode
,
1785 fnIMultiLanguage2_ConvertStringFromUnicode
,
1786 fnIMultiLanguage2_ConvertStringReset
,
1787 fnIMultiLanguage2_GetRfc1766FromLcid
,
1788 fnIMultiLanguage2_GetLcidFromRfc1766
,
1789 fnIMultiLanguage2_EnumRfc1766
,
1790 fnIMultiLanguage2_GetRfc1766Info
,
1791 fnIMultiLanguage2_CreateConvertCharset
,
1792 fnIMultiLanguage2_ConvertStringInIStream
,
1793 fnIMultiLanguage2_ConvertStringToUnicodeEx
,
1794 fnIMultiLanguage2_ConvertStringFromUnicodeEx
,
1795 fnIMultiLanguage2_DetectCodepageInIStream
,
1796 fnIMultiLanguage2_DetectInputCodepage
,
1797 fnIMultiLanguage2_ValidateCodePage
,
1798 fnIMultiLanguage2_GetCodePageDescription
,
1799 fnIMultiLanguage2_IsCodePageInstallable
,
1800 fnIMultiLanguage2_SetMimeDBSource
,
1801 fnIMultiLanguage2_GetNumberOfScripts
,
1802 fnIMultiLanguage2_EnumScripts
,
1803 fnIMultiLanguage2_ValidateCodePageEx
,
1806 static HRESULT
MultiLanguage_create(IUnknown
*pUnkOuter
, LPVOID
*ppObj
)
1811 TRACE("Creating MultiLanguage object\n");
1813 mlang
= HeapAlloc( GetProcessHeap(), 0, sizeof (MLang_impl
) );
1814 mlang
->vtbl_IMLangFontLink
= &IMLangFontLink_vtbl
;
1815 mlang
->vtbl_IMultiLanguage
= &IMultiLanguage_vtbl
;
1816 mlang
->vtbl_IMultiLanguage2
= &IMultiLanguage2_vtbl
;
1818 mlang
->total_cp
= 0;
1819 for (i
= 0; i
< sizeof(mlang_data
)/sizeof(mlang_data
[0]); i
++)
1820 mlang
->total_cp
+= mlang_data
[i
].number_of_cp
;
1822 mlang
->total_scripts
= 1;
1825 *ppObj
= (LPVOID
) mlang
;
1826 TRACE("returning %p\n", mlang
);
1830 /******************************************************************************/
1832 HRESULT WINAPI
MLANG_DllCanUnloadNow(void)
1838 HRESULT WINAPI
MLANG_DllRegisterServer(void)
1844 HRESULT WINAPI
MLANG_DllUnregisterServer(void)