2 * Implementation of hyperlinking (hlink.dll)
4 * Copyright 2006 Mike McCormack
5 * Copyright 2007-2008 Jacek Caban for CodeWeavers
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
30 #include "wine/test.h"
32 #define DEFINE_EXPECT(func) \
33 static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
35 #define SET_EXPECT(func) \
36 expect_ ## func = TRUE
38 #define CHECK_EXPECT2(func) \
40 ok(expect_ ##func, "unexpected call " #func "\n"); \
41 called_ ## func = TRUE; \
44 #define CHECK_EXPECT(func) \
46 CHECK_EXPECT2(func); \
47 expect_ ## func = FALSE; \
50 #define CHECK_CALLED(func) \
52 ok(called_ ## func, "expected " #func "\n"); \
53 expect_ ## func = called_ ## func = FALSE; \
56 DEFINE_EXPECT(IsSystemMoniker
);
57 DEFINE_EXPECT(BindToStorage
);
58 DEFINE_EXPECT(BindToObject
);
59 DEFINE_EXPECT(GetDisplayName
);
61 DEFINE_EXPECT(ComposeWith
);
62 DEFINE_EXPECT(OnNavigationComplete
);
64 DEFINE_EXPECT(Reduce
);
66 DEFINE_EXPECT(GetClassID
);
69 DEFINE_EXPECT(HBC_QueryInterface_IHlinkHistory
);
70 DEFINE_EXPECT(HBC_QueryInterface_IMarshal
);
71 DEFINE_EXPECT(HBC_QueryInterface_IdentityUnmarshal
);
72 DEFINE_EXPECT(HBC_QueryInterface_IUnknown
);
73 DEFINE_EXPECT(HBC_GetObject
);
74 DEFINE_EXPECT(HBC_UpdateHlink
);
76 DEFINE_EXPECT(HT_QueryInterface_IHlinkTarget
);
77 DEFINE_EXPECT(HT_SetBrowseContext
);
78 DEFINE_EXPECT(HT_GetBrowseContext
);
79 DEFINE_EXPECT(HT_Navigate
);
80 DEFINE_EXPECT(HT_GetFriendlyName
);
82 DEFINE_EXPECT(HLF_UpdateHlink
);
84 DEFINE_GUID(CLSID_IdentityUnmarshal
,0x0000001b,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
85 DEFINE_GUID(IID_IHlinkHistory
,0x79eac9c8,0xbaf9,0x11ce,0x8c,0x82,0x00,0xaa,0x00,0x4b,0xa9,0x0b);
87 static const WCHAR winehq_urlW
[] =
88 {'h','t','t','p',':','/','/','t','e','s','t','.','w','i','n','e','h','q','.','o','r','g',
89 '/','t','e','s','t','s','/','h','e','l','l','o','.','h','t','m','l',0};
90 static const WCHAR winehq_404W
[] =
91 {'h','t','t','p',':','/','/','t','e','s','t','.','w','i','n','e','h','q','.','o','r','g',
92 '/','t','e','s','t','s','/','f','a','k','e','u','r','l',0};
94 static void test_HlinkIsShortcut(void)
99 static const WCHAR file0
[] = {'f','i','l','e',0};
100 static const WCHAR file1
[] = {'f','i','l','e','.','u','r','l',0};
101 static const WCHAR file2
[] = {'f','i','l','e','.','l','n','k',0};
102 static const WCHAR file3
[] = {'f','i','l','e','.','u','R','l',0};
103 static const WCHAR file4
[] = {'f','i','l','e','u','r','l',0};
104 static const WCHAR file5
[] = {'c',':','\\','f','i','l','e','.','u','r','l',0};
105 static const WCHAR file6
[] = {'c',':','\\','f','i','l','e','.','l','n','k',0};
106 static const WCHAR file7
[] = {'.','u','r','l',0};
111 } shortcut_test
[] = {
123 for(i
=0; i
<sizeof(shortcut_test
)/sizeof(shortcut_test
[0]); i
++) {
124 hres
= HlinkIsShortcut(shortcut_test
[i
].file
);
125 ok(hres
== shortcut_test
[i
].hres
, "[%d] HlinkIsShortcut returned %08x, expected %08x\n",
126 i
, hres
, shortcut_test
[i
].hres
);
130 static void test_reference(void)
135 const WCHAR url
[] = { 'h','t','t','p',':','/','/','w','i','n','e','h','q','.','o','r','g',0 };
136 const WCHAR url2
[] = { 'h','t','t','p',':','/','/','w','i','n','e','h','q','.','o','r','g','/',0 };
139 r
= HlinkCreateFromString(url
, NULL
, NULL
, NULL
,
140 0, NULL
, &IID_IHlink
, (LPVOID
*) &lnk
);
141 ok(r
== S_OK
, "failed to create link\n");
145 r
= IHlink_GetMonikerReference(lnk
, HLINKGETREF_DEFAULT
, NULL
, NULL
);
146 ok(r
== S_OK
, "failed\n");
148 r
= IHlink_GetMonikerReference(lnk
, HLINKGETREF_DEFAULT
, &mk
, &str
);
149 ok(r
== S_OK
, "failed\n");
150 ok(mk
!= NULL
, "no moniker\n");
151 ok(str
== NULL
, "string should be null\n");
153 r
= IMoniker_Release(mk
);
154 ok( r
== 1, "moniker refcount wrong\n");
156 r
= IHlink_GetStringReference(lnk
, -1, &str
, NULL
);
157 ok(r
== S_OK
, "failed\n");
160 r
= IHlink_GetStringReference(lnk
, -1, NULL
, NULL
);
161 ok(r
== S_OK
, "failed, r=%08x\n", r
);
163 r
= IHlink_GetStringReference(lnk
, -1, NULL
, &str
);
164 ok(r
== S_OK
, "failed, r=%08x\n", r
);
165 ok(str
== NULL
, "string should be null\n");
167 r
= IHlink_GetStringReference(lnk
, HLINKGETREF_DEFAULT
, &str
, NULL
);
168 ok(r
== S_OK
, "failed\n");
169 ok(!lstrcmpW(str
, url2
), "url wrong\n");
172 r
= IHlink_GetStringReference(lnk
, HLINKGETREF_DEFAULT
, NULL
, NULL
);
173 ok(r
== S_OK
, "failed\n");
175 r
= IHlink_GetStringReference(lnk
, HLINKGETREF_DEFAULT
, NULL
, &str
);
176 ok(r
== S_OK
, "failed\n");
177 ok(str
== NULL
, "string should be null\n");
179 /* Unimplented functions checks */
180 r
= IHlink_GetAdditionalParams(lnk
, NULL
);
181 ok(r
== E_NOTIMPL
, "failed\n");
183 r
= IHlink_SetAdditionalParams(lnk
, NULL
);
184 ok(r
== E_NOTIMPL
, "failed\n");
190 static const unsigned char expected_hlink_data
[] =
192 0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,
193 0xe0,0xc9,0xea,0x79,0xf9,0xba,0xce,0x11,
194 0x8c,0x82,0x00,0xaa,0x00,0x4b,0xa9,0x0b,
195 0x26,0x00,0x00,0x00,0x68,0x00,0x74,0x00,
196 0x74,0x00,0x70,0x00,0x3a,0x00,0x2f,0x00,
197 0x2f,0x00,0x77,0x00,0x69,0x00,0x6e,0x00,
198 0x65,0x00,0x68,0x00,0x71,0x00,0x2e,0x00,
199 0x6f,0x00,0x72,0x00,0x67,0x00,0x2f,0x00,
204 static const unsigned char expected_hlink_data_ie7
[] =
206 0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,
207 0xe0,0xc9,0xea,0x79,0xf9,0xba,0xce,0x11,
208 0x8c,0x82,0x00,0xaa,0x00,0x4b,0xa9,0x0b,
209 0x3e,0x00,0x00,0x00,0x68,0x00,0x74,0x00,
210 0x74,0x00,0x70,0x00,0x3a,0x00,0x2f,0x00,
211 0x2f,0x00,0x77,0x00,0x69,0x00,0x6e,0x00,
212 0x65,0x00,0x68,0x00,0x71,0x00,0x2e,0x00,
213 0x6f,0x00,0x72,0x00,0x67,0x00,0x2f,0x00,
214 0x00,0x00,0x79,0x58,0x81,0xf4,0x3b,0x1d,
215 0x7f,0x48,0xaf,0x2c,0x82,0x5d,0xc4,0x85,
216 0x27,0x63,0x00,0x00,0x00,0x00,0xa5,0xab,
220 /* url + friendly name */
221 static const unsigned char expected_hlink_data2
[] =
223 0x02,0x00,0x00,0x00,0x17,0x00,0x00,0x00,
224 0x08,0x00,0x00,0x00,0x57,0x00,0x69,0x00,
225 0x6e,0x00,0x65,0x00,0x20,0x00,0x48,0x00,
226 0x51,0x00,0x00,0x00,0xe0,0xc9,0xea,0x79,
227 0xf9,0xba,0xce,0x11,0x8c,0x82,0x00,0xaa,
228 0x00,0x4b,0xa9,0x0b,0x26,0x00,0x00,0x00,
229 0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,
230 0x3a,0x00,0x2f,0x00,0x2f,0x00,0x77,0x00,
231 0x69,0x00,0x6e,0x00,0x65,0x00,0x68,0x00,
232 0x71,0x00,0x2e,0x00,0x6f,0x00,0x72,0x00,
233 0x67,0x00,0x2f,0x00,0x00,0x00,
236 /* url + friendly name (IE7) */
237 static const unsigned char expected_hlink_data2_ie7
[] =
239 0x02,0x00,0x00,0x00,0x17,0x00,0x00,0x00,
240 0x08,0x00,0x00,0x00,0x57,0x00,0x69,0x00,
241 0x6e,0x00,0x65,0x00,0x20,0x00,0x48,0x00,
242 0x51,0x00,0x00,0x00,0xe0,0xc9,0xea,0x79,
243 0xf9,0xba,0xce,0x11,0x8c,0x82,0x00,0xaa,
244 0x00,0x4b,0xa9,0x0b,0x3e,0x00,0x00,0x00,
245 0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,
246 0x3a,0x00,0x2f,0x00,0x2f,0x00,0x77,0x00,
247 0x69,0x00,0x6e,0x00,0x65,0x00,0x68,0x00,
248 0x71,0x00,0x2e,0x00,0x6f,0x00,0x72,0x00,
249 0x67,0x00,0x2f,0x00,0x00,0x00,0x79,0x58,
250 0x81,0xf4,0x3b,0x1d,0x7f,0x48,0xaf,0x2c,
251 0x82,0x5d,0xc4,0x85,0x27,0x63,0x00,0x00,
252 0x00,0x00,0xa5,0xab,0x00,0x00,
255 /* url + friendly name + location */
256 static const unsigned char expected_hlink_data3
[] =
258 0x02,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,
259 0x08,0x00,0x00,0x00,0x57,0x00,0x69,0x00,
260 0x6e,0x00,0x65,0x00,0x20,0x00,0x48,0x00,
261 0x51,0x00,0x00,0x00,0xe0,0xc9,0xea,0x79,
262 0xf9,0xba,0xce,0x11,0x8c,0x82,0x00,0xaa,
263 0x00,0x4b,0xa9,0x0b,0x26,0x00,0x00,0x00,
264 0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,
265 0x3a,0x00,0x2f,0x00,0x2f,0x00,0x77,0x00,
266 0x69,0x00,0x6e,0x00,0x65,0x00,0x68,0x00,
267 0x71,0x00,0x2e,0x00,0x6f,0x00,0x72,0x00,
268 0x67,0x00,0x2f,0x00,0x00,0x00,0x07,0x00,
269 0x00,0x00,0x5f,0x00,0x62,0x00,0x6c,0x00,
270 0x61,0x00,0x6e,0x00,0x6b,0x00,0x00,0x00,
273 /* url + friendly name + location (IE7) */
274 static const unsigned char expected_hlink_data3_ie7
[] =
276 0x02,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,
277 0x08,0x00,0x00,0x00,0x57,0x00,0x69,0x00,
278 0x6e,0x00,0x65,0x00,0x20,0x00,0x48,0x00,
279 0x51,0x00,0x00,0x00,0xe0,0xc9,0xea,0x79,
280 0xf9,0xba,0xce,0x11,0x8c,0x82,0x00,0xaa,
281 0x00,0x4b,0xa9,0x0b,0x3e,0x00,0x00,0x00,
282 0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,
283 0x3a,0x00,0x2f,0x00,0x2f,0x00,0x77,0x00,
284 0x69,0x00,0x6e,0x00,0x65,0x00,0x68,0x00,
285 0x71,0x00,0x2e,0x00,0x6f,0x00,0x72,0x00,
286 0x67,0x00,0x2f,0x00,0x00,0x00,0x79,0x58,
287 0x81,0xf4,0x3b,0x1d,0x7f,0x48,0xaf,0x2c,
288 0x82,0x5d,0xc4,0x85,0x27,0x63,0x00,0x00,
289 0x00,0x00,0xa5,0xab,0x00,0x00,0x07,0x00,
290 0x00,0x00,0x5f,0x00,0x62,0x00,0x6c,0x00,
291 0x61,0x00,0x6e,0x00,0x6b,0x00,0x00,0x00,
295 static const unsigned char expected_hlink_data4
[] =
297 0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
298 0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
299 0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46,
300 0x00,0x00,0x0b,0x00,0x00,0x00,0x69,0x6e,
301 0x64,0x65,0x78,0x2e,0x68,0x74,0x6d,0x6c,
302 0x00,0xff,0xff,0xad,0xde,0x00,0x00,0x00,
303 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
304 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
305 0x00,0x00,0x00,0x00,0x00,
308 /* url + target frame name */
309 static const unsigned char expected_hlink_data5
[] =
311 0x02,0x00,0x00,0x00,0x83,0x00,0x00,0x00,
312 0x07,0x00,0x00,0x00,0x74,0x00,0x67,0x00,
313 0x74,0x00,0x66,0x00,0x72,0x00,0x6d,0x00,
314 0x00,0x00,0xe0,0xc9,0xea,0x79,0xf9,0xba,
315 0xce,0x11,0x8c,0x82,0x00,0xaa,0x00,0x4b,
316 0xa9,0x0b,0x26,0x00,0x00,0x00,0x68,0x00,
317 0x74,0x00,0x74,0x00,0x70,0x00,0x3a,0x00,
318 0x2f,0x00,0x2f,0x00,0x77,0x00,0x69,0x00,
319 0x6e,0x00,0x65,0x00,0x68,0x00,0x71,0x00,
320 0x2e,0x00,0x6f,0x00,0x72,0x00,0x67,0x00,
324 /* url + target frame name (IE7) */
325 static const unsigned char expected_hlink_data5_ie7
[] =
327 0x02,0x00,0x00,0x00,0x83,0x00,0x00,0x00,
328 0x07,0x00,0x00,0x00,0x74,0x00,0x67,0x00,
329 0x74,0x00,0x66,0x00,0x72,0x00,0x6d,0x00,
330 0x00,0x00,0xe0,0xc9,0xea,0x79,0xf9,0xba,
331 0xce,0x11,0x8c,0x82,0x00,0xaa,0x00,0x4b,
332 0xa9,0x0b,0x3e,0x00,0x00,0x00,0x68,0x00,
333 0x74,0x00,0x74,0x00,0x70,0x00,0x3a,0x00,
334 0x2f,0x00,0x2f,0x00,0x77,0x00,0x69,0x00,
335 0x6e,0x00,0x65,0x00,0x68,0x00,0x71,0x00,
336 0x2e,0x00,0x6f,0x00,0x72,0x00,0x67,0x00,
337 0x2f,0x00,0x00,0x00,0x79,0x58,0x81,0xf4,
338 0x3b,0x1d,0x7f,0x48,0xaf,0x2c,0x82,0x5d,
339 0xc4,0x85,0x27,0x63,0x00,0x00,0x00,0x00,
344 static const unsigned char expected_hlink_data6
[] =
346 0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,
347 0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
348 0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46,
349 0x00,0x00,0x04,0x00,0x00,0x00,0x63,0x3a,
350 0x5c,0x00,0xff,0xff,0xad,0xde,0x00,0x00,
351 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
352 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
353 0x00,0x00,0x0c,0x00,0x00,0x00,0x06,0x00,
354 0x00,0x00,0x03,0x00,0x63,0x00,0x3a,0x00,
358 static void test_persist_save_data(const char *testname
, IHlink
*lnk
,
359 const unsigned char *expected_data
,
360 unsigned int expected_data_size
,
361 const unsigned char *expected_data_alt
,
362 unsigned int expected_data_alt_size
)
369 const unsigned char *data
;
373 hr
= IHlink_QueryInterface(lnk
, &IID_IPersistStream
, (void **)&ps
);
374 ok(hr
== S_OK
, "IHlink_QueryInterface failed with error 0x%08x\n", hr
);
376 hr
= CreateStreamOnHGlobal(NULL
, TRUE
, &stream
);
377 ok(hr
== S_OK
, "CreateStreamOnHGlobal failed with error 0x%08x\n", hr
);
379 hr
= IPersistStream_Save(ps
, stream
, TRUE
);
380 ok(hr
== S_OK
, "IPersistStream_Save failed with error 0x%08x\n", hr
);
382 hr
= GetHGlobalFromStream(stream
, &hglobal
);
383 ok(hr
== S_OK
, "GetHGlobalFromStream failed with error 0x%08x\n", hr
);
385 data_size
= GlobalSize(hglobal
);
387 data
= GlobalLock(hglobal
);
389 /* first check we have the right amount of data */
390 ok((data_size
== expected_data_size
) ||
391 (data_size
== expected_data_alt_size
),
392 "%s: Size of saved data differs (expected %d or %d, actual %d)\n",
393 testname
, expected_data_size
, expected_data_alt_size
, data_size
);
396 /* then do a byte-by-byte comparison */
397 for (i
= 0; i
< min(data_size
, expected_data_size
); i
++)
399 if ((expected_data
[i
] != data
[i
]) &&
400 (((expected_data
!= expected_hlink_data2
) &&
401 (expected_data
!= expected_hlink_data3
)) ||
402 ((i
< 52 || i
>= 56) && (i
< 80 || i
>= 84))))
409 if (!same
&& (expected_data_alt
!= expected_data
))
411 /* then try the alternate data */
413 for (i
= 0; i
< min(data_size
, expected_data_alt_size
); i
++)
415 if ((expected_data_alt
== expected_hlink_data_ie7
&& i
== 89) /* Win10 */ ||
416 (expected_data_alt
== expected_hlink_data2_ie7
&& i
== 109) /* Win10 */ ||
417 (expected_data_alt
== expected_hlink_data3_ie7
&& i
== 109) /* Win10 */ ||
418 (expected_data_alt
== expected_hlink_data5_ie7
&& i
== 107) /* Win10 */)
420 ok(data
[i
] == 0 || broken(data
[i
] == 1), "Expected 0 or 1, got %d\n", data
[i
]);
423 if ((expected_data_alt
[i
] != data
[i
]) &&
424 (((expected_data_alt
!= expected_hlink_data2
) &&
425 (expected_data_alt
!= expected_hlink_data3
)) ||
426 ((i
< 52 || i
>= 56) && (i
< 80 || i
>= 84))))
434 ok(same
, "%s: Saved data differs\n", testname
);
437 for (i
= 0; i
< data_size
; i
++)
439 if (i
% 8 == 0) printf(" ");
440 printf("0x%02x,", data
[i
]);
441 if (i
% 8 == 7) printf("\n");
446 GlobalUnlock(hglobal
);
448 IStream_Release(stream
);
449 IPersistStream_Release(ps
);
452 static void test_persist(void)
454 static const WCHAR url
[] = { 'h','t','t','p',':','/','/','w','i','n','e','h','q','.','o','r','g',0 };
455 static const WCHAR rel_url
[] = { 'i','n','d','e','x','.','h','t','m','l',0 };
456 static const WCHAR filename
[] = { 'c',':','\\',0 };
457 static const WCHAR friendly_name
[] = { 'W','i','n','e',' ','H','Q',0 };
458 static const WCHAR location
[] = { '_','b','l','a','n','k',0 };
459 static const WCHAR target_frame_name
[] = { 't','g','t','f','r','m',0 };
463 hr
= HlinkCreateFromString(url
, NULL
, NULL
, NULL
,
464 0, NULL
, &IID_IHlink
, (LPVOID
*) &lnk
);
465 ok(hr
== S_OK
, "HlinkCreateFromString failed with error 0x%08x\n", hr
);
467 skip("Can't create lnk, skipping test_persist.\n");
470 test_persist_save_data("url only", lnk
,
471 expected_hlink_data
, sizeof(expected_hlink_data
),
472 expected_hlink_data_ie7
, sizeof(expected_hlink_data_ie7
));
475 hr
= HlinkCreateFromString(url
, NULL
, friendly_name
, NULL
,
476 0, NULL
, &IID_IHlink
, (LPVOID
*) &lnk
);
477 ok(hr
== S_OK
, "HlinkCreateFromString failed with error 0x%08x\n", hr
);
478 test_persist_save_data("url + friendly name", lnk
,
479 expected_hlink_data2
, sizeof(expected_hlink_data2
),
480 expected_hlink_data2_ie7
, sizeof(expected_hlink_data2_ie7
));
483 hr
= HlinkCreateFromString(url
, location
, friendly_name
, NULL
,
484 0, NULL
, &IID_IHlink
, (LPVOID
*) &lnk
);
485 ok(hr
== S_OK
, "HlinkCreateFromString failed with error 0x%08x\n", hr
);
486 test_persist_save_data("url + friendly_name + location", lnk
,
487 expected_hlink_data3
, sizeof(expected_hlink_data3
),
488 expected_hlink_data3_ie7
, sizeof(expected_hlink_data3_ie7
));
491 hr
= HlinkCreateFromString(rel_url
, NULL
, NULL
, NULL
,
492 0, NULL
, &IID_IHlink
, (LPVOID
*) &lnk
);
493 ok(hr
== S_OK
, "HlinkCreateFromString failed with error 0x%08x\n", hr
);
494 test_persist_save_data("relative url", lnk
,
495 expected_hlink_data4
, sizeof(expected_hlink_data4
),
496 expected_hlink_data4
, sizeof(expected_hlink_data4
));
499 hr
= HlinkCreateFromString(url
, NULL
, NULL
, NULL
,
500 0, NULL
, &IID_IHlink
, (LPVOID
*) &lnk
);
501 ok(hr
== S_OK
, "HlinkCreateFromString failed with error 0x%08x\n", hr
);
502 hr
= IHlink_SetTargetFrameName(lnk
, target_frame_name
);
503 ok(hr
== S_OK
, "IHlink_SetTargetFrameName failed with error 0x%08x\n", hr
);
504 test_persist_save_data("url + target frame name", lnk
,
505 expected_hlink_data5
, sizeof(expected_hlink_data5
),
506 expected_hlink_data5_ie7
, sizeof(expected_hlink_data5_ie7
));
509 hr
= HlinkCreateFromString(filename
, NULL
, NULL
, NULL
,
510 0, NULL
, &IID_IHlink
, (LPVOID
*) &lnk
);
511 ok(hr
== S_OK
, "HlinkCreateFromString failed with error 0x%08x\n", hr
);
512 test_persist_save_data("filename", lnk
,
513 expected_hlink_data6
, sizeof(expected_hlink_data6
),
514 expected_hlink_data6
, sizeof(expected_hlink_data6
));
518 static void test_special_reference(void)
523 hres
= HlinkGetSpecialReference(HLSR_HOME
, &ref
);
524 ok(hres
== S_OK
, "HlinkGetSpecialReference(HLSR_HOME) failed: %08x\n", hres
);
525 ok(ref
!= NULL
, "ref == NULL\n");
528 hres
= HlinkGetSpecialReference(HLSR_SEARCHPAGE
, &ref
);
529 ok(hres
== S_OK
, "HlinkGetSpecialReference(HLSR_SEARCHPAGE) failed: %08x\n", hres
);
530 ok(ref
!= NULL
, "ref == NULL\n");
533 ref
= (void*)0xdeadbeef;
534 hres
= HlinkGetSpecialReference(HLSR_HISTORYFOLDER
, &ref
);
535 ok(hres
== E_NOTIMPL
, "HlinkGetSpecialReference(HLSR_HISTORYFOLDER) failed: %08x\n", hres
);
536 ok(ref
== NULL
, "ref=%p\n", ref
);
538 ref
= (void*)0xdeadbeef;
539 hres
= HlinkGetSpecialReference(4, &ref
);
540 ok(hres
== E_INVALIDARG
, "HlinkGetSpecialReference(HLSR_HISTORYFOLDER) failed: %08x\n", hres
);
541 ok(ref
== NULL
, "ref=%p\n", ref
);
544 static void test_HlinkCreateExtensionServices(void)
546 IAuthenticate
*authenticate
;
547 IHttpNegotiate
*http_negotiate
;
548 LPWSTR password
, username
, headers
;
552 static const WCHAR usernameW
[] = {'u','s','e','r',0};
553 static const WCHAR passwordW
[] = {'p','a','s','s',0};
554 static const WCHAR headersW
[] = {'h','e','a','d','e','r','s',0};
555 static const WCHAR headersexW
[] = {'h','e','a','d','e','r','s','\r','\n',0};
557 hres
= HlinkCreateExtensionServices(NULL
, NULL
, NULL
, NULL
,
558 NULL
, &IID_IAuthenticate
, (void**)&authenticate
);
559 ok(hres
== S_OK
, "HlinkCreateExtensionServices failed: %08x\n", hres
);
560 ok(authenticate
!= NULL
, "HlinkCreateExtensionServices returned NULL\n");
562 password
= username
= (void*)0xdeadbeef;
563 hwnd
= (void*)0xdeadbeef;
564 hres
= IAuthenticate_Authenticate(authenticate
, &hwnd
, &username
, &password
);
565 ok(hres
== S_OK
, "Authenticate failed: %08x\n", hres
);
566 ok(!hwnd
, "hwnd != NULL\n");
567 ok(!username
, "username != NULL\n");
568 ok(!password
, "password != NULL\n");
570 hres
= IAuthenticate_QueryInterface(authenticate
, &IID_IHttpNegotiate
, (void**)&http_negotiate
);
571 ok(hres
== S_OK
, "Could not get IHttpNegotiate interface: %08x\n", hres
);
573 headers
= (void*)0xdeadbeef;
574 hres
= IHttpNegotiate_BeginningTransaction(http_negotiate
, (void*)0xdeadbeef, (void*)0xdeadbeef,
576 ok(hres
== S_OK
, "BeginningTransaction failed: %08x\n", hres
);
577 ok(headers
== NULL
, "headers != NULL\n");
579 hres
= IHttpNegotiate_BeginningTransaction(http_negotiate
, (void*)0xdeadbeef, (void*)0xdeadbeef,
581 ok(hres
== E_INVALIDARG
, "BeginningTransaction failed: %08x, expected E_INVALIDARG\n", hres
);
583 headers
= (void*)0xdeadbeef;
584 hres
= IHttpNegotiate_OnResponse(http_negotiate
, 200, (void*)0xdeadbeef, (void*)0xdeadbeef, &headers
);
585 ok(hres
== S_OK
, "OnResponse failed: %08x\n", hres
);
586 ok(headers
== NULL
, "headers != NULL\n");
588 IHttpNegotiate_Release(http_negotiate
);
589 IAuthenticate_Release(authenticate
);
592 hres
= HlinkCreateExtensionServices(headersW
, (HWND
)0xfefefefe, usernameW
, passwordW
,
593 NULL
, &IID_IAuthenticate
, (void**)&authenticate
);
594 ok(hres
== S_OK
, "HlinkCreateExtensionServices failed: %08x\n", hres
);
595 ok(authenticate
!= NULL
, "HlinkCreateExtensionServices returned NULL\n");
597 password
= username
= NULL
;
599 hres
= IAuthenticate_Authenticate(authenticate
, &hwnd
, &username
, &password
);
600 ok(hres
== S_OK
, "Authenticate failed: %08x\n", hres
);
601 ok(hwnd
== (HWND
)0xfefefefe, "hwnd=%p\n", hwnd
);
602 ok(!lstrcmpW(username
, usernameW
), "unexpected username\n");
603 ok(!lstrcmpW(password
, passwordW
), "unexpected password\n");
604 CoTaskMemFree(username
);
605 CoTaskMemFree(password
);
607 password
= username
= (void*)0xdeadbeef;
608 hwnd
= (void*)0xdeadbeef;
609 hres
= IAuthenticate_Authenticate(authenticate
, &hwnd
, NULL
, &password
);
610 ok(hres
== E_INVALIDARG
, "Authenticate failed: %08x\n", hres
);
611 ok(password
== (void*)0xdeadbeef, "password = %p\n", password
);
612 ok(hwnd
== (void*)0xdeadbeef, "hwnd = %p\n", hwnd
);
614 hres
= IAuthenticate_QueryInterface(authenticate
, &IID_IHttpNegotiate
, (void**)&http_negotiate
);
615 ok(hres
== S_OK
, "Could not get IHttpNegotiate interface: %08x\n", hres
);
617 headers
= (void*)0xdeadbeef;
618 hres
= IHttpNegotiate_BeginningTransaction(http_negotiate
, (void*)0xdeadbeef, (void*)0xdeadbeef,
620 ok(hres
== S_OK
, "BeginningTransaction failed: %08x\n", hres
);
621 ok(!lstrcmpW(headers
, headersexW
), "unexpected headers %s\n", wine_dbgstr_w(headers
));
622 CoTaskMemFree(headers
);
624 headers
= (void*)0xdeadbeef;
625 hres
= IHttpNegotiate_OnResponse(http_negotiate
, 200, (void*)0xdeadbeef, (void*)0xdeadbeef, &headers
);
626 ok(hres
== S_OK
, "OnResponse failed: %08x\n", hres
);
627 ok(headers
== NULL
, "unexpected headers %s\n", wine_dbgstr_w(headers
));
629 IHttpNegotiate_Release(http_negotiate
);
630 IAuthenticate_Release(authenticate
);
633 static void test_HlinkParseDisplayName(void)
635 IMoniker
*mon
= NULL
;
642 static const WCHAR invalid_urlW
[] = {'t','e','s','t',':','1','2','3','a','b','c',0};
643 static const WCHAR clsid_nameW
[] = {'c','l','s','i','d',':',
644 '2','0','D','0','4','F','E','0','-','3','A','E','A','-','1','0','6','9','-','A','2','D','8',
645 '-','0','8','0','0','2','B','3','0','3','0','9','D',':',0};
646 static const WCHAR file_urlW
[] =
647 {'f','i','l','e',':','/','/','/','c',':','\\','f','i','l','e','.','t','x','t',0};
649 CreateBindCtx(0, &bctx
);
651 hres
= HlinkParseDisplayName(bctx
, winehq_urlW
, FALSE
, &eaten
, &mon
);
652 ok(hres
== S_OK
, "HlinkParseDisplayName failed: %08x\n", hres
);
653 ok(eaten
== sizeof(winehq_urlW
)/sizeof(WCHAR
)-1, "eaten=%d\n", eaten
);
654 ok(mon
!= NULL
, "mon == NULL\n");
656 hres
= IMoniker_GetDisplayName(mon
, bctx
, 0, &name
);
657 ok(hres
== S_OK
, "GetDisplayName failed: %08x\n", hres
);
658 ok(!lstrcmpW(name
, winehq_urlW
), "wrong display name %s\n", wine_dbgstr_w(name
));
661 hres
= IMoniker_IsSystemMoniker(mon
, &issys
);
662 ok(hres
== S_OK
, "IsSystemMoniker failed: %08x\n", hres
);
663 ok(issys
== MKSYS_URLMONIKER
, "issys=%x\n", issys
);
665 IMoniker_Release(mon
);
667 hres
= HlinkParseDisplayName(bctx
, clsid_nameW
, FALSE
, &eaten
, &mon
);
668 ok(hres
== S_OK
, "HlinkParseDisplayName failed: %08x\n", hres
);
669 ok(eaten
== sizeof(clsid_nameW
)/sizeof(WCHAR
)-1, "eaten=%d\n", eaten
);
670 ok(mon
!= NULL
, "mon == NULL\n");
672 hres
= IMoniker_IsSystemMoniker(mon
, &issys
);
673 ok(hres
== S_OK
, "IsSystemMoniker failed: %08x\n", hres
);
674 ok(issys
== MKSYS_CLASSMONIKER
, "issys=%x\n", issys
);
676 IMoniker_Release(mon
);
678 hres
= HlinkParseDisplayName(bctx
, invalid_urlW
, FALSE
, &eaten
, &mon
);
679 ok(hres
== S_OK
, "HlinkParseDisplayName failed: %08x\n", hres
);
680 ok(eaten
== sizeof(invalid_urlW
)/sizeof(WCHAR
)-1, "eaten=%d\n", eaten
);
681 ok(mon
!= NULL
, "mon == NULL\n");
683 hres
= IMoniker_GetDisplayName(mon
, bctx
, 0, &name
);
684 ok(hres
== S_OK
, "GetDisplayName failed: %08x\n", hres
);
685 ok(!lstrcmpW(name
, invalid_urlW
), "wrong display name %s\n", wine_dbgstr_w(name
));
688 hres
= IMoniker_IsSystemMoniker(mon
, &issys
);
689 ok(hres
== S_OK
, "IsSystemMoniker failed: %08x\n", hres
);
690 ok(issys
== MKSYS_FILEMONIKER
, "issys=%x\n", issys
);
692 IMoniker_Release(mon
);
694 hres
= HlinkParseDisplayName(bctx
, file_urlW
, FALSE
, &eaten
, &mon
);
695 ok(hres
== S_OK
, "HlinkParseDisplayName failed: %08x\n", hres
);
696 ok(eaten
== sizeof(file_urlW
)/sizeof(WCHAR
)-1, "eaten=%d\n", eaten
);
697 ok(mon
!= NULL
, "mon == NULL\n");
699 hres
= IMoniker_GetDisplayName(mon
, bctx
, 0, &name
);
700 ok(hres
== S_OK
, "GetDisplayName failed: %08x\n", hres
);
701 ok(!lstrcmpW(name
, file_urlW
+8), "wrong display name %s\n", wine_dbgstr_w(name
));
704 hres
= IMoniker_IsSystemMoniker(mon
, &issys
);
705 ok(hres
== S_OK
, "IsSystemMoniker failed: %08x\n", hres
);
706 ok(issys
== MKSYS_FILEMONIKER
, "issys=%x\n", issys
);
708 IMoniker_Release(mon
);
709 IBindCtx_Release(bctx
);
712 static IBindCtx
*_bctx
;
714 static HRESULT WINAPI
ServiceProvider_QueryInterface(IServiceProvider
*iface
, REFIID riid
, void **ppv
)
716 ok(0, "unexpected call\n");
717 return E_NOINTERFACE
;
720 static ULONG WINAPI
ServiceProvider_AddRef(IServiceProvider
*iface
)
725 static ULONG WINAPI
ServiceProvider_Release(IServiceProvider
*iface
)
730 static HRESULT WINAPI
ServiceProvider_QueryService(IServiceProvider
*iface
,
731 REFGUID guidService
, REFIID riid
, void **ppv
)
733 ok(0, "unexpected service %s\n", wine_dbgstr_guid(guidService
));
734 return E_NOINTERFACE
;
737 static IServiceProviderVtbl ServiceProviderVtbl
= {
738 ServiceProvider_QueryInterface
,
739 ServiceProvider_AddRef
,
740 ServiceProvider_Release
,
741 ServiceProvider_QueryService
744 static IServiceProvider ServiceProvider
= { &ServiceProviderVtbl
};
746 static HRESULT WINAPI
BindStatusCallback_QueryInterface(IBindStatusCallback
*iface
, REFIID riid
, void **ppv
)
750 if(IsEqualGUID(riid
, &IID_IServiceProvider
)) {
751 *ppv
= &ServiceProvider
;
755 ok(0, "unexpected interface %s\n", wine_dbgstr_guid(riid
));
756 return E_NOINTERFACE
;
759 static ULONG WINAPI
BindStatusCallback_AddRef(IBindStatusCallback
*iface
)
764 static ULONG WINAPI
BindStatusCallback_Release(IBindStatusCallback
*iface
)
769 static HRESULT WINAPI
BindStatusCallback_OnStartBinding(IBindStatusCallback
*iface
, DWORD dwReserved
,
772 ok(0, "unexpected call\n");
776 static HRESULT WINAPI
BindStatusCallback_GetPriority(IBindStatusCallback
*iface
, LONG
*pnPriority
)
778 ok(0, "unexpected call\n");
782 static HRESULT WINAPI
BindStatusCallback_OnLowResource(IBindStatusCallback
*iface
, DWORD reserved
)
784 ok(0, "unexpected call\n");
788 static HRESULT WINAPI
BindStatusCallback_OnProgress(IBindStatusCallback
*iface
, ULONG ulProgress
,
789 ULONG ulProgressMax
, ULONG ulStatusCode
, LPCWSTR szStatusText
)
791 ok(0, "unexpected call\n");
795 static HRESULT WINAPI
BindStatusCallback_OnStopBinding(IBindStatusCallback
*iface
, HRESULT hresult
, LPCWSTR szError
)
797 ok(0, "unexpected call\n");
801 static HRESULT WINAPI
BindStatusCallback_GetBindInfo(IBindStatusCallback
*iface
, DWORD
*grfBINDF
, BINDINFO
*pbindinfo
)
803 ok(0, "unexpected call\n");
807 static HRESULT WINAPI
BindStatusCallback_OnDataAvailable(IBindStatusCallback
*iface
, DWORD grfBSCF
,
808 DWORD dwSize
, FORMATETC
* pformatetc
, STGMEDIUM
* pstgmed
)
810 ok(0, "unexpected call\n");
814 static HRESULT WINAPI
BindStatusCallback_OnObjectAvailable(IBindStatusCallback
*iface
, REFIID riid
, IUnknown
*punk
)
816 ok(0, "unexpected call\n");
820 static IBindStatusCallbackVtbl BindStatusCallbackVtbl
= {
821 BindStatusCallback_QueryInterface
,
822 BindStatusCallback_AddRef
,
823 BindStatusCallback_Release
,
824 BindStatusCallback_OnStartBinding
,
825 BindStatusCallback_GetPriority
,
826 BindStatusCallback_OnLowResource
,
827 BindStatusCallback_OnProgress
,
828 BindStatusCallback_OnStopBinding
,
829 BindStatusCallback_GetBindInfo
,
830 BindStatusCallback_OnDataAvailable
,
831 BindStatusCallback_OnObjectAvailable
834 static IBindStatusCallback BindStatusCallback
= { &BindStatusCallbackVtbl
};
836 static HRESULT WINAPI
HlinkBrowseContext_QueryInterface(
837 IHlinkBrowseContext
*iface
, REFIID riid
, void **ppv
)
841 if (IsEqualGUID(&IID_IHlinkHistory
, riid
))
842 CHECK_EXPECT(HBC_QueryInterface_IHlinkHistory
);
843 else if (IsEqualGUID(&IID_IMarshal
, riid
))
844 CHECK_EXPECT2(HBC_QueryInterface_IMarshal
);
845 else if (IsEqualGUID(&CLSID_IdentityUnmarshal
, riid
))
846 CHECK_EXPECT(HBC_QueryInterface_IdentityUnmarshal
);
847 else if (IsEqualGUID(&IID_IUnknown
, riid
))
848 CHECK_EXPECT(HBC_QueryInterface_IUnknown
);
850 ok(0, "unexpected interface: %s\n", wine_dbgstr_guid(riid
));
852 return E_NOINTERFACE
;
855 static ULONG WINAPI
HlinkBrowseContext_AddRef(IHlinkBrowseContext
*iface
)
860 static ULONG WINAPI
HlinkBrowseContext_Release(IHlinkBrowseContext
*iface
)
865 static HRESULT WINAPI
HlinkBrowseContext_Register(IHlinkBrowseContext
*iface
,
866 DWORD reserved
, IUnknown
*piunk
, IMoniker
*pimk
, DWORD
*pdwRegister
)
868 ok(0, "unexpected call\n");
872 static IUnknown
*HBC_object
;
874 static IMoniker Moniker
;
875 static HRESULT WINAPI
HlinkBrowseContext_GetObject(IHlinkBrowseContext
*iface
,
876 IMoniker
*pimk
, BOOL fBindIfRootRegistered
, IUnknown
**ppiunk
)
882 CHECK_EXPECT(HBC_GetObject
);
884 CreateBindCtx(0, &bctx
);
885 hr
= IMoniker_GetDisplayName(pimk
, bctx
, NULL
, &name
);
886 ok(hr
== S_OK
, "Failed to get display name, hr %#x.\n", hr
);
887 ok(!lstrcmpW(winehq_urlW
, name
) || !lstrcmpW(winehq_404W
, name
), "got unexpected url\n");
889 IBindCtx_Release(bctx
);
891 ok(fBindIfRootRegistered
== 1, "fBindIfRootRegistered = %x\n", fBindIfRootRegistered
);
893 *ppiunk
= HBC_object
;
894 return HBC_object
? S_OK
: S_FALSE
;
897 static HRESULT WINAPI
HlinkBrowseContext_Revoke(IHlinkBrowseContext
*iface
, DWORD dwRegister
)
899 ok(0, "unexpected call\n");
903 static HRESULT WINAPI
HlinkBrowseContext_SetBrowseWindowInfo(
904 IHlinkBrowseContext
*iface
, HLBWINFO
*phlbwi
)
906 ok(0, "unexpected call\n");
910 static HRESULT WINAPI
HlinkBrowseContext_GetBrowseWindowInfo(
911 IHlinkBrowseContext
*iface
, HLBWINFO
*phlbwi
)
913 ok(0, "unexpected call\n");
917 static HRESULT WINAPI
HlinkBrowseContext_SetInitialHlink(IHlinkBrowseContext
*iface
,
918 IMoniker
*pimkTarget
, LPCWSTR pwzLocation
, LPCWSTR pwzFriendlyName
)
920 ok(0, "unexpected call\n");
924 static HRESULT WINAPI
HlinkBrowseContext_OnNavigateHlink(IHlinkBrowseContext
*iface
, DWORD grfHLNF
,
925 IMoniker
*pimkTarget
, LPCWSTR pwzLocation
, LPCWSTR pwzFriendlyName
, ULONG
*puHLID
)
927 ok(0, "unexpected call\n");
931 static HRESULT WINAPI
HlinkBrowseContext_UpdateHlink(IHlinkBrowseContext
*iface
, ULONG uHLID
,
932 IMoniker
*pimkTarget
, LPCWSTR location
, LPCWSTR friendly_name
)
934 CHECK_EXPECT(HBC_UpdateHlink
);
938 static HRESULT WINAPI
HlinkBrowseContext_EnumNavigationStack(IHlinkBrowseContext
*iface
,
939 DWORD dwReserved
, DWORD grfHLFNAMEF
, IEnumHLITEM
**ppienumhlitem
)
941 ok(0, "unexpected call\n");
945 static HRESULT WINAPI
HlinkBrowseContext_QueryHlink(IHlinkBrowseContext
*iface
,
946 DWORD grfHLQF
, ULONG uHLID
)
948 ok(0, "unexpected call\n");
952 static HRESULT WINAPI
HlinkBrowseContext_GetHlink(IHlinkBrowseContext
*iface
,
953 ULONG uHLID
, IHlink
**ppihl
)
955 ok(0, "unexpected call\n");
959 static HRESULT WINAPI
HlinkBrowseContext_SetCurrentHlink(
960 IHlinkBrowseContext
*iface
, ULONG uHLID
)
962 ok(0, "unexpected call\n");
966 static HRESULT WINAPI
HlinkBrowseContext_Clone(IHlinkBrowseContext
*iface
,
967 IUnknown
*piunkOuter
, REFIID riid
, IUnknown
**ppiunkObj
)
969 ok(0, "unexpected call\n");
973 static HRESULT WINAPI
HlinkBrowseContext_Close(IHlinkBrowseContext
*iface
, DWORD reserved
)
975 ok(0, "unexpected call\n");
979 static IHlinkBrowseContextVtbl HlinkBrowseContextVtbl
= {
980 HlinkBrowseContext_QueryInterface
,
981 HlinkBrowseContext_AddRef
,
982 HlinkBrowseContext_Release
,
983 HlinkBrowseContext_Register
,
984 HlinkBrowseContext_GetObject
,
985 HlinkBrowseContext_Revoke
,
986 HlinkBrowseContext_SetBrowseWindowInfo
,
987 HlinkBrowseContext_GetBrowseWindowInfo
,
988 HlinkBrowseContext_SetInitialHlink
,
989 HlinkBrowseContext_OnNavigateHlink
,
990 HlinkBrowseContext_UpdateHlink
,
991 HlinkBrowseContext_EnumNavigationStack
,
992 HlinkBrowseContext_QueryHlink
,
993 HlinkBrowseContext_GetHlink
,
994 HlinkBrowseContext_SetCurrentHlink
,
995 HlinkBrowseContext_Clone
,
996 HlinkBrowseContext_Close
999 static IHlinkBrowseContext HlinkBrowseContext
= { &HlinkBrowseContextVtbl
};
1001 static HRESULT WINAPI
HlinkTarget_QueryInterface(IHlinkTarget
*iface
, REFIID riid
, void **ppv
)
1003 if(IsEqualGUID(&IID_IHlinkTarget
, riid
)) {
1004 CHECK_EXPECT(HT_QueryInterface_IHlinkTarget
);
1009 ok(0, "unexpected interface: %s\n", wine_dbgstr_guid(riid
));
1010 return E_NOINTERFACE
;
1013 static ULONG WINAPI
HlinkTarget_AddRef(IHlinkTarget
*iface
)
1018 static ULONG WINAPI
HlinkTarget_Release(IHlinkTarget
*iface
)
1023 static HRESULT WINAPI
HlinkTarget_SetBrowseContext(IHlinkTarget
*iface
,
1024 IHlinkBrowseContext
*pihlbc
)
1026 CHECK_EXPECT(HT_SetBrowseContext
);
1028 ok(pihlbc
== &HlinkBrowseContext
, "pihlbc != &HlinkBrowseContext (%p)\n", pihlbc
);
1032 static HRESULT WINAPI
HlinkTarget_GetBrowseContext(IHlinkTarget
*iface
,
1033 IHlinkBrowseContext
**ppihlbc
)
1035 CHECK_EXPECT(HT_GetBrowseContext
);
1041 static HRESULT WINAPI
HlinkTarget_Navigate(IHlinkTarget
*iface
,
1042 DWORD grfHLNF
, LPCWSTR pwzJumpLocation
)
1044 CHECK_EXPECT(HT_Navigate
);
1046 ok(grfHLNF
== 0, "grfHLNF = %x\n", grfHLNF
);
1047 ok(pwzJumpLocation
== NULL
, "pwzJumpLocation = %s\n", wine_dbgstr_w(pwzJumpLocation
));
1051 static HRESULT WINAPI
HlinkTarget_GetMoniker(IHlinkTarget
*iface
,
1052 LPCWSTR pwzLocation
, DWORD dwAssign
, IMoniker
**ppimkLocation
)
1054 ok(0, "unexpected call\n");
1058 static HRESULT WINAPI
HlinkTarget_GetFriendlyName(IHlinkTarget
*iface
,
1059 LPCWSTR pwzLocation
, LPWSTR
*ppwzFriendlyName
)
1061 CHECK_EXPECT(HT_GetFriendlyName
);
1065 static IHlinkTargetVtbl HlinkTargetVtbl
= {
1066 HlinkTarget_QueryInterface
,
1068 HlinkTarget_Release
,
1069 HlinkTarget_SetBrowseContext
,
1070 HlinkTarget_GetBrowseContext
,
1071 HlinkTarget_Navigate
,
1072 HlinkTarget_GetMoniker
,
1073 HlinkTarget_GetFriendlyName
1076 static IHlinkTarget HlinkTarget
= { &HlinkTargetVtbl
};
1078 static HRESULT WINAPI
Moniker_QueryInterface(IMoniker
*iface
, REFIID riid
, void **ppv
)
1082 ok(0, "unexpected riid: %s\n", wine_dbgstr_guid(riid
));
1083 return E_NOINTERFACE
;
1086 static ULONG WINAPI
Moniker_AddRef(IMoniker
*iface
)
1091 static ULONG WINAPI
Moniker_Release(IMoniker
*iface
)
1096 static HRESULT WINAPI
Moniker_GetClassID(IMoniker
*iface
, CLSID
*pClassID
)
1098 CHECK_EXPECT(GetClassID
);
1099 *pClassID
= IID_IUnknown
; /* not a valid CLSID */
1103 static HRESULT WINAPI
Moniker_IsDirty(IMoniker
*iface
)
1105 ok(0, "unexpected call\n");
1109 static HRESULT WINAPI
Moniker_Load(IMoniker
*iface
, IStream
*pStm
)
1111 ok(0, "unexpected call\n");
1115 static HRESULT WINAPI
Moniker_Save(IMoniker
*iface
, IStream
*pStm
, BOOL fClearDirty
)
1121 static HRESULT WINAPI
Moniker_GetSizeMax(IMoniker
*iface
, ULARGE_INTEGER
*pcbSize
)
1123 ok(0, "unexpected call\n");
1127 static HRESULT WINAPI
Moniker_BindToObject(IMoniker
*iface
, IBindCtx
*pbc
, IMoniker
*pmkToLeft
,
1128 REFIID riid
, void **ppv
)
1130 CHECK_EXPECT(BindToObject
);
1132 ok(pbc
!= _bctx
, "pbc != _bctx\n");
1133 ok(pmkToLeft
== NULL
, "pmkToLeft = %p\n", pmkToLeft
);
1134 ok(IsEqualGUID(&IID_IUnknown
, riid
), "unexpected riid %s\n", wine_dbgstr_guid(riid
));
1135 ok(ppv
!= NULL
, "ppv == NULL\n");
1136 ok(*ppv
== NULL
, "*ppv = %p\n", *ppv
);
1138 *ppv
= &HlinkTarget
;
1142 static HRESULT WINAPI
Moniker_BindToStorage(IMoniker
*iface
, IBindCtx
*pbc
, IMoniker
*pmkToLeft
,
1143 REFIID riid
, void **ppv
)
1148 static OLECHAR BSCBHolder
[] = { '_','B','S','C','B','_','H','o','l','d','e','r','_',0 };
1150 CHECK_EXPECT(BindToStorage
);
1152 ok(pbc
== _bctx
, "pbc != _bctx\n");
1153 ok(pmkToLeft
== NULL
, "pmkToLeft=%p\n", pmkToLeft
);
1154 ok(IsEqualGUID(&IID_IUnknown
, riid
), "unexpected riid %s\n", wine_dbgstr_guid(riid
));
1155 ok(ppv
!= NULL
, "ppv == NULL\n");
1156 ok(*ppv
== NULL
, "*ppv=%p\n", *ppv
);
1158 hres
= IBindCtx_GetObjectParam(pbc
, BSCBHolder
, &unk
);
1159 ok(hres
== S_OK
, "GetObjectParam failed: %08x\n", hres
);
1160 ok(unk
!= NULL
, "unk == NULL\n");
1162 IUnknown_Release(unk
);
1167 static HRESULT WINAPI
Moniker_Reduce(IMoniker
*iface
, IBindCtx
*pbc
, DWORD dwReduceHowFar
,
1168 IMoniker
**ppmkToLeft
, IMoniker
**ppmkReduced
)
1170 CHECK_EXPECT(Reduce
);
1174 static HRESULT WINAPI
Moniker_ComposeWith(IMoniker
*iface
, IMoniker
*pmkRight
,
1175 BOOL fOnlyIfNotGeneric
, IMoniker
**ppnkComposite
)
1177 ok(0, "unexpected call\n");
1181 static HRESULT WINAPI
Moniker_Enum(IMoniker
*iface
, BOOL fForwrd
, IEnumMoniker
**ppenumMoniker
)
1187 static HRESULT WINAPI
Moniker_IsEqual(IMoniker
*iface
, IMoniker
*pmkOtherMoniker
)
1189 ok(0, "unexpected call\n");
1193 static HRESULT WINAPI
Moniker_Hash(IMoniker
*iface
, DWORD
*pdwHash
)
1195 ok(0, "unexpected call\n");
1199 static HRESULT WINAPI
Moniker_IsRunning(IMoniker
*iface
, IBindCtx
*pbc
, IMoniker
*pmkToLeft
,
1200 IMoniker
*pmkNewlyRunning
)
1202 ok(0, "unexpected call\n");
1206 static HRESULT WINAPI
Moniker_GetTimeOfLastChange(IMoniker
*iface
, IBindCtx
*pbc
,
1207 IMoniker
*pmkToLeft
, FILETIME
*pFileTime
)
1209 ok(0, "unexpected call\n");
1213 static HRESULT WINAPI
Moniker_Inverse(IMoniker
*iface
, IMoniker
**ppmk
)
1215 ok(0, "unexpected call\n");
1219 static HRESULT WINAPI
Moniker_CommonPrefixWith(IMoniker
*iface
, IMoniker
*pmkOther
,
1220 IMoniker
**ppmkPrefix
)
1222 ok(0, "unexpected call\n");
1226 static HRESULT WINAPI
Moniker_RelativePathTo(IMoniker
*iface
, IMoniker
*pmkOther
,
1227 IMoniker
**pmkRelPath
)
1229 ok(0, "unexpected call\n");
1233 static HRESULT WINAPI
Moniker_GetDisplayName(IMoniker
*iface
, IBindCtx
*pbc
,
1234 IMoniker
*pmkToLeft
, LPOLESTR
*ppszDisplayName
)
1236 CHECK_EXPECT2(GetDisplayName
);
1238 ok(pbc
!= NULL
, "pbc == NULL\n");
1239 ok(pbc
!= _bctx
, "pbc == _bctx\n");
1240 ok(pmkToLeft
== NULL
, "pmkToLeft=%p\n", pmkToLeft
);
1242 *ppszDisplayName
= CoTaskMemAlloc(sizeof(winehq_urlW
));
1243 memcpy(*ppszDisplayName
, winehq_urlW
, sizeof(winehq_urlW
));
1247 static HRESULT WINAPI
Moniker_ParseDisplayName(IMoniker
*iface
, IBindCtx
*pbc
,
1248 IMoniker
*pmkToLeft
, LPOLESTR pszDisplayName
, ULONG
*pchEaten
, IMoniker
**ppmkOut
)
1250 ok(0, "unexpected call\n");
1254 static HRESULT WINAPI
Moniker_IsSystemMoniker(IMoniker
*iface
, DWORD
*pdwMksys
)
1256 CHECK_EXPECT2(IsSystemMoniker
);
1258 *pdwMksys
= MKSYS_URLMONIKER
;
1262 static IMonikerVtbl MonikerVtbl
= {
1263 Moniker_QueryInterface
,
1271 Moniker_BindToObject
,
1272 Moniker_BindToStorage
,
1274 Moniker_ComposeWith
,
1279 Moniker_GetTimeOfLastChange
,
1281 Moniker_CommonPrefixWith
,
1282 Moniker_RelativePathTo
,
1283 Moniker_GetDisplayName
,
1284 Moniker_ParseDisplayName
,
1285 Moniker_IsSystemMoniker
1288 static IMoniker Moniker
= { &MonikerVtbl
};
1290 static void test_HlinkResolveMonikerForData(void)
1295 CreateBindCtx(0, &bctx
);
1298 SET_EXPECT(IsSystemMoniker
);
1299 SET_EXPECT(GetDisplayName
);
1300 SET_EXPECT(BindToStorage
);
1302 hres
= HlinkResolveMonikerForData(&Moniker
, 0, bctx
, 0, NULL
, &BindStatusCallback
, NULL
);
1303 ok(hres
== S_OK
, "HlinkResolveMonikerForData failed: %08x\n", hres
);
1305 CHECK_CALLED(IsSystemMoniker
);
1306 CHECK_CALLED(GetDisplayName
);
1307 CHECK_CALLED(BindToStorage
);
1309 IBindCtx_Release(bctx
);
1313 static void test_HlinkGetSetMonikerReference(void)
1315 IMoniker
*found_trgt
, *dummy
, *dummy2
;
1318 const WCHAR one
[] = {'1',0};
1319 const WCHAR two
[] = {'2',0};
1320 const WCHAR name
[] = {'a',0};
1323 /* create two dummy monikers to use as targets */
1324 hres
= CreateItemMoniker(one
, one
, &dummy
);
1325 ok(hres
== S_OK
, "CreateItemMoniker failed: 0x%08x\n", hres
);
1327 hres
= CreateItemMoniker(two
, two
, &dummy2
);
1328 ok(hres
== S_OK
, "CreateItemMoniker failed: 0x%08x\n", hres
);
1330 /* create a new hlink: target => dummy, location => one */
1331 hres
= HlinkCreateFromMoniker(dummy
, one
, name
, NULL
, 0, NULL
, &IID_IHlink
, (void**)&hlink
);
1332 ok(hres
== S_OK
, "HlinkCreateFromMoniker failed: 0x%08x\n", hres
);
1334 /* validate the target and location */
1335 hres
= IHlink_GetMonikerReference(hlink
, HLINKGETREF_DEFAULT
, &found_trgt
, &found_loc
);
1336 ok(hres
== S_OK
, "IHlink_GetMonikerReference failed: 0x%08x\n", hres
);
1337 ok(found_trgt
== dummy
, "Found target should've been %p, was: %p\n", dummy
, found_trgt
);
1338 ok(lstrcmpW(found_loc
, one
) == 0, "Found location should've been %s, was: %s\n", wine_dbgstr_w(one
), wine_dbgstr_w(found_loc
));
1339 IMoniker_Release(found_trgt
);
1340 CoTaskMemFree(found_loc
);
1342 /* set location => two */
1343 hres
= IHlink_SetMonikerReference(hlink
, HLINKSETF_LOCATION
, dummy2
, two
);
1344 ok(hres
== S_OK
, "IHlink_SetMonikerReference failed: 0x%08x\n", hres
);
1346 hres
= IHlink_GetMonikerReference(hlink
, HLINKGETREF_DEFAULT
, &found_trgt
, &found_loc
);
1347 ok(hres
== S_OK
, "IHlink_GetMonikerReference failed: 0x%08x\n", hres
);
1348 ok(found_trgt
== dummy
, "Found target should've been %p, was: %p\n", dummy
, found_trgt
);
1349 ok(lstrcmpW(found_loc
, two
) == 0, "Found location should've been %s, was: %s\n", wine_dbgstr_w(two
), wine_dbgstr_w(found_loc
));
1350 IMoniker_Release(found_trgt
);
1351 CoTaskMemFree(found_loc
);
1353 /* set target => dummy2 */
1354 hres
= IHlink_SetMonikerReference(hlink
, HLINKSETF_TARGET
, dummy2
, one
);
1355 ok(hres
== S_OK
, "IHlink_SetMonikerReference failed: 0x%08x\n", hres
);
1357 hres
= IHlink_GetMonikerReference(hlink
, HLINKGETREF_DEFAULT
, &found_trgt
, &found_loc
);
1358 ok(hres
== S_OK
, "IHlink_GetMonikerReference failed: 0x%08x\n", hres
);
1359 ok(found_trgt
== dummy2
, "Found target should've been %p, was: %p\n", dummy2
, found_trgt
);
1360 ok(lstrcmpW(found_loc
, two
) == 0, "Found location should've been %s, was: %s\n", wine_dbgstr_w(two
), wine_dbgstr_w(found_loc
));
1361 IMoniker_Release(found_trgt
);
1362 CoTaskMemFree(found_loc
);
1364 /* set target => dummy, location => one */
1365 hres
= IHlink_SetMonikerReference(hlink
, HLINKSETF_TARGET
| HLINKSETF_LOCATION
, dummy
, one
);
1366 ok(hres
== S_OK
, "IHlink_SetMonikerReference failed: 0x%08x\n", hres
);
1368 hres
= IHlink_GetMonikerReference(hlink
, HLINKGETREF_DEFAULT
, &found_trgt
, &found_loc
);
1369 ok(hres
== S_OK
, "IHlink_GetMonikerReference failed: 0x%08x\n", hres
);
1370 ok(found_trgt
== dummy
, "Found target should've been %p, was: %p\n", dummy
, found_trgt
);
1371 ok(lstrcmpW(found_loc
, one
) == 0, "Found location should've been %s, was: %s\n", wine_dbgstr_w(one
), wine_dbgstr_w(found_loc
));
1372 IMoniker_Release(found_trgt
);
1373 CoTaskMemFree(found_loc
);
1375 /* no HLINKSETF flags */
1376 hres
= IHlink_SetMonikerReference(hlink
, 0, dummy2
, two
);
1377 ok(hres
== E_INVALIDARG
, "IHlink_SetMonikerReference should've failed with E_INVALIDARG (0x%08x), failed with 0x%08x\n", E_INVALIDARG
, hres
);
1379 hres
= IHlink_GetMonikerReference(hlink
, HLINKGETREF_DEFAULT
, &found_trgt
, &found_loc
);
1380 ok(hres
== S_OK
, "IHlink_GetMonikerReference failed: 0x%08x\n", hres
);
1381 ok(found_trgt
== dummy
, "Found target should've been %p, was: %p\n", dummy
, found_trgt
);
1382 ok(lstrcmpW(found_loc
, one
) == 0, "Found location should've been %s, was: %s\n", wine_dbgstr_w(one
), wine_dbgstr_w(found_loc
));
1383 IMoniker_Release(found_trgt
);
1384 CoTaskMemFree(found_loc
);
1386 /* invalid HLINKSETF flags */
1387 /* Windows returns garbage; on 32-bit it returns the flags probably because the compiler happened to store them in %eax at some point */
1389 IHlink_SetMonikerReference(hlink
, 12, dummy2
, two
);
1391 hres
= IHlink_GetMonikerReference(hlink
, HLINKGETREF_DEFAULT
, &found_trgt
, &found_loc
);
1392 ok(hres
== S_OK
, "IHlink_GetMonikerReference failed: 0x%08x\n", hres
);
1393 ok(found_trgt
== dummy
, "Found target should've been %p, was: %p\n", dummy
, found_trgt
);
1394 ok(lstrcmpW(found_loc
, one
) == 0, "Found location should've been %s, was: %s\n", wine_dbgstr_w(one
), wine_dbgstr_w(found_loc
));
1395 IMoniker_Release(found_trgt
);
1396 CoTaskMemFree(found_loc
);
1398 /* valid & invalid HLINKSETF flags */
1399 hres
= IHlink_SetMonikerReference(hlink
, 12 | HLINKSETF_TARGET
, dummy2
, two
);
1400 ok(hres
== S_OK
, "IHlink_SetMonikerReference failed: 0x%08x\n", hres
);
1402 hres
= IHlink_GetMonikerReference(hlink
, HLINKGETREF_DEFAULT
, &found_trgt
, &found_loc
);
1403 ok(hres
== S_OK
, "IHlink_GetMonikerReference failed: 0x%08x\n", hres
);
1404 ok(found_trgt
== dummy2
, "Found target should've been %p, was: %p\n", dummy2
, found_trgt
);
1405 ok(lstrcmpW(found_loc
, one
) == 0, "Found location should've been %s, was: %s\n", wine_dbgstr_w(one
), wine_dbgstr_w(found_loc
));
1406 IMoniker_Release(found_trgt
);
1407 CoTaskMemFree(found_loc
);
1410 hres
= IHlink_SetMonikerReference(hlink
, HLINKSETF_TARGET
| HLINKSETF_LOCATION
, NULL
, NULL
);
1411 ok(hres
== S_OK
, "IHlink_SetMonikerReference failed: 0x%08x\n", hres
);
1413 hres
= IHlink_GetMonikerReference(hlink
, HLINKGETREF_DEFAULT
, &found_trgt
, &found_loc
);
1414 ok(hres
== S_OK
, "IHlink_GetMonikerReference failed: 0x%08x\n", hres
);
1415 ok(found_trgt
== NULL
, "Found target should've been %p, was: %p\n", NULL
, found_trgt
);
1416 ok(found_loc
== NULL
, "Found location should've been %s, was: %s\n", wine_dbgstr_w(NULL
), wine_dbgstr_w(found_loc
));
1418 IMoniker_Release(found_trgt
);
1420 IHlink_Release(hlink
);
1421 IMoniker_Release(dummy2
);
1422 IMoniker_Release(dummy
);
1426 SET_EXPECT(IsSystemMoniker
);
1427 SET_EXPECT(GetDisplayName
);
1428 hres
= HlinkCreateFromMoniker(&Moniker
, NULL
, NULL
, NULL
, 0, NULL
,
1429 &IID_IHlink
, (void **)&hlink
);
1430 ok(hres
== S_OK
, "CreateFromMoniker failed: %08x\n", hres
);
1432 hres
= IHlink_GetMonikerReference(hlink
, HLINKGETREF_ABSOLUTE
,
1433 &found_trgt
, &found_loc
);
1434 ok(hres
== S_OK
, "CreateFromMoniker failed: %08x\n", hres
);
1435 ok(found_trgt
== &Moniker
, "Got unexpected moniker: %p\n", found_trgt
);
1436 ok(found_loc
== NULL
, "Got unexpected location: %p\n", found_loc
);
1437 todo_wine
CHECK_CALLED(Reduce
);
1438 todo_wine
CHECK_CALLED(Enum
);
1439 CHECK_CALLED(IsSystemMoniker
);
1440 CHECK_CALLED(GetDisplayName
);
1442 IHlink_Release(hlink
);
1445 static void test_HlinkGetSetStringReference(void)
1448 static const WCHAR one
[] = {'1',0};
1449 static const WCHAR two
[] = {'2',0};
1450 static const WCHAR three
[] = {'3',0};
1451 static const WCHAR empty
[] = {0};
1452 WCHAR
*fnd_tgt
, *fnd_loc
;
1455 /* create a new hlink: target => NULL, location => one */
1456 hres
= HlinkCreateFromMoniker(NULL
, one
, empty
, NULL
, 0, NULL
, &IID_IHlink
, (void**)&link
);
1457 ok(hres
== S_OK
, "HlinkCreateFromMoniker failed: 0x%08x\n", hres
);
1459 /* test setting/getting location */
1460 hres
= IHlink_GetStringReference(link
, HLINKGETREF_DEFAULT
, &fnd_tgt
, &fnd_loc
);
1461 ok(hres
== S_OK
, "IHlink_GetStringReference failed: 0x%08x\n", hres
);
1462 ok(fnd_tgt
== NULL
, "Found target should have been NULL, was: %s\n", wine_dbgstr_w(fnd_tgt
));
1463 ok(!lstrcmpW(fnd_loc
, one
), "Found location should have been %s, was: %s\n", wine_dbgstr_w(one
), wine_dbgstr_w(fnd_loc
));
1464 CoTaskMemFree(fnd_tgt
);
1465 CoTaskMemFree(fnd_loc
);
1467 hres
= IHlink_SetStringReference(link
, HLINKSETF_LOCATION
, one
, two
);
1468 ok(hres
== S_OK
, "IHlink_SetStringReference failed: 0x%08x\n", hres
);
1470 hres
= IHlink_GetStringReference(link
, HLINKGETREF_DEFAULT
, &fnd_tgt
, &fnd_loc
);
1471 ok(hres
== S_OK
, "IHlink_GetStringReference failed: 0x%08x\n", hres
);
1472 ok(fnd_tgt
== NULL
, "Found target should have been NULL, was: %s\n", wine_dbgstr_w(fnd_tgt
));
1473 ok(!lstrcmpW(fnd_loc
, two
), "Found location should have been %s, was: %s\n", wine_dbgstr_w(two
), wine_dbgstr_w(fnd_loc
));
1474 CoTaskMemFree(fnd_tgt
);
1475 CoTaskMemFree(fnd_loc
);
1477 hres
= IHlink_SetStringReference(link
, -HLINKSETF_LOCATION
, two
, one
);
1478 ok(hres
== S_OK
, "IHlink_SetStringReference failed: 0x%08x\n", hres
);
1480 hres
= IHlink_GetStringReference(link
, HLINKGETREF_DEFAULT
, &fnd_tgt
, &fnd_loc
);
1481 ok(hres
== S_OK
, "IHlink_GetStringReference failed: 0x%08x\n", hres
);
1482 ok(fnd_tgt
== NULL
, "Found target should have been NULL, was: %s\n", wine_dbgstr_w(fnd_tgt
));
1483 ok(!lstrcmpW(fnd_loc
, one
), "Found location should have been %s, was: %s\n", wine_dbgstr_w(one
), wine_dbgstr_w(fnd_loc
));
1484 CoTaskMemFree(fnd_tgt
);
1485 CoTaskMemFree(fnd_loc
);
1487 /* test setting/getting target */
1488 hres
= IHlink_SetStringReference(link
, HLINKSETF_TARGET
, two
, three
);
1489 ok(hres
== S_OK
, "IHlink_SetStringReference failed: 0x%08x\n", hres
);
1491 hres
= IHlink_GetStringReference(link
, HLINKGETREF_DEFAULT
, &fnd_tgt
, &fnd_loc
);
1492 ok(hres
== S_OK
, "IHlink_GetStringReference failed: 0x%08x\n", hres
);
1493 ok(!lstrcmpW(fnd_tgt
, two
), "Found target should have been %s, was: %s\n", wine_dbgstr_w(two
), wine_dbgstr_w(fnd_tgt
));
1494 ok(!lstrcmpW(fnd_loc
, one
), "Found location should have been %s, was: %s\n", wine_dbgstr_w(one
), wine_dbgstr_w(fnd_loc
));
1495 CoTaskMemFree(fnd_tgt
);
1496 CoTaskMemFree(fnd_loc
);
1498 hres
= IHlink_SetStringReference(link
, -HLINKSETF_TARGET
, three
, two
);
1499 ok(hres
== S_OK
, "IHlink_SetStringReference failed: 0x%08x\n", hres
);
1501 hres
= IHlink_GetStringReference(link
, HLINKGETREF_DEFAULT
, &fnd_tgt
, &fnd_loc
);
1502 ok(hres
== S_OK
, "IHlink_GetStringReference failed: 0x%08x\n", hres
);
1503 ok(!lstrcmpW(fnd_tgt
, three
), "Found target should have been %s, was: %s\n", wine_dbgstr_w(three
), wine_dbgstr_w(fnd_tgt
));
1504 ok(!lstrcmpW(fnd_loc
, two
), "Found location should have been %s, was: %s\n", wine_dbgstr_w(two
), wine_dbgstr_w(fnd_loc
));
1505 CoTaskMemFree(fnd_tgt
);
1506 CoTaskMemFree(fnd_loc
);
1508 /* test setting/getting both */
1509 hres
= IHlink_SetStringReference(link
, HLINKSETF_TARGET
| HLINKSETF_LOCATION
, one
, two
);
1510 ok(hres
== S_OK
, "IHlink_SetStringReference failed: 0x%08x\n", hres
);
1512 hres
= IHlink_GetStringReference(link
, HLINKGETREF_DEFAULT
, &fnd_tgt
, &fnd_loc
);
1513 ok(hres
== S_OK
, "IHlink_GetStringReference failed: 0x%08x\n", hres
);
1514 ok(!lstrcmpW(fnd_tgt
, one
), "Found target should have been %s, was: %s\n", wine_dbgstr_w(one
), wine_dbgstr_w(fnd_tgt
));
1515 ok(!lstrcmpW(fnd_loc
, two
), "Found location should have been %s, was: %s\n", wine_dbgstr_w(two
), wine_dbgstr_w(fnd_loc
));
1516 CoTaskMemFree(fnd_tgt
);
1517 CoTaskMemFree(fnd_loc
);
1519 hres
= IHlink_SetStringReference(link
, -(HLINKSETF_TARGET
| HLINKSETF_LOCATION
), three
, one
);
1520 ok(hres
== S_OK
, "IHlink_SetStringReference failed: 0x%08x\n", hres
);
1522 hres
= IHlink_GetStringReference(link
, HLINKGETREF_DEFAULT
, &fnd_tgt
, &fnd_loc
);
1523 ok(hres
== S_OK
, "IHlink_GetStringReference failed: 0x%08x\n", hres
);
1524 ok(!lstrcmpW(fnd_tgt
, three
), "Found target should have been %s, was: %s\n", wine_dbgstr_w(three
), wine_dbgstr_w(fnd_tgt
));
1525 ok(!lstrcmpW(fnd_loc
, two
), "Found location should have been %s, was: %s\n", wine_dbgstr_w(two
), wine_dbgstr_w(fnd_loc
));
1526 CoTaskMemFree(fnd_tgt
);
1527 CoTaskMemFree(fnd_loc
);
1529 /* test invalid flags/params */
1530 hres
= IHlink_GetStringReference(link
, 4, &fnd_tgt
, &fnd_loc
);
1531 ok(hres
== E_INVALIDARG
, "IHlink_GetStringReference should have failed "
1532 "with E_INVALIDARG (0x%08x), instead: 0x%08x\n", E_INVALIDARG
, hres
);
1533 ok(fnd_tgt
== NULL
, "Found target should have been NULL, was: %s\n", wine_dbgstr_w(fnd_tgt
));
1534 ok(fnd_loc
== NULL
, "Found location should have been NULL, was: %s\n", wine_dbgstr_w(fnd_loc
));
1535 CoTaskMemFree(fnd_tgt
);
1536 CoTaskMemFree(fnd_loc
);
1538 hres
= IHlink_GetStringReference(link
, -1, &fnd_tgt
, NULL
);
1539 todo_wine
ok(hres
== E_FAIL
, "IHlink_GetStringReference should have failed "
1540 "with E_FAIL (0x%08x), instead: 0x%08x\n", E_FAIL
, hres
);
1541 CoTaskMemFree(fnd_tgt
);
1543 hres
= IHlink_GetStringReference(link
, -1, NULL
, NULL
);
1544 ok(hres
== S_OK
, "failed, hres=%08x\n", hres
);
1546 hres
= IHlink_GetStringReference(link
, -1, NULL
, &fnd_loc
);
1547 ok(hres
== S_OK
, "failed, hres=%08x\n", hres
);
1548 CoTaskMemFree(fnd_loc
);
1550 hres
= IHlink_GetStringReference(link
, -1, &fnd_tgt
, &fnd_loc
);
1551 todo_wine
ok(hres
== E_FAIL
, "IHlink_GetStringReference should have failed "
1552 "with E_FAIL (0x%08x), instead: 0x%08x\n", E_FAIL
, hres
);
1553 CoTaskMemFree(fnd_tgt
);
1554 CoTaskMemFree(fnd_loc
);
1556 hres
= IHlink_GetStringReference(link
, -2, &fnd_tgt
, &fnd_loc
);
1557 ok(hres
== E_INVALIDARG
, "IHlink_GetStringReference should have failed "
1558 "with E_INVALIDARG (0x%08x), instead: 0x%08x\n", E_INVALIDARG
, hres
);
1559 CoTaskMemFree(fnd_tgt
);
1560 CoTaskMemFree(fnd_loc
);
1564 /* Windows returns garbage; on 32-bit it returns the flags probably because the compiler happened to store them in %eax at some point */
1565 IHlink_SetStringReference(link
, 4, NULL
, NULL
);
1566 IHlink_SetStringReference(link
, -4, NULL
, NULL
);
1569 IHlink_Release(link
);
1572 #define setStringRef(h,f,t,l) r_setStringRef(__LINE__,h,f,t,l)
1573 static void r_setStringRef(unsigned line
, IHlink
*hlink
, DWORD flags
, const WCHAR
*tgt
, const WCHAR
*loc
)
1576 hres
= IHlink_SetStringReference(hlink
, flags
, tgt
, loc
);
1577 ok_(__FILE__
,line
) (hres
== S_OK
, "IHlink_SetStringReference failed: 0x%08x\n", hres
);
1580 #define getStringRef(h,t,l) r_getStringRef(__LINE__,h,t,l)
1581 static void r_getStringRef(unsigned line
, IHlink
*hlink
, const WCHAR
*exp_tgt
, const WCHAR
*exp_loc
)
1584 WCHAR
*fnd_tgt
, *fnd_loc
;
1586 hres
= IHlink_GetStringReference(hlink
, HLINKGETREF_DEFAULT
, &fnd_tgt
, &fnd_loc
);
1587 ok_(__FILE__
,line
) (hres
== S_OK
, "IHlink_GetStringReference failed: 0x%08x\n", hres
);
1590 ok_(__FILE__
,line
) (!lstrcmpW(fnd_tgt
, exp_tgt
), "Found string target should have been %s, was: %s\n", wine_dbgstr_w(exp_tgt
), wine_dbgstr_w(fnd_tgt
));
1592 ok_(__FILE__
,line
) (fnd_tgt
== NULL
, "Found string target should have been NULL, was: %s\n", wine_dbgstr_w(fnd_tgt
));
1595 ok_(__FILE__
,line
) (!lstrcmpW(fnd_loc
, exp_loc
), "Found string location should have been %s, was: %s\n", wine_dbgstr_w(exp_loc
), wine_dbgstr_w(fnd_loc
));
1597 ok_(__FILE__
,line
) (fnd_loc
== NULL
, "Found string location should have been NULL, was: %s\n", wine_dbgstr_w(fnd_loc
));
1599 CoTaskMemFree(fnd_tgt
);
1600 CoTaskMemFree(fnd_loc
);
1603 #define setMonikerRef(h,f,t,l) r_setMonikerRef(__LINE__,h,f,t,l)
1604 static void r_setMonikerRef(unsigned line
, IHlink
*hlink
, DWORD flags
, IMoniker
*tgt
, const WCHAR
*loc
)
1607 hres
= IHlink_SetMonikerReference(hlink
, flags
, tgt
, loc
);
1608 ok_(__FILE__
,line
) (hres
== S_OK
, "IHlink_SetMonikerReference failed: 0x%08x\n", hres
);
1611 /* passing 0xFFFFFFFF as exp_tgt will return the retrieved target & not test it */
1612 #define getMonikerRef(h,t,l,r) r_getMonikerRef(__LINE__,h,t,l,r)
1613 static IMoniker
*r_getMonikerRef(unsigned line
, IHlink
*hlink
, IMoniker
*exp_tgt
, const WCHAR
*exp_loc
, DWORD ref
)
1619 hres
= IHlink_GetMonikerReference(hlink
, ref
, &fnd_tgt
, &fnd_loc
);
1620 ok_(__FILE__
,line
) (hres
== S_OK
, "IHlink_GetMonikerReference failed: 0x%08x\n", hres
);
1623 ok_(__FILE__
,line
) (!lstrcmpW(fnd_loc
, exp_loc
), "Found string location should have been %s, was: %s\n", wine_dbgstr_w(exp_loc
), wine_dbgstr_w(fnd_loc
));
1625 ok_(__FILE__
,line
) (fnd_loc
== NULL
, "Found string location should have been NULL, was: %s\n", wine_dbgstr_w(fnd_loc
));
1627 CoTaskMemFree(fnd_loc
);
1629 if(exp_tgt
== (IMoniker
*)0xFFFFFFFF)
1632 ok_(__FILE__
,line
) (fnd_tgt
== exp_tgt
, "Found moniker target should have been %p, was: %p\n", exp_tgt
, fnd_tgt
);
1635 IMoniker_Release(fnd_tgt
);
1640 static void test_HlinkMoniker(void)
1643 IMoniker
*aMon
, *file_mon
;
1644 static const WCHAR emptyW
[] = {0};
1645 static const WCHAR wordsW
[] = {'w','o','r','d','s',0};
1646 static const WCHAR aW
[] = {'a',0};
1647 static const WCHAR bW
[] = {'b',0};
1650 hres
= HlinkCreateFromString(NULL
, NULL
, NULL
, NULL
, 0, NULL
, &IID_IHlink
, (void**)&hlink
);
1651 ok(hres
== S_OK
, "HlinkCreateFromString failed: 0x%08x\n", hres
);
1652 getStringRef(hlink
, NULL
, NULL
);
1653 getMonikerRef(hlink
, NULL
, NULL
, HLINKGETREF_RELATIVE
);
1655 /* setting a string target creates a moniker reference */
1656 setStringRef(hlink
, HLINKSETF_TARGET
| HLINKSETF_LOCATION
, aW
, wordsW
);
1657 getStringRef(hlink
, aW
, wordsW
);
1658 aMon
= getMonikerRef(hlink
, (IMoniker
*)0xFFFFFFFF, wordsW
, HLINKGETREF_RELATIVE
);
1659 ok(aMon
!= NULL
, "Moniker from %s target should not be NULL\n", wine_dbgstr_w(aW
));
1661 IMoniker_Release(aMon
);
1663 /* setting target & location to the empty string deletes the moniker
1665 setStringRef(hlink
, HLINKSETF_TARGET
| HLINKSETF_LOCATION
, emptyW
, emptyW
);
1666 getStringRef(hlink
, NULL
, NULL
);
1667 getMonikerRef(hlink
, NULL
, NULL
, HLINKGETREF_RELATIVE
);
1669 /* setting a moniker target also sets the target string to that moniker's
1671 hres
= CreateFileMoniker(bW
, &file_mon
);
1672 ok(hres
== S_OK
, "CreateFileMoniker failed: 0x%08x\n", hres
);
1674 setMonikerRef(hlink
, HLINKSETF_TARGET
| HLINKSETF_LOCATION
, file_mon
, wordsW
);
1675 getStringRef(hlink
, bW
, wordsW
);
1676 getMonikerRef(hlink
, file_mon
, wordsW
, HLINKGETREF_RELATIVE
);
1678 IMoniker_Release(file_mon
);
1680 IHlink_Release(hlink
);
1683 static void test_HashLink(void)
1687 const WCHAR hash_targetW
[] = {'a','f','i','l','e','#','a','n','a','n','c','h','o','r',0};
1688 const WCHAR two_hash_targetW
[] = {'a','f','i','l','e','#','a','n','a','n','c','h','o','r','#','a','n','o','t','h','e','r',0};
1689 const WCHAR hash_no_tgtW
[] = {'#','a','n','a','n','c','h','o','r',0};
1690 const WCHAR tgt_partW
[] = {'a','f','i','l','e',0};
1691 const WCHAR loc_partW
[] = {'a','n','a','n','c','h','o','r',0};
1692 const WCHAR two_hash_loc_partW
[] = {'a','n','a','n','c','h','o','r','#','a','n','o','t','h','e','r',0};
1693 const WCHAR test_locW
[] = {'t','e','s','t','l','o','c',0};
1696 /* simple single hash test */
1697 hres
= HlinkCreateFromString(hash_targetW
, NULL
, NULL
, NULL
, 0, NULL
, &IID_IHlink
, (void*)&hlink
);
1698 ok(hres
== S_OK
, "HlinkCreateFromString failed: 0x%08x\n", hres
);
1699 ok(hlink
!= NULL
, "Didn't get an hlink\n");
1702 getStringRef(hlink
, tgt_partW
, loc_partW
);
1703 pmk
= getMonikerRef(hlink
, (IMoniker
*)0xFFFFFFFF, loc_partW
, HLINKGETREF_RELATIVE
);
1704 ok(pmk
!= NULL
, "Found moniker should not be NULL\n");
1706 IMoniker_Release(pmk
);
1708 setStringRef(hlink
, HLINKSETF_TARGET
, hash_targetW
, NULL
);
1709 getStringRef(hlink
, hash_targetW
, loc_partW
);
1711 IHlink_Release(hlink
);
1714 /* two hashes in the target */
1715 hres
= HlinkCreateFromString(two_hash_targetW
, NULL
, NULL
, NULL
, 0, NULL
, &IID_IHlink
, (void*)&hlink
);
1716 ok(hres
== S_OK
, "HlinkCreateFromString failed: 0x%08x\n", hres
);
1717 ok(hlink
!= NULL
, "Didn't get an hlink\n");
1720 getStringRef(hlink
, tgt_partW
, two_hash_loc_partW
);
1721 pmk
= getMonikerRef(hlink
, (IMoniker
*)0xFFFFFFFF, two_hash_loc_partW
, HLINKGETREF_RELATIVE
);
1722 ok(pmk
!= NULL
, "Found moniker should not be NULL\n");
1724 IMoniker_Release(pmk
);
1726 IHlink_Release(hlink
);
1729 /* target with hash plus a location string */
1730 hres
= HlinkCreateFromString(hash_targetW
, test_locW
, NULL
, NULL
, 0, NULL
, &IID_IHlink
, (void*)&hlink
);
1731 ok(hres
== S_OK
, "HlinkCreateFromString failed: 0x%08x\n", hres
);
1732 ok(hlink
!= NULL
, "Didn't get an hlink\n");
1735 getStringRef(hlink
, tgt_partW
, test_locW
);
1736 pmk
= getMonikerRef(hlink
, (IMoniker
*)0xFFFFFFFF, test_locW
, HLINKGETREF_RELATIVE
);
1737 ok(pmk
!= NULL
, "Found moniker should not be NULL\n");
1739 IMoniker_Release(pmk
);
1741 IHlink_Release(hlink
);
1744 /* target with hash containing no "target part" */
1745 hres
= HlinkCreateFromString(hash_no_tgtW
, NULL
, NULL
, NULL
, 0, NULL
, &IID_IHlink
, (void*)&hlink
);
1746 ok(hres
== S_OK
, "HlinkCreateFromString failed: 0x%08x\n", hres
);
1747 ok(hlink
!= NULL
, "Didn't get an hlink\n");
1750 getStringRef(hlink
, NULL
, loc_partW
);
1751 pmk
= getMonikerRef(hlink
, (IMoniker
*)0xFFFFFFFF, loc_partW
, HLINKGETREF_RELATIVE
);
1752 ok(pmk
== NULL
, "Found moniker should be NULL\n");
1754 IMoniker_Release(pmk
);
1756 IHlink_Release(hlink
);
1760 static const WCHAR site_monikerW
[] = {'S','I','T','E','_','M','O','N','I','K','E','R',0};
1761 static const WCHAR ref_monikerW
[] = {'R','E','F','_','M','O','N','I','K','E','R',0};
1763 static HRESULT WINAPI
hls_test_Moniker_BindToStorage(IMoniker
*iface
,
1764 IBindCtx
*pbc
, IMoniker
*toLeft
, REFIID riid
, void **obj
)
1766 ok(0, "BTS: %p %p %p %s %p\n", iface
, pbc
, toLeft
, wine_dbgstr_guid(riid
), obj
);
1770 static HRESULT WINAPI
hls_site_Moniker_ComposeWith(IMoniker
*iface
,
1771 IMoniker
*right
, BOOL onlyIfNotGeneric
, IMoniker
**composite
)
1776 ok(onlyIfNotGeneric
== 0, "Expected onlyIfNotGeneric to be FALSE\n");
1778 CHECK_EXPECT(ComposeWith
);
1780 hres
= IMoniker_GetDisplayName(right
, NULL
, NULL
, &rightName
);
1781 ok(hres
== S_OK
, "GetDisplayName failed: %08x\n", hres
);
1782 ok(!lstrcmpW(rightName
, ref_monikerW
),
1783 "Expected to get moniker set via SetMonikerReference, instead got: %s\n",
1784 wine_dbgstr_w(rightName
));
1785 CoTaskMemFree(rightName
);
1789 /* unlikely error code to verify this return result is used */
1790 return E_OUTOFMEMORY
;
1793 static HRESULT WINAPI
hls_site_Moniker_GetDisplayName(IMoniker
*iface
,
1794 IBindCtx
*pbc
, IMoniker
*toLeft
, LPOLESTR
*displayName
)
1796 *displayName
= CoTaskMemAlloc(sizeof(site_monikerW
));
1797 memcpy(*displayName
, site_monikerW
, sizeof(site_monikerW
));
1801 static HRESULT WINAPI
hls_ref_Moniker_GetDisplayName(IMoniker
*iface
,
1802 IBindCtx
*pbc
, IMoniker
*toLeft
, LPOLESTR
*displayName
)
1804 *displayName
= CoTaskMemAlloc(sizeof(ref_monikerW
));
1805 memcpy(*displayName
, ref_monikerW
, sizeof(ref_monikerW
));
1809 static HRESULT WINAPI
hls_test_Moniker_IsSystemMoniker(IMoniker
*iface
,
1815 static IMonikerVtbl hls_site_MonikerVtbl
= {
1816 Moniker_QueryInterface
,
1824 Moniker_BindToObject
,
1825 hls_test_Moniker_BindToStorage
,
1827 hls_site_Moniker_ComposeWith
,
1832 Moniker_GetTimeOfLastChange
,
1834 Moniker_CommonPrefixWith
,
1835 Moniker_RelativePathTo
,
1836 hls_site_Moniker_GetDisplayName
,
1837 Moniker_ParseDisplayName
,
1838 hls_test_Moniker_IsSystemMoniker
1841 static IMonikerVtbl hls_ref_MonikerVtbl
= {
1842 Moniker_QueryInterface
,
1850 Moniker_BindToObject
,
1851 hls_test_Moniker_BindToStorage
,
1853 Moniker_ComposeWith
,
1858 Moniker_GetTimeOfLastChange
,
1860 Moniker_CommonPrefixWith
,
1861 Moniker_RelativePathTo
,
1862 hls_ref_Moniker_GetDisplayName
,
1863 Moniker_ParseDisplayName
,
1864 hls_test_Moniker_IsSystemMoniker
1867 static IMoniker hls_site_Moniker
= { &hls_site_MonikerVtbl
};
1868 static IMoniker hls_ref_Moniker
= { &hls_ref_MonikerVtbl
};
1870 static HRESULT WINAPI
hls_QueryInterface(IHlinkSite
*iface
, REFGUID iid
,
1873 ok(0, "QI: %p %s %p\n", iface
, wine_dbgstr_guid(iid
), obj
);
1877 static ULONG WINAPI
hls_AddRef(IHlinkSite
*iface
)
1882 static ULONG WINAPI
hls_Release(IHlinkSite
*iface
)
1887 static HRESULT WINAPI
hls_QueryService(IHlinkSite
*iface
, DWORD siteData
,
1888 REFGUID service
, REFIID riid
, IUnknown
**punk
)
1890 ok(0, "QS: %p %x %s %s %p\n", iface
, siteData
, wine_dbgstr_guid(service
),
1891 wine_dbgstr_guid(riid
), punk
);
1895 #define SITEDATA_SUCCESS 1
1896 #define SITEDATA_NOTIMPL 2
1898 static HRESULT WINAPI
hls_GetMoniker(IHlinkSite
*iface
, DWORD siteData
,
1899 DWORD assign
, DWORD which
, IMoniker
**pmk
)
1901 ok(siteData
== SITEDATA_NOTIMPL
||
1902 siteData
== SITEDATA_SUCCESS
, "Unexpected site data: %u\n", siteData
);
1904 if(siteData
== SITEDATA_SUCCESS
){
1905 *pmk
= &hls_site_Moniker
;
1912 static HRESULT WINAPI
hls_ReadyToNavigate(IHlinkSite
*iface
, DWORD siteData
,
1915 ok(0, "RTN: %p %x %x\n", iface
, siteData
, reserved
);
1919 static HRESULT WINAPI
hls_OnNavigationComplete(IHlinkSite
*iface
,
1920 DWORD siteData
, DWORD reserved
, HRESULT error
, LPCWSTR errorStr
)
1922 CHECK_EXPECT(OnNavigationComplete
);
1923 ok(siteData
== SITEDATA_SUCCESS
, "Unexpected site data: %u\n", siteData
);
1924 ok(error
== E_OUTOFMEMORY
, "Expected E_OUTOFMEMORY, got: %08x\n", error
);
1928 static IHlinkSiteVtbl HlinkSiteVtbl
= {
1934 hls_ReadyToNavigate
,
1935 hls_OnNavigationComplete
1938 static IHlinkSite HlinkSite
= { &HlinkSiteVtbl
};
1940 static void test_HlinkSite(void)
1947 hres
= HlinkCreateFromString(NULL
, NULL
, NULL
, NULL
, 0, NULL
,
1948 &IID_IHlink
, (LPVOID
*)&hl
);
1949 ok(hres
== S_OK
, "HlinkCreateFromString failed: %08x\n", hres
);
1950 getMonikerRef(hl
, NULL
, NULL
, HLINKGETREF_RELATIVE
);
1952 hres
= IHlink_SetHlinkSite(hl
, &HlinkSite
, SITEDATA_SUCCESS
);
1953 ok(hres
== S_OK
, "SetHlinkSite failed: %08x\n", hres
);
1954 getMonikerRef(hl
, NULL
, NULL
, HLINKGETREF_RELATIVE
);
1955 getStringRef(hl
, NULL
, NULL
);
1957 hres
= IHlink_GetMonikerReference(hl
, HLINKGETREF_RELATIVE
, &mon_ref
, NULL
);
1958 ok(hres
== S_OK
, "GetMonikerReference failed: %08x\n", hres
);
1959 ok(mon_ref
== NULL
, "Didn't get expected moniker, instead: %p\n", mon_ref
);
1961 hres
= IHlink_GetMonikerReference(hl
, HLINKGETREF_ABSOLUTE
, &mon_ref
, NULL
);
1962 ok(hres
== S_OK
, "GetMonikerReference failed: %08x\n", hres
);
1963 ok(mon_ref
== &hls_site_Moniker
, "Didn't get expected moniker, instead: %p\n", mon_ref
);
1967 hres
= IHlink_SetMonikerReference(hl
, HLINKSETF_TARGET
, &hls_ref_Moniker
, NULL
);
1968 ok(hres
== S_OK
, "SetMonikerReference failed: %08x\n", hres
);
1969 todo_wine
CHECK_CALLED(Reduce
);
1970 todo_wine
CHECK_CALLED(Enum
);
1972 getMonikerRef(hl
, &hls_ref_Moniker
, NULL
, HLINKGETREF_RELATIVE
);
1975 getStringRef(hl
, ref_monikerW
, NULL
);
1976 todo_wine
CHECK_CALLED(Enum
);
1978 hres
= IHlink_GetMonikerReference(hl
, HLINKGETREF_RELATIVE
, &mon_ref
, NULL
);
1979 ok(hres
== S_OK
, "GetMonikerReference failed: %08x\n", hres
);
1980 ok(mon_ref
== &hls_ref_Moniker
, "Didn't get expected moniker, instead: %p\n", mon_ref
);
1981 IMoniker_Release(mon_ref
);
1983 SET_EXPECT(ComposeWith
);
1984 hres
= IHlink_GetMonikerReference(hl
, HLINKGETREF_ABSOLUTE
, &mon_ref
, NULL
);
1985 ok(hres
== E_OUTOFMEMORY
, "Expected E_OUTOFMEMORY, got: %08x\n", hres
);
1986 ok(mon_ref
== NULL
, "Shouldn't have got a Moniker, got: %p\n", mon_ref
);
1987 CHECK_CALLED(ComposeWith
);
1989 hres
= CreateBindCtx(0, &pbc
);
1990 ok(hres
== S_OK
, "CreateBindCtx failed: %08x\n", hres
);
1992 SET_EXPECT(ComposeWith
);
1993 SET_EXPECT(OnNavigationComplete
);
1994 hres
= IHlink_Navigate(hl
, 0, pbc
, NULL
, NULL
);
1995 ok(hres
== E_OUTOFMEMORY
, "Navigate should've failed: %08x\n", hres
);
1996 CHECK_CALLED(ComposeWith
);
1997 CHECK_CALLED(OnNavigationComplete
);
1999 IBindCtx_Release(pbc
);
2004 hres
= HlinkCreateFromMoniker(&hls_ref_Moniker
, NULL
, NULL
, &HlinkSite
, SITEDATA_SUCCESS
,
2005 NULL
, &IID_IHlink
, (LPVOID
*)&hl
);
2006 ok(hres
== S_OK
, "HlinkCreateFromMoniker failed: %08x\n", hres
);
2007 todo_wine
CHECK_CALLED(Reduce
);
2008 todo_wine
CHECK_CALLED(Enum
);
2009 getMonikerRef(hl
, &hls_ref_Moniker
, NULL
, HLINKGETREF_RELATIVE
);
2012 hres
= HlinkCreateFromMoniker(NULL
, NULL
, NULL
, &HlinkSite
, SITEDATA_SUCCESS
,
2013 NULL
, &IID_IHlink
, (LPVOID
*)&hl
);
2014 ok(hres
== S_OK
, "HlinkCreateFromMoniker failed: %08x\n", hres
);
2015 getMonikerRef(hl
, NULL
, NULL
, HLINKGETREF_RELATIVE
);
2020 SET_EXPECT(IsSystemMoniker
);
2021 SET_EXPECT(GetDisplayName
);
2022 hres
= HlinkCreateFromMoniker(&Moniker
, NULL
, NULL
, &HlinkSite
, SITEDATA_NOTIMPL
,
2023 NULL
, &IID_IHlink
, (LPVOID
*)&hl
);
2024 ok(hres
== S_OK
, "HlinkCreateFromMoniker failed: %08x\n", hres
);
2025 getMonikerRef(hl
, &Moniker
, NULL
, HLINKGETREF_ABSOLUTE
);
2027 todo_wine
CHECK_CALLED(Reduce
);
2028 todo_wine
CHECK_CALLED(Enum
);
2029 CHECK_CALLED(IsSystemMoniker
);
2030 CHECK_CALLED(GetDisplayName
);
2033 static void test_HlinkClone(void)
2036 IHlink
*hl
, *cloned
= NULL
;
2037 IMoniker
*dummy
, *fnd_mk
;
2038 IHlinkSite
*fnd_site
;
2041 const WCHAR one
[] = {'1',0};
2042 const WCHAR two
[] = {'2',0};
2043 const WCHAR name
[] = {'a',0};
2045 hres
= HlinkClone(NULL
, NULL
, NULL
, 0, NULL
);
2046 ok(hres
== E_INVALIDARG
, "Got wrong failure code: %08x\n", hres
);
2048 hres
= HlinkCreateFromString(NULL
, NULL
, NULL
, NULL
, 0, NULL
,
2049 &IID_IHlink
, (void**)&hl
);
2050 ok(hres
== S_OK
, "HlinkCreateFromString failed: %08x\n", hres
);
2052 hres
= HlinkClone(hl
, &IID_IHlink
, NULL
, 0, NULL
);
2053 ok(hres
== E_INVALIDARG
, "Got wrong failure code: %08x\n", hres
);
2057 /* crash on Windows XP */
2058 HlinkClone(hl
, NULL
, NULL
, 0, NULL
);
2060 HlinkClone(hl
, NULL
, NULL
, 0, (void**)&cloned
);
2063 hres
= HlinkClone(hl
, &IID_IHlink
, NULL
, 0, (void**)&cloned
);
2064 ok(hres
== S_OK
, "HlinkClone failed: %08x\n", hres
);
2065 ok(cloned
!= NULL
, "Didn't get a clone\n");
2066 getMonikerRef(cloned
, NULL
, NULL
, HLINKGETREF_RELATIVE
);
2067 IHlink_Release(cloned
);
2073 hres
= HlinkCreateFromMoniker(&hls_ref_Moniker
, two
, NULL
, NULL
, 0, NULL
, &IID_IHlink
, (void**)&hl
);
2074 todo_wine
CHECK_CALLED(Reduce
);
2075 todo_wine
CHECK_CALLED(Enum
);
2076 ok(hres
== S_OK
, "HlinkCreateFromMoniker failed: 0x%08x\n", hres
);
2077 getMonikerRef(hl
, &hls_ref_Moniker
, two
, HLINKGETREF_RELATIVE
);
2080 SET_EXPECT(GetClassID
);
2081 cloned
= (IHlink
*)0xdeadbeef;
2082 hres
= HlinkClone(hl
, &IID_IHlink
, NULL
, 0, (void**)&cloned
);
2083 /* fails because of invalid CLSID given by Moniker_GetClassID */
2084 ok(hres
== REGDB_E_CLASSNOTREG
, "Wrong error code: %08x\n", hres
);
2085 ok(cloned
== NULL
, "Shouldn't have gotten a clone\n");
2087 CHECK_CALLED(GetClassID
);
2091 hres
= CreateItemMoniker(one
, one
, &dummy
);
2092 ok(hres
== S_OK
, "CreateItemMoniker failed: 0x%08x\n", hres
);
2094 hres
= HlinkCreateFromMoniker(dummy
, two
, name
, &HlinkSite
, SITEDATA_SUCCESS
, NULL
, &IID_IHlink
, (void**)&hl
);
2095 ok(hres
== S_OK
, "HlinkCreateFromMoniker failed: 0x%08x\n", hres
);
2096 getMonikerRef(hl
, dummy
, two
, HLINKGETREF_RELATIVE
);
2099 hres
= HlinkClone(hl
, &IID_IHlink
, NULL
, 0, (void**)&cloned
);
2100 ok(hres
== S_OK
, "HlinkClone failed: %08x\n", hres
);
2101 ok(cloned
!= NULL
, "Should have gotten a clone\n");
2103 fnd_mk
= getMonikerRef(cloned
, (IMoniker
*)0xFFFFFFFF, two
, HLINKGETREF_RELATIVE
);
2104 ok(fnd_mk
!= NULL
, "Expected non-null Moniker\n");
2105 ok(fnd_mk
!= dummy
, "Expected a new Moniker to be created\n");
2108 hres
= IHlink_GetFriendlyName(cloned
, HLFNAMEF_DEFAULT
, &fnd_name
);
2109 ok(hres
== S_OK
, "GetFriendlyName failed: %08x\n", hres
);
2110 ok(fnd_name
!= NULL
, "Expected friendly name to be non-NULL\n");
2111 ok(lstrcmpW(fnd_name
, name
) == 0, "Expected friendly name to be %s, was %s\n",
2112 wine_dbgstr_w(name
), wine_dbgstr_w(fnd_name
));
2113 CoTaskMemFree(fnd_name
);
2115 fnd_site
= (IHlinkSite
*)0xdeadbeef;
2117 hres
= IHlink_GetHlinkSite(cloned
, &fnd_site
, &fnd_data
);
2118 ok(hres
== S_OK
, "GetHlinkSite failed: %08x\n", hres
);
2119 ok(fnd_site
== NULL
, "Expected NULL site\n");
2120 ok(fnd_data
== 4, "Expected site data to be 4, was: %d\n", fnd_data
);
2122 IHlink_Release(cloned
);
2125 hres
= HlinkCreateFromMoniker(dummy
, NULL
, NULL
, NULL
, 0, NULL
, &IID_IHlink
, (void**)&hl
);
2126 ok(hres
== S_OK
, "HlinkCreateFromMoniker failed: 0x%08x\n", hres
);
2127 getMonikerRef(hl
, dummy
, NULL
, HLINKGETREF_RELATIVE
);
2130 hres
= HlinkClone(hl
, &IID_IHlink
, &HlinkSite
, SITEDATA_SUCCESS
, (void**)&cloned
);
2131 ok(hres
== S_OK
, "HlinkClone failed: %08x\n", hres
);
2132 ok(cloned
!= NULL
, "Should have gotten a clone\n");
2134 fnd_mk
= getMonikerRef(cloned
, (IMoniker
*)0xFFFFFFFF, NULL
, HLINKGETREF_RELATIVE
);
2135 ok(fnd_mk
!= NULL
, "Expected non-null Moniker\n");
2136 ok(fnd_mk
!= dummy
, "Expected a new Moniker to be created\n");
2138 fnd_site
= (IHlinkSite
*)0xdeadbeef;
2140 hres
= IHlink_GetHlinkSite(cloned
, &fnd_site
, &fnd_data
);
2141 ok(hres
== S_OK
, "GetHlinkSite failed: %08x\n", hres
);
2142 ok(fnd_site
== &HlinkSite
, "Expected found site to be HlinkSite, was: %p\n", fnd_site
);
2143 ok(fnd_data
== SITEDATA_SUCCESS
, "Unexpected site data: %u\n", fnd_data
);
2145 IHlink_Release(cloned
);
2148 IMoniker_Release(dummy
);
2151 static void test_StdHlink(void)
2157 static const WCHAR testW
[] = {'t','e','s','t',0};
2159 hres
= CoCreateInstance(&CLSID_StdHlink
, NULL
, CLSCTX_INPROC_SERVER
|CLSCTX_INPROC_HANDLER
,
2160 &IID_IHlink
, (void**)&hlink
);
2161 ok(hres
== S_OK
, "CoCreateInstance failed: %08x\n", hres
);
2163 str
= (void*)0xdeadbeef;
2164 hres
= IHlink_GetTargetFrameName(hlink
, &str
);
2165 ok(hres
== S_FALSE
, "GetTargetFrameName failed: %08x\n", hres
);
2166 ok(!str
, "str = %s\n", wine_dbgstr_w(str
));
2168 hres
= IHlink_SetTargetFrameName(hlink
, testW
);
2169 ok(hres
== S_OK
, "SetTargetFrameName failed: %08x\n", hres
);
2171 str
= (void*)0xdeadbeef;
2172 hres
= IHlink_GetTargetFrameName(hlink
, &str
);
2173 ok(hres
== S_OK
, "GetTargetFrameName failed: %08x\n", hres
);
2174 ok(!lstrcmpW(str
, testW
), "str = %s\n", wine_dbgstr_w(str
));
2177 hres
= IHlink_SetTargetFrameName(hlink
, NULL
);
2178 ok(hres
== S_OK
, "SetTargetFrameName failed: %08x\n", hres
);
2180 str
= (void*)0xdeadbeef;
2181 hres
= IHlink_GetTargetFrameName(hlink
, &str
);
2182 ok(hres
== S_FALSE
, "GetTargetFrameName failed: %08x\n", hres
);
2183 ok(!str
, "str = %s\n", wine_dbgstr_w(str
));
2185 IHlink_Release(hlink
);
2188 static void test_Hlink_Navigate(void)
2194 hres
= CreateBindCtx(0, &pbc
);
2195 ok(hres
== S_OK
, "CreateBindCtx failed: %08x\n", hres
);
2202 SET_EXPECT(IsSystemMoniker
);
2203 SET_EXPECT(GetDisplayName
);
2204 hres
= HlinkCreateFromMoniker(&Moniker
, NULL
, NULL
, NULL
,
2205 0, NULL
, &IID_IHlink
, (void**)&hlink
);
2206 ok(hres
== S_OK
, "HlinkCreateFromMoniker failed: %08x\n", hres
);
2207 todo_wine
CHECK_CALLED(Reduce
);
2208 todo_wine
CHECK_CALLED(Enum
);
2209 todo_wine
CHECK_CALLED(IsSystemMoniker
);
2210 CHECK_CALLED(GetDisplayName
);
2212 SET_EXPECT(IsSystemMoniker
);
2213 SET_EXPECT(GetDisplayName
);
2214 SET_EXPECT(HBC_GetObject
);
2216 SET_EXPECT(BindToObject
);
2217 SET_EXPECT(HT_QueryInterface_IHlinkTarget
);
2218 SET_EXPECT(HT_GetBrowseContext
);
2219 SET_EXPECT(HT_SetBrowseContext
);
2220 SET_EXPECT(HBC_QueryInterface_IHlinkHistory
);
2221 SET_EXPECT(HT_Navigate
);
2222 SET_EXPECT(HT_GetFriendlyName
);
2223 hres
= IHlink_Navigate(hlink
, 0, pbc
, NULL
, &HlinkBrowseContext
);
2224 ok(hres
== S_OK
, "Navigate failed: %08x\n", hres
);
2225 CHECK_CALLED(IsSystemMoniker
);
2226 CHECK_CALLED(GetDisplayName
);
2227 CHECK_CALLED(HBC_GetObject
);
2228 todo_wine
CHECK_CALLED(Reduce
);
2229 CHECK_CALLED(BindToObject
);
2230 CHECK_CALLED(HT_QueryInterface_IHlinkTarget
);
2231 todo_wine
CHECK_CALLED(HT_GetBrowseContext
);
2232 CHECK_CALLED(HT_SetBrowseContext
);
2233 todo_wine
CHECK_CALLED(HBC_QueryInterface_IHlinkHistory
);
2234 CHECK_CALLED(HT_Navigate
);
2235 todo_wine
CHECK_CALLED(HT_GetFriendlyName
);
2237 /* Test with valid return from HlinkBrowseContext::GetObject */
2238 HBC_object
= (IUnknown
*)&HlinkTarget
;
2240 SET_EXPECT(IsSystemMoniker
);
2241 SET_EXPECT(GetDisplayName
);
2242 SET_EXPECT(HBC_GetObject
);
2243 SET_EXPECT(HT_QueryInterface_IHlinkTarget
);
2244 SET_EXPECT(HT_Navigate
);
2245 SET_EXPECT(HT_GetFriendlyName
);
2246 hres
= IHlink_Navigate(hlink
, 0, pbc
, NULL
, &HlinkBrowseContext
);
2247 ok(hres
== S_OK
, "Navigate failed: %08x\n", hres
);
2248 CHECK_CALLED(IsSystemMoniker
);
2249 CHECK_CALLED(GetDisplayName
);
2250 CHECK_CALLED(HBC_GetObject
);
2251 CHECK_CALLED(HT_QueryInterface_IHlinkTarget
);
2252 CHECK_CALLED(HT_Navigate
);
2253 todo_wine
CHECK_CALLED(HT_GetFriendlyName
);
2257 if (0) { /* these currently open a browser window on wine */
2258 /* Test from string */
2259 SET_EXPECT(HBC_GetObject
);
2260 hres
= HlinkNavigateToStringReference(winehq_404W
, NULL
, NULL
, 0, NULL
, 0, pbc
, NULL
, &HlinkBrowseContext
);
2261 todo_wine
ok(hres
== INET_E_OBJECT_NOT_FOUND
, "Expected INET_E_OBJECT_NOT_FOUND, got %08x\n", hres
);
2262 CHECK_CALLED(HBC_GetObject
);
2264 /* MSDN claims browse context and bind context can't be null, but they can */
2265 SET_EXPECT(HBC_GetObject
);
2266 hres
= HlinkNavigateToStringReference(winehq_404W
, NULL
, NULL
, 0, NULL
, 0, NULL
, NULL
, &HlinkBrowseContext
);
2267 todo_wine
ok(hres
== INET_E_OBJECT_NOT_FOUND
, "Expected INET_E_OBJECT_NOT_FOUND, got %08x\n", hres
);
2268 CHECK_CALLED(HBC_GetObject
);
2271 /* these open a browser window, so mark them interactive only */
2272 if (winetest_interactive
)
2274 /* both parameters null */
2275 SET_EXPECT(IsSystemMoniker
);
2276 SET_EXPECT(GetDisplayName
);
2277 hres
= IHlink_Navigate(hlink
, 0, NULL
, NULL
, NULL
);
2278 ok(hres
== DRAGDROP_S_DROP
, "Expected DRAGDROP_S_DROP, got %08x\n", hres
);
2279 CHECK_CALLED(IsSystemMoniker
);
2280 CHECK_CALLED(GetDisplayName
);
2282 /* same, from string */
2283 hres
= HlinkNavigateToStringReference(winehq_404W
, NULL
, NULL
, 0, NULL
, 0, NULL
, NULL
, NULL
);
2284 ok(hres
== DRAGDROP_S_DROP
, "Expected DRAGDROP_S_DROP, got %08x\n", hres
);
2286 /* try basic test with valid URL */
2287 SET_EXPECT(HBC_GetObject
);
2288 SET_EXPECT(HBC_QueryInterface_IHlinkHistory
);
2289 SET_EXPECT(HBC_QueryInterface_IMarshal
);
2290 SET_EXPECT(HBC_QueryInterface_IdentityUnmarshal
);
2291 SET_EXPECT(HBC_QueryInterface_IUnknown
);
2292 hres
= HlinkNavigateToStringReference(winehq_urlW
, NULL
, NULL
, 0, NULL
, 0, pbc
, NULL
, &HlinkBrowseContext
);
2293 ok(hres
== S_OK
, "Expected S_OK, got %08x\n", hres
);
2294 CHECK_CALLED(HBC_GetObject
);
2295 todo_wine
CHECK_CALLED(HBC_QueryInterface_IHlinkHistory
);
2296 todo_wine
CHECK_CALLED(HBC_QueryInterface_IMarshal
);
2297 todo_wine
CHECK_CALLED(HBC_QueryInterface_IdentityUnmarshal
);
2298 todo_wine
CHECK_CALLED(HBC_QueryInterface_IUnknown
);
2301 skip("interactive IHlink_Navigate tests\n");
2303 IHlink_Release(hlink
);
2304 IBindCtx_Release(pbc
);
2308 static HRESULT WINAPI
hlinkframe_QueryInterface(IHlinkFrame
*iface
, REFIID riid
, void **obj
)
2310 if (IsEqualIID(riid
, &IID_IUnknown
) || IsEqualIID(riid
, &IID_IHlinkFrame
))
2317 return E_NOINTERFACE
;
2320 static ULONG WINAPI
hlinkframe_AddRef(IHlinkFrame
*iface
)
2325 static ULONG WINAPI
hlinkframe_Release(IHlinkFrame
*iface
)
2330 static HRESULT WINAPI
hlinkframe_SetBrowseContext(IHlinkFrame
*iface
, IHlinkBrowseContext
*bc
)
2332 ok(0, "unexpected %p\n", bc
);
2336 static HRESULT WINAPI
hlinkframe_GetBrowseContext(IHlinkFrame
*iface
, IHlinkBrowseContext
**bc
)
2339 ok(0, "unexpected %p\n", bc
);
2343 static HRESULT WINAPI
hlinkframe_Navigate(IHlinkFrame
*iface
, DWORD grfHLNF
, LPBC pbc
, IBindStatusCallback
*bsc
, IHlink
*navigate
)
2345 ok(0, "unexpected\n");
2349 static HRESULT WINAPI
hlinkframe_OnNavigate(IHlinkFrame
*iface
, DWORD grfHLNF
, IMoniker
*target
, LPCWSTR location
, LPCWSTR friendly_name
,
2352 ok(0, "unexpected\n");
2356 static HRESULT WINAPI
hlinkframe_UpdateHlink(IHlinkFrame
*iface
, ULONG uHLID
, IMoniker
*target
, LPCWSTR location
, LPCWSTR friendly_name
)
2358 CHECK_EXPECT(HLF_UpdateHlink
);
2362 static IHlinkFrameVtbl hlinkframevtbl
= {
2363 hlinkframe_QueryInterface
,
2366 hlinkframe_SetBrowseContext
,
2367 hlinkframe_GetBrowseContext
,
2368 hlinkframe_Navigate
,
2369 hlinkframe_OnNavigate
,
2370 hlinkframe_UpdateHlink
2373 static IHlinkFrame testframe
= { &hlinkframevtbl
};
2375 static void test_HlinkUpdateStackItem(void)
2377 static const WCHAR location
[] = {'l','o','c','a','t','i','o','n',0};
2380 hr
= HlinkUpdateStackItem(NULL
, NULL
, HLID_CURRENT
, &Moniker
, location
, NULL
);
2381 ok(hr
== E_INVALIDARG
, "got 0x%08x\n", hr
);
2383 SET_EXPECT(HBC_UpdateHlink
);
2384 hr
= HlinkUpdateStackItem(NULL
, &HlinkBrowseContext
, HLID_CURRENT
, &Moniker
, location
, NULL
);
2385 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
2386 CHECK_CALLED(HBC_UpdateHlink
);
2388 SET_EXPECT(HLF_UpdateHlink
);
2389 hr
= HlinkUpdateStackItem(&testframe
, &HlinkBrowseContext
, HLID_CURRENT
, &Moniker
, location
, NULL
);
2390 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
2391 CHECK_CALLED(HLF_UpdateHlink
);
2398 test_HlinkIsShortcut();
2401 test_special_reference();
2402 test_HlinkCreateExtensionServices();
2403 test_HlinkParseDisplayName();
2404 test_HlinkResolveMonikerForData();
2405 test_HlinkGetSetMonikerReference();
2406 test_HlinkGetSetStringReference();
2407 test_HlinkMoniker();
2412 test_Hlink_Navigate();
2413 test_HlinkUpdateStackItem();