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 static HRESULT
MultiLanguage_create(IUnknown
*pUnkOuter
, LPVOID
*ppObj
);
51 * Under what circumstances HKEY_CLASSES_ROOT\MIME\Database\Codepage and
52 * HKEY_CLASSES_ROOT\MIME\Database\Charset are used?
59 const char *web_charset
;
60 const char *header_charset
;
61 const char *body_charset
;
64 /* These data are based on the codepage info in libs/unicode/cpmap.pl */
65 /* FIXME: Add 28604 (Celtic), 28606 (Balkan) */
67 static const MIME_CP_INFO arabic_cp
[] =
69 { 864, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
|
70 MIMECONTF_MIME_LATEST
,
71 "ibm864", "ibm864", "ibm864" },
72 { 1006, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
|
73 MIMECONTF_MIME_LATEST
,
74 "ibm1006", "ibm1006", "ibm1006" },
75 { 1256, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_IMPORT
|
76 MIMECONTF_SAVABLE_MAILNEWS
| MIMECONTF_SAVABLE_BROWSER
|
77 MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
78 "windows-1256", "windows-1256", "windows-1256" },
79 { 28596, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_MINIMAL
|
80 MIMECONTF_IMPORT
| MIMECONTF_SAVABLE_MAILNEWS
|
81 MIMECONTF_SAVABLE_BROWSER
| MIMECONTF_EXPORT
|
82 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_IE4
| MIMECONTF_MIME_LATEST
,
83 "iso-8859-6", "iso-8859-6", "iso-8859-6" }
85 static const MIME_CP_INFO baltic_cp
[] =
87 { 775, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
88 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
89 "ibm775", "ibm775", "ibm775" },
90 { 1257, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_MINIMAL
|
91 MIMECONTF_IMPORT
| MIMECONTF_SAVABLE_MAILNEWS
|
92 MIMECONTF_SAVABLE_BROWSER
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
93 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
94 "windows-1257", "windows-1257", "windows-1257" },
95 { 28594, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_IMPORT
|
96 MIMECONTF_SAVABLE_MAILNEWS
| MIMECONTF_SAVABLE_BROWSER
|
97 MIMECONTF_EXPORT
| MIMECONTF_VALID
| MIMECONTF_VALID_NLS
|
98 MIMECONTF_MIME_LATEST
,
99 "iso-8859-4", "iso-8859-4", "iso-8859-4" },
100 { 28603, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
101 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
102 "iso-8859-13", "iso-8859-13", "iso-8859-13" }
104 static const MIME_CP_INFO chinese_simplified_cp
[] =
106 { 936, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_MINIMAL
|
107 MIMECONTF_IMPORT
| MIMECONTF_SAVABLE_MAILNEWS
|
108 MIMECONTF_SAVABLE_BROWSER
| MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
|
109 MIMECONTF_MIME_IE4
| MIMECONTF_MIME_LATEST
,
110 "gb2312", "gb2312", "gb2312" }
112 static const MIME_CP_INFO chinese_traditional_cp
[] =
114 { 950, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_MINIMAL
|
115 MIMECONTF_IMPORT
| MIMECONTF_SAVABLE_MAILNEWS
|
116 MIMECONTF_SAVABLE_BROWSER
| MIMECONTF_EXPORT
|
117 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_IE4
| MIMECONTF_MIME_LATEST
,
118 "big5", "big5", "big5" }
120 static const MIME_CP_INFO central_european_cp
[] =
122 { 852, MIMECONTF_BROWSER
| MIMECONTF_IMPORT
| MIMECONTF_SAVABLE_BROWSER
|
123 MIMECONTF_EXPORT
| MIMECONTF_VALID
| MIMECONTF_VALID_NLS
|
124 MIMECONTF_MIME_IE4
| MIMECONTF_MIME_LATEST
,
125 "ibm852", "ibm852", "ibm852" },
126 { 1250, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_IMPORT
|
127 MIMECONTF_SAVABLE_MAILNEWS
| MIMECONTF_SAVABLE_BROWSER
|
128 MIMECONTF_EXPORT
| MIMECONTF_VALID
| MIMECONTF_VALID_NLS
|
129 MIMECONTF_MIME_LATEST
,
130 "windows-1250", "windows-1250", "windows-1250" },
131 { 10029, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
132 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
133 "x-mac-ce", "x-mac-ce", "x-mac-ce" },
134 { 28592, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_MINIMAL
|
135 MIMECONTF_IMPORT
| MIMECONTF_SAVABLE_MAILNEWS
|
136 MIMECONTF_SAVABLE_BROWSER
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
137 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_IE4
| MIMECONTF_MIME_LATEST
,
138 "iso-8859-2", "iso-8859-2", "iso-8859-2" }
140 static const MIME_CP_INFO cyrillic_cp
[] =
142 { 855, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
143 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
144 "ibm855", "ibm855", "ibm855" },
145 { 866, MIMECONTF_BROWSER
| MIMECONTF_IMPORT
| MIMECONTF_SAVABLE_BROWSER
|
146 MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
| MIMECONTF_MIME_IE4
|
147 MIMECONTF_MIME_LATEST
,
148 "cp866", "cp866", "cp866" },
149 { 878, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
150 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
151 "koi8-r", "koi8-r", "koi8-r" },
152 { 1251, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_IMPORT
|
153 MIMECONTF_SAVABLE_MAILNEWS
| MIMECONTF_SAVABLE_BROWSER
|
154 MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
155 "windows-1251", "windows-1251", "windows-1251" },
156 { 10007, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
|
157 MIMECONTF_MIME_LATEST
,
158 "x-mac-cyrillic", "x-mac-cyrillic", "x-mac-cyrillic" },
159 { 20866, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_MINIMAL
|
160 MIMECONTF_IMPORT
| MIMECONTF_SAVABLE_MAILNEWS
|
161 MIMECONTF_SAVABLE_BROWSER
| MIMECONTF_EXPORT
|
162 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_IE4
| MIMECONTF_MIME_LATEST
,
163 "koi8-r", "koi8-r", "koi8-r" },
164 { 28595, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_MINIMAL
|
165 MIMECONTF_IMPORT
| MIMECONTF_SAVABLE_MAILNEWS
|
166 MIMECONTF_SAVABLE_BROWSER
| MIMECONTF_EXPORT
|
167 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_IE4
| MIMECONTF_MIME_LATEST
,
168 "iso-8859-5", "iso-8859-5", "iso-8859-5" }
170 static const MIME_CP_INFO greek_cp
[] =
172 { 737, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
|
173 MIMECONTF_MIME_LATEST
,
174 "ibm737", "ibm737", "ibm737" },
175 { 869, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
|
176 MIMECONTF_MIME_LATEST
,
177 "ibm869", "ibm869", "ibm869" },
178 { 875, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
|
179 MIMECONTF_MIME_LATEST
,
180 "cp875", "cp875", "cp875" },
181 { 1253, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_IMPORT
|
182 MIMECONTF_SAVABLE_MAILNEWS
| MIMECONTF_SAVABLE_BROWSER
|
183 MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
184 "windows-1253", "windows-1253", "windows-1253" },
185 { 10006, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
|
186 MIMECONTF_MIME_LATEST
,
187 "x-mac-greek", "x-mac-greek", "x-mac-greek" },
188 { 28597, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_MINIMAL
|
189 MIMECONTF_IMPORT
| MIMECONTF_SAVABLE_MAILNEWS
|
190 MIMECONTF_SAVABLE_BROWSER
| MIMECONTF_EXPORT
|
191 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_IE4
| MIMECONTF_MIME_LATEST
,
192 "iso-8859-7", "iso-8859-7", "iso-8859-7" }
194 static const MIME_CP_INFO hebrew_cp
[] =
196 { 424, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
|
197 MIMECONTF_MIME_LATEST
,
198 "ibm424", "ibm424", "ibm424" },
199 { 856, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
|
200 MIMECONTF_MIME_LATEST
,
201 "cp856", "cp856", "cp856" },
202 { 862, MIMECONTF_BROWSER
| MIMECONTF_MINIMAL
| MIMECONTF_IMPORT
|
203 MIMECONTF_SAVABLE_BROWSER
| MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
|
204 MIMECONTF_MIME_LATEST
,
205 "dos-862", "dos-862", "dos-862" },
206 { 1255, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_IMPORT
|
207 MIMECONTF_SAVABLE_MAILNEWS
| MIMECONTF_SAVABLE_BROWSER
|
208 MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
209 "windows-1255", "windows-1255", "windows-1255" },
210 { 28598, MIMECONTF_BROWSER
| MIMECONTF_MINIMAL
| MIMECONTF_IMPORT
|
211 MIMECONTF_SAVABLE_BROWSER
| MIMECONTF_EXPORT
|
212 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_IE4
| MIMECONTF_MIME_LATEST
,
213 "iso-8859-8", "iso-8859-8", "iso-8859-8" }
215 static const MIME_CP_INFO japanese_cp
[] =
217 { 932, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_MINIMAL
|
218 MIMECONTF_IMPORT
| MIMECONTF_SAVABLE_MAILNEWS
|
219 MIMECONTF_SAVABLE_BROWSER
| MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
|
220 MIMECONTF_MIME_IE4
| MIMECONTF_MIME_LATEST
,
221 "shift_jis", "iso-2022-jp", "iso-2022-jp" },
222 { 20932, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
|
223 MIMECONTF_MIME_LATEST
,
224 "euc-jp", "euc-jp", "euc-jp" }
226 static const MIME_CP_INFO korean_cp
[] =
228 { 949, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_MINIMAL
|
229 MIMECONTF_IMPORT
| MIMECONTF_SAVABLE_MAILNEWS
|
230 MIMECONTF_SAVABLE_BROWSER
| MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
|
231 MIMECONTF_MIME_LATEST
,
232 "ks_c_5601-1987", "ks_c_5601-1987", "ks_c_5601-1987" }
234 static const MIME_CP_INFO thai_cp
[] =
236 { 874, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_MIME_LATEST
,
237 "ibm-thai", "ibm-thai", "ibm-thai" }
239 static const MIME_CP_INFO turkish_cp
[] =
241 { 857, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
242 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
243 "ibm857", "ibm857", "ibm857" },
244 { 1026, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
245 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
246 "ibm1026", "ibm1026", "ibm1026" },
247 { 1254, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_MINIMAL
|
248 MIMECONTF_IMPORT
| MIMECONTF_SAVABLE_MAILNEWS
|
249 MIMECONTF_SAVABLE_BROWSER
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
250 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
251 "windows-1254", "windows-1254", "windows-1254" },
252 { 10081, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
253 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
254 "x-mac-turkish", "x-mac-turkish", "x-mac-turkish" },
255 { 28593, MIMECONTF_MAILNEWS
| MIMECONTF_IMPORT
|
256 MIMECONTF_SAVABLE_MAILNEWS
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
257 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_IE4
| MIMECONTF_MIME_LATEST
,
258 "iso-8859-3", "iso-8859-3", "iso-8859-3" },
259 { 28599, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_MINIMAL
|
260 MIMECONTF_IMPORT
| MIMECONTF_SAVABLE_MAILNEWS
|
261 MIMECONTF_SAVABLE_BROWSER
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
262 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
263 "iso-8859-9", "iso-8859-9", "iso-8859-9" }
265 static const MIME_CP_INFO vietnamese_cp
[] =
267 { 1258, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_IMPORT
|
268 MIMECONTF_SAVABLE_MAILNEWS
| MIMECONTF_SAVABLE_BROWSER
|
269 MIMECONTF_EXPORT
| MIMECONTF_VALID_NLS
| MIMECONTF_MIME_IE4
|
270 MIMECONTF_MIME_LATEST
,
271 "windows-1258", "windows-1258", "windows-1258" }
273 static const MIME_CP_INFO western_cp
[] =
275 { 37, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
276 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
277 "ibm037", "ibm037", "ibm037" },
278 { 437, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
279 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
280 "ibm437", "ibm437", "ibm437" },
281 { 500, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
282 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
283 "ibm500", "ibm500", "ibm500" },
284 { 850, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
285 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
286 "ibm850", "ibm850", "ibm850" },
287 { 860, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
288 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
289 "ibm860", "ibm860", "ibm860" },
290 { 861, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
291 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
292 "ibm861", "ibm861", "ibm861" },
293 { 863, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
294 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
295 "ibm863", "ibm863", "ibm863" },
296 { 865, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
297 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
298 "ibm865", "ibm865", "ibm865" },
299 { 1252, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_MINIMAL
|
300 MIMECONTF_IMPORT
| MIMECONTF_SAVABLE_MAILNEWS
|
301 MIMECONTF_SAVABLE_BROWSER
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
302 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
303 "windows-1252", "windows-1252", "iso-8859-1" },
304 { 10000, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
305 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
306 "macintosh", "macintosh", "macintosh" },
307 { 10079, MIMECONTF_IMPORT
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
308 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_LATEST
,
309 "x-mac-icelandic", "x-mac-icelandic", "x-mac-icelandic" },
310 { 28591, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_IMPORT
|
311 MIMECONTF_SAVABLE_MAILNEWS
| MIMECONTF_SAVABLE_BROWSER
|
312 MIMECONTF_EXPORT
| MIMECONTF_VALID
| MIMECONTF_VALID_NLS
|
313 MIMECONTF_MIME_LATEST
,
314 "iso-8859-1", "iso-8859-1", "iso-8859-1" },
315 { 28605, MIMECONTF_MAILNEWS
| MIMECONTF_IMPORT
|
316 MIMECONTF_SAVABLE_MAILNEWS
| MIMECONTF_SAVABLE_BROWSER
|
317 MIMECONTF_EXPORT
| MIMECONTF_VALID
| MIMECONTF_VALID_NLS
|
318 MIMECONTF_MIME_LATEST
,
319 "iso-8859-15", "iso-8859-15", "iso-8859-15" }
321 static const MIME_CP_INFO unicode_cp
[] =
323 { CP_UNICODE
, MIMECONTF_MINIMAL
| MIMECONTF_IMPORT
|
324 MIMECONTF_SAVABLE_BROWSER
| MIMECONTF_EXPORT
|
325 MIMECONTF_VALID
| MIMECONTF_VALID_NLS
| MIMECONTF_MIME_IE4
|
326 MIMECONTF_MIME_LATEST
,
327 "unicode", "unicode", "unicode" },
328 { CP_UTF7
, MIMECONTF_MAILNEWS
| MIMECONTF_IMPORT
|
329 MIMECONTF_SAVABLE_MAILNEWS
| MIMECONTF_EXPORT
| MIMECONTF_VALID
|
330 MIMECONTF_VALID_NLS
| MIMECONTF_MIME_IE4
| MIMECONTF_MIME_LATEST
,
331 "utf-7", "utf-7", "utf-7" },
332 { CP_UTF8
, MIMECONTF_MAILNEWS
| MIMECONTF_BROWSER
| MIMECONTF_IMPORT
|
333 MIMECONTF_SAVABLE_MAILNEWS
| MIMECONTF_SAVABLE_BROWSER
|
334 MIMECONTF_EXPORT
| MIMECONTF_VALID
| MIMECONTF_VALID_NLS
|
335 MIMECONTF_MIME_IE4
| MIMECONTF_MIME_LATEST
,
336 "utf-8", "utf-8", "utf-8" }
339 static const struct mlang_data
342 UINT family_codepage
;
344 const MIME_CP_INFO
*mime_cp_info
;
345 const char *fixed_font
; /* FIXME: Add */
346 const char *proportional_font
; /* FIXME: Add */
349 { MAKELANGID(LANG_ARABIC
,SUBLANG_DEFAULT
),1256,sizeof(arabic_cp
)/sizeof(arabic_cp
[0]),arabic_cp
},
351 { MAKELANGID(LANG_ENGLISH
,SUBLANG_DEFAULT
),1257,sizeof(baltic_cp
)/sizeof(baltic_cp
[0]),baltic_cp
},
352 { MAKELANGID(LANG_CHINESE
,SUBLANG_CHINESE_SIMPLIFIED
),936,sizeof(chinese_simplified_cp
)/sizeof(chinese_simplified_cp
[0]),chinese_simplified_cp
},
353 { MAKELANGID(LANG_CHINESE
,SUBLANG_CHINESE_TRADITIONAL
),950,sizeof(chinese_traditional_cp
)/sizeof(chinese_traditional_cp
[0]),chinese_traditional_cp
},
355 { MAKELANGID(LANG_ENGLISH
,SUBLANG_DEFAULT
),1250,sizeof(central_european_cp
)/sizeof(central_european_cp
[0]),central_european_cp
},
356 { MAKELANGID(LANG_RUSSIAN
,SUBLANG_DEFAULT
),1251,sizeof(cyrillic_cp
)/sizeof(cyrillic_cp
[0]),cyrillic_cp
},
357 { MAKELANGID(LANG_GREEK
,SUBLANG_DEFAULT
),1253,sizeof(greek_cp
)/sizeof(greek_cp
[0]),greek_cp
},
358 { MAKELANGID(LANG_HEBREW
,SUBLANG_DEFAULT
),1255,sizeof(hebrew_cp
)/sizeof(hebrew_cp
[0]),hebrew_cp
},
359 { MAKELANGID(LANG_JAPANESE
,SUBLANG_DEFAULT
),932,sizeof(japanese_cp
)/sizeof(japanese_cp
[0]),japanese_cp
},
360 { MAKELANGID(LANG_KOREAN
,SUBLANG_DEFAULT
),949,sizeof(korean_cp
)/sizeof(korean_cp
[0]),korean_cp
},
361 { MAKELANGID(LANG_THAI
,SUBLANG_DEFAULT
),874,sizeof(thai_cp
)/sizeof(thai_cp
[0]),thai_cp
},
362 { MAKELANGID(LANG_TURKISH
,SUBLANG_DEFAULT
),1254,sizeof(turkish_cp
)/sizeof(turkish_cp
[0]),turkish_cp
},
363 { MAKELANGID(LANG_VIETNAMESE
,SUBLANG_DEFAULT
),1258,sizeof(vietnamese_cp
)/sizeof(vietnamese_cp
[0]),vietnamese_cp
},
364 { MAKELANGID(LANG_ENGLISH
,SUBLANG_DEFAULT
),1252,sizeof(western_cp
)/sizeof(western_cp
[0]),western_cp
},
366 { MAKELANGID(LANG_ENGLISH
,SUBLANG_DEFAULT
),CP_UNICODE
,sizeof(unicode_cp
)/sizeof(unicode_cp
[0]),unicode_cp
}
369 static void fill_cp_info(const struct mlang_data
*ml_data
, UINT index
, MIMECPINFO
*mime_cp_info
);
371 BOOL WINAPI
DllMain(HINSTANCE hInstDLL
, DWORD fdwReason
, LPVOID lpv
)
374 case DLL_PROCESS_ATTACH
:
375 DisableThreadLibraryCalls(hInstDLL
);
377 case DLL_PROCESS_DETACH
:
383 HRESULT WINAPI
ConvertINetMultiByteToUnicode(
393 TRACE("%p %ld %s %p %p %p\n", pdwMode
, dwEncoding
,
394 debugstr_a(pSrcStr
), pcSrcSize
, pDstStr
, pcDstSize
);
400 pcSrcSize
= &src_len
;
411 if (*pcSrcSize
== -1)
412 *pcSrcSize
= lstrlenW((LPCWSTR
)pSrcStr
);
413 *pcDstSize
= min(*pcSrcSize
, *pcDstSize
);
414 *pcSrcSize
*= sizeof(WCHAR
);
416 memmove(pDstStr
, pSrcStr
, *pcDstSize
* sizeof(WCHAR
));
420 if (*pcSrcSize
== -1)
421 *pcSrcSize
= lstrlenA(pSrcStr
);
424 *pcDstSize
= MultiByteToWideChar(dwEncoding
, 0, pSrcStr
, *pcSrcSize
, pDstStr
, *pcDstSize
);
426 *pcDstSize
= MultiByteToWideChar(dwEncoding
, 0, pSrcStr
, *pcSrcSize
, NULL
, 0);
436 HRESULT WINAPI
ConvertINetUnicodeToMultiByte(
447 TRACE("%p %ld %s %p %p %p\n", pdwMode
, dwEncoding
,
448 debugstr_w(pSrcStr
), pcSrcSize
, pDstStr
, pcDstSize
);
454 pcSrcSize
= &src_len
;
465 if (*pcSrcSize
== -1)
466 *pcSrcSize
= lstrlenW(pSrcStr
);
467 *pcDstSize
= min(*pcSrcSize
* sizeof(WCHAR
), *pcDstSize
);
469 memmove(pDstStr
, pSrcStr
, *pcDstSize
);
473 if (*pcSrcSize
== -1)
474 *pcSrcSize
= lstrlenW(pSrcStr
);
477 *pcDstSize
= WideCharToMultiByte(dwEncoding
, 0, pSrcStr
, *pcSrcSize
, pDstStr
, *pcDstSize
, NULL
, NULL
);
479 *pcDstSize
= WideCharToMultiByte(dwEncoding
, 0, pSrcStr
, *pcSrcSize
, NULL
, 0, NULL
, NULL
);
490 HRESULT WINAPI
ConvertINetString(
500 FIXME("%p %ld %ld %s %p %p %p: stub!\n", pdwMode
, dwSrcEncoding
, dwDstEncoding
,
501 debugstr_a(pSrcStr
), pcSrcSize
, pDstStr
, pcDstSize
);
505 static HRESULT
GetFamilyCodePage(
507 UINT
* puiFamilyCodePage
)
511 TRACE("%u %p\n", uiCodePage
, puiFamilyCodePage
);
513 if (!puiFamilyCodePage
) return S_FALSE
;
515 for (i
= 0; i
< sizeof(mlang_data
)/sizeof(mlang_data
[0]); i
++)
517 for (n
= 0; n
< mlang_data
[i
].number_of_cp
; n
++)
519 if (mlang_data
[i
].mime_cp_info
[n
].cp
== uiCodePage
)
521 *puiFamilyCodePage
= mlang_data
[i
].family_codepage
;
530 HRESULT WINAPI
IsConvertINetStringAvailable(
534 UINT src_family
, dst_family
;
536 TRACE("%ld %ld\n", dwSrcEncoding
, dwDstEncoding
);
538 if (GetFamilyCodePage(dwSrcEncoding
, &src_family
) != S_OK
||
539 GetFamilyCodePage(dwDstEncoding
, &dst_family
) != S_OK
)
542 if (src_family
== dst_family
) return S_OK
;
544 /* we can convert any codepage to/from unicode */
545 if (src_family
== CP_UNICODE
|| dst_family
== CP_UNICODE
) return S_OK
;
550 /******************************************************************************
554 IClassFactory ITF_IClassFactory
;
557 HRESULT (*pfnCreateInstance
)(IUnknown
*pUnkOuter
, LPVOID
*ppObj
);
560 struct object_creation_info
564 HRESULT (*pfnCreateInstance
)(IUnknown
*pUnkOuter
, LPVOID
*ppObj
);
567 static const struct object_creation_info object_creation
[] =
569 { &CLSID_CMultiLanguage
, "CLSID_CMultiLanguage", MultiLanguage_create
},
572 static HRESULT WINAPI
573 MLANGCF_QueryInterface(LPCLASSFACTORY iface
,REFIID riid
,LPVOID
*ppobj
)
575 ICOM_THIS(IClassFactoryImpl
,iface
);
577 TRACE("%s\n", debugstr_guid(riid
) );
579 if (IsEqualGUID(riid
, &IID_IUnknown
)
580 || IsEqualGUID(riid
, &IID_IClassFactory
))
582 IClassFactory_AddRef(iface
);
587 WARN("(%p)->(%s,%p),not found\n",This
,debugstr_guid(riid
),ppobj
);
588 return E_NOINTERFACE
;
591 static ULONG WINAPI
MLANGCF_AddRef(LPCLASSFACTORY iface
) {
592 ICOM_THIS(IClassFactoryImpl
,iface
);
593 return ++(This
->ref
);
596 static ULONG WINAPI
MLANGCF_Release(LPCLASSFACTORY iface
) {
597 ICOM_THIS(IClassFactoryImpl
,iface
);
599 ULONG ref
= --This
->ref
;
603 TRACE("Destroying %p\n", This
);
604 HeapFree(GetProcessHeap(), 0, This
);
610 static HRESULT WINAPI
MLANGCF_CreateInstance(LPCLASSFACTORY iface
, LPUNKNOWN pOuter
,
611 REFIID riid
, LPVOID
*ppobj
) {
612 ICOM_THIS(IClassFactoryImpl
,iface
);
616 TRACE("(%p)->(%p,%s,%p)\n",This
,pOuter
,debugstr_guid(riid
),ppobj
);
618 hres
= This
->pfnCreateInstance(pOuter
, (LPVOID
*) &punk
);
623 hres
= IUnknown_QueryInterface(punk
, riid
, ppobj
);
628 IUnknown_Release(punk
);
629 TRACE("returning (%p) -> %lx\n", *ppobj
, hres
);
633 static HRESULT WINAPI
MLANGCF_LockServer(LPCLASSFACTORY iface
,BOOL dolock
) {
634 ICOM_THIS(IClassFactoryImpl
,iface
);
635 FIXME("(%p)->(%d),stub!\n",This
,dolock
);
639 static IClassFactoryVtbl MLANGCF_Vtbl
=
641 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
642 MLANGCF_QueryInterface
,
645 MLANGCF_CreateInstance
,
649 HRESULT WINAPI
MLANG_DllGetClassObject(REFCLSID rclsid
, REFIID iid
, LPVOID
*ppv
)
652 IClassFactoryImpl
*factory
;
654 TRACE("%s %s %p\n",debugstr_guid(rclsid
), debugstr_guid(iid
), ppv
);
656 if ( !IsEqualGUID( &IID_IClassFactory
, iid
)
657 && ! IsEqualGUID( &IID_IUnknown
, iid
) )
658 return E_NOINTERFACE
;
660 for (i
=0; i
< sizeof(object_creation
)/sizeof(object_creation
[0]); i
++)
662 if (IsEqualGUID(object_creation
[i
].clsid
, rclsid
))
666 if (i
== sizeof(object_creation
)/sizeof(object_creation
[0]))
668 FIXME("%s: no class found.\n", debugstr_guid(rclsid
));
669 return CLASS_E_CLASSNOTAVAILABLE
;
672 TRACE("Creating a class factory for %s\n",object_creation
[i
].szClassName
);
674 factory
= HeapAlloc(GetProcessHeap(), 0, sizeof(*factory
));
675 if (factory
== NULL
) return E_OUTOFMEMORY
;
677 factory
->ITF_IClassFactory
.lpVtbl
= &MLANGCF_Vtbl
;
680 factory
->pfnCreateInstance
= object_creation
[i
].pfnCreateInstance
;
682 *ppv
= &(factory
->ITF_IClassFactory
);
684 TRACE("(%p) <- %p\n", ppv
, &(factory
->ITF_IClassFactory
) );
690 /******************************************************************************/
692 typedef struct tagMLang_impl
694 IMLangFontLinkVtbl
*vtbl_IMLangFontLink
;
695 IMultiLanguageVtbl
*vtbl_IMultiLanguage
;
696 IMultiLanguage2Vtbl
*vtbl_IMultiLanguage2
;
698 DWORD total_cp
, total_scripts
;
701 static ULONG WINAPI
MLang_AddRef( MLang_impl
* This
)
703 return ++(This
->ref
);
706 static ULONG WINAPI
MLang_Release( MLang_impl
* This
)
708 ULONG ref
= --This
->ref
;
710 TRACE("%p ref = %ld\n", This
, ref
);
713 TRACE("Destroying %p\n", This
);
714 HeapFree(GetProcessHeap(), 0, This
);
720 static HRESULT WINAPI
MLang_QueryInterface(
725 TRACE("%p -> %s\n", This
, debugstr_guid(riid
) );
727 if (IsEqualGUID(riid
, &IID_IUnknown
)
728 || IsEqualGUID(riid
, &IID_IMLangCodePages
)
729 || IsEqualGUID(riid
, &IID_IMLangFontLink
))
732 TRACE("Returning IID_IMLangFontLink %p ref = %ld\n", This
, This
->ref
);
733 *ppvObject
= &(This
->vtbl_IMLangFontLink
);
737 if (IsEqualGUID(riid
, &IID_IMultiLanguage
) )
740 TRACE("Returning IID_IMultiLanguage %p ref = %ld\n", This
, This
->ref
);
741 *ppvObject
= &(This
->vtbl_IMultiLanguage
);
745 if (IsEqualGUID(riid
, &IID_IMultiLanguage2
) )
748 *ppvObject
= &(This
->vtbl_IMultiLanguage2
);
749 TRACE("Returning IID_IMultiLanguage2 %p ref = %ld\n", This
, This
->ref
);
753 WARN("(%p)->(%s,%p),not found\n",This
,debugstr_guid(riid
),ppvObject
);
754 return E_NOINTERFACE
;
757 /******************************************************************************/
759 typedef struct tagEnumCodePage_impl
761 IEnumCodePageVtbl
*vtbl_IEnumCodePage
;
767 static HRESULT WINAPI
fnIEnumCodePage_QueryInterface(
768 IEnumCodePage
* iface
,
772 ICOM_THIS_MULTI(EnumCodePage_impl
, vtbl_IEnumCodePage
, iface
);
774 TRACE("%p -> %s\n", This
, debugstr_guid(riid
) );
776 if (IsEqualGUID(riid
, &IID_IUnknown
)
777 || IsEqualGUID(riid
, &IID_IEnumCodePage
))
779 IEnumCodePage_AddRef(iface
);
780 TRACE("Returning IID_IEnumCodePage %p ref = %ld\n", This
, This
->ref
);
781 *ppvObject
= &(This
->vtbl_IEnumCodePage
);
785 WARN("(%p)->(%s,%p),not found\n",This
,debugstr_guid(riid
),ppvObject
);
786 return E_NOINTERFACE
;
789 static ULONG WINAPI
fnIEnumCodePage_AddRef(
790 IEnumCodePage
* iface
)
792 ICOM_THIS_MULTI(EnumCodePage_impl
, vtbl_IEnumCodePage
, iface
);
793 return ++(This
->ref
);
796 static ULONG WINAPI
fnIEnumCodePage_Release(
797 IEnumCodePage
* iface
)
799 ICOM_THIS_MULTI(EnumCodePage_impl
, vtbl_IEnumCodePage
, iface
);
800 ULONG ref
= --This
->ref
;
802 TRACE("%p ref = %ld\n", This
, ref
);
805 TRACE("Destroying %p\n", This
);
806 HeapFree(GetProcessHeap(), 0, This
->cpinfo
);
807 HeapFree(GetProcessHeap(), 0, This
);
813 static HRESULT WINAPI
fnIEnumCodePage_Clone(
814 IEnumCodePage
* iface
,
815 IEnumCodePage
** ppEnum
)
817 ICOM_THIS_MULTI(EnumCodePage_impl
, vtbl_IEnumCodePage
, iface
);
818 FIXME("%p %p\n", This
, ppEnum
);
822 static HRESULT WINAPI
fnIEnumCodePage_Next(
823 IEnumCodePage
* iface
,
828 ICOM_THIS_MULTI(EnumCodePage_impl
, vtbl_IEnumCodePage
, iface
);
829 TRACE("%p %lu %p %p\n", This
, celt
, rgelt
, pceltFetched
);
831 if (!pceltFetched
) return S_FALSE
;
834 if (!rgelt
) return S_FALSE
;
836 if (This
->pos
+ celt
> This
->total
)
837 celt
= This
->total
- This
->pos
;
839 if (!celt
) return S_FALSE
;
841 memcpy(rgelt
, This
->cpinfo
+ This
->pos
, celt
* sizeof(MIMECPINFO
));
842 *pceltFetched
= celt
;
848 static HRESULT WINAPI
fnIEnumCodePage_Reset(
849 IEnumCodePage
* iface
)
851 ICOM_THIS_MULTI(EnumCodePage_impl
, vtbl_IEnumCodePage
, iface
);
858 static HRESULT WINAPI
fnIEnumCodePage_Skip(
859 IEnumCodePage
* iface
,
862 ICOM_THIS_MULTI(EnumCodePage_impl
, vtbl_IEnumCodePage
, iface
);
863 TRACE("%p %lu\n", This
, celt
);
865 if (celt
>= This
->total
) return S_FALSE
;
867 This
->pos
= celt
; /* FIXME: should be += ?? */
871 static IEnumCodePageVtbl IEnumCodePage_vtbl
=
873 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
874 fnIEnumCodePage_QueryInterface
,
875 fnIEnumCodePage_AddRef
,
876 fnIEnumCodePage_Release
,
877 fnIEnumCodePage_Clone
,
878 fnIEnumCodePage_Next
,
879 fnIEnumCodePage_Reset
,
883 static HRESULT
EnumCodePage_create( MLang_impl
* mlang
, DWORD grfFlags
,
884 LANGID LangId
, IEnumCodePage
** ppEnumCodePage
)
886 EnumCodePage_impl
*ecp
;
890 TRACE("%p, %08lx, %04x, %p\n", mlang
, grfFlags
, LangId
, ppEnumCodePage
);
892 if (!grfFlags
) /* enumerate internal data base of encodings */
893 grfFlags
= MIMECONTF_MIME_LATEST
;
895 ecp
= HeapAlloc( GetProcessHeap(), 0, sizeof (EnumCodePage_impl
) );
896 ecp
->vtbl_IEnumCodePage
= &IEnumCodePage_vtbl
;
900 for (i
= 0; i
< sizeof(mlang_data
)/sizeof(mlang_data
[0]); i
++)
902 for (n
= 0; n
< mlang_data
[i
].number_of_cp
; n
++)
904 if (mlang_data
[i
].mime_cp_info
[n
].flags
& grfFlags
)
909 ecp
->cpinfo
= HeapAlloc(GetProcessHeap(), 0,
910 sizeof(MIMECPINFO
) * ecp
->total
);
911 cpinfo
= ecp
->cpinfo
;
913 for (i
= 0; i
< sizeof(mlang_data
)/sizeof(mlang_data
[0]); i
++)
915 for (n
= 0; n
< mlang_data
[i
].number_of_cp
; n
++)
917 if (mlang_data
[i
].mime_cp_info
[n
].flags
& grfFlags
)
918 fill_cp_info(&mlang_data
[i
], n
, cpinfo
++);
922 TRACE("enumerated %ld codepages with flags %08lx\n", ecp
->total
, grfFlags
);
924 *ppEnumCodePage
= (IEnumCodePage
*) ecp
;
929 /******************************************************************************/
931 typedef struct tagEnumScript_impl
933 IEnumScriptVtbl
*vtbl_IEnumScript
;
935 SCRIPTINFO
*script_info
;
939 static HRESULT WINAPI
fnIEnumScript_QueryInterface(
944 ICOM_THIS_MULTI(EnumScript_impl
, vtbl_IEnumScript
, iface
);
946 TRACE("%p -> %s\n", This
, debugstr_guid(riid
) );
948 if (IsEqualGUID(riid
, &IID_IUnknown
)
949 || IsEqualGUID(riid
, &IID_IEnumScript
))
951 IEnumScript_AddRef(iface
);
952 TRACE("Returning IID_IEnumScript %p ref = %ld\n", This
, This
->ref
);
953 *ppvObject
= &(This
->vtbl_IEnumScript
);
957 WARN("(%p)->(%s,%p),not found\n",This
,debugstr_guid(riid
),ppvObject
);
958 return E_NOINTERFACE
;
961 static ULONG WINAPI
fnIEnumScript_AddRef(
964 ICOM_THIS_MULTI(EnumScript_impl
, vtbl_IEnumScript
, iface
);
965 return ++(This
->ref
);
968 static ULONG WINAPI
fnIEnumScript_Release(
971 ICOM_THIS_MULTI(EnumScript_impl
, vtbl_IEnumScript
, iface
);
972 ULONG ref
= --This
->ref
;
974 TRACE("%p ref = %ld\n", This
, ref
);
977 TRACE("Destroying %p\n", This
);
978 HeapFree(GetProcessHeap(), 0, This
);
984 static HRESULT WINAPI
fnIEnumScript_Clone(
986 IEnumScript
** ppEnum
)
988 ICOM_THIS_MULTI(EnumScript_impl
, vtbl_IEnumScript
, iface
);
989 FIXME("%p %p: stub!\n", This
, ppEnum
);
993 static HRESULT WINAPI
fnIEnumScript_Next(
999 ICOM_THIS_MULTI(EnumScript_impl
, vtbl_IEnumScript
, iface
);
1000 TRACE("%p %lu %p %p\n", This
, celt
, rgelt
, pceltFetched
);
1002 if (!pceltFetched
|| !rgelt
) return E_FAIL
;
1006 if (This
->pos
+ celt
> This
->total
)
1007 celt
= This
->total
- This
->pos
;
1009 if (!celt
) return S_FALSE
;
1011 memcpy(rgelt
, This
->script_info
+ This
->pos
, celt
* sizeof(SCRIPTINFO
));
1012 *pceltFetched
= celt
;
1018 static HRESULT WINAPI
fnIEnumScript_Reset(
1021 ICOM_THIS_MULTI(EnumScript_impl
, vtbl_IEnumScript
, iface
);
1022 TRACE("%p\n", This
);
1028 static HRESULT WINAPI
fnIEnumScript_Skip(
1032 ICOM_THIS_MULTI(EnumScript_impl
, vtbl_IEnumScript
, iface
);
1033 TRACE("%p %lu\n", This
, celt
);
1035 if (celt
>= This
->total
) return S_FALSE
;
1037 This
->pos
= celt
; /* FIXME: should be += ?? */
1041 static IEnumScriptVtbl IEnumScript_vtbl
=
1043 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1044 fnIEnumScript_QueryInterface
,
1045 fnIEnumScript_AddRef
,
1046 fnIEnumScript_Release
,
1047 fnIEnumScript_Clone
,
1049 fnIEnumScript_Reset
,
1053 static HRESULT
EnumScript_create( MLang_impl
* mlang
, DWORD dwFlags
,
1054 LANGID LangId
, IEnumScript
** ppEnumScript
)
1056 static const WCHAR defaultW
[] = { 'D','e','f','a','u','l','t',0 };
1057 EnumScript_impl
*es
;
1059 FIXME("%p, %08lx, %04x, %p: stub!\n", mlang
, dwFlags
, LangId
, ppEnumScript
);
1061 if (!dwFlags
) /* enumerate all available scripts */
1062 dwFlags
= SCRIPTCONTF_SCRIPT_USER
| SCRIPTCONTF_SCRIPT_HIDE
| SCRIPTCONTF_SCRIPT_SYSTEM
;
1064 es
= HeapAlloc( GetProcessHeap(), 0, sizeof (EnumScript_impl
) );
1065 es
->vtbl_IEnumScript
= &IEnumScript_vtbl
;
1070 es
->script_info
= HeapAlloc(GetProcessHeap(), 0, sizeof(SCRIPTINFO
) * es
->total
);
1072 /* just a fake for now */
1073 es
->script_info
[0].ScriptId
= 0;
1074 es
->script_info
[0].uiCodePage
= 0;
1075 strcpyW(es
->script_info
[0].wszDescription
, defaultW
);
1076 es
->script_info
[0].wszFixedWidthFont
[0] = 0;
1077 es
->script_info
[0].wszProportionalFont
[0] = 0;
1079 *ppEnumScript
= (IEnumScript
*)es
;
1084 /******************************************************************************/
1086 static HRESULT WINAPI
fnIMLangFontLink_QueryInterface(
1087 IMLangFontLink
* iface
,
1091 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMLangFontLink
, iface
);
1092 return MLang_QueryInterface( This
, riid
, ppvObject
);
1095 static ULONG WINAPI
fnIMLangFontLink_AddRef(
1096 IMLangFontLink
* iface
)
1098 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMLangFontLink
, iface
);
1099 return MLang_AddRef( This
);
1102 static ULONG WINAPI
fnIMLangFontLink_Release(
1103 IMLangFontLink
* iface
)
1105 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMLangFontLink
, iface
);
1106 return MLang_Release( This
);
1109 static HRESULT WINAPI
fnIMLangFontLink_GetCharCodePages(
1110 IMLangFontLink
* iface
,
1112 DWORD
* pdwCodePages
)
1118 static HRESULT WINAPI
fnIMLangFontLink_GetStrCodePages(
1119 IMLangFontLink
* iface
,
1120 const WCHAR
* pszSrc
,
1122 DWORD dwPriorityCodePages
,
1123 DWORD
* pdwCodePages
,
1124 long* pcchCodePages
)
1130 static HRESULT WINAPI
fnIMLangFontLink_CodePageToCodePages(
1131 IMLangFontLink
* iface
,
1133 DWORD
* pdwCodePages
)
1139 static HRESULT WINAPI
fnIMLangFontLink_CodePagesToCodePage(
1140 IMLangFontLink
* iface
,
1142 UINT uDefaultCodePage
,
1149 static HRESULT WINAPI
fnIMLangFontLink_GetFontCodePages(
1150 IMLangFontLink
* iface
,
1153 DWORD
* pdwCodePages
)
1159 static HRESULT WINAPI
fnIMLangFontLink_MapFont(
1160 IMLangFontLink
* iface
,
1170 static HRESULT WINAPI
fnIMLangFontLink_ReleaseFont(
1171 IMLangFontLink
* iface
,
1178 static HRESULT WINAPI
fnIMLangFontLink_ResetFontMapping(
1179 IMLangFontLink
* iface
)
1186 static IMLangFontLinkVtbl IMLangFontLink_vtbl
=
1188 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1189 fnIMLangFontLink_QueryInterface
,
1190 fnIMLangFontLink_AddRef
,
1191 fnIMLangFontLink_Release
,
1192 fnIMLangFontLink_GetCharCodePages
,
1193 fnIMLangFontLink_GetStrCodePages
,
1194 fnIMLangFontLink_CodePageToCodePages
,
1195 fnIMLangFontLink_CodePagesToCodePage
,
1196 fnIMLangFontLink_GetFontCodePages
,
1197 fnIMLangFontLink_MapFont
,
1198 fnIMLangFontLink_ReleaseFont
,
1199 fnIMLangFontLink_ResetFontMapping
,
1202 /******************************************************************************/
1204 static HRESULT WINAPI
fnIMultiLanguage_QueryInterface(
1205 IMultiLanguage
* iface
,
1209 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMultiLanguage
, iface
);
1210 return MLang_QueryInterface( This
, riid
, ppvObject
);
1213 static ULONG WINAPI
fnIMultiLanguage_AddRef( IMultiLanguage
* iface
)
1215 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMultiLanguage
, iface
);
1216 return IMLangFontLink_AddRef( ((IMLangFontLink
*)This
) );
1219 static ULONG WINAPI
fnIMultiLanguage_Release( IMultiLanguage
* iface
)
1221 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMultiLanguage
, iface
);
1222 return IMLangFontLink_Release( ((IMLangFontLink
*)This
) );
1225 static HRESULT WINAPI
fnIMultiLanguage_GetNumberOfCodePageInfo(
1226 IMultiLanguage
* iface
,
1233 static HRESULT WINAPI
fnIMultiLanguage_GetCodePageInfo(
1234 IMultiLanguage
* iface
,
1236 PMIMECPINFO pCodePageInfo
)
1242 static HRESULT WINAPI
fnIMultiLanguage_GetFamilyCodePage(
1243 IMultiLanguage
* iface
,
1245 UINT
* puiFamilyCodePage
)
1247 return GetFamilyCodePage(uiCodePage
, puiFamilyCodePage
);
1250 static HRESULT WINAPI
fnIMultiLanguage_EnumCodePages(
1251 IMultiLanguage
* iface
,
1253 IEnumCodePage
** ppEnumCodePage
)
1255 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMultiLanguage
, iface
);
1256 TRACE("%p %08lx %p\n", This
, grfFlags
, ppEnumCodePage
);
1258 return EnumCodePage_create( This
, grfFlags
, 0, ppEnumCodePage
);
1261 static HRESULT WINAPI
fnIMultiLanguage_GetCharsetInfo(
1262 IMultiLanguage
* iface
,
1264 PMIMECSETINFO pCharsetInfo
)
1270 static HRESULT WINAPI
fnIMultiLanguage_IsConvertible(
1271 IMultiLanguage
* iface
,
1272 DWORD dwSrcEncoding
,
1273 DWORD dwDstEncoding
)
1275 return IsConvertINetStringAvailable(dwSrcEncoding
, dwDstEncoding
);
1278 static HRESULT WINAPI
fnIMultiLanguage_ConvertString(
1279 IMultiLanguage
* iface
,
1281 DWORD dwSrcEncoding
,
1282 DWORD dwDstEncoding
,
1288 return ConvertINetString(pdwMode
, dwSrcEncoding
, dwDstEncoding
,
1289 pSrcStr
, pcSrcSize
, pDstStr
, pcDstSize
);
1292 static HRESULT WINAPI
fnIMultiLanguage_ConvertStringToUnicode(
1293 IMultiLanguage
* iface
,
1301 return ConvertINetMultiByteToUnicode(pdwMode
, dwEncoding
,
1302 pSrcStr
, pcSrcSize
, pDstStr
, pcDstSize
);
1305 static HRESULT WINAPI
fnIMultiLanguage_ConvertStringFromUnicode(
1306 IMultiLanguage
* iface
,
1314 return ConvertINetUnicodeToMultiByte(pdwMode
, dwEncoding
,
1315 pSrcStr
, pcSrcSize
, pDstStr
, pcDstSize
);
1318 static HRESULT WINAPI
fnIMultiLanguage_ConvertStringReset(
1319 IMultiLanguage
* iface
)
1325 static HRESULT WINAPI
fnIMultiLanguage_GetRfc1766FromLcid(
1326 IMultiLanguage
* iface
,
1334 static HRESULT WINAPI
fnIMultiLanguage_GetLcidFromRfc1766(
1335 IMultiLanguage
* iface
,
1343 static HRESULT WINAPI
fnIMultiLanguage_EnumRfc1766(
1344 IMultiLanguage
* iface
,
1345 IEnumRfc1766
** ppEnumRfc1766
)
1351 static HRESULT WINAPI
fnIMultiLanguage_GetRfc1766Info(
1352 IMultiLanguage
* iface
,
1354 PRFC1766INFO pRfc1766Info
)
1360 static HRESULT WINAPI
fnIMultiLanguage_CreateConvertCharset(
1361 IMultiLanguage
* iface
,
1365 IMLangConvertCharset
** ppMLangConvertCharset
)
1371 static IMultiLanguageVtbl IMultiLanguage_vtbl
=
1373 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1374 fnIMultiLanguage_QueryInterface
,
1375 fnIMultiLanguage_AddRef
,
1376 fnIMultiLanguage_Release
,
1377 fnIMultiLanguage_GetNumberOfCodePageInfo
,
1378 fnIMultiLanguage_GetCodePageInfo
,
1379 fnIMultiLanguage_GetFamilyCodePage
,
1380 fnIMultiLanguage_EnumCodePages
,
1381 fnIMultiLanguage_GetCharsetInfo
,
1382 fnIMultiLanguage_IsConvertible
,
1383 fnIMultiLanguage_ConvertString
,
1384 fnIMultiLanguage_ConvertStringToUnicode
,
1385 fnIMultiLanguage_ConvertStringFromUnicode
,
1386 fnIMultiLanguage_ConvertStringReset
,
1387 fnIMultiLanguage_GetRfc1766FromLcid
,
1388 fnIMultiLanguage_GetLcidFromRfc1766
,
1389 fnIMultiLanguage_EnumRfc1766
,
1390 fnIMultiLanguage_GetRfc1766Info
,
1391 fnIMultiLanguage_CreateConvertCharset
,
1395 /******************************************************************************/
1397 static HRESULT WINAPI
fnIMultiLanguage2_QueryInterface(
1398 IMultiLanguage2
* iface
,
1402 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMultiLanguage2
, iface
);
1403 return MLang_QueryInterface( This
, riid
, ppvObject
);
1406 static ULONG WINAPI
fnIMultiLanguage2_AddRef( IMultiLanguage2
* iface
)
1408 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMultiLanguage2
, iface
);
1409 return MLang_AddRef( This
);
1412 static ULONG WINAPI
fnIMultiLanguage2_Release( IMultiLanguage2
* iface
)
1414 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMultiLanguage2
, iface
);
1415 return MLang_Release( This
);
1418 static HRESULT WINAPI
fnIMultiLanguage2_GetNumberOfCodePageInfo(
1419 IMultiLanguage2
* iface
,
1422 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMultiLanguage2
, iface
);
1423 TRACE("%p, %p\n", This
, pcCodePage
);
1425 if (!pcCodePage
) return S_FALSE
;
1427 *pcCodePage
= This
->total_cp
;
1431 static void fill_cp_info(const struct mlang_data
*ml_data
, UINT index
, MIMECPINFO
*mime_cp_info
)
1437 if (TranslateCharsetInfo((DWORD
*)ml_data
->family_codepage
, &csi
, TCI_SRCCODEPAGE
))
1438 mime_cp_info
->bGDICharset
= csi
.ciCharset
;
1440 mime_cp_info
->bGDICharset
= DEFAULT_CHARSET
;
1442 if (!GetCPInfoExW(ml_data
->mime_cp_info
[index
].cp
, 0, &cpinfo
))
1444 /* fall back to family codepage in the case of alias */
1445 if (!GetCPInfoExW(ml_data
->family_codepage
, 0, &cpinfo
))
1446 cpinfo
.CodePageName
[0] = 0;
1449 mime_cp_info
->dwFlags
= ml_data
->mime_cp_info
[index
].flags
;
1450 mime_cp_info
->uiCodePage
= ml_data
->mime_cp_info
[index
].cp
;
1451 mime_cp_info
->uiFamilyCodePage
= ml_data
->family_codepage
;
1452 strcpyW(mime_cp_info
->wszDescription
, cpinfo
.CodePageName
);
1453 MultiByteToWideChar(CP_ACP
, 0, ml_data
->mime_cp_info
[index
].web_charset
, -1,
1454 mime_cp_info
->wszWebCharset
, sizeof(mime_cp_info
->wszWebCharset
)/sizeof(WCHAR
));
1455 MultiByteToWideChar(CP_ACP
, 0, ml_data
->mime_cp_info
[index
].header_charset
, -1,
1456 mime_cp_info
->wszHeaderCharset
, sizeof(mime_cp_info
->wszHeaderCharset
)/sizeof(WCHAR
));
1457 MultiByteToWideChar(CP_ACP
, 0, ml_data
->mime_cp_info
[index
].body_charset
, -1,
1458 mime_cp_info
->wszBodyCharset
, sizeof(mime_cp_info
->wszBodyCharset
)/sizeof(WCHAR
));
1461 GetObjectW(GetStockObject(SYSTEM_FIXED_FONT
), sizeof(lf
), &lf
);
1462 strcpyW(mime_cp_info
->wszFixedWidthFont
, lf
.lfFaceName
);
1464 GetObjectW(GetStockObject(DEFAULT_GUI_FONT
), sizeof(lf
), &lf
);
1465 strcpyW(mime_cp_info
->wszProportionalFont
, lf
.lfFaceName
);
1468 static HRESULT WINAPI
fnIMultiLanguage2_GetCodePageInfo(
1469 IMultiLanguage2
* iface
,
1472 PMIMECPINFO pCodePageInfo
)
1476 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMultiLanguage2
, iface
);
1477 TRACE("%p, %u, %04x, %p\n", This
, uiCodePage
, LangId
, pCodePageInfo
);
1479 for (i
= 0; i
< sizeof(mlang_data
)/sizeof(mlang_data
[0]); i
++)
1481 for (n
= 0; n
< mlang_data
[i
].number_of_cp
; n
++)
1483 if (mlang_data
[i
].mime_cp_info
[n
].cp
== uiCodePage
)
1485 fill_cp_info(&mlang_data
[i
], n
, pCodePageInfo
);
1494 static HRESULT WINAPI
fnIMultiLanguage2_GetFamilyCodePage(
1495 IMultiLanguage2
* iface
,
1497 UINT
* puiFamilyCodePage
)
1499 return GetFamilyCodePage(uiCodePage
, puiFamilyCodePage
);
1502 static HRESULT WINAPI
fnIMultiLanguage2_EnumCodePages(
1503 IMultiLanguage2
* iface
,
1506 IEnumCodePage
** ppEnumCodePage
)
1508 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMultiLanguage2
, iface
);
1509 TRACE("%p %08lx %04x %p\n", This
, grfFlags
, LangId
, ppEnumCodePage
);
1511 return EnumCodePage_create( This
, grfFlags
, LangId
, ppEnumCodePage
);
1514 static HRESULT WINAPI
fnIMultiLanguage2_GetCharsetInfo(
1515 IMultiLanguage2
* iface
,
1517 PMIMECSETINFO pCharsetInfo
)
1519 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMultiLanguage2
, iface
);
1520 FIXME("%p %s %p\n", This
, debugstr_w(Charset
), pCharsetInfo
);
1524 static HRESULT WINAPI
fnIMultiLanguage2_IsConvertible(
1525 IMultiLanguage2
* iface
,
1526 DWORD dwSrcEncoding
,
1527 DWORD dwDstEncoding
)
1529 return IsConvertINetStringAvailable(dwSrcEncoding
, dwDstEncoding
);
1532 static HRESULT WINAPI
fnIMultiLanguage2_ConvertString(
1533 IMultiLanguage2
* iface
,
1535 DWORD dwSrcEncoding
,
1536 DWORD dwDstEncoding
,
1542 return ConvertINetString(pdwMode
, dwSrcEncoding
, dwDstEncoding
,
1543 pSrcStr
, pcSrcSize
, pDstStr
, pcDstSize
);
1546 static HRESULT WINAPI
fnIMultiLanguage2_ConvertStringToUnicode(
1547 IMultiLanguage2
* iface
,
1555 return ConvertINetMultiByteToUnicode(pdwMode
, dwEncoding
,
1556 pSrcStr
, pcSrcSize
, pDstStr
, pcDstSize
);
1559 static HRESULT WINAPI
fnIMultiLanguage2_ConvertStringFromUnicode(
1560 IMultiLanguage2
* iface
,
1568 return ConvertINetUnicodeToMultiByte(pdwMode
, dwEncoding
,
1569 pSrcStr
, pcSrcSize
, pDstStr
, pcDstSize
);
1572 static HRESULT WINAPI
fnIMultiLanguage2_ConvertStringReset(
1573 IMultiLanguage2
* iface
)
1579 static HRESULT WINAPI
fnIMultiLanguage2_GetRfc1766FromLcid(
1580 IMultiLanguage2
* iface
,
1588 static HRESULT WINAPI
fnIMultiLanguage2_GetLcidFromRfc1766(
1589 IMultiLanguage2
* iface
,
1597 static HRESULT WINAPI
fnIMultiLanguage2_EnumRfc1766(
1598 IMultiLanguage2
* iface
,
1600 IEnumRfc1766
** ppEnumRfc1766
)
1606 static HRESULT WINAPI
fnIMultiLanguage2_GetRfc1766Info(
1607 IMultiLanguage2
* iface
,
1610 PRFC1766INFO pRfc1766Info
)
1616 static HRESULT WINAPI
fnIMultiLanguage2_CreateConvertCharset(
1617 IMultiLanguage2
* iface
,
1621 IMLangConvertCharset
** ppMLangConvertCharset
)
1627 static HRESULT WINAPI
fnIMultiLanguage2_ConvertStringInIStream(
1628 IMultiLanguage2
* iface
,
1632 DWORD dwSrcEncoding
,
1633 DWORD dwDstEncoding
,
1641 static HRESULT WINAPI
fnIMultiLanguage2_ConvertStringToUnicodeEx(
1642 IMultiLanguage2
* iface
,
1656 static HRESULT WINAPI
fnIMultiLanguage2_ConvertStringFromUnicodeEx(
1657 IMultiLanguage2
* This
,
1671 static HRESULT WINAPI
fnIMultiLanguage2_DetectCodepageInIStream(
1672 IMultiLanguage2
* iface
,
1674 DWORD dwPrefWinCodePage
,
1676 DetectEncodingInfo
* lpEncoding
,
1683 static HRESULT WINAPI
fnIMultiLanguage2_DetectInputCodepage(
1684 IMultiLanguage2
* iface
,
1686 DWORD dwPrefWinCodePage
,
1689 DetectEncodingInfo
* lpEncoding
,
1696 static HRESULT WINAPI
fnIMultiLanguage2_ValidateCodePage(
1697 IMultiLanguage2
* iface
,
1705 static HRESULT WINAPI
fnIMultiLanguage2_GetCodePageDescription(
1706 IMultiLanguage2
* iface
,
1709 LPWSTR lpWideCharStr
,
1716 static HRESULT WINAPI
fnIMultiLanguage2_IsCodePageInstallable(
1717 IMultiLanguage2
* iface
,
1724 static HRESULT WINAPI
fnIMultiLanguage2_SetMimeDBSource(
1725 IMultiLanguage2
* iface
,
1732 static HRESULT WINAPI
fnIMultiLanguage2_GetNumberOfScripts(
1733 IMultiLanguage2
* iface
,
1736 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMultiLanguage2
, iface
);
1737 TRACE("%p %p\n", This
, pnScripts
);
1739 if (!pnScripts
) return S_FALSE
;
1741 *pnScripts
= This
->total_scripts
;
1745 static HRESULT WINAPI
fnIMultiLanguage2_EnumScripts(
1746 IMultiLanguage2
* iface
,
1749 IEnumScript
** ppEnumScript
)
1751 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMultiLanguage2
, iface
);
1752 TRACE("%p %08lx %04x %p\n", This
, dwFlags
, LangId
, ppEnumScript
);
1754 return EnumScript_create( This
, dwFlags
, LangId
, ppEnumScript
);
1757 static HRESULT WINAPI
fnIMultiLanguage2_ValidateCodePageEx(
1758 IMultiLanguage2
* iface
,
1761 DWORD dwfIODControl
)
1763 ICOM_THIS_MULTI(MLang_impl
, vtbl_IMultiLanguage2
, iface
);
1764 FIXME("%p %u %p %08lx: stub!\n", This
, uiCodePage
, hwnd
, dwfIODControl
);
1769 static IMultiLanguage2Vtbl IMultiLanguage2_vtbl
=
1771 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1772 fnIMultiLanguage2_QueryInterface
,
1773 fnIMultiLanguage2_AddRef
,
1774 fnIMultiLanguage2_Release
,
1775 fnIMultiLanguage2_GetNumberOfCodePageInfo
,
1776 fnIMultiLanguage2_GetCodePageInfo
,
1777 fnIMultiLanguage2_GetFamilyCodePage
,
1778 fnIMultiLanguage2_EnumCodePages
,
1779 fnIMultiLanguage2_GetCharsetInfo
,
1780 fnIMultiLanguage2_IsConvertible
,
1781 fnIMultiLanguage2_ConvertString
,
1782 fnIMultiLanguage2_ConvertStringToUnicode
,
1783 fnIMultiLanguage2_ConvertStringFromUnicode
,
1784 fnIMultiLanguage2_ConvertStringReset
,
1785 fnIMultiLanguage2_GetRfc1766FromLcid
,
1786 fnIMultiLanguage2_GetLcidFromRfc1766
,
1787 fnIMultiLanguage2_EnumRfc1766
,
1788 fnIMultiLanguage2_GetRfc1766Info
,
1789 fnIMultiLanguage2_CreateConvertCharset
,
1790 fnIMultiLanguage2_ConvertStringInIStream
,
1791 fnIMultiLanguage2_ConvertStringToUnicodeEx
,
1792 fnIMultiLanguage2_ConvertStringFromUnicodeEx
,
1793 fnIMultiLanguage2_DetectCodepageInIStream
,
1794 fnIMultiLanguage2_DetectInputCodepage
,
1795 fnIMultiLanguage2_ValidateCodePage
,
1796 fnIMultiLanguage2_GetCodePageDescription
,
1797 fnIMultiLanguage2_IsCodePageInstallable
,
1798 fnIMultiLanguage2_SetMimeDBSource
,
1799 fnIMultiLanguage2_GetNumberOfScripts
,
1800 fnIMultiLanguage2_EnumScripts
,
1801 fnIMultiLanguage2_ValidateCodePageEx
,
1804 static HRESULT
MultiLanguage_create(IUnknown
*pUnkOuter
, LPVOID
*ppObj
)
1809 TRACE("Creating MultiLanguage object\n");
1811 mlang
= HeapAlloc( GetProcessHeap(), 0, sizeof (MLang_impl
) );
1812 mlang
->vtbl_IMLangFontLink
= &IMLangFontLink_vtbl
;
1813 mlang
->vtbl_IMultiLanguage
= &IMultiLanguage_vtbl
;
1814 mlang
->vtbl_IMultiLanguage2
= &IMultiLanguage2_vtbl
;
1816 mlang
->total_cp
= 0;
1817 for (i
= 0; i
< sizeof(mlang_data
)/sizeof(mlang_data
[0]); i
++)
1818 mlang
->total_cp
+= mlang_data
[i
].number_of_cp
;
1820 mlang
->total_scripts
= 1;
1823 *ppObj
= (LPVOID
) mlang
;
1824 TRACE("returning %p\n", mlang
);
1828 /******************************************************************************/
1830 HRESULT WINAPI
MLANG_DllCanUnloadNow(void)
1836 HRESULT WINAPI
MLANG_DllRegisterServer(void)
1842 HRESULT WINAPI
MLANG_DllUnregisterServer(void)