Moved ICOM_THIS_MULTI definition out of objbase.h and into the files
[wine/multimedia.git] / dlls / mlang / mlang.c
blob7eb2d235b8a469f7c7da4c3ab85518981750968b
1 /*
2 * MLANG Class Factory
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
23 #include "config.h"
25 #include <stdarg.h>
26 #include <stdio.h>
28 #include "windef.h"
29 #include "winbase.h"
30 #include "wingdi.h"
31 #include "winuser.h"
32 #include "winnls.h"
33 #include "winreg.h"
34 #include "ole2.h"
35 #include "mlang.h"
37 #include "uuids.h"
39 #include "wine/unicode.h"
40 #include "wine/debug.h"
42 WINE_DEFAULT_DEBUG_CHANNEL(mlang);
44 #include "initguid.h"
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);
52 /* FIXME:
53 * Under what circumstances HKEY_CLASSES_ROOT\MIME\Database\Codepage and
54 * HKEY_CLASSES_ROOT\MIME\Database\Charset are used?
57 typedef struct
59 UINT cp;
60 DWORD flags;
61 const char *web_charset;
62 const char *header_charset;
63 const char *body_charset;
64 } MIME_CP_INFO;
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
343 LANGID langid;
344 UINT family_codepage;
345 UINT number_of_cp;
346 const MIME_CP_INFO *mime_cp_info;
347 const char *fixed_font; /* FIXME: Add */
348 const char *proportional_font; /* FIXME: Add */
349 } mlang_data[] =
351 { MAKELANGID(LANG_ARABIC,SUBLANG_DEFAULT),1256,sizeof(arabic_cp)/sizeof(arabic_cp[0]),arabic_cp },
352 /* FIXME */
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 },
356 /* FIXME */
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 },
367 /* FIXME */
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)
375 switch(fdwReason) {
376 case DLL_PROCESS_ATTACH:
377 DisableThreadLibraryCalls(hInstDLL);
378 break;
379 case DLL_PROCESS_DETACH:
380 break;
382 return TRUE;
385 HRESULT WINAPI ConvertINetMultiByteToUnicode(
386 LPDWORD pdwMode,
387 DWORD dwEncoding,
388 LPCSTR pSrcStr,
389 LPINT pcSrcSize,
390 LPWSTR pDstStr,
391 LPINT pcDstSize)
393 INT src_len = -1;
395 TRACE("%p %ld %s %p %p %p\n", pdwMode, dwEncoding,
396 debugstr_a(pSrcStr), pcSrcSize, pDstStr, pcDstSize);
398 if (!pcDstSize)
399 return E_FAIL;
401 if (!pcSrcSize)
402 pcSrcSize = &src_len;
404 if (!*pcSrcSize)
406 *pcDstSize = 0;
407 return S_OK;
410 switch (dwEncoding)
412 case CP_UNICODE:
413 if (*pcSrcSize == -1)
414 *pcSrcSize = lstrlenW((LPCWSTR)pSrcStr);
415 *pcDstSize = min(*pcSrcSize, *pcDstSize);
416 *pcSrcSize *= sizeof(WCHAR);
417 if (pDstStr)
418 memmove(pDstStr, pSrcStr, *pcDstSize * sizeof(WCHAR));
419 break;
421 default:
422 if (*pcSrcSize == -1)
423 *pcSrcSize = lstrlenA(pSrcStr);
425 if (pDstStr)
426 *pcDstSize = MultiByteToWideChar(dwEncoding, 0, pSrcStr, *pcSrcSize, pDstStr, *pcDstSize);
427 else
428 *pcDstSize = MultiByteToWideChar(dwEncoding, 0, pSrcStr, *pcSrcSize, NULL, 0);
429 break;
432 if (!*pcDstSize)
433 return E_FAIL;
435 return S_OK;
438 HRESULT WINAPI ConvertINetUnicodeToMultiByte(
439 LPDWORD pdwMode,
440 DWORD dwEncoding,
441 LPCWSTR pSrcStr,
442 LPINT pcSrcSize,
443 LPSTR pDstStr,
444 LPINT pcDstSize)
447 INT src_len = -1;
449 TRACE("%p %ld %s %p %p %p\n", pdwMode, dwEncoding,
450 debugstr_w(pSrcStr), pcSrcSize, pDstStr, pcDstSize);
452 if (!pcDstSize)
453 return E_FAIL;
455 if (!pcSrcSize)
456 pcSrcSize = &src_len;
458 if (!*pcSrcSize)
460 *pcDstSize = 0;
461 return S_OK;
464 switch (dwEncoding)
466 case CP_UNICODE:
467 if (*pcSrcSize == -1)
468 *pcSrcSize = lstrlenW(pSrcStr);
469 *pcDstSize = min(*pcSrcSize * sizeof(WCHAR), *pcDstSize);
470 if (pDstStr)
471 memmove(pDstStr, pSrcStr, *pcDstSize);
472 break;
474 default:
475 if (*pcSrcSize == -1)
476 *pcSrcSize = lstrlenW(pSrcStr);
478 if (pDstStr)
479 *pcDstSize = WideCharToMultiByte(dwEncoding, 0, pSrcStr, *pcSrcSize, pDstStr, *pcDstSize, NULL, NULL);
480 else
481 *pcDstSize = WideCharToMultiByte(dwEncoding, 0, pSrcStr, *pcSrcSize, NULL, 0, NULL, NULL);
482 break;
486 if (!*pcDstSize)
487 return E_FAIL;
489 return S_OK;
492 HRESULT WINAPI ConvertINetString(
493 LPDWORD pdwMode,
494 DWORD dwSrcEncoding,
495 DWORD dwDstEncoding,
496 LPCSTR pSrcStr,
497 LPINT pcSrcSize,
498 LPSTR pDstStr,
499 LPINT pcDstSize
502 FIXME("%p %ld %ld %s %p %p %p: stub!\n", pdwMode, dwSrcEncoding, dwDstEncoding,
503 debugstr_a(pSrcStr), pcSrcSize, pDstStr, pcDstSize);
504 return E_NOTIMPL;
507 static HRESULT GetFamilyCodePage(
508 UINT uiCodePage,
509 UINT* puiFamilyCodePage)
511 UINT i, n;
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;
524 return S_OK;
529 return S_FALSE;
532 HRESULT WINAPI IsConvertINetStringAvailable(
533 DWORD dwSrcEncoding,
534 DWORD dwDstEncoding)
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)
542 return S_FALSE;
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;
549 return S_FALSE;
552 /******************************************************************************
553 * MLANG ClassFactory
555 typedef struct {
556 IClassFactory ITF_IClassFactory;
558 DWORD ref;
559 HRESULT (*pfnCreateInstance)(IUnknown *pUnkOuter, LPVOID *ppObj);
560 } IClassFactoryImpl;
562 struct object_creation_info
564 const CLSID *clsid;
565 LPCSTR szClassName;
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);
585 *ppobj = This;
586 return S_OK;
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;
603 if (ref == 0)
605 TRACE("Destroying %p\n", This);
606 HeapFree(GetProcessHeap(), 0, This);
609 return ref;
612 static HRESULT WINAPI MLANGCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter,
613 REFIID riid, LPVOID *ppobj) {
614 ICOM_THIS(IClassFactoryImpl,iface);
615 HRESULT hres;
616 LPUNKNOWN punk;
618 TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj);
620 hres = This->pfnCreateInstance(pOuter, (LPVOID *) &punk);
621 if (FAILED(hres)) {
622 *ppobj = NULL;
623 return hres;
625 hres = IUnknown_QueryInterface(punk, riid, ppobj);
626 if (FAILED(hres)) {
627 *ppobj = NULL;
628 return hres;
630 IUnknown_Release(punk);
631 TRACE("returning (%p) -> %lx\n", *ppobj, hres);
632 return hres;
635 static HRESULT WINAPI MLANGCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
636 ICOM_THIS(IClassFactoryImpl,iface);
637 FIXME("(%p)->(%d),stub!\n",This,dolock);
638 return S_OK;
641 static IClassFactoryVtbl MLANGCF_Vtbl =
643 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
644 MLANGCF_QueryInterface,
645 MLANGCF_AddRef,
646 MLANGCF_Release,
647 MLANGCF_CreateInstance,
648 MLANGCF_LockServer
651 HRESULT WINAPI MLANG_DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv)
653 int i;
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))
665 break;
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;
680 factory->ref = 1;
682 factory->pfnCreateInstance = object_creation[i].pfnCreateInstance;
684 *ppv = &(factory->ITF_IClassFactory);
686 TRACE("(%p) <- %p\n", ppv, &(factory->ITF_IClassFactory) );
688 return S_OK;
692 /******************************************************************************/
694 typedef struct tagMLang_impl
696 IMLangFontLinkVtbl *vtbl_IMLangFontLink;
697 IMultiLanguageVtbl *vtbl_IMultiLanguage;
698 IMultiLanguage2Vtbl *vtbl_IMultiLanguage2;
699 DWORD ref;
700 DWORD total_cp, total_scripts;
701 } MLang_impl;
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);
713 if (ref == 0)
715 TRACE("Destroying %p\n", This);
716 HeapFree(GetProcessHeap(), 0, This);
719 return ref;
722 static HRESULT WINAPI MLang_QueryInterface(
723 MLang_impl* This,
724 REFIID riid,
725 void** ppvObject)
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))
733 MLang_AddRef(This);
734 TRACE("Returning IID_IMLangFontLink %p ref = %ld\n", This, This->ref);
735 *ppvObject = &(This->vtbl_IMLangFontLink);
736 return S_OK;
739 if (IsEqualGUID(riid, &IID_IMultiLanguage) )
741 MLang_AddRef(This);
742 TRACE("Returning IID_IMultiLanguage %p ref = %ld\n", This, This->ref);
743 *ppvObject = &(This->vtbl_IMultiLanguage);
744 return S_OK;
747 if (IsEqualGUID(riid, &IID_IMultiLanguage2) )
749 MLang_AddRef(This);
750 *ppvObject = &(This->vtbl_IMultiLanguage2);
751 TRACE("Returning IID_IMultiLanguage2 %p ref = %ld\n", This, This->ref);
752 return S_OK;
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;
764 DWORD ref;
765 MIMECPINFO *cpinfo;
766 DWORD total, pos;
767 } EnumCodePage_impl;
769 static HRESULT WINAPI fnIEnumCodePage_QueryInterface(
770 IEnumCodePage* iface,
771 REFIID riid,
772 void** ppvObject)
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);
784 return S_OK;
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);
805 if (ref == 0)
807 TRACE("Destroying %p\n", This);
808 HeapFree(GetProcessHeap(), 0, This->cpinfo);
809 HeapFree(GetProcessHeap(), 0, This);
812 return ref;
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);
821 return E_NOTIMPL;
824 static HRESULT WINAPI fnIEnumCodePage_Next(
825 IEnumCodePage* iface,
826 ULONG celt,
827 PMIMECPINFO rgelt,
828 ULONG* pceltFetched)
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;
834 *pceltFetched = 0;
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;
845 This->pos += celt;
847 return S_OK;
850 static HRESULT WINAPI fnIEnumCodePage_Reset(
851 IEnumCodePage* iface)
853 ICOM_THIS_MULTI(EnumCodePage_impl, vtbl_IEnumCodePage, iface);
854 TRACE("%p\n", This);
856 This->pos = 0;
857 return S_OK;
860 static HRESULT WINAPI fnIEnumCodePage_Skip(
861 IEnumCodePage* iface,
862 ULONG celt)
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 += ?? */
870 return S_OK;
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,
882 fnIEnumCodePage_Skip
885 static HRESULT EnumCodePage_create( MLang_impl* mlang, DWORD grfFlags,
886 LANGID LangId, IEnumCodePage** ppEnumCodePage )
888 EnumCodePage_impl *ecp;
889 MIMECPINFO *cpinfo;
890 UINT i, n;
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;
899 ecp->ref = 1;
900 ecp->pos = 0;
901 ecp->total = 0;
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)
907 ecp->total++;
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;
928 return S_OK;
931 /******************************************************************************/
933 typedef struct tagEnumScript_impl
935 IEnumScriptVtbl *vtbl_IEnumScript;
936 DWORD ref;
937 SCRIPTINFO *script_info;
938 DWORD total, pos;
939 } EnumScript_impl;
941 static HRESULT WINAPI fnIEnumScript_QueryInterface(
942 IEnumScript* iface,
943 REFIID riid,
944 void** ppvObject)
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);
956 return S_OK;
959 WARN("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
960 return E_NOINTERFACE;
963 static ULONG WINAPI fnIEnumScript_AddRef(
964 IEnumScript* iface)
966 ICOM_THIS_MULTI(EnumScript_impl, vtbl_IEnumScript, iface);
967 return ++(This->ref);
970 static ULONG WINAPI fnIEnumScript_Release(
971 IEnumScript* iface)
973 ICOM_THIS_MULTI(EnumScript_impl, vtbl_IEnumScript, iface);
974 ULONG ref = --This->ref;
976 TRACE("%p ref = %ld\n", This, ref);
977 if (ref == 0)
979 TRACE("Destroying %p\n", This);
980 HeapFree(GetProcessHeap(), 0, This);
983 return ref;
986 static HRESULT WINAPI fnIEnumScript_Clone(
987 IEnumScript* iface,
988 IEnumScript** ppEnum)
990 ICOM_THIS_MULTI(EnumScript_impl, vtbl_IEnumScript, iface);
991 FIXME("%p %p: stub!\n", This, ppEnum);
992 return E_NOTIMPL;
995 static HRESULT WINAPI fnIEnumScript_Next(
996 IEnumScript* iface,
997 ULONG celt,
998 PSCRIPTINFO rgelt,
999 ULONG* pceltFetched)
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;
1006 *pceltFetched = 0;
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;
1015 This->pos += celt;
1017 return S_OK;
1020 static HRESULT WINAPI fnIEnumScript_Reset(
1021 IEnumScript* iface)
1023 ICOM_THIS_MULTI(EnumScript_impl, vtbl_IEnumScript, iface);
1024 TRACE("%p\n", This);
1026 This->pos = 0;
1027 return S_OK;
1030 static HRESULT WINAPI fnIEnumScript_Skip(
1031 IEnumScript* iface,
1032 ULONG celt)
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 += ?? */
1040 return S_OK;
1043 static IEnumScriptVtbl IEnumScript_vtbl =
1045 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1046 fnIEnumScript_QueryInterface,
1047 fnIEnumScript_AddRef,
1048 fnIEnumScript_Release,
1049 fnIEnumScript_Clone,
1050 fnIEnumScript_Next,
1051 fnIEnumScript_Reset,
1052 fnIEnumScript_Skip
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;
1068 es->ref = 1;
1069 es->pos = 0;
1070 es->total = 1;
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;
1083 return S_OK;
1086 /******************************************************************************/
1088 static HRESULT WINAPI fnIMLangFontLink_QueryInterface(
1089 IMLangFontLink* iface,
1090 REFIID riid,
1091 void** ppvObject)
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,
1113 WCHAR chSrc,
1114 DWORD* pdwCodePages)
1116 FIXME("\n");
1117 return E_NOTIMPL;
1120 static HRESULT WINAPI fnIMLangFontLink_GetStrCodePages(
1121 IMLangFontLink* iface,
1122 const WCHAR* pszSrc,
1123 long cchSrc,
1124 DWORD dwPriorityCodePages,
1125 DWORD* pdwCodePages,
1126 long* pcchCodePages)
1128 FIXME("\n");
1129 return E_NOTIMPL;
1132 static HRESULT WINAPI fnIMLangFontLink_CodePageToCodePages(
1133 IMLangFontLink* iface,
1134 UINT uCodePage,
1135 DWORD* pdwCodePages)
1137 FIXME("\n");
1138 return E_NOTIMPL;
1141 static HRESULT WINAPI fnIMLangFontLink_CodePagesToCodePage(
1142 IMLangFontLink* iface,
1143 DWORD dwCodePages,
1144 UINT uDefaultCodePage,
1145 UINT* puCodePage)
1147 FIXME("\n");
1148 return E_NOTIMPL;
1151 static HRESULT WINAPI fnIMLangFontLink_GetFontCodePages(
1152 IMLangFontLink* iface,
1153 HDC hDC,
1154 HFONT hFont,
1155 DWORD* pdwCodePages)
1157 FIXME("\n");
1158 return E_NOTIMPL;
1161 static HRESULT WINAPI fnIMLangFontLink_MapFont(
1162 IMLangFontLink* iface,
1163 HDC hDC,
1164 DWORD dwCodePages,
1165 HFONT hSrcFont,
1166 HFONT* phDestFont)
1168 FIXME("\n");
1169 return E_NOTIMPL;
1172 static HRESULT WINAPI fnIMLangFontLink_ReleaseFont(
1173 IMLangFontLink* iface,
1174 HFONT hFont)
1176 FIXME("\n");
1177 return E_NOTIMPL;
1180 static HRESULT WINAPI fnIMLangFontLink_ResetFontMapping(
1181 IMLangFontLink* iface)
1183 FIXME("\n");
1184 return E_NOTIMPL;
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,
1208 REFIID riid,
1209 void** ppvObject)
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,
1229 UINT* pcCodePage)
1231 FIXME("\n");
1232 return E_NOTIMPL;
1235 static HRESULT WINAPI fnIMultiLanguage_GetCodePageInfo(
1236 IMultiLanguage* iface,
1237 UINT uiCodePage,
1238 PMIMECPINFO pCodePageInfo)
1240 FIXME("\n");
1241 return E_NOTIMPL;
1244 static HRESULT WINAPI fnIMultiLanguage_GetFamilyCodePage(
1245 IMultiLanguage* iface,
1246 UINT uiCodePage,
1247 UINT* puiFamilyCodePage)
1249 return GetFamilyCodePage(uiCodePage, puiFamilyCodePage);
1252 static HRESULT WINAPI fnIMultiLanguage_EnumCodePages(
1253 IMultiLanguage* iface,
1254 DWORD grfFlags,
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,
1265 BSTR Charset,
1266 PMIMECSETINFO pCharsetInfo)
1268 FIXME("\n");
1269 return E_NOTIMPL;
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,
1282 DWORD* pdwMode,
1283 DWORD dwSrcEncoding,
1284 DWORD dwDstEncoding,
1285 BYTE* pSrcStr,
1286 UINT* pcSrcSize,
1287 BYTE* pDstStr,
1288 UINT* pcDstSize)
1290 return ConvertINetString(pdwMode, dwSrcEncoding, dwDstEncoding,
1291 pSrcStr, pcSrcSize, pDstStr, pcDstSize);
1294 static HRESULT WINAPI fnIMultiLanguage_ConvertStringToUnicode(
1295 IMultiLanguage* iface,
1296 DWORD* pdwMode,
1297 DWORD dwEncoding,
1298 CHAR* pSrcStr,
1299 UINT* pcSrcSize,
1300 WCHAR* pDstStr,
1301 UINT* pcDstSize)
1303 return ConvertINetMultiByteToUnicode(pdwMode, dwEncoding,
1304 pSrcStr, pcSrcSize, pDstStr, pcDstSize);
1307 static HRESULT WINAPI fnIMultiLanguage_ConvertStringFromUnicode(
1308 IMultiLanguage* iface,
1309 DWORD* pdwMode,
1310 DWORD dwEncoding,
1311 WCHAR* pSrcStr,
1312 UINT* pcSrcSize,
1313 CHAR* pDstStr,
1314 UINT* pcDstSize)
1316 return ConvertINetUnicodeToMultiByte(pdwMode, dwEncoding,
1317 pSrcStr, pcSrcSize, pDstStr, pcDstSize);
1320 static HRESULT WINAPI fnIMultiLanguage_ConvertStringReset(
1321 IMultiLanguage* iface)
1323 FIXME("\n");
1324 return E_NOTIMPL;
1327 static HRESULT WINAPI fnIMultiLanguage_GetRfc1766FromLcid(
1328 IMultiLanguage* iface,
1329 LCID Locale,
1330 BSTR* pbstrRfc1766)
1332 FIXME("\n");
1333 return E_NOTIMPL;
1336 static HRESULT WINAPI fnIMultiLanguage_GetLcidFromRfc1766(
1337 IMultiLanguage* iface,
1338 LCID* pLocale,
1339 BSTR bstrRfc1766)
1341 FIXME("\n");
1342 return E_NOTIMPL;
1345 static HRESULT WINAPI fnIMultiLanguage_EnumRfc1766(
1346 IMultiLanguage* iface,
1347 IEnumRfc1766** ppEnumRfc1766)
1349 FIXME("\n");
1350 return E_NOTIMPL;
1353 static HRESULT WINAPI fnIMultiLanguage_GetRfc1766Info(
1354 IMultiLanguage* iface,
1355 LCID Locale,
1356 PRFC1766INFO pRfc1766Info)
1358 FIXME("\n");
1359 return E_NOTIMPL;
1362 static HRESULT WINAPI fnIMultiLanguage_CreateConvertCharset(
1363 IMultiLanguage* iface,
1364 UINT uiSrcCodePage,
1365 UINT uiDstCodePage,
1366 DWORD dwProperty,
1367 IMLangConvertCharset** ppMLangConvertCharset)
1369 FIXME("\n");
1370 return E_NOTIMPL;
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,
1401 REFIID riid,
1402 void** ppvObject)
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,
1422 UINT* pcCodePage)
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;
1430 return S_OK;
1433 static void fill_cp_info(const struct mlang_data *ml_data, UINT index, MIMECPINFO *mime_cp_info)
1435 CPINFOEXW cpinfo;
1436 CHARSETINFO csi;
1437 LOGFONTW lf;
1439 if (TranslateCharsetInfo((DWORD *)ml_data->family_codepage, &csi, TCI_SRCCODEPAGE))
1440 mime_cp_info->bGDICharset = csi.ciCharset;
1441 else
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));
1462 /* FIXME */
1463 GetObjectW(GetStockObject(SYSTEM_FIXED_FONT), sizeof(lf), &lf);
1464 strcpyW(mime_cp_info->wszFixedWidthFont, lf.lfFaceName);
1465 /* FIXME */
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,
1472 UINT uiCodePage,
1473 LANGID LangId,
1474 PMIMECPINFO pCodePageInfo)
1476 UINT i, n;
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);
1488 return S_OK;
1493 return S_FALSE;
1496 static HRESULT WINAPI fnIMultiLanguage2_GetFamilyCodePage(
1497 IMultiLanguage2* iface,
1498 UINT uiCodePage,
1499 UINT* puiFamilyCodePage)
1501 return GetFamilyCodePage(uiCodePage, puiFamilyCodePage);
1504 static HRESULT WINAPI fnIMultiLanguage2_EnumCodePages(
1505 IMultiLanguage2* iface,
1506 DWORD grfFlags,
1507 LANGID LangId,
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,
1518 BSTR Charset,
1519 PMIMECSETINFO pCharsetInfo)
1521 ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage2, iface);
1522 FIXME("%p %s %p\n", This, debugstr_w(Charset), pCharsetInfo);
1523 return E_NOTIMPL;
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,
1536 DWORD* pdwMode,
1537 DWORD dwSrcEncoding,
1538 DWORD dwDstEncoding,
1539 BYTE* pSrcStr,
1540 UINT* pcSrcSize,
1541 BYTE* pDstStr,
1542 UINT* pcDstSize)
1544 return ConvertINetString(pdwMode, dwSrcEncoding, dwDstEncoding,
1545 pSrcStr, pcSrcSize, pDstStr, pcDstSize);
1548 static HRESULT WINAPI fnIMultiLanguage2_ConvertStringToUnicode(
1549 IMultiLanguage2* iface,
1550 DWORD* pdwMode,
1551 DWORD dwEncoding,
1552 CHAR* pSrcStr,
1553 UINT* pcSrcSize,
1554 WCHAR* pDstStr,
1555 UINT* pcDstSize)
1557 return ConvertINetMultiByteToUnicode(pdwMode, dwEncoding,
1558 pSrcStr, pcSrcSize, pDstStr, pcDstSize);
1561 static HRESULT WINAPI fnIMultiLanguage2_ConvertStringFromUnicode(
1562 IMultiLanguage2* iface,
1563 DWORD* pdwMode,
1564 DWORD dwEncoding,
1565 WCHAR* pSrcStr,
1566 UINT* pcSrcSize,
1567 CHAR* pDstStr,
1568 UINT* pcDstSize)
1570 return ConvertINetUnicodeToMultiByte(pdwMode, dwEncoding,
1571 pSrcStr, pcSrcSize, pDstStr, pcDstSize);
1574 static HRESULT WINAPI fnIMultiLanguage2_ConvertStringReset(
1575 IMultiLanguage2* iface)
1577 FIXME("\n");
1578 return E_NOTIMPL;
1581 static HRESULT WINAPI fnIMultiLanguage2_GetRfc1766FromLcid(
1582 IMultiLanguage2* iface,
1583 LCID Locale,
1584 BSTR* pbstrRfc1766)
1586 FIXME("\n");
1587 return E_NOTIMPL;
1590 static HRESULT WINAPI fnIMultiLanguage2_GetLcidFromRfc1766(
1591 IMultiLanguage2* iface,
1592 LCID* pLocale,
1593 BSTR bstrRfc1766)
1595 FIXME("\n");
1596 return E_NOTIMPL;
1599 static HRESULT WINAPI fnIMultiLanguage2_EnumRfc1766(
1600 IMultiLanguage2* iface,
1601 LANGID LangId,
1602 IEnumRfc1766** ppEnumRfc1766)
1604 FIXME("\n");
1605 return E_NOTIMPL;
1608 static HRESULT WINAPI fnIMultiLanguage2_GetRfc1766Info(
1609 IMultiLanguage2* iface,
1610 LCID Locale,
1611 LANGID LangId,
1612 PRFC1766INFO pRfc1766Info)
1614 FIXME("\n");
1615 return E_NOTIMPL;
1618 static HRESULT WINAPI fnIMultiLanguage2_CreateConvertCharset(
1619 IMultiLanguage2* iface,
1620 UINT uiSrcCodePage,
1621 UINT uiDstCodePage,
1622 DWORD dwProperty,
1623 IMLangConvertCharset** ppMLangConvertCharset)
1625 FIXME("\n");
1626 return E_NOTIMPL;
1629 static HRESULT WINAPI fnIMultiLanguage2_ConvertStringInIStream(
1630 IMultiLanguage2* iface,
1631 DWORD* pdwMode,
1632 DWORD dwFlag,
1633 WCHAR* lpFallBack,
1634 DWORD dwSrcEncoding,
1635 DWORD dwDstEncoding,
1636 IStream* pstmIn,
1637 IStream* pstmOut)
1639 FIXME("\n");
1640 return E_NOTIMPL;
1643 static HRESULT WINAPI fnIMultiLanguage2_ConvertStringToUnicodeEx(
1644 IMultiLanguage2* iface,
1645 DWORD* pdwMode,
1646 DWORD dwEncoding,
1647 CHAR* pSrcStr,
1648 UINT* pcSrcSize,
1649 WCHAR* pDstStr,
1650 UINT* pcDstSize,
1651 DWORD dwFlag,
1652 WCHAR* lpFallBack)
1654 FIXME("\n");
1655 return E_NOTIMPL;
1658 static HRESULT WINAPI fnIMultiLanguage2_ConvertStringFromUnicodeEx(
1659 IMultiLanguage2* This,
1660 DWORD* pdwMode,
1661 DWORD dwEncoding,
1662 WCHAR* pSrcStr,
1663 UINT* pcSrcSize,
1664 CHAR* pDstStr,
1665 UINT* pcDstSize,
1666 DWORD dwFlag,
1667 WCHAR* lpFallBack)
1669 FIXME("\n");
1670 return E_NOTIMPL;
1673 static HRESULT WINAPI fnIMultiLanguage2_DetectCodepageInIStream(
1674 IMultiLanguage2* iface,
1675 DWORD dwFlag,
1676 DWORD dwPrefWinCodePage,
1677 IStream* pstmIn,
1678 DetectEncodingInfo* lpEncoding,
1679 INT* pnScores)
1681 FIXME("\n");
1682 return E_NOTIMPL;
1685 static HRESULT WINAPI fnIMultiLanguage2_DetectInputCodepage(
1686 IMultiLanguage2* iface,
1687 DWORD dwFlag,
1688 DWORD dwPrefWinCodePage,
1689 CHAR* pSrcStr,
1690 INT* pcSrcSize,
1691 DetectEncodingInfo* lpEncoding,
1692 INT* pnScores)
1694 FIXME("\n");
1695 return E_NOTIMPL;
1698 static HRESULT WINAPI fnIMultiLanguage2_ValidateCodePage(
1699 IMultiLanguage2* iface,
1700 UINT uiCodePage,
1701 HWND hwnd)
1703 FIXME("\n");
1704 return E_NOTIMPL;
1707 static HRESULT WINAPI fnIMultiLanguage2_GetCodePageDescription(
1708 IMultiLanguage2* iface,
1709 UINT uiCodePage,
1710 LCID lcid,
1711 LPWSTR lpWideCharStr,
1712 int cchWideChar)
1714 FIXME("\n");
1715 return E_NOTIMPL;
1718 static HRESULT WINAPI fnIMultiLanguage2_IsCodePageInstallable(
1719 IMultiLanguage2* iface,
1720 UINT uiCodePage)
1722 FIXME("\n");
1723 return E_NOTIMPL;
1726 static HRESULT WINAPI fnIMultiLanguage2_SetMimeDBSource(
1727 IMultiLanguage2* iface,
1728 MIMECONTF dwSource)
1730 FIXME("\n");
1731 return E_NOTIMPL;
1734 static HRESULT WINAPI fnIMultiLanguage2_GetNumberOfScripts(
1735 IMultiLanguage2* iface,
1736 UINT* pnScripts)
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;
1744 return S_OK;
1747 static HRESULT WINAPI fnIMultiLanguage2_EnumScripts(
1748 IMultiLanguage2* iface,
1749 DWORD dwFlags,
1750 LANGID LangId,
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,
1761 UINT uiCodePage,
1762 HWND hwnd,
1763 DWORD dwfIODControl)
1765 ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage2, iface);
1766 FIXME("%p %u %p %08lx: stub!\n", This, uiCodePage, hwnd, dwfIODControl);
1768 return S_FALSE;
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)
1808 MLang_impl *mlang;
1809 UINT i;
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;
1824 mlang->ref = 1;
1825 *ppObj = (LPVOID) mlang;
1826 TRACE("returning %p\n", mlang);
1827 return S_OK;
1830 /******************************************************************************/
1832 HRESULT WINAPI MLANG_DllCanUnloadNow(void)
1834 FIXME("\n");
1835 return S_FALSE;
1838 HRESULT WINAPI MLANG_DllRegisterServer(void)
1840 FIXME("\n");
1841 return S_OK;
1844 HRESULT WINAPI MLANG_DllUnregisterServer(void)
1846 FIXME("\n");
1847 return S_OK;