ReactOS 0.4.15-dev-7934-g1dc8d80
mimeintl.c
Go to the documentation of this file.
1/*
2 * MimeInternational tests
3 *
4 * Copyright 2008 Huw Davies
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20
21#define COBJMACROS
22#define NONAMELESSUNION
23
24#include "windows.h"
25#include "ole2.h"
26#include "ocidl.h"
27
28#include "mimeole.h"
29
30#include "initguid.h"
31#include "mlang.h"
32
33#include <stdio.h>
34
35#include "wine/test.h"
36
37static void test_create(void)
38{
39 IMimeInternational *internat, *internat2;
40 HRESULT hr;
41 ULONG ref;
42
43 hr = MimeOleGetInternat(&internat);
44 ok(hr == S_OK, "ret %08x\n", hr);
45 hr = MimeOleGetInternat(&internat2);
46 ok(hr == S_OK, "ret %08x\n", hr);
47
48 /* Under w2k8 it's no longer a singleton */
49 if(internat == internat2)
50 {
51 /* test to show that the object is a singleton with
52 a reference held by the dll. */
53 ref = IMimeInternational_Release(internat2);
54 ok(ref == 2 ||
55 ref == 1, /* win95 - object is a static singleton */
56 "got %d\n", ref);
57
58 ref = IMimeInternational_Release(internat);
59 ok(ref == 1, "got %d\n", ref);
60 }
61 else
62 {
63 ref = IMimeInternational_Release(internat2);
64 ok(ref == 0, "got %d\n", ref);
65
66 ref = IMimeInternational_Release(internat);
67 ok(ref == 0, "got %d\n", ref);
68 }
69
70}
71
72static inline HRESULT get_mlang(IMultiLanguage **ml)
73{
74 return CoCreateInstance(&CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER,
75 &IID_IMultiLanguage, (void **)ml);
76}
77
78static HRESULT mlang_getcsetinfo(const char *charset, MIMECSETINFO *mlang_info)
79{
81 BSTR bstr = SysAllocStringLen(NULL, len - 1);
82 HRESULT hr;
83 IMultiLanguage *ml;
84
85 MultiByteToWideChar(CP_ACP, 0, charset, -1, bstr, len);
86
87 hr = get_mlang(&ml);
88
89 if(SUCCEEDED(hr))
90 {
91 hr = IMultiLanguage_GetCharsetInfo(ml, bstr, mlang_info);
92 IMultiLanguage_Release(ml);
93 }
94 SysFreeString(bstr);
95 if(FAILED(hr)) hr = MIME_E_NOT_FOUND;
96 return hr;
97}
98
99static HRESULT mlang_getcodepageinfo(UINT cp, MIMECPINFO *mlang_cp_info)
100{
101 HRESULT hr;
102 IMultiLanguage *ml;
103
104 hr = get_mlang(&ml);
105
106 if(SUCCEEDED(hr))
107 {
108 hr = IMultiLanguage_GetCodePageInfo(ml, cp, mlang_cp_info);
109 IMultiLanguage_Release(ml);
110 }
111 return hr;
112}
113
114static HRESULT mlang_getcsetinfo_from_cp(UINT cp, CHARSETTYPE charset_type, MIMECSETINFO *mlang_info)
115{
116 MIMECPINFO mlang_cp_info;
117 WCHAR *charset_name;
118 HRESULT hr;
119 IMultiLanguage *ml;
120
121 hr = mlang_getcodepageinfo(cp, &mlang_cp_info);
122 if(FAILED(hr)) return hr;
123
124 switch(charset_type)
125 {
126 case CHARSET_BODY:
127 charset_name = mlang_cp_info.wszBodyCharset;
128 break;
129 case CHARSET_HEADER:
130 charset_name = mlang_cp_info.wszHeaderCharset;
131 break;
132 case CHARSET_WEB:
133 charset_name = mlang_cp_info.wszWebCharset;
134 break;
135 }
136
137 hr = get_mlang(&ml);
138
139 if(SUCCEEDED(hr))
140 {
141 hr = IMultiLanguage_GetCharsetInfo(ml, charset_name, mlang_info);
142 IMultiLanguage_Release(ml);
143 }
144 return hr;
145}
146
147static void test_charset(void)
148{
149 IMimeInternational *internat;
150 HRESULT hr;
151 HCHARSET hcs, hcs_windows_1252, hcs_windows_1251;
152 INETCSETINFO cs_info;
153 MIMECSETINFO mlang_cs_info;
154
155 hr = MimeOleGetInternat(&internat);
156 ok(hr == S_OK, "ret %08x\n", hr);
157
158 hr = IMimeInternational_FindCharset(internat, "nonexistent", &hcs);
159 ok(hr == MIME_E_NOT_FOUND, "got %08x\n", hr);
160
161 hr = IMimeInternational_FindCharset(internat, "windows-1252", &hcs_windows_1252);
162 ok(hr == S_OK, "got %08x\n", hr);
163 hr = IMimeInternational_FindCharset(internat, "windows-1252", &hcs);
164 ok(hr == S_OK, "got %08x\n", hr);
165 ok(hcs_windows_1252 == hcs, "got different hcharsets for the same name\n");
166 hr = IMimeInternational_FindCharset(internat, "WiNdoWs-1252", &hcs);
167 ok(hr == S_OK, "got %08x\n", hr);
168 ok(hcs_windows_1252 == hcs, "got different hcharsets for the same name\n");
169
170 hr = IMimeInternational_FindCharset(internat, "windows-1251", &hcs_windows_1251);
171 ok(hr == S_OK, "got %08x\n", hr);
172 ok(hcs_windows_1252 != hcs_windows_1251, "got the same hcharset for the different names\n");
173
174 hr = IMimeInternational_GetCharsetInfo(internat, hcs_windows_1252, &cs_info);
175 ok(hr == S_OK, "got %08x\n", hr);
176
177 hr = mlang_getcsetinfo("windows-1252", &mlang_cs_info);
178 ok(hr == S_OK, "got %08x\n", hr);
179 ok(cs_info.cpiWindows == mlang_cs_info.uiCodePage, "cpiWindows %d while mlang uiCodePage %d\n",
180 cs_info.cpiWindows, mlang_cs_info.uiCodePage);
181 ok(cs_info.cpiInternet == mlang_cs_info.uiInternetEncoding, "cpiInternet %d while mlang uiInternetEncoding %d\n",
182 cs_info.cpiInternet, mlang_cs_info.uiInternetEncoding);
183 ok(cs_info.hCharset == hcs_windows_1252, "hCharset doesn't match requested\n");
184 ok(!strcmp(cs_info.szName, "windows-1252"), "szName doesn't match requested\n");
185
186 hr = IMimeInternational_GetCodePageCharset(internat, 1252, CHARSET_BODY, &hcs);
187 ok(hr == S_OK, "got %08x\n", hr);
188 hr = IMimeInternational_GetCharsetInfo(internat, hcs, &cs_info);
189 ok(hr == S_OK, "got %08x\n", hr);
190
191 hr = mlang_getcsetinfo_from_cp(1252, CHARSET_BODY, &mlang_cs_info);
192 ok(hr == S_OK, "got %08x\n", hr);
193 ok(cs_info.cpiWindows == mlang_cs_info.uiCodePage, "cpiWindows %d while mlang uiCodePage %d\n",
194 cs_info.cpiWindows, mlang_cs_info.uiCodePage);
195 ok(cs_info.cpiInternet == mlang_cs_info.uiInternetEncoding, "cpiInternet %d while mlang uiInternetEncoding %d\n",
196 cs_info.cpiInternet, mlang_cs_info.uiInternetEncoding);
197
198 IMimeInternational_Release(internat);
199}
200
201static void test_defaultcharset(void)
202{
203 IMimeInternational *internat;
204 HRESULT hr;
205 HCHARSET hcs_default, hcs, hcs_windows_1251;
206
207 hr = MimeOleGetInternat(&internat);
208 ok(hr == S_OK, "ret %08x\n", hr);
209
210 hr = IMimeInternational_GetDefaultCharset(internat, &hcs_default);
211 ok(hr == S_OK, "ret %08x\n", hr);
212 hr = IMimeInternational_GetCodePageCharset(internat, GetACP(), CHARSET_BODY, &hcs);
213 ok(hr == S_OK, "ret %08x\n", hr);
214 ok(hcs_default == hcs, "Unexpected default charset\n");
215
216 hr = IMimeInternational_FindCharset(internat, "windows-1251", &hcs_windows_1251);
217 ok(hr == S_OK, "got %08x\n", hr);
218 hr = IMimeInternational_SetDefaultCharset(internat, hcs_windows_1251);
219 ok(hr == S_OK, "ret %08x\n", hr);
220 hr = IMimeInternational_GetDefaultCharset(internat, &hcs);
221 ok(hr == S_OK, "ret %08x\n", hr);
222 ok(hcs == hcs_windows_1251, "didn't retrieve recently set default\n");
223 /* Set the old default back again */
224 hr = IMimeInternational_SetDefaultCharset(internat, hcs_default);
225 ok(hr == S_OK, "ret %08x\n", hr);
226
227 IMimeInternational_Release(internat);
228}
229
230static void test_convert(void)
231{
232 IMimeInternational *internat;
233 HRESULT hr;
234 BLOB src, dst;
235 ULONG read;
236 PROPVARIANT prop_in, prop_out;
237 static char test_string[] = "test string";
238 static WCHAR test_stringW[] = {'t','e','s','t',' ','s','t','r','i','n','g',0};
239
240 hr = MimeOleGetInternat(&internat);
241 ok(hr == S_OK, "ret %08x\n", hr);
242
243 src.pBlobData = (BYTE*)test_string;
244 src.cbSize = sizeof(test_string);
245 hr = IMimeInternational_ConvertBuffer(internat, 1252, 28591, &src, &dst, &read);
246 ok(hr == S_OK, "ret %08x\n", hr);
247 ok(read == sizeof(test_string), "got %d\n", read);
248 ok(dst.cbSize == sizeof(test_string), "got %d\n", dst.cbSize);
249 CoTaskMemFree(dst.pBlobData);
250
251 src.cbSize = 2;
252 hr = IMimeInternational_ConvertBuffer(internat, 1252, 28591, &src, &dst, &read);
253 ok(hr == S_OK, "ret %08x\n", hr);
254 ok(read == 2, "got %d\n", read);
255 ok(dst.cbSize == 2, "got %d\n", dst.cbSize);
256 CoTaskMemFree(dst.pBlobData);
257
258 prop_in.vt = VT_LPWSTR;
259 prop_in.u.pwszVal = test_stringW;
260 hr = IMimeInternational_ConvertString(internat, CP_UNICODE, 1252, &prop_in, &prop_out);
261 ok(hr == S_OK, "ret %08x\n", hr);
262 ok(prop_out.vt == VT_LPSTR, "got %d\n", prop_out.vt);
263 ok(!strcmp(prop_out.u.pszVal, test_string), "got %s\n", prop_out.u.pszVal);
264 PropVariantClear(&prop_out);
265
266 /* If in.vt is VT_LPWSTR, ignore cpiSrc */
267 prop_in.vt = VT_LPWSTR;
268 prop_in.u.pwszVal = test_stringW;
269 hr = IMimeInternational_ConvertString(internat, 28591, 1252, &prop_in, &prop_out);
270 ok(hr == S_OK, "ret %08x\n", hr);
271 ok(prop_out.vt == VT_LPSTR, "got %d\n", prop_out.vt);
272 ok(!strcmp(prop_out.u.pszVal, test_string), "got %s\n", prop_out.u.pszVal);
273 PropVariantClear(&prop_out);
274
275 prop_in.vt = VT_LPSTR;
276 prop_in.u.pszVal = test_string;
277 hr = IMimeInternational_ConvertString(internat, 28591, CP_UNICODE, &prop_in, &prop_out);
278 ok(hr == S_OK, "ret %08x\n", hr);
279 ok(prop_out.vt == VT_LPWSTR, "got %d\n", prop_out.vt);
280 ok(!lstrcmpW(prop_out.u.pwszVal, test_stringW), "mismatched strings\n");
281 PropVariantClear(&prop_out);
282
283 /* If in.vt is VT_LPSTR and cpiSrc is CP_UNICODE, use another multibyte codepage (probably GetACP()) */
284 prop_in.vt = VT_LPSTR;
285 prop_in.u.pszVal = test_string;
286 hr = IMimeInternational_ConvertString(internat, CP_UNICODE, CP_UNICODE, &prop_in, &prop_out);
287 ok(hr == S_OK, "ret %08x\n", hr);
288 ok(prop_out.vt == VT_LPWSTR, "got %d\n", prop_out.vt);
289 ok(!lstrcmpW(prop_out.u.pwszVal, test_stringW), "mismatched strings\n");
290 PropVariantClear(&prop_out);
291
292 IMimeInternational_Release(internat);
293}
294
295START_TEST(mimeintl)
296{
298 test_create();
299 test_charset();
301 test_convert();
303}
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
#define read
Definition: acwin.h:96
#define ok(value,...)
Definition: atltest.h:57
#define START_TEST(x)
Definition: atltest.h:75
CFF_Charset charset
Definition: cffcmap.c:138
#define NULL
Definition: types.h:112
#define CP_ACP
Definition: compat.h:109
OLECHAR * BSTR
Definition: compat.h:2293
#define MultiByteToWideChar
Definition: compat.h:110
@ VT_LPSTR
Definition: compat.h:2324
@ VT_LPWSTR
Definition: compat.h:2325
static HRESULT mlang_getcsetinfo(const char *charset, MIMECSETINFO *mlang_info)
Definition: mimeintl.c:203
HRESULT WINAPI MimeOleGetInternat(IMimeInternational **internat)
Definition: mimeintl.c:543
static HRESULT get_mlang(IMultiLanguage **ml)
Definition: mimeintl.c:65
static HRESULT mlang_getcodepageinfo(UINT cp, MIMECPINFO *mlang_cp_info)
Definition: mimeintl.c:147
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
HRESULT WINAPI DECLSPEC_HOTPATCH OleInitialize(LPVOID reserved)
Definition: ole2.c:169
HRESULT WINAPI PropVariantClear(PROPVARIANT *pvar)
Definition: ole2.c:2968
void WINAPI DECLSPEC_HOTPATCH OleUninitialize(void)
Definition: ole2.c:230
#define CP_UNICODE
Definition: stg_prop.c:74
unsigned long DWORD
Definition: ntddk_ex.h:95
GLenum src
Definition: glext.h:6340
GLenum GLenum dst
Definition: glext.h:6340
GLenum GLsizei len
Definition: glext.h:6722
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:442
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
int WINAPI lstrcmpW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:170
POINT cp
Definition: magnifier.c:59
static HRESULT mlang_getcsetinfo_from_cp(UINT cp, CHARSETTYPE charset_type, MIMECSETINFO *mlang_info)
Definition: mimeintl.c:114
static void test_create(void)
Definition: mimeintl.c:37
static void test_convert(void)
Definition: mimeintl.c:230
static void test_charset(void)
Definition: mimeintl.c:147
static void test_defaultcharset(void)
Definition: mimeintl.c:201
unsigned int UINT
Definition: ndis.h:50
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271
BSTR WINAPI SysAllocStringLen(const OLECHAR *str, unsigned int len)
Definition: oleaut.c:339
HRESULT hr
Definition: shlfolder.c:183
Definition: nspapi.h:57
Definition: send.c:48
void test_string()
Definition: test_string.cpp:38
uint32_t ULONG
Definition: typedefs.h:59
UINT WINAPI GetACP(void)
Definition: nls.c:2307
__wchar_t WCHAR
Definition: xmlstorage.h:180
unsigned char BYTE
Definition: xxhash.c:193